【已解决】pic16lf1823单片机引脚初始化问题

2019-03-25 18:50发布

本帖最后由 Tobey 于 2017-3-22 12:10 编辑

       和室友写了个简单的LED翻转程序,触摸感应区时翻转LED状态,由于LED输出电平在单片机初始化后是随机的,想让LED灯一开始是绿灯亮,之后再进行翻转操作,然而只要在进入循环前对LED引脚进行配置,程序运行结果就不对:触摸时LED状态翻转,随即又恢复至原来状态~~~若在进入循环前不对LED引脚进行配置,那么程序运行就正常,但是LED灯的初始状态就成随机的了,据说这段程序从开始就是错误的~~~然而我们还是没找到问题的出处,,

相关原理图:
QQ图片20170321211801.png 123.png

代码:
  1. #include<pic16LF1823.h>
  2. void main()
  3. {        
  4.         static bit led_status;                 //定义一个静态的位变量
  5.         ANSELC=0;
  6.     TRISCbits.TRISC1=0;                        // 配置LED引脚为输出
  7.         PORTCbits.RC1 = 1;                  // 去除这行代码则LED翻转正常~~~
  8.         TRISCbits.TRISC0=1;                        // 配置触摸感应引脚为输入
  9.         led_status = RC1;                   //把LED灯的当前状态赋给变量led_status
  10.                
  11.     while(1)
  12.     {
  13.                 if(RC0==1)                                 // 检测到触摸信号
  14.         {
  15.                         led_status=~led_status;
  16.                         while(RC0)
  17.                         RC1=led_status;                // 翻转LED灯状态

  18.                 }

  19.         }
  20. }
复制代码


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
Tobey
2019-03-26 10:11
huaiqiao 发表于 2017-3-22 09:25
没用过pic的这个片子,但是你可以连接仿真器,debug下看寄存器的值啊。通过判断寄存器的值,确定你的程序在 ...

       pic这块并不是我负责的,我也不了解PIC单片机,,从网上找了别人写的代码参考着写了这么个测试用例,,       问题已经解决了,主要问题出在头文件及配置上,,,正确代码如下:
  1. #include<pic.h>

  2. __CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);
  3. __CONFIG(PLLEN_OFF&LVP_OFF) ;//配置位

  4. void delay(unsigned int x)
  5. {
  6.         unsigned int y,z;
  7.         for(y=x;y>0;y--)
  8.                 for(z=25;z>0;z--);
  9. }

  10. void IO_Init(void)//初始化IO
  11. {
  12.   ANSELC=0;          //将RC口全部设置成数字口,
  13.   TRISCbits.TRISC1=0;//设置RC1为输出
  14.   PORTCbits.RC1=1;   //设置输出高电平,即关闭灯
  15.        
  16.   TRISCbits.TRISC0=1;//设置RC0为输入
  17.   WPUCbits.WPUC0=1;  //设置输入上拉
  18. }

  19. void main(void)
  20. {       
  21.            static bit temp = 0; //定义一个静态的变量

  22.         IO_Init();

  23. //        temp = RC1;   //把RC1 LED灯的当前状态赋给变量temp   RC1是输出模式,读取到数据?这地方不对,建议不用

  24.     delay(1000);  //等一秒,让触摸板校正
  25.           while(RC0);          //等到校正结束

  26.     while(1)
  27.     {  
  28.        if(RC0==1)//按下触摸板
  29.        {
  30.                         while(RC0);//等触摸板变回0,即松开手指
  31.                         {
  32.                                 temp=~temp;//每按一次,位变量temp取反一次
  33.                                 PORTCbits.RC1=temp;//要是第一次触摸,灯不亮,第二次触摸,灯亮,static bit temp = 0; 改为static bit temp = 1;即可
  34.                         }
  35.        }   
  36.     }
  37. }
复制代码

一周热门 更多>