新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機實現按健連加減程序

        51單片機實現按健連加減程序

        作者: 時間:2012-10-08 來源:網絡 收藏
        ************************************************************************/
        /********按鍵記數0-99 長按鍵連續加或者連續減實驗******************/
        /********按k1鍵加一,超過一定時間連續加一,加到99后k1在按無效*******/
        /********按k2鍵減一,超過一定時間連續減一,減到00后k2在按無效*******/
        /************************************************************************/

        /****************宏定義*******************/

        #includereg51.h>

        #define uchar unsigned char
        #define uint unsigned int
        #define SEG P2 //段碼
        #define DIG P0 //位碼

        sbit k1=P3^0; //按鍵加1按鈕
        sbit k2=P3^1; //按鍵減1按鈕
        uchar code SegTabl[11] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};
        uchar DispData[8] = {10,10,10,10,10,10,0,0};

        uchar count; //記數
        uchar IntCount; //中斷記數
        uchar keyk1; //k1按下后等待的時間
        uchar keyk2; //k2按下后等待的時間

        void delay(uint); //延時函數
        void key(void); //按鍵判斷函數
        void display(void); //掃描顯示函數

        /****************主程序********************/

        void main(void)
        {
        //**************硬件初始化***********

        //* 使用定時器T0,定時模式,工作方式1;晶振頻率f=22.1184MHz-即1S鐘有22118400個``````
        //晶振脈沖,也就是22118400/12=1843200個機器周期-即1843200個機器周期就是`````````
        //1S;考慮到單片機本身設計成倍頻方式,所以實際上1S是3686400個機器周期。 */`*`

        DIG = 0xff; //關位碼
        TMOD = 0x01; //選用T0定時器,T0為定時方式,工作方式為1````
        TH0 = 0x10; //中斷初值
        TL0 = 0x00; //中斷初值
        EA = 1; //開總中斷
        ET0 = 1; //允許T0中斷
        TR0 = 0; //關閉定時器T0

        //**************超級循環**************

        while(1)
        {
        key(); //調用按鍵判斷函數
        display(); //調用掃描顯示函數
        }
        }

        /****************按鍵掃描*******************/

        void key(void)
        {
        uchar q,w;

        //******k1按鍵掃描******

        if(k1==0) //判斷k1是否按下
        {
        delay(5); //去抖
        if(k1==0) //在判斷k1是否真的按下
        {
        TR0 = 1; //開啟定時器0
        keyk1=0; //k1按鍵按下時間清0
        count++; //k1按下就加一
        while(k1==0) //等待按鍵彈起
        {
        display(); //調用掃描顯示,讓按鍵進入等待時數碼管也顯示
        if(keyk1 >= 2) //k1按鍵按下超過1.5秒連續加一
        {
        if(count!=99) //要顯示的數超過99就不執行下列語句
        {
        for(w=0;w8;w++) //為了使加一的過程變的緩慢一些,以便看的清
        { //如果有需要就改變for語句循環的次數
        display( );
        delay(2);
        display( );
        delay(2);
        display( );
        delay(2);
        display( );
        delay(2);
        display( );
        }
        count++; //上面for循環完畢后記數加一
        }
        }
        }
        }
        }

        //*************k2按鍵掃描************

        if(k2==0)
        {
        delay(5);
        if(k2==0)
        {
        TR0 = 1;
        keyk2 = 0;
        if(count) //記數值為0不執行減一功能
        count--;
        while(k2==0) //等待按鍵彈起
        {
        display(); //調用掃描顯示,讓按鍵進入等待時數碼管也顯示
        if(keyk2 >= 2)
        {
        for(q=0;q8;q++)
        {
        display( );
        delay(2);
        display( );
        delay(2);
        display( );
        delay(2);
        display( );
        delay(2);
        display( );
        }
        if(count) //記數值為0是不執行減一功能
        count--;
        }
        }
        //EA = 0;//關總中斷
        //ET0 = 0;//禁止T0中斷
        TR0 = 0;//關閉定時器T0
        }
        }
        }

        /**************定時器T0中斷程序****************/

        void IntTimer0(void) interrupt 1
        {
        TH0 = 0x10;
        TL0 = 0x00;
        IntCount++; //中斷記數
        if(IntCount == 45) //中斷60次為1秒
        {
        IntCount=0;
        keyk1++; //K1加一
        keyk2++; //k2加一
        }
        }

        /****************掃描顯示******************/

        void display(void)
        {
        uchar i;
        uchar scan = 0xfe;
        if(count >= 99) //超過99或者等于99的只顯示99
        count = 99;
        DispData[6] = count/10;
        DispData[7] = count%10;
        for(i=0;i8;i++) //掃描顯示8位
        {
        SEG = SegTabl[DispData[i]]; //輸出顯示碼
        DIG = scan; //掃描位
        delay(2); //延時
        DIG = 0xff; //關顯示
        scan = (scan1)|0x01; //掃描下一位
        }
        }

        /**************延時****************/

        void delay(uint time)
        {
        uint i;
        uint j;
        for(i=0;itime;i++)
        {
        for(j=0;j130;j++);
        }
        }


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 潮安县| 潢川县| 厦门市| 双桥区| 津南区| 盐池县| 辽宁省| 江安县| 牡丹江市| 图片| 静乐县| 永嘉县| 哈尔滨市| 济南市| 拜泉县| 长春市| 潍坊市| 庆安县| 五寨县| 孟连| 荔浦县| 兴安县| 新巴尔虎右旗| 孟州市| 五寨县| 延长县| 安丘市| 精河县| 修水县| 宁武县| 湘阴县| 特克斯县| 鄱阳县| 财经| 四平市| 云和县| 来凤县| 凯里市| 桑日县| 靖边县| 得荣县|