刚学PIC,不明白一个问题,请教大侠,谢谢先

2020-02-09 11:26发布

是这样的,我想用按键控制灯,按一下,LED亮,按一下灭,PORTC_0脚接按键,PORTD_0接LED.程序如下:
LED#include <pic.h>
#include <pic1687x.h>
#include"delay.h"

void main(void)
{
  unsigned char ID=0;
  TRISD&=~0X01;//所有D0端口输出
  PORTD&=~0X01;//所有D0端口输出低电平
  TRISC=0X00;//
  PORTC|=0X01;//所有C0端口输出高电平
  
while(1){  
         
             if(RC0==0)
          {
            delay_nms(10);  
            if(RC0==0)
              {
               ID++;
              }
          }      
      switch(ID)
      {
       case 1: PORTD=0x01;
       break;
       case 2:  PORTD=0X00;
                ID=0;
       break;
       default:
       break;
      }
   }
}
按道理是要先把PORTC_0这个脚方向置为输入 TRISC=0X01;但结果是按键控制不了,灯一闪一闪的,把它改成TRISC=0X00,就可以了,不知怎么回事,望熟手指点下,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
penny2799
1楼-- · 2020-02-09 13:29
delay_nms(10);按下ID加了好多次,switch分支在一段 时间内会执行=1 =2等就会闪,TRISC=0X00都扫不到键了当然就不闪了


总的来说是你扫键程序不对
lbhj310
2楼-- · 2020-02-09 16:32
楼上正解。delay_nms(10);其实是很短的时间。
harng
3楼-- · 2020-02-09 17:27
 精彩回答 2  元偷偷看……
penny2799
4楼-- · 2020-02-09 17:52
按键上没上拉电阻吧,TRISC=0X00如果能扫到键就是你强行把该端口接到地上去了,小心损坏单片机,要不上个图看看
Yaksa
5楼-- · 2020-02-09 21:31
怎么可能正常,pic的direction和其它mcu不一样,1是input而0是output(1=i 0=o很形象)
你令TRISC=0x00那是输出啊
windingway
6楼-- · 2020-02-10 03:23
5楼说得对,trisc=0x00是PORTC全部为输出状态,无法检测输入变化了。
想让小灯亮灭受按键控制,也就是按键导致输出状态翻转,这样倒是没有必要用switch(ID)函数,按键检测最好能检测松开作为有效,按下-松开,然后翻转PORTD0就行啦。下面的代码可能性,我没验证,我用的不是HiTec的编译器,代码有所差异

trisc0 = 1;
trisd0 = 0;


if(portc0 == 0)
{
   delay_ms(10); //去抖动
   if(portc0 == 0)  //确定有按键按下
   {
     while(portc == 0){} //等待按键松开
     portd0 = !portd0;
   }
}

一周热门 更多>