新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC單片機中斷程序設計技巧

        PIC單片機中斷程序設計技巧

        作者: 時間:2012-12-18 來源:網絡 收藏

        首先,在定時器中斷里設置一個lms的時間基準標志位“SYSlms”,每到lms,“SYSlms”便置位。程序如下:

        unsigned char count;

        if((ToIETOIF)==1){ //定時器中斷

        TMRO+=0x09; //每250μs中斷一次

        if(count==4){

        count=0;

        SYSlms=l; //系統時間標志

        couot++;

        }

        T0IF=0; //清除時鐘中斷標志位

        }

        有了這個時間基準,便可以在主程序里進行按鍵去抖處理了。為了更好地利用這個時間基準,定義一個消息標志SYSTime,筆者把它稱作時間消息。為了讓這個消息有自我發布和自我消失的功能.定義了如下一個宏:

        bit SYSTime;

        #defincTimeEnahle()SYSTime=0,if(SYSlms){SYSTime=l;SYSlms=0;)

        可以把TimeEnable()放到主程序死循環的任何地方,每當程序執行這個宏,SYSTime就會清零,這就是標志位的自我消失.如果在定時器時間基準標志位SYSlms已經置位的話,SYSTime就會置1,這樣別的程序就可以利用這個時間消息了,這就是消息的自我發布。下面就是利用這個時間消息來進行按鍵延時去抖的,首先看一下按鍵掃描子程序;

        void seaakey(){

        unsigned char KeyTime,KeyTask;//定義任務時間參數、

        //任務參數

        switch(KeyTask){

        case0:if(key){

        KeyTime=30; //準備延時30 ms

        KeyTask++; //準備好下一個任務

        kcy=0;

        }

        break;

        case I:KeyTime--; //延時30 ms

        if(KeyTime==0)Key+ask++;

        break;

        case2;if(RB4==o){

        //調按鍵處理程序

        KeyTask=0;

        }

        else KeyTask=0;//退出任務

        break;

        }

        }

        在主程序的死循環中這樣用:

        while(1){

        TimeEnable();

        If(SYSTime==1){scankey();)

        //在此可以添加其他程序

        只有有時問消息的時候才執行按鍵掃描程序。可以看到,進入掃描程序執行第一次的時候,程序首先判斷按鍵標志位有沒有置位,置位的話(也就是有按鍵按下的話),任務時間參數(KeyTime)賦值為30,這是延時30ms,去抖,當然你也可以設置為其他的時間值;同時任務參數 (KeyTask)加1。1ms后,再進入掃描程序,這個時候掃描程序執行casel的語句,這樣30次后(延時了30ms),任務參數(KeyTask)加1,值為2。lms后,再進入掃描程序,將執行case 2的語句,首先在這里再次判斷是不是按鍵還在按下,如果是就調按鍵的處理程序,如果不是。就退出按鍵掃描程序。在這里,還可以加入按鍵是否抬起的判斷程序。

        這樣設計的引腳變化程序,CPU開銷小,效率高,不會出現堆淺溢出的問題,提高了系統的實時性。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 卫辉市| 荣昌县| 黑山县| 乌拉特前旗| 永康市| 罗山县| 东源县| 阳山县| 阳信县| 新乡县| 桃江县| 穆棱市| 侯马市| 舟曲县| 双流县| 四平市| 五家渠市| 温宿县| 罗江县| 原平市| 仪陇县| 繁峙县| 郯城县| 龙州县| 石嘴山市| 孟津县| 娄底市| 乌苏市| 甘孜| 新民市| 铜鼓县| 东安县| 灌阳县| 江口县| 北碚区| 舟山市| 嘉善县| 石柱| 南漳县| 金山区| 洮南市|