小子我现在刚刚开始学PIC,在用877A的RB0-RB4做个按键检测遇到了疑问:在无按键按下,或者按下松开后在数码管经常出现乱显示的。后来在RB0-RB4口上加了20K的上拉电阻后就好了。我想问下,RB口本来不就有若上拉了吗,是不是在作为输入口后就没有上拉,必须在外部硬件上作上拉,还是可以通过程序来解决呢?
下面是我写的程序,接口线路:
//实验目的:熟悉按键的判断
//数码管无按键按下时显示“FF”,有按键按下时显示按键的编号
//硬件要求:拨码开关S1全部置ON
// 拨码开关S6全部置ON,S5第5-6位置ON,其他位置OFF
// 其他拨码开关置OFF
#include<pic.h> //包含单片机内部资源预定义
__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
int result;
void delay(); //delay函数申明
void init(); //I/O口初始化函数申明
void scan(); //按键扫描程序申明
void display(); //显示函数申明
//------------------------------------------------
//主程序
void main()
{
while(1) //死循环
{
init(); //调用初始化函数
scan(); //调用按键扫描程序
display(); //调用结果显示程序
}
}
//------------------------------------------------
//初始化程序
void init()
{
result=0;
ADCON1=0X07; //设置A口为普通I/O口
TRISA =0X0F; //设置A口高2位为输出,低4位为输入
TRISB=0X1F; //设置B口B0--B4为输入
PORTA=0XFF;
TRISD=0X00; //设置D口全部为输出
PORTA=0XFF;
PORTD=0XFF; //先关闭所有显示
}
//------------------------------------------------
//按键扫描程序
void scan()
{
if(RB0==0) //判断B0是否按下
{
result=1;
return;
}
if(RB1==0) //判断B1是否按下
{
result=2;
return;
}
if(RB2==0) //判断B2是否按下
{
result=3;
return;
}
if(RB3==0) //判断B3是否按下
{
result=4;
return;
}
if(RB4==0) //判断B4是否按下
{
result=5;
return;
}
}
//-------------------------------------------------
//结果显示程序
void display()
{
int y;
if(result==1)
{
for(y=0;y<10;++y)
{
PORTD=0XC0;PORTA=0X2F;delay();PORTD=0X83;PORTA=0X1F;delay(); //B0
}
}
if(result==2)
{
for(y=0;y<10;++y)
{
PORTD=0XF9;PORTA=0X2F;delay();PORTD=0X83;PORTA=0X1F;delay(); //B1
}
}
if(result==3)
{
for(y=0;y<10;++y)
{
PORTD=0XA4;PORTA=0X2F;delay();PORTD=0X83;PORTA=0X1F;delay(); //B2
}
}
if(result==4)
{
for(y=0;y<10;++y)
{
PORTD=0XB0;PORTA=0X2F;delay();PORTD=0X83;PORTA=0X1F;delay(); //B3
}
}
if(result==5)
{
for(y=0;y<10;++y)
{
PORTD=0X99;PORTA=0X2F;delay();PORTD=0X83;PORTA=0X1F;delay(); //B4
}
}
if(result==0)
{
for(y=0;y<10;++y)
{
PORTD=0X80;PORTA=0X2F;delay();PORTD=0X80;PORTA=0X1F;delay(); //88
}
}
}
void delay()
{
int z; //定义整形变量
for(z=0x100;z--;); //延时
}
|