/*****************************************************
本程序的目標(biāo)是這樣的:
1:不使用INTn中斷功能,按鍵接在普通IO上
2:由定時(shí)器T/C2每隔一段時(shí)間檢測(cè)按鍵一次,并具有防抖動(dòng)功能
3:每點(diǎn)擊按鍵一次,在按鍵松開(kāi)后,變量A=A+1
4:如果按鍵按下后不放,則每隔nms就做A=A+1運(yùn)算一次
5:在按鍵按下期間,CPU除了處理按鍵外,還必須能正常運(yùn)行主程序
6:本程序的系統(tǒng)時(shí)鐘是1MHz
*****************************************************/
#include
#include
#include
unsignedcharA,B;
unsignedcharn;
bitstep1,step2,step3,step4;//使用幾個(gè)位變量記憶按鍵狀態(tài)
//***************************************************
interrupt[10]voidTC2_OVF(void)
{
if(n<255)n++;
if(PIND.2==1&&n>8)step1=1;//按鍵松開(kāi)一定時(shí)間后開(kāi)始進(jìn)入可用狀態(tài)
if(PIND.2==0&&step1){step1=0;step2=1;n=0;}//按鍵由可用狀態(tài)進(jìn)入到按下?tīng)顟B(tài)
if(PIND.2==1&&step2){step2=0;step3=1;n=0;}//按鍵由按下?tīng)顟B(tài)進(jìn)入到松開(kāi)狀態(tài)
//-------------------------------------------------
//按鍵按下后...
if(step2)
{
n++;
if(n>60)//如果按下超過(guò)一定時(shí)間
{
A+=1;
n=40;
step4=1;
}
}
//-------------------------------------------------
if(step3)//按鍵松開(kāi)后...
{
step3=0;
if(step4)step4=0;elseA+=1;
}
}
//***************************************************
//www.avrDIY.companxiaoyi
voidmain(void)
{
PORTB&=209;
DDRB|=46;//設(shè)置單片機(jī)的4個(gè)LCD引腳輸出0
lcd_init();//lcd初始化
lcd_cls();//清屏,光標(biāo)回位
DDRD.2=0;
PORTD.2=1;//PD2設(shè)置為輸入,上拉電阻有效(接按鍵)
TCCR2B|=4;//T/C2采用系統(tǒng)時(shí)鐘的64分頻
#asm("sei");//全局中斷使能
TIMSK2"=1;//T/C2計(jì)數(shù)溢出中斷使能
while(1)
{
B+=1;
lcd_gotoxy(12,1);
lcd_putsf("AVRDIY.COM",10);
lcd_gotoxy(15,3);
lcd_putchar(B/100+48);//顯示變量B
lcd_putchar(B/10%10+48);
lcd_putchar(B%10+48);
lcd_gotoxy(52,3);
lcd_putchar(A/100+48);//顯示變量A
lcd_putchar(A/10%10+48);
lcd_putchar(A%10+48);
};
}