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

3.13 K1~K4分組控制LED

本例區別于前兩種方法,給出了新的識別按鍵的方法,在得出鍵號后分別對LED執行4種不同操作。

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

圖3-11 K1~K4分組控制LED電路

程序設計調試與實訓:

程序將4只按鍵所在的P1端口高4位移到低4位,如果有鍵按下,則這4位中必有一位為0,為便于對這一位0所在位置進行判斷,代碼將其預先取反,然后再右移4位,這樣處理后的8位中,僅低4位中有一位為1,其他7位均為0,接下來的循環在該值不等于全0時累加按鍵號,并將該值向右移位,循環中止時即可得出按鍵號1~4,最后根據按鍵號執行相應操作。

讀者可修改程序代碼,在K1按鍵的長按、短按以及雙擊上實現不同的顯示效果。

源程序代碼:

        //-----------------------------------------------------------------
        //  名稱: K1~K4 分組控制LED
        //-----------------------------------------------------------------
        //  說明:每次按下K1時遞增點亮一只LED,全亮時再按下則再次循環開始,
        //       K2按下后點亮上面4只LED,
        //       K3按下后點亮下面4只LED,
        //       K4按下后關閉所有LED。
        //-----------------------------------------------------------------
        #include <reg51.h>
        #define uchar unsigned char
        #define uint  unsigned int
        //-----------------------------------------------------------------
        // 延時
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        {
          uchar t;
          while(x--)  for(t = 0; t < 120; t++);
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          uchar k,t,Key_State;
          P0 = 0xFF;
          P1 = 0xFF;
          while(1)
          {
            t = P1;
            if (t != 0xFF )
            {
                DelayMS(10);
                //再次檢查按鍵
                if ( t != P1 ) continue;
                //取得4位按鍵值,由模式XXXX1111(X中有一位為0,其他均為1)
                //變為模式0000XXXX(X中有一位為1,其他均為0)
                Key_State = ~t >> 4 ;
                k = 0;
                //檢查1所在位置,累加獲取按鍵號k
                while (Key_State != 0)
                {
                  k++;
                  Key_State >>= 1;
                }
                //根據按鍵號k進行4種處理
                switch(k)
                {
                  case 1:  if (P0 == 0x00) P0 = 0xFF;
                          P0 <<= 1 ;
                          DelayMS(200);
                          break;
                  case 2:  P0 = 0xF0;  break;
                  case 3:  P0 = 0x0F;  break;
                  case 4:  P0 = 0xFF;
                }
            }
          }
        }
主站蜘蛛池模板: 长宁区| 新津县| 巨鹿县| 浑源县| 洪湖市| 施秉县| 科尔| 厦门市| 剑阁县| 新宾| 平陆县| 祁阳县| 罗江县| 都江堰市| 且末县| 通江县| 巴马| 金阳县| 大关县| 海城市| 织金县| 龙游县| 海南省| 安塞县| 高雄市| 温宿县| 千阳县| 毕节市| 江门市| 浙江省| 彭山县| 绵阳市| 阿瓦提县| 麟游县| 桓台县| 荔波县| 襄垣县| 阿克苏市| 博白县| 天峻县| 巫山县|