发新帖我要提问
123
返回列表
打印

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

[复制链接]
楼主: xuyiyi
手机看帖
扫描二维码
随时随地手机跟帖
41
有空学习!标记!

使用特权

评论回复
42
yytdragon| | 2010-3-24 08:33 | 只看该作者
这个普通I/O不能实现的吧...怎样判断阈值呢?

使用特权

评论回复
43
xuyiyi|  楼主 | 2010-3-24 08:58 | 只看该作者
这个普通I/O不能实现的吧...怎样判断阈值呢?
yytdragon 发表于 2010-3-24 08:33


输入口的阈值有点离散性,但由于所接键较少,A/D精度要求较低,实际并不影响使用,详情请参考匠人的大作,《匠人手记》书中<手记17  用普通I/O口检测模拟值〉之章节,理论和实践都有,详细介绍了用单片机的普通I/O口检测模拟值。

使用特权

评论回复
44
ljm810010| | 2010-3-24 17:06 | 只看该作者
呵呵,老许跑这边来了,支持一下!

使用特权

评论回复
45
NE5532| | 2010-3-24 21:00 | 只看该作者
过于追求奇技淫巧,并不是好事情. 系统分析综合能力,才是王道.
dongshan 发表于 2010-3-21 20:28


是呀,走火入魔,就成欧阳峰了。

使用特权

评论回复
46
lenmon650| | 2010-3-25 09:53 | 只看该作者
匠人快要变成啊莫了~~~~~~~~:lol

使用特权

评论回复
47
mcu_c10g16| | 2010-3-30 12:40 | 只看该作者
一个普通IO接6个按键,可靠吗?

使用特权

评论回复
48
xfgood3872| | 2010-4-7 13:45 | 只看该作者
这个题目太牛X了

使用特权

评论回复
49
月下狂想曲| | 2010-4-19 21:43 | 只看该作者
看到这样的帖子总有点手痒,说点个人的看法

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

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


如果使用P0的IO口应不会烧芯片吧,片内本来就要上拉电阻才能用的

使用特权

评论回复
50
dengm| | 2010-4-22 20:47 | 只看该作者
最好在S7上并一个10k 电阻, 用于标定 C1

使用特权

评论回复
51
麻辣鸭脖子| | 2010-4-22 22:20 | 只看该作者
都是牛人,还这么爱斗计

使用特权

评论回复
52
sanguo147| | 2010-4-23 17:15 | 只看该作者
shou jiao l

使用特权

评论回复
53
月下狂想曲| | 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);
    }
}
/*我试了不行,请问有错误吗*/

使用特权

评论回复
54
Liang118038| | 2012-9-26 16:27 | 只看该作者
AD按钮还是不要用的好,做实验还没什么,真正做产品返修率吓人,除非是想靠维修再敲一笔!

使用特权

评论回复
55
duhemayi| | 2012-9-26 19:46 | 只看该作者
高深

使用特权

评论回复
56
today_lucky| | 2012-9-27 09:45 | 只看该作者
MARK

使用特权

评论回复
57
changshee| | 2012-9-27 20:25 | 只看该作者
过于钻牛角尖了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则