官术网_书友最值得收藏!

3.14 K1~K4控制數碼管移位顯示

本例給出不同的識別多位獨立按鍵的方法,并用按鍵控制數碼管的顯示。

本例電路及運行效果如圖3-12所示。

程序設計調試與實訓:

本例用直接與P1端口狀態進行比較的方法識別獨立按鍵,因為P1端口沒有連接其他元件,其狀態相對固定,因此使用這種方法也能很有效地識別獨立按鍵。在顯示數碼時,程序中使用了8位的顯示緩沖Display_Buffer,待顯示的數碼被預先存在Display_Buffer數組中。

讀者可將電路中原有的8位數碼管改為4位數碼管(例如,7SEG-MPX-CA-BLUE),然后修改代碼,在4只集成式數碼管上實現按鍵控制移位顯示。

圖3-12 K1~K4控制數碼管移位顯示電路

源程序代碼

        //-----------------------------------------------------------------
        //  名稱: K1~K4 控制數碼管移位顯示
        //-----------------------------------------------------------------
        //  說明: 按下K1時加1計數并增加顯示位,
        //       按下K2時減1計數并減少顯示位,
        //       按下K3時清零。
        //-----------------------------------------------------------------
        #include <reg51.h>
        #define uchar unsigned char
        #define uint  unsigned int
        //0~9的段碼,0xFF為黑屏
        uchar code  DSY_CODE[] =
        {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
        //位碼
        uchar code DSY_Index[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
        //待顯示到各數碼管的數字緩沖(開始時僅在0位上顯示0,其他數碼管黑屏)
        uchar Display_Buffer[] = {0,10,10,10,10,10,10,10};
        //-----------------------------------------------------------------
        // 延時
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        {
          uchar t;
          while(x--) for(t = 0; t < 120; t++);
        }
        //-----------------------------------------------------------------
        // 顯示
        //-----------------------------------------------------------------
        void Show_Count_ON_DSY()
        {
          uchar i;
          for(i = 0; i < 8; i++)
          {
            P2 = DSY_Index[i];                   //位碼
            P0 = DSY_CODE[Display_Buffer[i]] ;  //段碼
            DelayMS(2);
          }
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          uchar i;
          uchar Key_NO, Key_Counts=0;
          P0 = 0xFF;
          P1 = 0xFF;
          P2 = 0x00;
          while(1)
          {
            Show_Count_ON_DSY();
            P1 = 0xFF;
            Key_NO = P1;
            //P1端口按鍵狀態分別為K1-11111110(0xFE),K2-11111101(0xFD),K3-11111011 (0xFB)
            switch(Key_NO)
            {
              case 0xFE:  Key_Counts++;
                        if (Key_Counts > 8) Key_Counts = 8;
                        Display_Buffer[Key_Counts-1] = Key_Counts;
                        break;
              case 0xFD:  if (Key_Counts > 0) Display_Buffer[--Key_Counts] = 10;
                        if (Key_Counts ==0) Display_Buffer[0] = 0;
                        break;
              case 0xFB:  Display_Buffer[0] = 0;
                        for(i = 1; i < 8; i++) Display_Buffer[i] = 10;
                        Key_Counts = 0;
            }
            //如果按鍵未釋放則僅執行刷新顯示,不進行按鍵掃描
            while (P1 != 0xFF) Show_Count_ON_DSY();
          }
        }
主站蜘蛛池模板: 烟台市| 陆川县| 昌都县| 泰来县| 北票市| 清水县| 大足县| 嵊泗县| 苍南县| 贵州省| 常州市| 宾川县| 宁安市| 射洪县| 西和县| 介休市| 汝城县| 右玉县| 京山县| 延川县| 喀喇沁旗| 昌宁县| 赣榆县| 大石桥市| 彩票| 吉林省| 沽源县| 双流县| 平罗县| 伊宁县| 昆明市| 沙坪坝区| 石柱| 皮山县| 赤水市| 新邵县| 西峡县| 德州市| 新民市| 阜城县| 文成县|