在刚学数码管的时候,都是用的Delay延时函数操作的,但这样的坏处很大, 非常浪费CPU运算时间,故推荐用定时器扫描数码管
code unsigned char Seg_Table[] =
{
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80,0x90,0x8e,0xc1,0xbf,0xff
/*0, 1, 2, 3, 4, 5, 6, 7, 8, 9, F U —, 全灭*/
};
unsigned char Nixie_Buf[]={0,13,13,13,13,13,13,13,13}; //设置缓存区
void Choose(unsigned char n)
{
switch(n)
{
case 4:P2=(P2&0x1f) | 0x80; break;
case 5:P2=(P2&0x1f) | 0xa0; break;
case 6:P2=(P2&0x1f) | 0xc0; break;
case 7:P2=(P2&0x1f) | 0xe0; break;
}
P2&=0x1f;
}
void Nixie_Scan(unsigned char Location,Number)
{
P0=0x01<<(Location-1); //数码管位选
Choose(6);
P0=Seg_Table[Number]; //数码管段选
Choose(7);
}
void Nixie_SetBuf(unsigned char Location,Number)
{
Nixie_Buf[Location]=Number; 设置缓存区里面的值
}
void Nixie_Loop(void) //在中断里面调用
{
static unsigned char i=1;
Nixie_Scan(i,Nixie_Buf[i]); 将缓存区数组的值2ms一一显示出来
i++;
if(i>=9)
{
i=1;
}
}
void Timer1_Init(void) //2ms@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x30; //设置定时初始值
TH1 = 0xF8; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //使能定时器1中断
EA=1;
}
void Timer1_Isr(void) interrupt 3 //2ms进入一次
{
Nixie_Loop(); 2ms扫描一次
}
在主函数调用Nixie_SetBuf()这个函数写入想要的值即可