关于PIC16F877A的问题

[复制链接]
3223|4
 楼主| 122356045 发表于 2009-11-14 15:47 | 显示全部楼层 |阅读模式
小子我现在刚刚开始学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--;);     //延时
    }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ddb_21ic 发表于 2009-11-14 22:00 | 显示全部楼层
RB口弱上拉是有,不过软件要使能
 楼主| 122356045 发表于 2009-11-16 09:55 | 显示全部楼层
2# ddb_21ic 现在知道了,是要对OPTION寄存器设置吧,不过这个寄存器的设置有点不明白。
zhaohe2001 发表于 2009-11-16 10:41 | 显示全部楼层
电路有点问题 最好在按键上并联104电容
wxlf0429 发表于 2010-3-12 17:33 | 显示全部楼层
刚学就能写成这样!好厉害!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部