打印

关于PIC16F877A的问题

[复制链接]
2299|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--;);     //延时
    }

未命名.jpg (576.05 KB )

未命名.jpg

相关帖子

沙发
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电容

使用特权

评论回复
5
wxlf0429| | 2010-3-12 17:33 | 只看该作者
刚学就能写成这样!好厉害!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

17

帖子

0

粉丝