数码管显示:
数码管显示分为段选和位选,数码管段码和位选可以在比赛提供的资源包内ISP软件内获取,以下以共阴为例:
数码管定义和显示函数:**共阴**
unsigned char code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
上面的代码是共阴的代码,板子上的却是共阳的,那么怎么办呢?我们是不是将它取反就可以了。
void Set_Hc573(unsigned char Yx) //锁存器选择
{
P2 &= 0X1F;
P2 |= Yx << 5;
P2 &= 0X1F; //关锁存
}
void Set_SMG(unsigned char Dat) //设置显示
{
P0 = T_COM[Dat]; //位选
Set_Hc573(6); //开位选
P0 = ~ t_display[Dat]; //段选
Set_Hc573(7);
P0 = 0XFF; //消隐
Set_Hc573(7); //开段选
}
void DisPlay() //显示
{
for(i = 0;i >= 8;i ++)
{
Set_SMG(i);
Delay(500); //延时
}
}
定时器配置:
这里只需记住定时器的配置,知道怎么使用就可以了。首先有两个定时器,T0和T1,(也有的单片机有T2),定时器有4种工作方式0,1,2,3;其中最常用的是方式1(16位),其次是方式2(8位自动重装,串口通讯中断会用到)。
定时器需要配置:TMOD |= 0x01;配置成使用定时器0,工作方式为1;同理使用定时器1工作方式1:TMOD |= 0x10;则同时使用两个定时器且工作方式为1,那么可以:TMOD |=0x11;
定时器1配置成工作方式2:TMOD |= 0x20;
接着配置(以定时器0举例):
void Timer0Init(void) //2毫秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x40; //设置定时初始值
TH0 = 0xA2; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
定时器1也是同理的,只不过0要改成1.
接着定时中断函数和优先级:
定时器0:
void Timer0(void) interrupt 1 //默认中断优先级 1
{
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256; //定时器重载
DisPlay();
}
定时器1:
void Timer1(void) interrupt 3 //默认中断优先级 3
{
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256; //定时器重载
DisPlay();
}
注意:定时器0优先级为1,定时器1为3,串口中断优先级为4,总共有5个中断源,后面还会介绍外部中断和串口中断。
数码管动态扫描,显示函数放在定时中断函数里面,2ms扫一次是最稳定的!!