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

3.11 K1~K4控制LED移位

在運行本例時,按下獨立按鍵K1~K4鍵,可分別上下控制連接在P0,P2端口的LED移位顯示。

本例電路如圖3-9所示。

圖3-9 K1~K4控制LED移位電路

程序設計調試與實訓:

因為K1~K4連接在P1端口的高4位,本例在識別按鍵時,將P1端口的值分別與0x10、0x20、0x40、0x80進行與操作,如果與其中之一相與后結果為0,則表明對應按鍵按下,這4個數(shù)高4位分別是0001(1)、0010(2)、0100(4)、1000(8)。

每當有鍵按下時,都會立即導致LED移位顯示,但按鍵未釋放時不會形成LED連續(xù)移位顯示,因為按鍵后Recent_Key保存了P1端口的按鍵狀態(tài)信息,在下一個循環(huán)中,如果P1端口的按鍵尚未釋放,則P1與Recent_Key相等,if語句內的代碼不會執(zhí)行,Move_LED函數(shù)不會被調用,LED不會繼續(xù)出現(xiàn)移位顯示。

每當按鍵釋放時,P1變?yōu)?xFF,此時P1與Recent_Key不相等,if語句內的代碼又再次執(zhí)行,Recent_Key也變?yōu)?xFF,Move_LED函數(shù)被調用,但由于Move_LED函數(shù)內部P1 和0x10,0x20,0x40,0x80執(zhí)行與操作時均不等于0,因此不會導致移位顯示。

當再次有鍵按下時,由于P1不等于值為0xFF的Recent_Key,LED繼續(xù)移位顯示,整個程序的執(zhí)行如此重復。

讀者可以思考如果將K1~K4連接在P1端口的低4位時應該如何修改代碼,另外,讀者還可在單只數(shù)碼管顯示0~9的案例中添加按鍵,使按鍵每次按下時切換數(shù)字顯示。

源程序代碼:

        //-----------------------------------------------------------------
        //  名稱: K1~K4控制LED移位
        //-----------------------------------------------------------------
        //  說明: 按下K1時, P0端口LED上移一位
        //       按下K2時, P0端口LED下移一位
        //       按下K3時, P2端口LED上移一位
        //       按下K4時, P2端口LED下移一位
        //-----------------------------------------------------------------
        #include <reg51.h>
        #include <intrins.h>
        #define uchar unsigned char
        #define uint  unsigned int
        //-----------------------------------------------------------------
        // 延時
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        {
          uchar i;
          while(x--) for(i = 0; i < 120; i++);
        }
        //-----------------------------------------------------------------
        // 根據(jù)P1端口的按鍵移動LED
        //-----------------------------------------------------------------
        void Move_LED()
        {
          if    ((P1 & 0x10) == 0) P0 = _cror_(P0, 1);   //K1
          else if((P1 & 0x20) == 0) P0 = _crol_(P0, 1);   //K2
          else if((P1 & 0x40) == 0) P2 = _cror_(P2, 1);   //K3
          else if((P1 & 0x80) == 0) P2 = _crol_(P2, 1);   //K4
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          uchar Recent_Key;          //最近按鍵
          P0 = 0xFE;
          P2 = 0xFE;
          P1 = 0xFF;
          Recent_Key = 0xFF;
          while(1)
          {
              if (Recent_Key != P1)
              {
                Recent_Key = P1;    //保存最近按鍵
                Move_LED();
                DelayMS(10);
              }
          }
        }
主站蜘蛛池模板: 星子县| 左权县| 科技| 新巴尔虎左旗| 垫江县| 高雄市| 奉贤区| 通榆县| 凤山市| 新乐市| 饶河县| 梅河口市| 广德县| 康平县| 武强县| 宜君县| 贵阳市| 双桥区| 东乌珠穆沁旗| 阿拉善左旗| 阿拉善盟| 日照市| 漳平市| 玉溪市| 丰镇市| 白沙| 古田县| 威远县| 方正县| 汉源县| 岫岩| 玉山县| 元氏县| 吉林市| 蛟河市| 灌南县| 桂平市| 高台县| 兴安县| 谢通门县| 孝义市|