打印

初学pic,写了一个按键和发光二极管的程序,求指教

[复制链接]
1633|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huyang1015|  楼主 | 2012-9-6 18:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此程序用pic16f877的芯片,管脚改用PORTB和PORTD能够正常实现,不知道为啥886上不行了
#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int
void delay(uint x);
void init();
void scan();

void main()
{
        init();        //初始化
        while(1)
        {
                scan();      //扫描按键
        }
}
void delay(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=110;b>0;b--);
}
void init()
{
        TRISB=0X0F;
        TRISA=0;
        PORTA=0;
}       
void scan()
{
        if(RB0==0)
        {
                delay(10);
                if(RB0==0)
                {
                        while(!RB0);
                        PORTA=0x01;
                }
        }
        if(RB1==0)
        {
                delay(10);
                if(RB1==0)
                {
                        while(!RB1);
                        PORTA=0x02;
                }
        }
        if(RB2==0)
        {
                delay(10);
                if(RB2==0)
                {
                        while(!RB2);
                        PORTA=0x04;
                }
        }
        if(RB3==0)
        {
                delay(10);
                if(RB3==0)
                {
                        while(!RB3);
                        PORTA=0x08;
                }
        }
                               
}
沙发
Ryanhsiung| | 2012-9-6 21:23 | 只看该作者
注意:887与877的IO模拟口寄存器不一致!!
   IO口若有模拟口功能,则初始化状态都为模拟功能。。

使用特权

评论回复
板凳
yimankehao| | 2012-9-7 08:58 | 只看该作者
呵呵,端口初始化的问题。

使用特权

评论回复
地板
yewuyi| | 2012-9-7 09:22 | 只看该作者
此类问题应果断的自己看DATASHEET解决。

使用特权

评论回复
5
mwb0500| | 2012-10-30 10:36 | 只看该作者
对,肯定和模拟口冲突了,要用ANSELX吧,数字量输入的端口置0,才能当数字输入管脚

使用特权

评论回复
6
gaoyang9992006| | 2012-10-30 19:21 | 只看该作者
看手册,把端口都设为模拟功能,然后再使用

使用特权

评论回复
7
dogglove| | 2012-10-31 14:13 | 只看该作者
看datasheet手册,还有,delay(10);这种延时不是很好的解决方法

使用特权

评论回复
8
dogglove| | 2012-10-31 14:22 | 只看该作者
#define  key_input             (0x34&PORTA)  // ?????
#define old_key_input  0x34
#define key_on_off 0x14
#define key_inc  0x24
#define key_dec 0x30
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
void read_key(void)
{
static unsigned  char key_state = 0;
unsigned char key_press, key_return = 0;
unsigned char i;
//unsigned char key_input;
//tt=RC1|RA2|RC0;

key_press =old_key_input&key_input;
//key_press = key_input;
//key_press = key_input; //????
switch (key_state)
{
  case key_state_0: // ??????
       if(key_press!=old_key_input)
        //if(!key_press)
       key_state = key_state_1; //??????????????
       break;
  case key_state_1: //??????
       if(key_press!=old_key_input)
       //if(!key_press)
        {
           

            
            


            key_state = key_state_2; //?????????
         }
       else
            key_state = key_state_0;
       break;
  case key_state_2:
       if(key_press==old_key_input)

         {
         
            
            
               
                  
               
                }
         
       key_state = key_state_0; //???????????????
   
    }
   break;
}

}
我觉得这种方式好一点

使用特权

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

本版积分规则

0

主题

9

帖子

0

粉丝