C51多汉字显示(16x16点阵)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


汉字左移的时候将涉及到两个汉字,共四个字节 当前面一个汉字向左移还没有超出左边半个汉字的时候,这时 候的移动只会涉及到后面一个汉字的左边字节; 假设目前要显示偏移为y,目前对应的是第x个汉字,构造显示数据 的方法如下(以其中一行为例): (1) 将前面一个汉字的左边字节向左移动y位,并与前面一个汉 字的右边字节向右移动(8-y)位后的结果按位或,所得的结果即 为要显示数据的左边字节; outdata[2*i]=(displaydata[x*32+2*i]<<y)|(displaydata[x*32+2*i+1]>>(8 -y)); (2) 将前面一个汉字的右边字节向左移动y位,并与后面一个汉 字的左边字节向右移动(8-y)位后的结果按位或,所得的结果即 为要显示数据的右边字节; outdata[2*i+1]=(displaydata[x*32+2*i+1]<<y)|(displaydata[((x+1)%nu m)*32+2*i]>>(8-y));
上海电子信息职业技术学院

利用单片机和16×16 点阵LED及驱动电路 构成LED路名显示器。行列扫描、驱动由4 片74LS574电路实现。 向左水平滚动显示指定路名。路名为三或 四个汉字。

80C51
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 ALE WR D0 D1 D2 D3 D4 D5 D6 D7 CE 74LS373

但当前面一个汉字向左移还超出了左边半个汉字的时候,这时 候的移动会涉及到后面一个汉字的左边和右边字节; 假设目前要显示偏移为y(yy=y-8),目前对应的是第x个汉字,构造显 示数据的方法如下(以其中一行为例): (1) 将前面一个汉字的右边字节向左移动yy位,并与后面一个汉 字的左边字节向右移动(8-yy)位后的结果按位或,所得的结果即 为要显示数据的左边字节; outdata[2*i]=(displaydata[x*32+2*i+1]<<yy)|(displaydata[((x+1)%num )*32+2*i]>>(8-yy)); (2) 将后面一个汉字的左边字节向左移动yy位,并与后面一个汉 字的右边字节向右移动(8-yy)位后的结果按位或,所得的结果即 为要显示数据的右边字节; outdata[2*i+1]=(displaydata[((x+1)%num)*32+2*i]<<yy)|(displaydata[( (x+1)%num)*32+2*i+1]>>(8-yy)); (x+1)%num是为了实现循环移动,num是显示的汉字个数

16*16点阵需要32个驱动,分为16个列驱动 及16个行驱动,每个行与每个列可以选中一 个发光管,共有256个发光管,采用动态驱 动方式。每次显示一行,延时后(例如 10ms)再显示下一行。

16*16_CS连接CS3

汉字显示必须使显示器工作于图形方式。 在显示之前,须先建立本系统所需的汉字 库,可直接从国标汉字字符集中用专用软 件或自已编程提取,制作好字库后存在系 统程序区中,由程序逐字节地向图形显示 区相应单元写入,在显示屏上显示出相应 的汉字。




//C语言程序清单: #include<reg51.h> unsigned char volatile xdata RowLow _at_ 0xB002;// 行低八位地址 unsigned char volatile xdata RowHigh _at_ 0xB003;// 行高八位地址 unsigned char volatile xdata ColLow _at_ 0xB000; // 列低八位地址 unsigned char volatile xdata ColHigh _at_ 0xB001; // 列高八位地址 unsigned int bitmask=0x0001; unsigned int base=0x0000; unsigned int num=3; unsigned char code displaydata[]= { 0x01,0x00,0x01,0x00,0x01,0x00,0x3f,0xf8, 0x21,0x08,0x21,0x08,0x3f,0xf8,0x21,0x08, 0x21,0x08,0x21,0x08,0x3f,0xf8,0x21,0x08, 0x01,0x02,0x01,0x02,0x00,0xfe,0x00,0x00,//电 0x00,0x00,0x3f,0xf0,0x00,0x20,0x00,0x40, 0x00,0x80,0x01,0x00,0x01,0x00,0x01,0x04, 0xff,0xfe,0x01,0x00,0x01,0x00,0x01,0x00, 0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,//子 0x00,0x7c,0x3f,0x80,0x02,0x20,0x04,0x20, 0x08,0x40,0x1f,0x80,0x03,0x20,0x0c,0x10, 0x3f,0xf8,0x10,0x8c,0x04,0xa0,0x08,0x90, 0x10,0x88,0x20,0x84,0x42,0x84,0x01,0x00//系 //至此字模插入结束 }; unsigned char outdata[32];
1 采用自编的软件 2 专用的C程序 3 专用的字模软件


系统可以逐个显示多个汉字 系统可以左移显示多个汉字 系统可以上移显示多个汉字


列触发方式采用低电平(0)触发,行触发方式采用高电平(1) 触发 当某点所处的行为1,列为0的时候,该点被点亮
行 列 16 15 14 13 12 11 10 9 8 7 6 5 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 4 3 2 1

只需要将对应汉字的字模数据复制到outdata中, 然后调用显示函数即可
由于多个汉字的字模数据在内存中的存放刚好是连续的,与从上到下是一一对应的, 因此要实现向上移动很简单,每次只需要将要显示的数据(32个字节)从内存中相对于上次 位置向后偏移两个字节(1行)的位置开始选取即可实现。 void upgetCurrentFont(unsigned int rowoffset){ unsigned int x,y; int i; x=rowoffset/16; y=rowoffset%16; for(i=0;i<32;i++){ outdata[i]=displaydata[(x*32+y*2+i)%(num*32)]; } } void upshift(void){ int i=0; for(i=0;i<num*16;i++){ clrscr(); upgetCurrentFont(i); display(30); } }


ห้องสมุดไป่ตู้
列(一次2个字节)的输入是字模数据,左边字节取 反放入高位字节,右边字节取反放入低位字节 行(一次2个字节)的输入是行选通数据,它与汉字 字模的对应关系是从上到下为
0x8000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0 040,0x0020,0x0010,0x0008,0x0004,0x0002,0x0001


void clrscr() { //行驱动低无效 RowLow=(unsigned char)0x00; RowHigh=(unsigned char)0x00; //列驱动高无效 ColLow=(unsigned char)0xff; ColHigh=(unsigned char)0xff; } void lockdisplay() { //行驱动低无效 RowLow=(unsigned char)0x00; RowHigh=(unsigned char)0x00; }
void display(unsigned long delay) { int i,k,j,n; for(k=0;k<delay;k++) { bitmask=0x8000; for(i=0;i<16;i++){ ColLow=~outdata[i*2+1];//~displaydata[offset*32+i*2]; ColHigh=~outdata[i*2];//~displaydata[offset*32+i*2+1]; RowLow=(unsigned char)(bitmask&0x00ff); RowHigh=(unsigned char)((bitmask>>8)&0x00ff); for(j=0;j<20;j++) n=0; lockdisplay(); bitmask=bitmask>>1; } } }
void singleGetCurrentFont(unsigned int offsetChar) { int i; for(i=0;i<32;i++) outdata[i]=displaydata[offsetChar*32+i]; } void main(void) { int i=0; while(1){ for(i=0;i<num;i++) { clrscr(); singleGetCurrentFont(i); display(30); } } }



//C语言程序清单: #include<reg51.h> unsigned char volatile xdata RowLow _at_ 0xB002;// 行低八位地址 unsigned char volatile xdata RowHigh _at_ 0xB003;// 行高八位地址 unsigned char volatile xdata ColLow _at_ 0xB000; // 列低八位地址 unsigned char volatile xdata ColHigh _at_ 0xB001; // 列高八位地址 unsigned int bitmask=0x0001; unsigned int base=0x0000; unsigned int num=3; unsigned char code displaydata[]= { 0x01,0x00,0x01,0x00,0x01,0x00,0x3f,0xf8, 0x21,0x08,0x21,0x08,0x3f,0xf8,0x21,0x08, 0x21,0x08,0x21,0x08,0x3f,0xf8,0x21,0x08, 0x01,0x02,0x01,0x02,0x00,0xfe,0x00,0x00,//电 0x00,0x00,0x3f,0xf0,0x00,0x20,0x00,0x40, 0x00,0x80,0x01,0x00,0x01,0x00,0x01,0x04, 0xff,0xfe,0x01,0x00,0x01,0x00,0x01,0x00, 0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,//子 0x00,0x7c,0x3f,0x80,0x02,0x20,0x04,0x20, 0x08,0x40,0x1f,0x80,0x03,0x20,0x0c,0x10, 0x3f,0xf8,0x10,0x8c,0x04,0xa0,0x08,0x90, 0x10,0x88,0x20,0x84,0x42,0x84,0x01,0x00//系 //至此字模插入结束 }; unsigned char outdata[32];
74LS138 P2.4 P2.5 P2.6 P2.7
A B C E3 E2 E1 Y3 Y1 Y2 Y0 Y4 Y5 Y6 Y7
VCC
74LS574 D0 Q0 D1 Q1 D2 Q2 D3 Q3 D4 Q4 D5 Q5 D6 Q6 D7 Q7 CE
74LS574 D0 Q0 D1 Q1 D2 Q2 D3 Q3 D4 Q4 D5 Q5 D6 Q6 D7 Q7 CE
E1 E2 E3
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
A0 A1
74LS138
A B C Y3 Y2 Y1 Y0 Y4 Y5 Y6 Y7
74LS574 D0 Q0 D1 Q1 D2 Q2 D3 Q3 D4 Q4 D5 Q5 D6 Q6 D7 Q7 CE 74LS574 D0 D1 D2 D3 D4 D5 D6 D7 CE Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7

字模的顺序是从左到右,从上到下 每一行中左八位一个字节,右八位一个字节,每 个字节中高位在左



定义一个32字节的缓冲区outdata 将要显示的内容都放到该缓冲区中 outdata中的第0,2,……,30偏移对应的是汉字的左半边 (从上到下),outdata中的第1,3,……,31偏移对应的是汉 字的右半边(从上到下)
相关文档
最新文档