|
程序結(jié)構(gòu)問題,不能用delay掃描數(shù)碼管,用中斷掃描,每執(zhí)行中斷一次掃描一位,LCD驅(qū)動(dòng)在主循環(huán)執(zhí)行就不會(huì)干涉,例如8位掃描+鍵盤中斷
/*------------------------------------------------------------------------------
T0 中斷1 延時(shí)、顯示、鍵盤掃描
------------------------------------------------------------------------------*/
void timer0(void) interrupt 1
{
static uchar i,j,key_down,key_count;
TH0 = 0xEE;
TL0 = 0x12;
P0=0x00; //段碼關(guān)閉,避免影響鍵盤(避免位三極管飽和壓降大)
i++; //生產(chǎn)速度計(jì)數(shù)
if(i==4) //2.5ms*4=0.01s時(shí)基
{
i=0;
for(j=0;j<8;j++)//delay[0]-delay[6]每10ms周期減一到零為止
{
if(delay[j]!=0)
{
delay[j]--;
}
}
}
//鍵盤掃描(有按鍵按下后每周期固定P2輸出2.5ms間隔計(jì)數(shù)去抖)
if(key_down!=8)
{
P2=weim[key_down]; //輸出第一次按下的掃描碼
if(P2!=weim[key_down]) //檢測輸入跟輸出不同
{
if(key_count==8) //如果小于8,計(jì)數(shù)+1
{
key[key_down]=1;//否則,按鍵有效
}
else
key_count++;
}
else //檢測輸入跟輸出相同 key_num-- 到零
{
if(key_count!=0) //計(jì)數(shù)不為零
key_count--;
else
{
key[key_down]=0; //按鍵輸出置零
key_down=8; //標(biāo)記置8新一輪每個(gè)檢測
}
}
}
else
{
if(P2!=weim[wei]) //檢測輸入跟輸出不同
key_down=wei; //做標(biāo)記=位碼
}
wei++;
//數(shù)碼管掃描
if(wei==8)
wei=0;
P2=weim[wei]; //置位碼
if(wei!=point) //斷碼加小數(shù)點(diǎn)處理
P0=duan[disp[wei]];
else
P0=duan[disp[wei]]|0x80;
} |
評(píng)分
-
查看全部評(píng)分
|