新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機 獨立鍵盤控制

        51單片機 獨立鍵盤控制

        作者: 時間:2016-11-25 來源:網(wǎng)絡 收藏
        鍵盤部分原理圖:



        本文引用地址:http://www.104case.com/article/201611/321310.htm

        歷程里面設計到數(shù)碼管,這個參考前面的文章《51單片機 數(shù)碼顯示數(shù)字》。

        代碼如下: 注釋很詳細。

        //按鍵key1顯示數(shù)字加1,按鍵key2顯示數(shù)字減1,按鍵key3清零,按鍵key4數(shù)字每秒加1.
        #include //頭文件
        #define uint unsigned int //宏定義
        #define uchar unsigned char
        //按鍵標示聲明
        sbit key1=P3^4;
        sbit key2=P3^5;
        sbit key3=P3^6;
        sbit key4=P3^7;
        sbit duanxuan=P2^6;
        sbit weixuan=P2^7;

        uint number; //需要顯示的數(shù)字
        uint time_number; //T0計時器方式一計滿次數(shù)

        void delay(uint); //延時函數(shù)聲明
        void init(); //T0定時器中斷初始化函數(shù)聲明
        void display(uint); //顯示函數(shù)聲明
        void keyscan();//按鍵檢測函數(shù)聲明

        uchar code table[]={ //字符斷碼
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71}; //C語言編碼定義

        void main() //主函數(shù)入口
        {
        init(); //T0定時器方式一中斷初始化
        while(1)
        {
        display(number); //顯示函數(shù)
        keyscan(); //鍵盤掃描函數(shù)
        }
        }
        //延時函數(shù)主體
        void delay(uint s)
        {
        uint i,j;
        for(i=s;i>0;i--)
        {
        for(j=110;j>0;j--)
        {

        }
        }
        }
        //定時器T0方式一中斷初始化函數(shù)主體
        void init()
        {
        TMOD=0x11; //TMOD賦值,確定T0/T1工作方式
        TH0=(65536-46080)/256;//TH0/TL0;TH1/TL1計算初值
        TL0=(65536-46080)%6;
        EA=1; //總中斷打開
        ET0=1; //開T0/T1中斷
        //TR0=1; //TR0/TR1置位,啟動定時器(本程序當key4按下之后TR=1)
        }
        //顯示函數(shù)主體
        void display(uint number0)
        {
        uint no1,no2,no3,no4,no5;
        no1=number0/10000;
        no2=number0000/1000;
        no3=number000/100;
        no4=number00/10;
        no5=number0;
        //數(shù)碼管1顯示 ①送斷碼;②選擇要顯示數(shù)碼管
        duanxuan=1; //打開段選鎖存器
        P0=table[no1]; //送斷碼
        duanxuan=0; //關(guān)閉(鎖住)鎖存器
        P0=0xff; //必不可少的清屏
        weixuan=1; //打開位選鎖存器
        P0=0xfe; //選擇數(shù)碼管
        weixuan=0; //關(guān)閉鎖存器
        delay(2); //延時
        //數(shù)碼管2顯示
        duanxuan=1;
        P0=table[no2];
        duanxuan=0;
        P0=0xff;
        weixuan=1;
        P0=0xfd;
        weixuan=0;
        delay(2);
        //數(shù)碼管3顯示
        duanxuan=1;
        P0=table[no3];
        duanxuan=0;
        P0=0xff;
        weixuan=1;
        P0=0xfb;
        weixuan=0;
        delay(2);
        //數(shù)碼管4顯示
        duanxuan=1;
        P0=table[no4];
        duanxuan=0;
        P0=0xff;
        weixuan=1;
        P0=0xf7;
        weixuan=0;
        delay(2);
        //數(shù)碼管5顯示
        duanxuan=1;
        P0=table[no5];
        duanxuan=0;
        P0=0xff;
        weixuan=1;
        P0=0xef;
        weixuan=0;
        delay(2);
        }
        void keyscan() //按鍵檢測函數(shù)主體
        {
        if(key1==0) //檢測key1按下
        {
        delay(10); //延時10us
        if(key1==0)//檢測鍵盤依然是按下的
        {
        number++;//顯示數(shù)字加1
        if(number==10000)//如果記滿10000
        {
        number=0; //清零重新開始
        }
        while(!key1); //等待按鍵放下
        }
        }
        if(key2==0)
        {
        delay(10);
        if(key2==0)
        {
        number--;
        if(number==0)
        {
        number=10000;
        }
        while(!key2);
        }
        }
        if(key3==0)
        {
        delay(10);
        if(key3==0)
        {
        number=0;
        while(!key3);
        }
        }
        if(key4==0)
        {
        delay(10);
        if(key4==0)
        {
        while(!key4);
        TR0=~TR0;
        }
        }
        }
        //T0定時器方式一中斷服務函數(shù)主體
        void R0_Time_no1() interrupt 1
        {
        TH0=(65536-46080)/256;//預裝值
        TL0=(65536-56080)%6;
        time_number++; //記滿次數(shù)
        if(time_number==20) //20次為1s
        {
        time_number=0;
        number++;
        if(number==10000)
        {
        number=0;
        }
        }
        }

        以上,結(jié)束。



        關(guān)鍵詞: 51單片機獨立鍵盤控

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 嘉义市| 连州市| 衡水市| 长葛市| 黄骅市| 巴青县| 陵水| 山丹县| 瑞金市| 桑植县| 阜阳市| 衡山县| 鹤山市| 常宁市| 兖州市| 寿宁县| 福州市| 鞍山市| 沁源县| 阳原县| 酒泉市| 中山市| 昌图县| 威信县| 即墨市| 慈溪市| 商南县| 宝山区| 拉萨市| 涟水县| 上林县| 千阳县| 扎赉特旗| 许昌县| 云安县| 广东省| 谷城县| 宁都县| 合山市| 陆川县| 墨竹工卡县|