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

Tobey   2017-3-21 21:23 楼主
和室友写了个简单的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. while(1)
  11. {
  12. if(RC0==1) // 检测到触摸信号
  13. {
  14. led_status=~led_status;
  15. while(RC0)
  16. RC1=led_status; // 翻转LED灯状态
  17. }
  18. }
  19. }
本帖最后由 Tobey 于 2017-3-22 12:10 编辑

回复评论 (6)

2推荐 huaiqiao 

引用: Tobey 发表于 2017-3-22 11:16
pic这块并不是我负责的,我也不了解PIC单片机,,从网上找了别人写的代码参考着写了这么个测试用 ...

确实,头文件弄不好,再写多少都是枉然。。。。。。一般官网会有它的头文件包之类的吧,一般是这样。
点赞  2017-3-22 11:55
为什么不初始化参数呢?
点赞  2017-3-21 21:52
引用: 低调的路人 发表于 2017-3-21 21:52
为什么不初始化参数呢?

问题就在于初始化后程序运行不对啊,,,
点赞  2017-3-22 08:11
没用过pic的这个片子,但是你可以连接仿真器,debug下看寄存器的值啊。通过判断寄存器的值,确定你的程序在哪里配置的不对啊。
点赞  2017-3-22 09:25
引用: 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. }

点赞  2017-3-22 11:16
谢谢,楼主分享

谢谢,楼主提供的场地。如果需要PIC原装正品的单片机或者可以替代的单片机可以联系我(不需要修改PCB资料,程序可以共用)
Microchip原装正品单片机,另有可替换单片机(无需修改PCB资料,程序可共用PIC的) 有用到的兄弟多多支持! 期待您的来电。 电话13430885511
点赞  2017-8-23 11:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复