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

3.15 K1~K4控制數碼管加減演示

上一個案例所顯示的最大數字為8,本例重新編寫程序,在數碼管上顯示000~255范圍內的任意整數,而且,在不松開按鍵時,數字會按一定時間間隔持續遞增或遞減。

程序設計調試與實訓:

本例要點在于函數Show_Counts_ON_DSY的編寫,000~255之間的整數要顯示在3位數碼管上時,需要先將待顯示的3位整數分解為3個數位,然后根據它們的值提取對應段碼。

本例固定顯示3個數位,讀者可修改程序,不顯示高位無效的0,如002僅顯示2,039僅顯示39。

源程序代碼:

        //-----------------------------------------------------------------
        //  名稱: K1~K4 控制數碼管加減演示
        //-----------------------------------------------------------------
        //  說明: K1按下后加1計數,
        //       K2按下后減1計數,
        //       K3按下后清零。
        //-----------------------------------------------------------------
        #include <reg51.h>
        #include <intrins.h>
        #define uchar unsigned char
        #define uint  unsigned int
        //0~9的數碼管段碼,最后一個為關閉
        uchar code  DSY_CODE[] =
          {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
        //待顯示的3位數
        uchar Num_Buffer[] = {0,0,0};
        //按鍵代碼,按鍵計數
        uchar Key_Code,Key_Counts=0;
        //-----------------------------------------------------------------
        // 延時
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        {
          uchar t;
          while(x--) for(t = 0; t < 120; t++);
        }
        //-----------------------------------------------------------------
        // 顯示子程序
        //-----------------------------------------------------------------
        void  Show_Counts_ON_DSY()
        {
          uchar i,j = 0x01;
          Num_Buffer[2] = Key_Counts / 100;
          Num_Buffer[1] = Key_Counts / 10 % 10;
          Num_Buffer[0] = Key_Counts % 10;
          for (i = 0;i < 3; i++)
          {
            j = _cror_(j,1);
            P2 = j;
            P0 = DSY_CODE[Num_Buffer[i]] ;
            DelayMS(1);
          }
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          uchar i;
          P0 = 0xFF;
          P1 = 0xFF;
          P2 = 0x00;
          Key_Code = 0xFF;
          while(1)
          {
            Show_Counts_ON_DSY();
            P1 = 0xFF;
            Key_Code = P1;
            //有鍵按下時,數碼管刷新顯示30次,該行代碼同時起到了延時作用
            if (Key_Code != 0xFF)
            for(i = 0; i < 30; i++) Show_Counts_ON_DSY();
            switch(Key_Code)
            {
                case 0xFE: if (Key_Counts < 255) Key_Counts++;  break;
                case 0xFD: if (Key_Counts > 0)   Key_Counts--;  break;
                case 0xFB: Key_Counts = 0;
            }
            Key_Code = 0xFF;
          }
        }
主站蜘蛛池模板: 静乐县| 尉氏县| 驻马店市| 岢岚县| 什邡市| 大宁县| 浦北县| 西青区| 韶关市| 六盘水市| 抚松县| 封开县| 定西市| 鄂伦春自治旗| 邓州市| 资阳市| 鹤庆县| 威信县| 黔西县| 临洮县| 昭通市| 噶尔县| 昌黎县| 保定市| 定西市| 陕西省| 涿州市| 民和| 太保市| 兴和县| 梁河县| 辽阳县| 基隆市| 柘城县| 邮箱| 海南省| 绥中县| 定边县| 福鼎市| 东城区| 响水县|