本程序通过时间定时器产生中断,每10ms刷新一次字符,每2S更新一个汉字。
单片机源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define unit unsigned int
- sbit DS=P2^0; //595第14脚 串行数据输入端
- sbit SH_CP=P2^1; //595第11脚 移位脉冲
- sbit ST_CP=P2^2; //595第12脚 并出脉冲
- sbit EN_154=P2^3;
- unsigned int i;
- unsigned char code tab[][32]=
- {
- {0xDF,0xDB,0xDB,0xDB,0x01,0xDC,0xDD,0xDF,0xDF,0x00,0xDF,0xDD,0xD3,0x5F,0xDF,0xFF,
- 0xFF,0xF7,0xB7,0x7B,0x80,0xFD,0xBE,0xBF,0xDF,0xEC,0xF3,0xEB,0xDD,0xBE,0x07,0xFF},
- {0x7F,0x9B,0xD3,0xCB,0xDB,0xDB,0x13,0xCD,0xDD,0xDD,0xCD,0xD1,0xDC,0x5D,0x9F,0xFF,
- 0xFF,0xBE,0xDE,0x6E,0x76,0x78,0xB2,0xAA,0xDA,0xDA,0xAA,0xB2,0x7E,0x7F,0x7F,0xFF},
- {0xFD,0x1D,0xDD,0xDD,0xC1,0x7F,0x7F,0x00,0x7F,0x5F,0x6F,0x77,0x79,0x7F,0x7F,0xFF,
- 0xFF,0xBC,0x7D,0xBD,0xC1,0xFF,0xFF,0x00,0xBF,0xDE,0xF9,0xF7,0xEF,0xDF,0xBF,0xFF},
- {0xF7,0x77,0x77,0x00,0x77,0x57,0xEF,0x17,0xD8,0xDB,0x1B,0xCB,0xD3,0x1F,0xFF,0xFF,
- 0xF7,0xF7,0xF7,0x00,0xF7,0xF7,0xFF,0xC0,0xBD,0xBD,0xBC,0xBD,0xBD,0xBC,0x8F,0xFF}
- };
- void delay_ms(unsigned int ms)
- {
- unsigned int j;
- while(ms--);
- for(j=0;j<10;j++);
- }
- void WriteByte(unsigned char dat)
- {
- unsigned int k;
- for(k=0;k<8;k++) //按照低位到高位的顺序传递数据
- {
- dat=dat>>1; //数据右移,低位先出
- DS=CY;
- SH_CP=0;
- SH_CP=1;
- SH_CP=0;
- }
- }
-
- void main()
- {
- EA=1; //使能总中断
- TMOD=0x01; //设置T0为模式1
- TH0=0xFC; //为T0赋初值,12M晶振下,定时1ms
- TL0=0x18;
- ET0=1; //使能T0中断
- TR0=1; //启动T0
- while(1);
- }
- //定时器0中断服务函数
- void InterruptTimer0() interrupt 1
- {
- static unsigned int i=0; //动态扫描的索引
- static unsigned int index=0; //文字更新索引,等于要显示的字数
- static unsigned int tmr=0; //2s软件定时器
-
- //重新加载初值。本程序定时时间的想法是:每1ms刷新一次字符,每2S更新一个汉字
- TH0 = 0x0FC;
- TL0 = 0x18;
- if(i<16)
- {
- EN_154=1;
- WriteByte(tab[index][i]);
- WriteByte(tab[index][i+16]);
- ST_CP=0;
- ST_CP=1;
- delay_ms(1);
- ST_CP=0;
- P1=i;
- EN_154=0;
- i++;
- }
- else
- {
- i=0;
- }
- tmr++; //下面代码完成2s改变一个文字
- if(tmr>=2000)
- {
- tmr=0;
- index++;
- if(index>3)
- {
- index=0;
- }
- }
- }
复制代码
所有资料51hei提供下载:
16X16点阵轮换显示多个汉字程序.rar
(203.21 KB, 下载次数: 22)
|