两条I/O,接六个按键的电路(无附加集成块)及配套KeilC程序
2014-11-10
标签: 按键




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


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号