新聞中心

        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 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 泸溪县| 昌吉市| 大埔县| 原阳县| 平利县| 玉山县| 舟山市| 东源县| 翁牛特旗| 平谷区| 平邑县| 屏东县| 洞头县| 新宾| 东乌珠穆沁旗| 平凉市| 河曲县| 长泰县| 邵东县| 罗定市| 昌宁县| 巴南区| 平原县| 漳平市| 丰原市| 台南县| 通江县| 芦溪县| 容城县| 疏附县| 巨野县| 临西县| 荣昌县| 射阳县| 道孚县| 南平市| 彭州市| 新乐市| 龙泉市| 新化县| 毕节市|