#include <reg51.h> #include <absacc.h> #define unit unsigned int #define uchar unsigned char sbit L0=P0^0; sbit L1=P0^1; sbit L2=P0^2; sbit L3=P0^3; void delays(void) { uchar i; for(i=300;i>0;i--); } void main(void) { P1=0x00; // 初始化端口 EA=1; IT0=1; EX0=1; // 初始化外中斷標(biāo)志位 while(1) { delays(); // 鍵的消抖延時(shí)函數(shù) } } /* 外中斷0的中斷服務(wù)子程序 */ void intersvr0(void) interrupt 0 using 1 { L3=!L3; // 燈L3狀態(tài)取反 L2=!L2; // 燈L2狀態(tài)取反 L1=!L1; // 燈L1狀態(tài)取反 L0=!L0; // 燈L0狀態(tài)取反 }
,自己頂一下
我在開發(fā)板上試驗(yàn)了了一下你這個(gè)程序,存在的問題是你沒有做按鍵的消抖處理,所以導(dǎo)致整個(gè)程序很不穩(wěn)定,按下了中斷按鍵燈有點(diǎn)亂來.
給你一個(gè)解決辦法:
當(dāng)用外部中斷的方法實(shí)現(xiàn)按鍵的檢測(cè)時(shí),由于存在按鍵抖動(dòng),這樣我們?cè)诎聪掳存I時(shí),會(huì)出現(xiàn)多次進(jìn)入中斷的現(xiàn)象,最好的解決辦法是在程序中我們進(jìn)行相應(yīng)的處理:
void int_key() interrupt 0//外部中斷1服務(wù)程序
{
EX0=0;//關(guān)外部中斷1
delay_ms(100);
if(s1==0) //s1是外部中斷對(duì)應(yīng)的IO口
{
s1_num++; //這里是用戶自己編寫的程序
s1_num%=4;//這里是用戶自己編寫的程序
di();//這里是用戶自己編寫的程序
}
while(!s1);
EX0=1;//開外部中斷
}
delay_ms(100),if(s1==0)是必需要有的,延時(shí)是為了消抖,if(s1==0)是為了看看延時(shí)后是否還為低電平,如果還為低電平那確實(shí)是按下按鍵了,并且這樣可以有效地做到一次按鍵只進(jìn)入一次中斷,當(dāng)然delay_ms(100)這個(gè)延時(shí)時(shí)間不能太長,否則正常的按鍵也會(huì)在延時(shí)后,因?yàn)闀r(shí)間太長手已經(jīng)松開變?yōu)楦唠娖剑袛噱e(cuò)誤。這個(gè)中斷是下降沿觸發(fā)。
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |