找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

请教一个单片机io口识别两个按键的问题

查看数: 5736 | 评论数: 8 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-5-8 14:59

正文摘要:

本人菜鸟工程师,最近公司业务给我一个单片机板子。要抄板。 主控室一颗8脚的mcu,丝印被磨掉了。其中一个引脚控制了两个按键。对应原理图如下。 但程序最终还是无法很好的实现功能。 给各位一下参 ...

回复

ID:979299 发表于 2021-12-2 11:25
图上不是一个引脚控制两个按键,是两个按键控制一个引脚,按上面输入高电平,按下面输入低电平。又看到回复S1是一直按下去的,那就一直是高电平了啊,就没有按键的意义了,如果P2.6为低电平按S3没有作用的,如果P2.6为高电平时,S1常通又按S3相当于经R7取得一个中间值,这个值对单片机无用。
ID:966423 发表于 2021-12-2 10:26
你这样还不如直接放AD口,两个电阻不一样的话AD值就不一样了,就可以判断了
ID:587810 发表于 2021-11-10 16:15
识别高低电平就可以了吧
ID:624769 发表于 2021-11-9 18:35
baobao125 发表于 2021-11-9 17:55
就上面的电路,用ADC去判断应该可以吧

用ADC判断就没必要这样接了,这样接明显是没有ADC的IO,不过这个接法有缺陷,虽然IO = 1 可以被接地的按钮拉低, 但是IO = 0, 不是所有的单片机都可以被接VCC的按钮拉高,所以要有通用性的话,还是需要利用电容充放电来确认接VCC的按键有没有按下。
ID:960619 发表于 2021-11-9 17:55
188610329 发表于 2021-11-9 16:06
这东西8年前还是多少年前,STC刚出15系列的时候,倒是研究过。
这个电路,需要加个电容,和下拉电阻,

就上面的电路,用ADC去判断应该可以吧
ID:624769 发表于 2021-11-9 16:06
这东西8年前还是多少年前,STC刚出15系列的时候,倒是研究过。
这个电路,需要加个电容,和下拉电阻,

先用强推挽给电容充电,然后转高阻,读取按键,
如果依然是高,说明接地的按键没有按下,不然电容被放电了。
然后,等待一定时间,(取决于电容和下拉电阻),变低了,说明接VCC的按键也没有按下,反之,接VCC按键按下了。
ID:960619 发表于 2021-11-9 14:57
本帖最后由 baobao125 于 2021-11-9 14:59 编辑
wulin 发表于 2018-5-8 21:02
//使用STC15W104系列
#include
#define uint unsigned int

这样不行,实际电路这样按键S1是一直被按下的状态,P26一下置1一下置0,检测P26才1.5V左右跳动,为何就成了高电平?
ID:213173 发表于 2018-5-8 21:02
//使用STC15W104系列
#include <STC15F2K60S2.H>
#define uint unsigned int
#define uchar unsigned char
sbit key = P3^2;
sbit LED1= P3^3;
sbit LED2= P3^4;

void delay(uint k)//1ms延时
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=114;j>0;j--);
}

void key_scan()//按键扫描程序
{
        P2M1|=0x40;        //P2.6设置高阻
        key=0;                //P2.6置0
        if(key==1)        //判断是否为1,S1按下
        {
                delay(10);//延时       
                if(key==1)//再次判断是否为1,S1按下
                {
                        LED1=0;//LED输出状态
                        LED2=1;
                }
        }
        P2M1&=0xBF; //P2.6设置准双向
        key=1;                //P2.6置1
        if(key==0)        //判断是否为0,S3按下
        {
                delay(10);//延时       
                if(key==0)//再次判断是否为0,S3按下
                {
                        LED1=1;//LED输出状态
                        LED2=0;
                }               
        }
}

void main()
{
        P3M0=0x00;        //初始化P3口准双向
        P3M1=0x00;        //初始化P3口准双向
        LED1=1;                //初始化LED1熄灭
        LED2=1;                //初始化LED2熄灭
        while(1)
        {
                key_scan();//按键扫描
        }
}

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表