**
    按键设计一般分为两种:独立按键和矩阵键盘。按键数量较少的用前者,按键数量较多的用后者。虽然两种设计都是操作按键,但是其键盘扫描方式和程序的设计思路是截然不同的。独立按键简单很多,矩阵键盘虽然复杂,只要掌握了本质思路,也没有什么困难之处。

    1、独立按键的处理思路
    一般情况下,独立按键有两个引脚,其中一个通过上拉电阻接到单片机的I/O端口,另外一端接地。也就是说,平时按键没有动作的时候,输出的是高电平,如果有按下动作发生,则输出的是低电平。那么,我们在程序设计的时候,只要扫描跟按键引脚相连的I/O端口,如果发现有低电平产生,则判定该按键处于按下状态。有些时候,电路或者外围有电磁干扰,也会使单片机的I/O端口产生低电平,这种干扰信号会让单片机误认为是按键动作。所以,在扫描按键的时候应该做去抖动处理,把干扰信号过滤掉,从而获得准确的按键状态信号
    #include
    #define u8 unsigned char
    #define s8 char
    #define u16 unsigned int
    #define s16 int
    sbit S7 =P3^0;
    sbit S6 =P3^1;
    sbit S5 =P3^2;
    sbit S4 =P3^3;
    sbit led1=P0^0;
    sbit led2=P0^1;
    sbit led3=P0^2;
    sbit led4=P0^3;
    sbit led5=P0^4;
    sbit led6=P0^5;
    sbit led7=P0^6;
    sbit led8=P0^7;
    void cls_buzz(void)
    {
    P2 = (P2&0x1F|0xA0);
    P0 = 0x00;
    P2 &= 0x1F;
    }
    void htc573(u8 n)
    {
    switch(n)
    {
    case 4:
    P2=(P2&0x1f)|0x80;
    break;

    case 5:
    P2=(P2&0x1f)|0xa0;
    break;
    case 6:
    P2=(P2&0x1f)|0xc0;
    break;
    case 7:
    P2=(P2&0x1f)|0xe0;
    break;
    case 8:
    P2=(P2&0x1f)|0x00;
    break;
    }
    }
    void dealy(u16 t)
    {
    while(t—);
    }
    u8 key=0;
    void anjang()
    {
    if (S7==0)
    {
    dealy(100);
    if(key==0)
    {
    led1=0;
    key=1;
    }
    else if(S7==1)
    {
    led1=0;
    key=0;
    }
    }

    if (S6==0)
    {
    dealy(100);
    if(S6==0)
    {
    led2=0;
    while(S6==1);
    led2=1;
    }
    }
    if (S5==0)
    {
    dealy(100);
    if(S5==0)
    {
    led3=0;
    while(S5==1);
    led3=1;
    }
    }
    if (S4==0)
    {
    dealy(100);
    if(S4==0)
    {
    led4=0;
    while(S4==1);
    led4=1;
    }
    }
    }

    void main()
    {
    cls_buzz();
    htc573(4);
    while(1)
    {
    anjang();
    }
    }
    **