以下程序在 16×16 点阵 LED 上依次显示“梅川酷子”四个字,分别用
正向显示和反向显示,间隔两秒钟变换一次,电路图和效果图下图所示。 AT89
c52 晶振频率为 24MHz,用 T0 定时,改变变量 flag 值,从而让程序确定显示哪
个汉字和显示方式(正向 or 反向)。
#include
或者#include
#define int8 unsigned char
#define int16 unsigned int
#define int32 unsigned long
int8 flag;
/*
flag 变量
MSB 7
6
× ×
5
4
3
2
×
1
0
LSB
Bit5=1,Bit4=0 时,负向显示
Bit5=0,Bit4=1 时,负向显示
Bit[2..0]74HC138 的片选信号
*/
int8 n;
int8 code table[][32]={
{0x88,0x00,0x88,0x00,0x88,0x7F,0x48,0x00,0xDF,0x1F,0xA8,0x10,0x9C,0x1
2,0xAC,0x14,0xEA,0x7F,0x8A,0x12,0x89,0x14,0x88,0x10,0x88,0x7F,0x08,0x
10,0x08,0x14,0x08,0x08},/*"梅",0*/
{0x08,0x20,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x2
1,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x04,0x
21,0x04,0x20,0x02,0x00},/*"川",1*/
{0x00,0x08,0xFE,0x08,0x28,0x0A,0x28,0x7E,0xFE,0x0A,0xAA,0x09,0xAA,0xF
F,0xEA,0x00,0x86,0x00,0x82,0x7E,0xFE,0x42,0x82,0x42,0x82,0x42,0xFE,0x
7E,0x82,0x42,0x00,0x00},/*"酷",2*/
{0x00,0x00,0xF8,0x1F,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x0
1,0x00,0x41,0xFE,0xFF,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x
01,0x40,0x01,0x80,0x00}/*"子",3*/
};
void delay(void);
void main(void){
int8 i;
int8 j;
int8 index;
flag=0x10;
n=0;
//定时器 T0 初始化
TMOD=0x01;
TH0=0xb1;
TL0=0xe0;
ET0=1;
EA=1;
TR0=1;
while(1)
{
index=flag&0x03;
if((flag&0x30)==0x10)
{
//正向显示
for(i=0;i<8;i++)
{ //显示上半屏
P0=table[index][2*i];
//左上
P2=i|0x08;
delay();
P0=table[index][2*i+1];
//右上
P2=i|0x10;
delay();
}
for(i=8;i<16;i++)
{ //显示下半屏
P0=table[index][2*i];
//左下
P2=(i-8)|0x20;
delay();
P0=table[index][2*i+1];
//右下
P2=(i-8)|0x40;
delay();
}
}
if((flag&0x30)==0x20)
{
//反向显示
for(i=0;i<8;i++)
{
P0=~(table[index][2*i]);
//左上
P2=i|0x08;
delay();
P0=~(table[index][2*i+1]);
//右上
P2=i|0x10;
delay();
}
for(i=8;i<16;i++)
{
P0=~(table[index][2*i]);
//左下
P2=(i-8)|0x20;
delay();
P0=~(table[index][2*i+1]);
//右下
P2=(i-8)|0x40;
delay();
}
}
}
}
void delay(void){
int16 i;
for(i=0;i<50;i++);
}
void timer0() interrupt 1 using 3
{
TF0=0;
TH0=0xb1;
TL0=0xe0;
if(n<200)
{
//10ms 中断一次
n++;
}
else
{ //2 秒改变一次
switch(flag)
{
case 0x10:
{
}
{
}
{
}
{
}
{
}
{
}
{
flag=0x11;//下次显示正向“川”
break;
case 0x11:
flag=0x12;//下次显示正向“酷”
break;
case 0x12:
flag=0x13;//下次显示正向“子”
break;
case 0x13:
flag=0x20;//下次显示负向“川”
break;
case 0x20:
flag=0x21;//下次显示负向“梅”
break;
case 0x21:
flag=0x22;//下次显示负向“酷”
break;
case 0x22:
flag=0x23;//下次显示负向“子”
break;