PIC單片機中斷程序設計技巧
首先,在定時(shí)器中斷里設置一個(gè)lms的時(shí)間基準標志位“SYSlms”,每到lms,“SYSlms”便置位。程序如下:
unsigned char count;
if((ToIETOIF)==1){ //定時(shí)器中斷
TMRO+=0x09; //每250μs中斷一次
if(count==4){
count=0;
SYSlms=l; //系統時(shí)間標志
couot++;
}
T0IF=0; //清除時(shí)鐘中斷標志位
}
有了這個(gè)時(shí)間基準,便可以在主程序里進(jìn)行按鍵去抖處理了。為了更好地利用這個(gè)時(shí)間基準,定義一個(gè)消息標志SYSTime,筆者把它稱(chēng)作時(shí)間消息。為了讓這個(gè)消息有自我發(fā)布和自我消失的功能.定義了如下一個(gè)宏:
bit SYSTime;
#defincTimeEnahle()SYSTime=0,if(SYSlms){SYSTime=l;SYSlms=0;)
可以把TimeEnable()放到主程序死循環(huán)的任何地方,每當程序執行這個(gè)宏,SYSTime就會(huì )清零,這就是標志位的自我消失.如果在定時(shí)器時(shí)間基準標志位SYSlms已經(jīng)置位的話(huà),SYSTime就會(huì )置1,這樣別的程序就可以利用這個(gè)時(shí)間消息了,這就是消息的自我發(fā)布。下面就是利用這個(gè)時(shí)間消息來(lái)進(jìn)行按鍵延時(shí)去抖的,首先看一下按鍵掃描子程序;
void seaakey(){
unsigned char KeyTime,KeyTask;//定義任務(wù)時(shí)間參數、
//任務(wù)參數
switch(KeyTask){
case0:if(key){
KeyTime=30; //準備延時(shí)30 ms
KeyTask++; //準備好下一個(gè)任務(wù)
kcy=0;
}
break;
case I:KeyTime--; //延時(shí)30 ms
if(KeyTime==0)Key+ask++;
break;
case2;if(RB4==o){
//調按鍵處理程序
KeyTask=0;
}
else KeyTask=0;//退出任務(wù)
break;
}
}
在主程序的死循環(huán)中這樣用:
while(1){
TimeEnable();
If(SYSTime==1){scankey();)
//在此可以添加其他程序
只有有時(shí)問(wèn)消息的時(shí)候才執行按鍵掃描程序??梢钥吹?,進(jìn)入掃描程序執行第一次的時(shí)候,程序首先判斷按鍵標志位有沒(méi)有置位,置位的話(huà)(也就是有按鍵按下的話(huà)),任務(wù)時(shí)間參數(KeyTime)賦值為30,這是延時(shí)30ms,去抖,當然你也可以設置為其他的時(shí)間值;同時(shí)任務(wù)參數 (KeyTask)加1。1ms后,再進(jìn)入掃描程序,這個(gè)時(shí)候掃描程序執行casel的語(yǔ)句,這樣30次后(延時(shí)了30ms),任務(wù)參數(KeyTask)加1,值為2。lms后,再進(jìn)入掃描程序,將執行case 2的語(yǔ)句,首先在這里再次判斷是不是按鍵還在按下,如果是就調按鍵的處理程序,如果不是。就退出按鍵掃描程序。在這里,還可以加入按鍵是否抬起的判斷程序。
這樣設計的引腳變化程序,CPU開(kāi)銷(xiāo)小,效率高,不會(huì )出現堆淺溢出的問(wèn)題,提高了系統的實(shí)時(shí)性。
評論