使用51单片机编写的简单的16*16点阵显示器,能显示任意数字和字母。希望对感兴趣的同学们有一定的帮助!
单片机源程序如下:
- /*****************************
- 16*16点阵显示任意数字和字母
- 移动显示和闪屏显示
- 用5个74HC595控制
- 制作人:秦龙标
- DATE:2014.3.9
- 如果您引用了该代码请注明作者和出处,作者保留所有权
- ******************************/
- #include <stc/stc12c5a60s2.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define xian_gs 25 //要显示数字的个数(实际数为xian_gs-1;因为加了一个空白数在前面)
- #define huancun 33 //显存区大小
- sbit clk=P1^0;
- sbit di=P1^1;
- sbit cr=P1^2;
- uchar code SZ_ZM[]={0x0,0xFF,0xFF,0xF8,0x0F,0xF7,0xF7,0xEF,0xFB,0xEF,0xFB,0xF7,0xF7,0xF8,0x0F,0xFF,0xFF,/*"0",0*/
- …………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
- 0xF7,0xFB,0xEF,0xE3,0xEF,0x9B,0xEF,0x7B,0xEC,0xFB,0xE3,0xFB,0xEF,0xE7,0xFF,0xFF};/*"Z",61*/
-
- uchar code duanx[]={0x0,0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80}; //扫描
- uchar code xian_shu[]={"1aB2c3DABCDEFGHIJKLMNOPQRSTUVWXYZ"}; //要显示的数字和大小写字母
- //uchar code yima[]={"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
- uchar weis=1; //数字移动位置
- bit fa=0; //两种显示方式的转换标志
- uchar xiancun[huancun]; //显示缓存区
- uchar SN; //显示时的第几个数字数
- void delay(uchar x)
- {uchar a,b;
- for(a=x;a<0;a--)
- for(b=1000;b<0;b--);
- }
- void send_byte(uchar num) //595发送数据函数
- {uchar a;
- for(a=0;a<8;a++)
- {
- clk=0;
- di=num&0x80;
- num<<=1;
- clk=1;
- }
- }
- /*uint yimas(uchar ma)
- {uchar a;
- uint temp;
- for(a=0;a<62;a++)
- {
- if(xian_shu[ma]==yima[a])
- {
- temp=a*16;
- }
- }
- return temp;
- }*/
- uint yimas(uchar shu) //用于判断数字和大小字母重新译码并算出在SZ_ZM[]里的地址位置
- {uint sm;
-
- if((xian_shu[shu]>=0x30)&(xian_shu[shu]<=0x39)) //数字判断 重新译码号:0-9 ; 数字的编码是(0x30-0x39)
- {
- sm=(xian_shu[shu]-0x30)*16; //乘以16就是数字在SZ_ZM[]里的地址位置
- }
- if((xian_shu[shu]>=0x41)&(xian_shu[shu]<=0x5a)) //大写字母判断 重新译码号:36-61 ; 大写字母的编码是(0x41-0x5a)
- {
- sm=(xian_shu[shu]-0x41+36)*16;
- }
- if((xian_shu[shu]>=0x61)&(xian_shu[shu]<=0x7a)) //小写字母判断 重新译码号:10-35 ;小写字母的编码是(0x61-0x7a)
- {
- sm=(xian_shu[shu]-0x61+10)*16;
- }
- return sm;
- }
- void zhuan_byte(uint shu,uint shu1) //2个数字数据放进显存
- {uchar a;
- for(a=1;a<17;a++)
- {
- xiancun[a]=SZ_ZM[shu+a];
- xiancun[16+a]=SZ_ZM[shu1+a];
- }
- }
- void display() //显示函数显示显存里面的数据(16byte)
- {uchar a;
- for(a=1;a<9;a++)
- {
- cr=0;
- send_byte(xiancun[a*2-1]);
- send_byte(xiancun[a*2]);
- send_byte(xiancun[16+a*2-1]);
- send_byte(xiancun[16+a*2]);
- send_byte(duanx[a]);
- cr=1;
- delay(1);
- }
- }
- void yidond_diplay() //用向左流动显示
- {uchar a,b;
- uchar a1=1;
- for(a=weis;a<17;a++) //要显示第一个数字的存入显存
- {
- xiancun[a1]=SZ_ZM[yimas(SN)+a1+weis-1]; //要显示的数字乘以16就是该数的的数据地址
- xiancun[16+a1]=SZ_ZM[yimas(SN+1)+a1+weis-1];
- a1++;
- }
-
- for(b=1;b<weis;b++) //第一个数字显示移动后要追加第二个要显示的数字数据存入显存
- {
- xiancun[a1]=SZ_ZM[yimas(SN+1)+b];
- xiancun[16+a1]=SZ_ZM[yimas(SN+2)+b];
- a1++;
- }
- if(SN==xian_gs-1) //消除最后一个数时显示的乱码
- {
- for(a=0;a<huancun;a++)
- xiancun[a]=0xff; //清空缓存区
- }
- weis+=2;
- if(weis>=17)
- {
- weis=1;
- SN++;
- if(SN==xian_gs)
- {
- SN=0;fa=!fa;
- }
- }
- }
- void shan_display() //闪屏显示
- {uchar a;
- for(a=0;a<150;a++)
- zhuan_byte(yimas(SN),yimas(SN+1));
- SN+=2;if(SN>=xian_gs){SN=0;fa=!fa;}
- }
- void main()
- {
- while(1)
- {uchar a;
- if(fa==0)
- shan_display();
- if(fa)
- yidond_diplay();
- for(a=0;a<30;a++)
- {
- display();
- }
- }
- }
复制代码
所有资料51hei提供下载:
16 16点阵显示(任意数字和字母).rar
(80.29 KB, 下载次数: 101)
|