你好,51单片机16*16点阵滚动显示程序能不能发个给我,谢谢了!

如题所述

第1个回答  2014-06-05
/*--------16*16点阵屏的移动显示------------*/

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned char
#define DATE_OUT P1 //指定P1口做为输出
sbit DATA=DATE_OUT^0; //列数据输出位
sbit SCLH=DATE_OUT^1; //列扫描时钟位
sbit SCLT=DATE_OUT^2; //列数据锁存位
sbit AB =DATE_OUT^3; //行数据输出位
sbit SCK =DATE_OUT^4; //行扫描时钟位
sbit kong=DATE_OUT^5;
unsigned char xxx=0,upcount=0;
unsigned char ccc,time1time=0,s=0;
//段前缀{
//段后缀};
//注释前缀、/*"
//注释后缀",
//数据前缀 0x
//数据后缀,
//行前缀
//行后缀},
//行尾缀*/
code unsigned char dong[16][32]={
{0x00,0x80,0x00,0x80,0xFC,0x80,0x04,0xFC,0x05,0x04,0x49,0x08,0x2A,0x40,0x14,0x40,
0x10,0x40,0x28,0xA0,0x24,0xA0,0x45,0x10,0x81,0x10,0x02,0x08,0x04,0x04,0x08,0x02},/*"欢",0*/

{0x00,0x00,0x20,0x80,0x13,0x3C,0x12,0x24,0x02,0x24,0x02,0x24,0xF2,0x24,0x12,0x24,
0x12,0x24,0x12,0xB4,0x13,0x28,0x12,0x20,0x10,0x20,0x28,0x20,0x47,0xFE,0x00,0x00},/*"迎",1*/

{0x01,0x00,0x01,0x00,0x01,0x00,0x7F,0xFC,0x01,0x00,0x11,0x10,0x09,0x10,0x09,0x20,
0xFF,0xFE,0x03,0x80,0x05,0x40,0x09,0x20,0x31,0x18,0xC1,0x06,0x01,0x00,0x01,0x00},/*"来",2*/

{0x00,0x04,0xFF,0x84,0x08,0x04,0x10,0x24,0x22,0x24,0x41,0x24,0xFF,0xA4,0x08,0xA4,
0x08,0x24,0x08,0x24,0x7F,0x24,0x08,0x24,0x08,0x04,0x0F,0x84,0xF8,0x14,0x40,0x08},/*"到",3*/

{0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,
0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x0A,0x01,0x02,0x01,0x02,0x00,0xFE},/*"电",4*/

{0x00,0x00,0x7F,0xF8,0x00,0x10,0x00,0x20,0x00,0x40,0x01,0x80,0x01,0x00,0xFF,0xFE,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00},/*"子",5*/

{0x00,0x00,0x00,0x00,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00},/*"工",6*/

{0x08,0x00,0x1D,0xFC,0xF1,0x04,0x11,0x04,0x11,0x04,0xFD,0xFC,0x10,0x00,0x30,0x00,
0x39,0xFE,0x54,0x20,0x54,0x20,0x91,0xFC,0x10,0x20,0x10,0x20,0x13,0xFE,0x10,0x00},/*"程",7*/

{0x00,0xF8,0x3F,0x00,0x04,0x00,0x08,0x20,0x10,0x40,0x3F,0x80,0x01,0x00,0x06,0x10,
0x18,0x08,0x7F,0xFC,0x01,0x04,0x09,0x20,0x11,0x10,0x21,0x08,0x45,0x04,0x02,0x00},/*"系",8*/

{0x00,0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00},/*"三",9*/

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"一",10*/

{0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,
0x04,0x40,0x04,0x20,0x08,0x10,0x08,0x08,0x10,0x08,0x20,0x04,0x40,0x04,0x00,0x00},/*"六",11*/

{0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x88,0x84,0x04,0x80,0x04,0x80,0x10,0x80,
0x08,0x80,0x08,0x80,0xFF,0xFE,0x01,0x40,0x02,0x20,0x04,0x10,0x18,0x08,0x60,0x04},/*"实",12*/

{0x00,0x20,0xF8,0x20,0x08,0x50,0x48,0x50,0x48,0x88,0x49,0x04,0x4A,0xFA,0x7C,0x00,
0x04,0x44,0x04,0x24,0x1D,0x24,0xE4,0xA8,0x44,0x88,0x04,0x10,0x2B,0xFE,0x10,0x00},/*"验",13*/

{0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x80,0x04,0x3F,0xF8,0x04,0x00,0x08,0x20,
0x1F,0xF0,0x01,0x10,0x01,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00},/*"室",14*/

};

idata unsigned char date[3][32];
idata uchar i=0,displayflag=0;
uchar k=0;
void displaymoveup(unsigned char count,unsigned char time);
void display(unsigned char dis);//做为点阵扫描函数,将显示缓存的数据输出到点阵屏
void displaymove(unsigned char count,unsigned char timer);//显示汉字内容的移动效果,LP指向要显示第一个字的首地址,C表示显示字的个数,
//非常好用的字摸软件PCtoLCD2002完美版 字模选项:阴码、逐行式、顺向

void main(void) //主入口函数
{
display(0);
while(1)
{
displaymove(16,10);
}
}
void display(unsigned char dis)//显示
{
unsigned char i,ia,j,tmp,x; //定义变量
DATE_OUT=0XFF; //置位高电平做准备
AB=0; //将列数据位清0,准备移位
for(i=0;i<16;i++)
{ //循环输出16行数据
SCK=0; //为列移位做准备
SCLT=0; //为行锁存做准备
for(x=3;x>0;x--)
{
for(ia=2;ia>0;)
{ //每行16个点,循环位移两个字节
ia--; //循环两次
if(dis==1)
{
tmp=~date[x-1][i*2+ia]; //读取点阵数据做输出,这里用到ia目的是先读取点阵数据的第二位字节,因一行16个点由两个字节组成, //电路中的移位寄存器最后一位对应最后一列,所以要先输出一行中的第二个字节数据
}
if(dis==0)
tmp=0xff;
for(j=0;j<8;j++)
{ //循环两次,每次移一个字节,
SCLH=0; //为列移位做准备
DATA=tmp&0x01; //将数据低位做输出,由电路图可知,移位寄存器的最后一位对应最后一列,因此先移最后一位
tmp>>=1; //将数据缓冲右移一位,为下次输出做准备
SCLH=1; //将DATA上的数据移入寄存器
} //移入单字节结束
} //移入两个字节结束
}
SCK=1; //SCK拉高,列数据移位,相应行拉低,三极管导通输出电量到相应行点阵管阳极(共阳)
SCLT=1; //SCLT拉高,将数据锁存输出到相应行的点阵发光管显示,显示一行后将保持到下一行显示开始
AB=1; //列数据位只在第一行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始一直移位最后一位,
//移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱
}
j=20;
while(j--); //每一行的显示,保持16个移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度
SCK=0; //
SCK=1; //将最后一行数据移出
}
void displaymove(unsigned char count,unsigned char timer)//显示汉字内容的移动效果,
//LP指向要显示第一个字的首地址,C表示显示字的个数, //timer是移动的速度
{
unsigned char c=8,i=0,ia=0,num=0;
unsigned char timerc=0;
unsigned char tmp2[16];
for(i=0;i<16;i++)
{
tmp2[i]=dong[xxx/2][i*2+ccc%2]; //取半个汉字点阵数据,16字节
}
xxx++;
if(xxx==(count*2))
xxx=0;
ccc++;
while(c)
{ //循环处理
ia=0; //做为点阵数组的元素
for(i=0;i<16;i++)
{//移动是16行同时移,因此要处理16个字节
// if(date[num][ia]&0x80)

date[num][ia]<<=1; //移当前显示缓冲的前半行字节
if(date[num][ia+1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理
date[num][ia]++;
ia++;
date[num][ia]<<=1; //移当前显示缓冲的前半行字节
if(date[num+1][ia-1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理
date[num][ia]++;
ia--;

date[num+1][ia]<<=1; //移当前显示缓冲的前半行字节
if(date[num+1][ia+1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理
date[num+1][ia]++;
ia++;
date[num+1][ia]<<=1; //移当前显示缓冲的前半行字节
if(date[num+2][ia-1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理
date[num+1][ia]++;
ia--;

date[num+2][ia]<<=1; //移当前显示缓冲的前半行字节
if(date[num+2][ia+1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理
date[num+2][ia]++;
ia++;
date[num+2][ia]<<=1;
if(tmp2[i]&0x80) //判断下一个要显示汉字的前半行字节的高位是否为1,是移入,否则不处理
date[num+2][ia]++;
ia++;
tmp2[i]<<=1; //下一个要显示汉字的半行字节向高位移一位,准备下一次取位
}
timerc=timer; //处理完16行,调用显示函数更新点阵
while(timerc--) //循环做为处理的速度,即移动的速度
display(1);
//----------
c--; //移完一半,进入下一半或下一个汉字,直到结束
}
}
void displaymoveup(unsigned char count,unsigned char time)
{
unsigned char k,i,j,tim=0;
for(i=0;i<3;i++)
{
for(j=0;j<32;j++)
{
date[i][j]=xin[upcount][j];
}
upcount++;
}

if(upcount==count)
upcount=0;
for(k=0;k<16;k++)
{
for(i=0;i<3;i++)
{
for(j=0;j<32;j++)
{
if(j<30)
date[i][j]=date[i][j+2];
if(j>=30)
date[i][j]=0x00;
}
}
tim=time;
while(tim--)
display(1);
}
}追问

程序编译有错误呢? 我是用的4个8*8点阵拼的16*16的点阵,这个程序能行吗?

追答

我是用的是4个8*8点阵拼的16*16的点阵,可以的,那程序有点问题,就是那xin我把他删了,你改下就可以了。

你好,51单片机16*16点阵滚动显示程序能不能发个给我,谢谢了!
unsigned char tmp2[16]; for(i=0;i<16;i++) { tmp2[i]=dong[xxx\/2][i*2+ccc%2]; \/\/取半个汉字点阵数据,16字节 } xxx++; if(xxx==(count*2)) xxx=0; ccc++; while(c) { \/\/循环处理 ia=0; \/\/做为点阵数组的元素 for(i=0;i<16;i++) {\/\/移动是16行同时移,因此要处理16...

求51单片机控制的16*16点阵代码
\/\/这是16*16点阵 显示一个字的代码。。。 临时写的。。。include <reg52.h> include <intrins.h> define IOdata \/\/数据口定义 define uchar unsigned char sbit row0 \/\/0行 定义 sbit row1 \/\/1行 定义 sbit col0 \/\/0列 定义 sbit col1 \/\/1列 定义 uchar code word_tab[][32]= {...

51单片机用汇编语言驱动16*16点阵显示“机电工程系”汉字
;16X16LED点阵流动显示 ;逐列、逆向(低位开始)扫描 ORG0000H AJMPMAIN ORG0030H MAIN:MOVDPTR,#TAB;字码表初址赋值 MOVR1,#00H;列控制码 MOVR4,#96;移动" "及"机电工程系"6个字符,共96列 CM:MOVR5,#5;每屏反复显示5次 MOVR3,#16;列数 C1:MOVR2,#0;取码指针 C16:MOVP0,#00H ...

我想编写16*16点阵的左移程序。用C语言,51单片机。你能否帮我编一个小...
if(temp==16)temp=0;} } } }

求51单片机16*16的点阵汉字移动原理
首先是让汉字能够静态显示,显示一段时间后(时间可能很短)把所显示的汉字编码移一位重新送出,比如要向左移动,原本显示在第一列的数据就丢弃了,把第二列的数据送到第一列上显示,依次移动显示一屏,显示一段时间再进行一次移动,人们看起来也就是移动的了。 还搞不明白的话,可以晚上问我。

单片机16*16LED点阵怎样让文字从上到下显示出来 求程序
下面我们就首先介绍使用8×8点阵构建16×16点阵的方法,并构建一块16×16LED点阵,用于本例的显示任务。首先,从Proteus元件库中找到“MATRIX-8X8-RED”元器件,并将四块该元器件放入Proteus文档区编辑窗口中。此时需要注意,如果该元器件保持初始的位置(没有转动方向),我们要首先将其左转90°,使其...

51单片机16*16点阵4个汉字LED屏显示 请帮忙修改下程序,其他都不变...
LED上下移动很简单,麻烦一点的是左右移动。程序懒得写了,给你个思路吧,你在内存中开辟(16÷8+1)×16=48个字节的缓存。每行3个字节,实际显示2个字节的内容。在定时器中断中定时扫描列的内容。第一次中断,从行缓存头上开始,每行送16个BIT,共16行,第二次中断,从行缓存头上开始,每行送17...

求16*16LED点阵显示汉字程序
我也不怎么会,还在学习中 下面有一个16*16的C程序 参考一下。。。字模软件你要的话我可以给你 共同学习。。。include<reg51.h> sbit P20=P2^0;sbit P22=P2^2;unsigned char code text[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00...

【51单片机系列】proteus中创建16x16LED点阵
其次,文章提供了使用8x8点阵制作16x16点阵的详细步骤,包括创建、分解、复制、制作Symbol等操作,最终得到16x16点阵的元件。文章还介绍了如何使用此元件进行测试和显示数字、字符的方法,结果验证了自制16x16 LED点阵的有效性。整个过程详尽且实用,适合对Proteus和LED点阵设计感兴趣的读者。

51单片机下,谁能教我一下 16X16点阵怎么 让字移动起来啊?
多建一个缓冲区,将移位的数据从缓冲区读出加入到显示字符的最后一位,前面的数据移动一位,移动那一位数据加在前一位数据的最后一位。缓冲区的数据移完后再加入,一般是8位的数据。也就是说移8次加载一次数据到缓冲区。

相似回答