基于C语言在8×8点阵实现9到0倒计时牌显示。
每个数之间为1秒间隔,采用定时器实现。
#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[10][8]={
{0xFF,0xC3,0xDB,0xDB,0xC3,0xDF,0xDF,0xC3}, //要显示数字9时,对于的P0值
{0xFF,0xC3,0xDB,0xDB,0xC3,0xDB,0xDB,0xC3},
{0xFF,0xC3,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF}, //要显示数字7时,对于的P0值
{0xFF,0xFB,0xFB,0xFB,0xC3,0xDB,0xDB,0xC3},
{0xFF,0xC3,0xFB,0xFB,0xC3,0xDF,0xDF,0xC3},
{0xFF,0xDB,0xDB,0xDB,0xC3,0xDF,0xDF,0xDF},
{0xFF,0xC3,0xDF,0xDF,0xC3,0xDF,0xDF,0xC3},
{0xFF,0xC3,0xDF,0xDF,0xC3,0xFB,0xFB,0xC3},
{0xEF,0xE7,0xE3,0xE7,0xE7,0xE7,0xE7,0x81},
{0xFF,0xC3,0xDB,0xDB,0xDB,0xDB,0xC3,0xFF}
};
void main()
{
ENLED = 0; //使能点阵
ADDR3 = 0;
EA = 1; //打开中断
ET0 = 1;
TMOD = 0x01; //定时器初始化
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
while(1);
}
void InterrupTimer0() interrupt 1
{
static unsigned long cnt = 0; //ms计数
static unsigned char sec = 0; //s计数
static unsigned char i = 0; //点阵行号
TH0 = 0xFC; //定时器重新赋值,保证每次为1ms
TL0 = 0x67;
cnt++;
if(cnt>=1000)
{
cnt = 0;
sec++;
if(sec>9)
{
sec = 0;
}
}
P0 = 0xFF; //消隐
switch(i)
{
case 0 : ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++;P0 = image[sec][0];break;
case 1 : ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++;P0 = image[sec][1];break;
case 2 : ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++;P0 = image[sec][2];break;
case 3 : ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++;P0 = image[sec][3];break;
case 4 : ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++;P0 = image[sec][4];break;
case 5 : ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i++;P0 = image[sec][5];break;
case 6 : ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;i++;P0 = image[sec][6];break;
case 7 : ADDR2 = 1;ADDR1 = 1;ADDR0 = 1;i=0;P0 = image[sec][7];break;
default : break;
}
}