PIC 单片机判断按键 pic16F886
我的按键没有接上拉电压,想法是先将端口设置为输出,并输入1 ,在读取这个脚的电压,如果为0了,说明按下了,如果还是1那就是还没有按下。
TRISB0=0;
RB0=1
if(RB0==0)
{
//....
}
//但这样不论我按没按下,单片机都会执行if中的句子(换成while也一样),很郁闷。
第1个回答 2012-04-10
你的端口设置为输出的,那么输入就为高阻态是没有办法读取数据的。
RB口没有上拉电阻可以配置RBPU位,使RB为弱上拉,端口要配置位输入,才可以读去该口的值。PIC单片机按键设计时最好是要上拉,按键按下就接地,按下读取数值为低。如果把端口悬空,按键按下才接高电平,认为不按时没有接高电平,没有输入为低电平,这样也是错的,因为单片机引脚悬空读取的数值也为高电平,这样按下和没有按下都是高电平。
追问谢谢,但如果使用弱上拉的话我这样写
TRISB0=1;
WPUB0=1;
RBPU= 1;
RB0口还是为0 不知道为什么
追答查了下,你这个单片机B口设置为弱上拉为RBPU,这个参数在OPTION寄存器里面,是低电平有效,RBPU=0时使能B口弱上拉。如果外面没有上拉电阻,B口作为I/O口输入和输出都要设置RBPU为弱上拉,否则还是0.
TRISB0=1;
RBPU=0;
你的按键是接地的吧,就是说按键没有按下时RB0是悬空的,这个时候读取是高电平,按下时RB0就接地了吧
if(RB0==0)
{
//去抖;
}
第2个回答 2012-04-10
PIC单片机内部有弱上拉的,所以你应该设置为输入模式。如果RB0是具有ADC功能的话,同时不要忘记设置ADC管脚设置寄存器(ANSEL),把这个管脚设置为数字I/O口模式 ,
你之前设置的是输出模式,PIC单片机的高电平是可以大电流输出的,也就是说你之前按键的时候,管脚直接拉到地,是有烧坏引脚的可能性的,所以如果你还不行的话,建议你换一个单片机试试。
第3个回答 推荐于2016-06-29
WPUB<7:0>: Weak Pull-up Register bit
1 = Pull-up enabled
0 = Pull-up disabled
WPUB寄存器是设置PORTB引脚弱上拉的,相关位置1就会开启对应引脚的内部弱上拉功能。
你改成下面的试一下。
TRISB0=1;
WPUB0=1;
if(RB0==0)
{
//....
}
追问TRISB0=1;
WPUB=1;
RBPU=1;
RB0还是为0 是不是我的这个坏了,但是改为输出,是可以输出高电平的。
追答查一下ANSELH寄存器的BIT4是否为1,为1的话会导致读RB0的值为0的。ANSELH寄存器POR后的默认值是有用位置1的,如果你没有对ANSELH寄存器清零,那可能就是这个原因。
本回答被提问者采纳
第4个回答 2012-04-09
你设置方向错了!
既然是按键,这个引脚就是输入,所以要用:
TRISB0=1;
由于RB0为输入,此时,你写RB0=1是没用的,这是高还是低,由外部电路决定的,当然你可以用内部弱上拉的办法让它在没有按键时为高电平。
这个说来有点复杂,请看北航的《PIC16系列单片机C程序设计与PROTEUS仿真》一书。
追问内部弱上拉的办法让它在没有按键时为高电平。
能继续指点下,或者给个代码看看吗,大侠。
Warning: Invalid argument supplied for foreach() in /www/wwwroot/aolonic.com/skin/templets/default/contents.html on line 45
相似回答