16*64点阵仿真,74HC138做行驱动,74HC595做列驱动,文字上移、下移、静止显示,时钟“:”闪烁;有完整的源程序和仿真文件;
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源码:
- /************16*16LED点阵屏显示*****************/
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit R=P2^0; //595数据输入端口
- sbit CLK=P2^1; //595 时钟信号
- sbit STB=P2^2; // 595锁存端
- uchar cont,num,xs;
- char miao=30,fen=30,shi=12;
- //bit flag;
- char code table[][32]={
-
-
- /////////////////////////////////////////////////////////////////////////
- // 汉字字模表 //
- // 汉字库: 宋体16.dot,横向取模左高位,数据排列:从左到右从上到下 ,对应R=1 else R=0的写法 //
- /////////////////////////////////////////////////////////////////////////
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*"点",*/ 0x02,0x00,0x02,0x00,0x02,0x08,0x03,0xFC,
- 0x02,0x00,0x02,0x10,0x3F,0xF8,0x20,0x10,
- 0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,
- 0x29,0x10,0x24,0xC8,0x44,0x44,0x80,0x04,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*"阵",*/ 0x00,0x80,0x78,0x84,0x4F,0xFE,0x50,0x80,
- 0x50,0xA0,0x61,0x20,0x51,0x28,0x4B,0xFC,
- 0x48,0x20,0x48,0x20,0x68,0x24,0x57,0xFE,
- 0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*"时",*/ 0x00,0x08,0x04,0x08,0x7E,0x08,0x44,0x08,
- 0x47,0xFE,0x44,0x08,0x44,0x08,0x7C,0x88,
- 0x44,0x48,0x44,0x48,0x44,0x08,0x44,0x08,
- 0x7C,0x08,0x44,0x48,0x00,0x28,0x00,0x10,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*"钟",*/ 0x10,0x20,0x10,0x20,0x10,0x20,0x1C,0x24,
- 0x21,0xFE,0x21,0x24,0x7D,0x24,0x91,0x24,
- 0x11,0x24,0xFD,0xFC,0x11,0x24,0x10,0x20,
- 0x14,0x20,0x18,0x20,0x10,0x20,0x00,0x20,
-
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- };
- uchar code tab[][16]={
- 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6, // -0-
- 0xD6,0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x38,0x78,0x18,0x18, // -1-
- 0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18, // -2-
- 0x30,0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C, // -3-
- 0x06,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC, // -4-
- 0xFE,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC, // -5-
- 0x0E,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC, // -6-
- 0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C, // -7-
- 0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C, // -8-
- 0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E, // -9-
- 0x06,0x06,0x06,0x0C,0x78,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // -:-
- 0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- };
- void delay(uint z)
- {
- uint x,y;
- for(x=0;x<z;x++)
- for(y=0;y<110;y++);
- }
- void WriteByte(uchar dat)
- {
- uchar i;
- /* 通过8循环将8位数据一次移入74HC595 */
- CLK = 0;
- for(i = 0; i < 8; i++)
- {
- if(dat & 0x80)
- R = 1;
- else
- R = 0;
- dat = dat << 1;
- CLK = 0;
- _nop_();_nop_();
- CLK = 1;
- }
- }
- void main()
- {
- // uint num;
- uint num,move,speed;
- TMOD |=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- while(1)
- {
- switch(xs)
- {
-
- case 0:
- {
- for(num=0;num<16;num++) //静止显示4个汉字
- {
- WriteByte(~table[7][2*num+1]); //送出一个字节
- WriteByte(~table[7][2*num]);
-
- WriteByte(~table[5][2*num+1]); //送出一个字节
- WriteByte(~table[5][2*num]);
-
- WriteByte(~table[3][2*num+1]); //送出一个字节
- WriteByte(~table[3][2*num]);
-
- WriteByte(~table[1][2*num+1]); //送出一个字节
- WriteByte(~table[1][2*num]);
-
-
- P1=num; //行选
- STB=0; //输出锁存器中的数据
- STB=1;
- delay(1);
- }
- } break;
-
- case 1:
- {
- for(num=0;num<16;num++) //时钟显示88:88:88
- {
- WriteByte(~tab[miao%10][num]); //小时十位
-
- WriteByte(~tab[miao/10][num]); //小时个位
-
- if(cont>=10)
- WriteByte(~tab[10][num]); //显示‘:’号
- else
- WriteByte(~tab[11][num]); //不显
-
- WriteByte(~tab[fen%10][num]); //分钟十位
-
- WriteByte(~tab[fen/10][num]); //分钟个位
-
- if(cont>=10)
- WriteByte(~tab[10][num]); //显示‘:’号
- else
- WriteByte(~tab[11][num]); //不显
-
- WriteByte(~tab[shi%10][num]); //秒钟十位
-
- WriteByte(~tab[shi/10][num]); //秒钟个位
-
- P1=num; //行选
- STB=0;
- STB=1; //输出锁存器中的数据,上升沿
- delay(1);
- }
- } break;
-
- case 2:
-
- {
- if(++speed>4) //移动速度控制
- {
- speed=0;
- move++; //移位
- if(move>16) //是否完成移位一个汉字
- move=0; //从头开始
- }
-
-
- for(num=0;num<16;num++) //上移 显示4个汉字 "点阵时钟" 74HC154+反相器,行高,74HC595 列低 ,数据取反
- {
- WriteByte(~table[7][2*num+1+move*2]); //送出一个字节
- WriteByte(~table[7][2*num+move*2]);
-
- WriteByte(~table[5][2*num+1+move*2]); //送出一个字节
- WriteByte(~table[5][2*num+move*2]);
-
- WriteByte(~table[3][2*num+1+move*2]); //送出一个字节
- WriteByte(~table[3][2*num+move*2]);
-
- WriteByte(~table[1][2*num+1+move*2]); //送出一个字节
- WriteByte(~table[1][2*num+move*2]);
-
- P1=num; //行选
- STB=0; //输出锁存器中的数据
- STB=1;
- delay(1);
- }
-
- } break;
-
- case 3:
-
- {
- if(++speed>4) //移动速度控制
- {
- speed=0;
- move++; //移位
- if(move>16) //是否完成移位一个汉字
- move=0; //从头开始
- }
-
-
- for(num=0;num<16;num++) //上移 显示4个汉字 "点阵时钟" 74HC154+反相器,行高,74HC595 列低 ,数据取反
- {
- WriteByte(~table[7][2*num+1-move*2]); //送出一个字节
- WriteByte(~table[7][2*num-move*2]);
-
- WriteByte(~table[5][2*num+1-move*2]); //送出一个字节
- WriteByte(~table[5][2*num-move*2]);
-
- WriteByte(~table[3][2*num+1-move*2]); //送出一个字节
- WriteByte(~table[3][2*num-move*2]);
-
- WriteByte(~table[1][2*num+1-move*2]); //送出一个字节
- WriteByte(~table[1][2*num-move*2]);
-
- P1=num; //行选
- STB=0; //输出锁存器中的数据
- STB=1;
- delay(1);
- }
-
- } break;
-
- }
- }
- }
- void timer0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
-
- cont++;
- num++;
- if(cont==20)
- {
- cont=0;
- miao++;
- if(miao==60)
- {
- miao=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)
- shi=0;
- }
- }
- }
- if(num==60) //3秒钟换1种显示
- {
- num=0;
- xs++;
- if(xs==4)
- xs=0;
- }
- }
复制代码 完整的文件在附件里面:
16x64 -595 138 -时钟.rar
(304.83 KB, 下载次数: 184)
|