程序结构问题,不能用delay扫描数码管,用中断扫描,每执行中断一次扫描一位,LCD驱动在主循环执行就不会干涉,例如8位扫描+键盘中断
/*------------------------------------------------------------------------------
T0 中断1 延时、显示、键盘扫描
------------------------------------------------------------------------------*/
void timer0(void) interrupt 1
{
static uchar i,j,key_down,key_count;
TH0 = 0xEE;
TL0 = 0x12;
P0=0x00; //段码关闭,避免影响键盘(避免位三极管饱和压降大)
i++; //生产速度计数
if(i==4) //2.5ms*4=0.01s时基
{
i=0;
for(j=0;j<8;j++)//delay[0]-delay[6]每10ms周期减一到零为止
{
if(delay[j]!=0)
{
delay[j]--;
}
}
}
//键盘扫描(有按键按下后每周期固定P2输出2.5ms间隔计数去抖)
if(key_down!=8)
{
P2=weim[key_down]; //输出第一次按下的扫描码
if(P2!=weim[key_down]) //检测输入跟输出不同
{
if(key_count==8) //如果小于8,计数+1
{
key[key_down]=1;//否则,按键有效
}
else
key_count++;
}
else //检测输入跟输出相同 key_num-- 到零
{
if(key_count!=0) //计数不为零
key_count--;
else
{
key[key_down]=0; //按键输出置零
key_down=8; //标记置8新一轮每个检测
}
}
}
else
{
if(P2!=weim[wei]) //检测输入跟输出不同
key_down=wei; //做标记=位码
}
wei++;
//数码管扫描
if(wei==8)
wei=0;
P2=weim[wei]; //置位码
if(wei!=point) //断码加小数点处理
P0=duan[disp[wei]];
else
P0=duan[disp[wei]]|0x80;
} |