*匠人做的<一条I/O,接6个按键的电路>---将老X彻底打趴下

[复制链接]
15124|56
guzhuangyelao 发表于 2010-3-23 16:57 | 显示全部楼层
有空学习!标记!
yytdragon 发表于 2010-3-24 08:33 | 显示全部楼层
这个普通I/O不能实现的吧...怎样判断阈值呢?
 楼主| xuyiyi 发表于 2010-3-24 08:58 | 显示全部楼层
这个普通I/O不能实现的吧...怎样判断阈值呢?
yytdragon 发表于 2010-3-24 08:33


输入口的阈值有点离散性,但由于所接键较少,A/D精度要求较低,实际并不影响使用,详情请参考匠人的大作,《匠人手记》书中<手记17  用普通I/O口检测模拟值〉之章节,理论和实践都有,详细介绍了用单片机的普通I/O口检测模拟值。
ljm810010 发表于 2010-3-24 17:06 | 显示全部楼层
呵呵,老许跑这边来了,支持一下!
NE5532 发表于 2010-3-24 21:00 | 显示全部楼层
过于追求奇技淫巧,并不是好事情. 系统分析综合能力,才是王道.
dongshan 发表于 2010-3-21 20:28


是呀,走火入魔,就成欧阳峰了。
lenmon650 发表于 2010-3-25 09:53 | 显示全部楼层
匠人快要变成啊莫了~~~~~~~~:lol
mcu_c10g16 发表于 2010-3-30 12:40 | 显示全部楼层
一个普通IO接6个按键,可靠吗?
xfgood3872 发表于 2010-4-7 13:45 | 显示全部楼层
这个题目太牛X了
月下狂想曲 发表于 2010-4-19 21:43 | 显示全部楼层
看到这样的帖子总有点手痒,说点个人的看法

****首先这个方法确实非常巧妙,很有创意****

我没有针对代码进行详细分析,好像是先由上拉电阻判断S1和S2有没有按下,再看S3,S3会让两个IO输入都读到0,最后通过IO1和 ...
sj_dai 发表于 2010-3-21 19:08


如果使用P0的IO口应不会烧芯片吧,片内本来就要上拉电阻才能用的
dengm 发表于 2010-4-22 20:47 | 显示全部楼层
最好在S7上并一个10k 电阻, 用于标定 C1
麻辣鸭脖子 发表于 2010-4-22 22:20 | 显示全部楼层
都是牛人,还这么爱斗计
sanguo147 发表于 2010-4-23 17:15 | 显示全部楼层
shou jiao l
月下狂想曲 发表于 2010-4-30 15:15 | 显示全部楼层
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
sbit IO1=P1^0;
sbit IO2=P1^1;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,};

uchar keybuf,keydat,num;

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)
{

           P2=table[key];
        P0=0xf0;         
}

void main(void)
{
    while(1)
    {
        if(scan_key())
            doanything(read_key());
        delay_ms(10);
    }
}
/*我试了不行,请问有错误吗*/
Liang118038 发表于 2012-9-26 16:27 | 显示全部楼层
AD按钮还是不要用的好,做实验还没什么,真正做产品返修率吓人,除非是想靠维修再敲一笔!
duhemayi 发表于 2012-9-26 19:46 | 显示全部楼层
today_lucky 发表于 2012-9-27 09:45 | 显示全部楼层
changshee 发表于 2012-9-27 20:25 | 显示全部楼层
过于钻牛角尖了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部