X机密档案 https://bbs.21ic.com/?10254 [收藏] [复制] [RSS]

日志

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

已有 3535 次阅读2006-6-16 12:06 |个人分类:版主原创|系统分类:单片机







//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);
    }
}
//本程序由xwj设计的UltraEdit脚本加亮显示,如需要脚本访问我的Blog发送邮件至:xwjfile@21cn.com



原贴:两条I/O,接六个按键的电路(无附加集成块),欢迎各位排砖.


路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (5 个评论)

回复 无悔 2006-7-13 16:52
支持
回复 早红 2006-11-14 16:48
头晕了! 清楚时再来看!
CG 2006-11-24 17:20
好神奇!创意一流!
回复 ty_21ic 2007-4-12 09:16
我好像在一本电子杂志上看过,是Macrochip公司发表的,当时是和单片机画在一起,外部电路一样,只是说了原理,没有程序. 楼主辛苦了,先收下,谢谢!!! 我想用3个或更多IO口是否能扩展更多的KEY呢?
回复 炎龙 2007-10-7 19:28
的确很有创意
运动 2007-10-24 08:11
顶一下,一个带AD的IO可以做很多按键
回复 PSoC_Rock 2008-7-9 13:15
一个I/O口可实现8,10,12...个键,只要有AD就行了.