基于C语言在点阵上实现 I LOVE U 的动态显示。
本程序是基于STC-51开发板电路实现的。
#include<reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
code unsigned char image[] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3,0xFF,
0x99,0x00,0x00,0x00,0x81,0xC3,0xE7,0xFF,
0x99,0x99,0x99,0x99,0x99,0x81,0xC3,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
}; //图片字模表
void main()
{
ENLED = 0;
ADDR3 = 0; //使能U4(74HC138),选择点阵
TMOD = 0x01; //设置T0为模式1
TH0 = 0xfc;
TL0 = 0x67; //设置定时初值为0xFC67,定时为1ms
TR0 = 1; //打开定时器T0
EA = 1; //打开总中断
ET0 = 1; //打开T0中断
while(1);
}
//定时器T0中断,发生中断时更新图片
void InterruptTimer0() interrupt 1
{
static unsigned char i = 0; //点阵行号
static unsigned char index = 0; //动态图片编号
static unsigned char tmr = 0; //用于200ms定时(每200ms更新一张图片)
TH0 = 0xFC;
TL0 = 0x67; //定时溢出时,重新赋值,保证每次定时为1ms
P0 = 0xFF; //点阵消隐
switch(i)
{
case 0 : ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++;P0 = image[0+index];break; //使第0行点阵数码管正极为高电平,通过P0点亮需要点亮的部分
case 1 : ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++;P0 = image[1+index];break;
case 2 : ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++;P0 = image[2+index];break;
case 3 : ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++;P0 = image[3+index];break;
case 4 : ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++;P0 = image[4+index];break;
case 5 : ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i++;P0 = image[5+index];break;
case 6 : ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;i++;P0 = image[6+index];break;
case 7 : ADDR2 = 1;ADDR1 = 1;ADDR0 = 1;i=0;P0 = image[7+index];break;
default : break;
}
tmr++;
if(tmr>=250)
{
tmr = 0;
index++;
if(index==33)
{
index = 0;
}
}
}
显示效果如图所示: