图上不是一个引脚控制两个按键,是两个按键控制一个引脚,按上面输入高电平,按下面输入低电平。又看到回复S1是一直按下去的,那就一直是高电平了啊,就没有按键的意义了,如果P2.6为低电平按S3没有作用的,如果P2.6为高电平时,S1常通又按S3相当于经R7取得一个中间值,这个值对单片机无用。 |
你这样还不如直接放AD口,两个电阻不一样的话AD值就不一样了,就可以判断了 |
识别高低电平就可以了吧 |
baobao125 发表于 2021-11-9 17:55 用ADC判断就没必要这样接了,这样接明显是没有ADC的IO,不过这个接法有缺陷,虽然IO = 1 可以被接地的按钮拉低, 但是IO = 0, 不是所有的单片机都可以被接VCC的按钮拉高,所以要有通用性的话,还是需要利用电容充放电来确认接VCC的按键有没有按下。 |
188610329 发表于 2021-11-9 16:06 就上面的电路,用ADC去判断应该可以吧 |
这东西8年前还是多少年前,STC刚出15系列的时候,倒是研究过。 这个电路,需要加个电容,和下拉电阻, 先用强推挽给电容充电,然后转高阻,读取按键, 如果依然是高,说明接地的按键没有按下,不然电容被放电了。 然后,等待一定时间,(取决于电容和下拉电阻),变低了,说明接VCC的按键也没有按下,反之,接VCC按键按下了。 |
本帖最后由 baobao125 于 2021-11-9 14:59 编辑 wulin 发表于 2018-5-8 21:02 这样不行,实际电路这样按键S1是一直被按下的状态,P26一下置1一下置0,检测P26才1.5V左右跳动,为何就成了高电平? |
//使用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();//按键扫描 } } |