原创 两条I/O,接六个按键的电路(无附加集成块)及配套KeilC程序

2007-2-26 10:17 3247 8 8 分类: MCU/ 嵌入式

//6keyfor2io.c
//
//昨日网友啊龙发布了一个《两条I/O,接六个按键的电路(无附加集成块)》
//思路非常巧妙,仅用2个IO就可区分出无键和6个单独按键共7种状态,
//不过论坛上好像有许多人没搞清怎么去区分出这些状态,
//故针对该电路写了个配套的按键检测程序,希望大家喜欢!
//如有疑问也可发送邮件至:xwjfile@21cn.com讨论
//                                  xwj    2006/06/16
#include <REG52.H>
#define uchar unsigned char


sbit IO1=P1^6;
sbit IO2=P1^7;
uchar keybuf,keydat;
bit bkeyok;


void delay_us(unsigned int n)
{
    while(--n);
}


void delay_ms(unsigned int n)
{
    do
    {
        delay_us(1000);
    }
    while(--n);
}


bit scan_key(void)
{
    uchar tempkey;
    IO1=1;IO2=1;
    if(!IO1)
    {
        if (!IO2)
            tempkey="3";
        else
            tempkey="2";
    }
    else
    {
        if (!IO2)
            tempkey="1";
        else
        {
            IO1=0;
            if (!IO2)
            {
                IO1=1;IO2=0;
                if (!IO1)
                    tempkey="4";
                else
                    tempkey="6";
            }
            else
            {
                IO1=1;IO2=0;
                if (!IO1)
                    tempkey="5";
                else
                    tempkey="0";
            }
               
        }
    }
    IO1=1;IO2=1;
    if((keybuf !=0) && (keybuf == tempkey))
    {
        bkeyok="1";
        keydat="tempkey";
    }
    keybuf="tempkey";
    return(bkeyok);
}


uchar read_key(void)
{
    bkeyok="0";
    return(keydat);
}


void doanything(uchar key)
{
    //----------按键处理只有有按键并正确消抖时才会进入,功能自己随便写
    ;           
}


void main(void)
{
    while(1)
    {
        if(scan_key())
            doanything(read_key());
        delay_ms(10);
    }
}
点击看大图 

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条