点阵屏的移动显示_第1页
点阵屏的移动显示_第2页
点阵屏的移动显示_第3页
点阵屏的移动显示_第4页
点阵屏的移动显示_第5页
免费预览已结束,剩余14页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、点阵屏的移动显示/*16*16 点阵屏的移动显示*/#include <reg51.h>#include <intrins.h>/ 指定 P2 口做为输/ 列数据输出位/ 列扫描时钟位/ 列数据锁存位/ 行数据输出位/ 行扫描时钟位#define DATE_OUTP2出sbit DATA=DATE_OUTA0;sbit SCLH=DATE_OUTA1;sbit SCLT=DATE_OUTA2;sbit AB =DATE_OUTA3;sbit SCK =DATE_OUTA4;unsigned char date32;/32字节RAM做为16

2、*16点阵屏显示缓存void display。;/做为点阵扫描函数,将显示缓存的数据输出到点阵屏/ 指void display_time(unsigned int timer);定时间扫描显示void displaymove(unsigned char *lp,unsigned char c,unsigned char timer);/显示汉字内容的移动效果,LP指向要显示第一个字的首地址, C表示显示字的个数,/timer 是移动的速度void displaymovetb(unsigned char din,unsigned char *lp,unsigned chartimer);/上下移

3、动内容, din: 1 为向下, 0为向上, lp 指向要移入的内容,timer 为移动速度void delay(unsigned int a);延时子函数非常好用的字摸软件 PCtoLCD2002完美版字模选项:阴码、逐行式、顺向code unsigned char yu32=0x00,0x00,0x7E,0xFC,0x02,0x04,0x02,0x04,0x22,0x44,0x12,0x24,0x12,0x24,0x06,0x04,0x0A,0x14,0x12,0x24,0x62,0xC4,0x02,0x04,0x02,0x04,0x02,0x04,0x0A,0 x14,0x04,0x08

4、/*"羽 ",0*/;code unsigned char yi32=0x7E,0xF8,0x12,0x48,0x0A,0x28,0x12,0x18,0x22,0x28,0x1F,0xF0,0x11,0x 10,0x1F,0xF0,0x11,0x10,0x1F,0xF0,0x08,0x20,0x7F,0xFC,0x08,0x20,0xFF,0xFE,0x18,0x3 0,0x60,0x0C/*"翼",0*/;code unsigned char dian32=0x01,0x00,0x01,0x00,0x01,0x00,0x

5、3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x02,0x01,0x02,0x00,0x FE,0x00,0x00/*"电 ",0*/;code unsigned char zi32=0x00,0x00,0x3F,0xF0,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00

6、,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00/*"子",0*/;code unsigned char gong32=0x00,0x00,0x3F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x 00,0x00,0x00/*"工",0*/;code unsigned char

7、 zuo32=0x08,0x80,0x0C,0x80,0x09,0x00,0x13,0xFE,0x12,0x80,0x34,0x88,0x50,0x FC,0x90,0x80,0x10,0x80,0x10,0x84,0x10,0xFE,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80/*"作",1*/;code unsigned char shi32=0x02,0x00,0x01,0x00,0x3F,0xFE,0x20,0x04,0x40,0x08,0x3F,0xFC,0x04,0x 00,0x08,0x20

8、,0x1F,0xF0,0x01,0x10,0x01,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xF E,0x00,0x00/*"室",2*/;void main(void) / 主入口函数unsigned char i=0,j=0;for(i=0;i<32;i+)date=yu;将"羽"复制到显示缓存while(1)display_time(2);/ 显示约 2 秒displaymove(yi,6,7);/将从"翼"开始的六个汉字从右

9、向左移动display_time(1);/ 等持约 1 秒displaymovetb(1,0,10); /将点阵上显示的内容向下以 10 的速度移出,补上 0 ,即清空显示屏display_time(1);/ 等待 1 秒displaymovetb(0,yu,10); / 将"羽"字以 10 的速度向上移动displaymovetb(0,yi,10); 将"翼"字以 10 的速度向上移动displaymovetb(0,dian,10);/ 将"电"字以10 的速度向上移动displaym

10、ovetb(0,zi,10);将"子"字以 10 的速度向上移动displaymovetb(0,gong,10);将"工"字以10 的速度向上移动displaymovetb(0,zuo,10);/ 将"作"字以10 的速度向上移动displaymovetb(0,shi,10);的速度向上移动将"室"字以 10displaymovetb(0,0,10);/ 以 10 的速度向上清空display_time(1);displaymovetb(1,yu,10

11、); 下移动void display()/ 显示unsigned char i,ia,j,tmp;DATE_OUT=0XFF;位高电平做准备AB=0;/ 将行数据位清0,准备移位for(i=0;i<16;i+)/ 等待 1 秒/将"羽"字以10的速度向/ 定义变量/置SCK=0;SCLT=0;/ 循环输出 16 行数据/ 为行移位做准备/ 为列锁存做准备for(ia=2;ia>0;)/ 每行 16个点,循环位移两个字节ia-;/ 循环两次tmp=datei*2+ia;/读取点阵数据做输出,这里用到 ia 目的是先读取点阵数据的第二

12、位字节,因一行16 个点由两个字节组成,/ 电路中的移位寄存器最后一位对应最后一列,所以要先输出一行中的第二个字节数据for(j=0;j<8;j+)/ 循环两次,每次移一个字节,SCLH=0;/ 为列移位做准备DATA=tmp&0x01;/ 将数据低位做输出,由电路图可知,移位寄存器的最后一位对应最后一列,因此先移最后一位tmp>>=1;/将数据缓冲右移一位,为下次输出做准备SCLH=1;将DATAk的数据移入寄存器/ 移入单字节结束/ 移入两个字节结束DATE_OUT|=0X14;/ 此句可以用以下两句来理解,如果不将两句合为一句,将

13、出现拖影现像/SCK=1;/SCK拉高,行数据移位,相应行拉低,三极管导通输出电量到相应行点阵管阳极(共阳)/SCLT=1;/SCLT拉高,将数据锁存输出到相应列的点阵发光管显示,显示一行后将保持到下一行显示开始AB=1;/ 行数据位只在第一行时为 0, 其它时候都为1,当将这个0 移入寄存器后,从第一位开始一直移位最后一位,移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0 的出现,否则显示出乱j=64;while(j-);/ 每一行的显示,保持了两字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度SCK=0;/SCK=1;/ 将最后一行数据移出void di

14、splay_time(unsigned int timer)/ 指定时间扫描显示unsigned char i;while(timer-)/ 当 timer=1 时,大约 1 秒时间i=130;while(i-)display();void displaymove(unsigned char *lp,unsigned char c,unsigned chartimer)/显示汉字内容的移动效果,LP指向要显示第一个字的首地址,C表示显示字的个数,/timer 是移动的速度 unsigned char i=0,j=0,ia=0;unsigned int tmp=0,timerc=0;unsign

15、ed char tmp216;c*=2;/ 因一个汉字由 32 字节组成,而移位显示,要分开半个汉字16 字节处理,因此将这里乘以 2for(i=0;i<16;i+)tmp21=0;/ 将缓冲区清0,while(c)/ 循环处理if(lp!=0)当lp指向的地址为0时,直接用组缓冲0补上,效果是将当前显示的内容移出tmp=c%2; / 取余, 目的是为了判断处理汉字的前半部份还是for(i=0;i<16;i+)tmp2=lpi*2+tmp;if(tmp)将地址转到下一个字后半部份/取半个汉字点阵数据, 16 字节/ 当 tmp 为 1 时, 表时一个字数组处理完成,

16、lp+=32;/tmp=8;/ 变量再次利用while(tmp)/循环8 次,是将下一个字的前半部份的字节数据移入显示缓冲ia=0;/ 做为点阵数组的元素for(i=0;i<16;i+)/ 移动是 16行同时移,因此要处理16个字节dateia<<=1;/移当前显示缓冲的前半行字节if(dateia+1&0x80)/判断后半行字节的高位是否为 1 ,是移入前半行字节低位,否则不处理dateia+;ia+;dateia<<=1;/移当前显示缓冲的后半行字节if(tmp2&0x80)/ 判断下一个

17、要显示汉字的前半行字节的高位是否为 1 ,是移入,否则不处理dateia+;ia+;tmp2<<=1;/ 下一个要显示汉字的半行字节向高位移一位,准备下一次取位tmp-;timerc=timer;/处理完16行,调用显示函数更新点阵while(timerc-)/ 循环做为处理的速度,即移动的速度display();/c-;/ 移完一半,进入下一半或下一个汉字,直到结束void displaymovetb(unsigned char din,unsigned char *lp,unsigned chartimer)/上下移动内容, din: 1 为向下, 0为向上,

18、lp 指向要移入的内容,timer 为移动速度unsigned char i=0,j=0,ia=0;unsigned int tmp=0,timerc=0;if(din)/ 判断移动方向,向下ia=32;/ 要移入第一个汉字的数组元素i=16;/ 行索引while(i-)/ 逐行处理j=30;while(j) j-;datej+2=datej;/ 将上一行的内容复制到下一行, 每两行内容相隔四个字节,复制 15 行if(lp=0)/ 最后一行的处理,判断移入的内容是否为空,是用 0 移入date0=0;date1=0;else/ 否则,取字数组处理ia-;date1=lpia;ia-;date0=lpia;timerc=timer;/处理完16行,调用显示函数更新点阵while(timerc-)/ 循环做为处理的速度,即移动的速度display();/ 移动方向,向上/ 向上移动,移入汉字从低位开始else ia=0;for(i=0;i<16;i+

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论