单片机C语言程序设计实训100例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.12 K1~K4按键状态显示

在本例执行过程中,按下K1或K2键时LED1或LED2点亮,松开时对应的LED熄灭,当按下K3或K4后释放时,LED3或LED4点亮,再次按下并释放时熄灭,如此重复。不同于上一案例的是本例对各按键和LED均单独进行sbit定义,这样便于对它们单独控制。

本例电路如图3-10所示。

图3-10 K1~K4按键状态显示电路

程序设计调试与实训:

由于LED1,LED2是否导通与K1,K2是否按下完全保持一致,因此代码中有语句D1 = K1和D2 = K2,而LED3、LED4是在K3、K4按下并释放后切换显示,因此用K3或K4是否等于0来判断是否按下,用while(K3 == 0)和while(K4 == 0)来等待释放按键,在释放后LED3和LED4分别取反,实现切换显示。

读者可稍加修改代码,使K3或K4按下时随即实现LED切换显示。对于上一案例,读者也可修改代码,使用本例方法对按键进行判断。

源程序代码:

        //-----------------------------------------------------------------
        //  名称: K1~K4按键状态显示
        //-----------------------------------------------------------------
        //  说明: K1,K2按下时LED点亮,松开时熄灭,
        //       K3,K4按下并释放时LED点亮,再次按下并释放时熄灭。
        //-----------------------------------------------------------------
        #include <reg51.h>
        #define uchar unsigned char
        #define uint  unsigned int
        sbit  LED1 = P0^0;
        sbit  LED2 = P0^1;
        sbit  LED3 = P0^2;
        sbit  LED4 = P0^3;
        sbit  K1 = P1^0;
        sbit  K2 = P1^1;
        sbit  K3 = P1^2;
        sbit  K4 = P1^3;
        //-----------------------------------------------------------------
        // 延时
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        {
          uchar i;
          while(x--) for(i = 0; i < 120; i++);
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          P1 = 0xFF;
          P0 = 0xFF;
          while(1)
          {
            LED1 = K1;
            LED2 = K2;
            if( K3 == 0)
            {
                while (K3==0);           //等待释放按键
                LED3 = ~LED3;
            }
            if( K4 == 0)
            {
                while (K4==0);           //等待释放按键
                LED4 = ~LED4;
            }
            DelayMS(10);
          }
        }