我是新来的,希望我做得很好,并张贴在正确的部分x)
我开始对PIC微控制器进行编程,有时会卡住。 我对此代码有问题,那就是一个二进制计数器,当位为1时,它会点亮LED,并在每次计数时都打开一个开关(RB7)。 当它启动时,它将一直运行到add1(),然后停止,因为不遵循while条件(直到add1()语句的click()都没有,然后不再重复while循环)。
这是C语言中的代码
#pragma config OSC = HS
#pragma config WDT = OFF
#define _XTAL_FREQ 4000000 // Fosc frequency for _delay() library
#include <xc.h>
bit a = 0; //variabili per il conteggio binario (10 bit)
bit b = 0;
bit c = 0;
bit d = 0;
bit e = 0;
bit f = 0;
bit g = 0;
bit h = 0;
bit i = 0;
bit j = 0;
void click() {
if (a==1) {PORTAbits.RA2 = 1;}
if (a==0) {PORTAbits.RA2 = 0;}
if (b==1) {PORTAbits.RA3 = 1;}
if (b==0) {PORTAbits.RA3 = 0;}
if (c==1) {PORTBbits.RB1 = 1;}
if (c==0) {PORTBbits.RB1 = 0;}
if (d==1) {PORTBbits.RB2 = 1;}
if (d==0) {PORTBbits.RB2 = 0;}
if (e==1) {PORTBbits.RB3 = 1;}
if (e==0) {PORTBbits.RB3 = 0;}
if (f==1) {PORTAbits.RA1 = 1;}
if (f==0) {PORTAbits.RA1 = 0;}
if (g==1) {PORTAbits.RA0 = 1;}
if (g==0) {PORTAbits.RA0 = 0;}
if (h==1) {PORTBbits.RB6 = 1;}
if (h==0) {PORTBbits.RB6 = 0;}
if (i==1) {PORTBbits.RB5 = 1;}
if (i==0) {PORTBbits.RB5 = 0;}
if (j==1) {PORTBbits.RB4 = 1;}
if (j==0) {PORTBbits.RB4 = 0;}
PORTBbits.RB7 = 1;
__delay_ms(500);
PORTBbits.RB7 = 0;
__delay_ms(5);
}
void add9() {
if (a==0) {
a=1; b=0; c=0; d=0; e=0; f =0; g=0; h=0; i=0; j=0;
click();
}
if (a==1,b==1,c==1,d==1,e==1,f==1,g==1,h==1,i==1,j==1) {
//interrompe il contatore se sono tutti 1 e li azzera
a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;j=0; click();
}
}
void add8() {
if (b==0) {
b=1; c=0; d=0; e=0; f =0; g=0; h=0; i=0; j=0; click();
}
else {
add9();
}
}
void add7() {
if (c==0) {
c=1; d=0; e=0; f =0; g=0; h=0; i=0; j=0; click();
}
else {
add8();
}
}
void add6() {
if (d==0) {
d=1; e=0; f =0; g=0; h=0; i=0; j=0; click();
}
else {
add7();
}
}
void add5() {
if (e==0) {
e=1; f =0; g=0; h=0; i=0; j=0; click();
}
else {
add6();
}
}
void add4() {
if (f==0) {
f =1; g=0; h=0; i=0; j=0; click();
}
else {
add5();
}
}
void add3() {
if (g==0) {
g=1; h=0; i=0; j=0; click();
}
else {
add4();
}
}
void add2() {
if (h==0) {
h=1; i=0; j=0; click();
}
else {
add3();
}
}
void add1() {
if (i==0) {
i=1; j=0; click();
}
else {
add2();
}
}
void add() {
if (j==0) {
j=1; click();
}
else {
add1();
}
}
void main(void) {
TRISA=0x00;
TRISB=0x00;
while(1) {
add();
}
return;
}
我想念什么? 抱歉,有些评论是意大利语的,但我来自意大利x)
答案 0 :(得分:3)
表达式
a==1,b==1,c==1,d==1,e==1,f==1,g==1,h==1,i==1,j==1
进行所有比较,但是由于comma operator的工作方式仅返回 last 的结果,本例中为j == 1
。其他所有结果都将被丢弃并忽略。
所以您的情况实际上是
if (j == 1)
如果要链接多个条件,则需要使用逻辑运算符AND &&
或OR ||
。如
if (a==1 && b==1 && c==1 && d==1 && e==1 && f==1 && g==1 && h==1 && i==1 && j==1)
现在,仅当所有部分为真时,条件才为真。
这应该在几乎所有的书籍,教程或课程中。如果您错过了,请回到他们那里了解更多信息。
另一方面,当您这样做
if (a==1) {PORTAbits.RA2 = 1;}
if (a==0) {PORTAbits.RA2 = 0;}
那真的等于
PORTAbits.RA2 = a;
答案 1 :(得分:0)
对于PIC16F54的此代码,您在做的错误是不知道如何在芯片中实现Microchip基准控制器的体系结构。
您使用的编码方法看起来像某种python或Java脚本。
这无法为资源严重受限的控制器(如PIC16F54)创建代码。
阅读PIC16F54数据表!!! 理解架构!!!
根据目前的经验,您将无法理解以下解释:
代码失败的原因是嵌套函数调用超出了调用堆栈的深度。