本帖最后由 Tobey 于 2017-3-22 12:10 编辑
和室友写了个简单的LED翻转程序,触摸感应区时翻转LED状态,由于LED输出电平在单片机初始化后是随机的,想让LED灯一开始是绿灯亮,之后再进行翻转操作,然而只要在进入循环前对LED引脚进行配置,程序运行结果就不对:触摸时LED状态翻转,随即又恢复至原来状态~~~若在进入循环前不对LED引脚进行配置,那么程序运行就正常,但是LED灯的初始状态就成随机的了,据说这段程序从开始就是错误的~~~然而我们还是没找到问题的出处
,,
相关原理图:
代码:
- #include<pic16LF1823.h>
- void main()
- {
- static bit led_status; //定义一个静态的位变量
- ANSELC=0;
- TRISCbits.TRISC1=0; // 配置LED引脚为输出
- PORTCbits.RC1 = 1; // 去除这行代码则LED翻转正常~~~
- TRISCbits.TRISC0=1; // 配置触摸感应引脚为输入
- led_status = RC1; //把LED灯的当前状态赋给变量led_status
-
- while(1)
- {
- if(RC0==1) // 检测到触摸信号
- {
- led_status=~led_status;
- while(RC0)
- RC1=led_status; // 翻转LED灯状态
- }
- }
- }
复制代码
此帖出自
小平头技术问答
pic这块并不是我负责的,我也不了解PIC单片机,,从网上找了别人写的代码参考着写了这么个测试用例,, 问题已经解决了,主要问题出在头文件及配置上,,,正确代码如下:
- #include<pic.h>
- __CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);
- __CONFIG(PLLEN_OFF&LVP_OFF) ;//配置位
- void delay(unsigned int x)
- {
- unsigned int y,z;
- for(y=x;y>0;y--)
- for(z=25;z>0;z--);
- }
- void IO_Init(void)//初始化IO
- {
- ANSELC=0; //将RC口全部设置成数字口,
- TRISCbits.TRISC1=0;//设置RC1为输出
- PORTCbits.RC1=1; //设置输出高电平,即关闭灯
-
- TRISCbits.TRISC0=1;//设置RC0为输入
- WPUCbits.WPUC0=1; //设置输入上拉
- }
- void main(void)
- {
- static bit temp = 0; //定义一个静态的变量
- IO_Init();
- // temp = RC1; //把RC1 LED灯的当前状态赋给变量temp RC1是输出模式,读取到数据?这地方不对,建议不用
- delay(1000); //等一秒,让触摸板校正
- while(RC0); //等到校正结束
- while(1)
- {
- if(RC0==1)//按下触摸板
- {
- while(RC0);//等触摸板变回0,即松开手指
- {
- temp=~temp;//每按一次,位变量temp取反一次
- PORTCbits.RC1=temp;//要是第一次触摸,灯不亮,第二次触摸,灯亮,static bit temp = 0; 改为static bit temp = 1;即可
- }
- }
- }
- }
复制代码一周热门 更多>