我是新来的,我希望我做没事,并张贴在右侧部分X)
我开始编程PIC单片机和我有时会卡住。我有此代码,这是一个二进制计数器,在LED上转弯时位在1并在每个计数(RB7)打开一个开关的问题。当它启动时,它会直到ADD1(),然后它停止,因为当条件不跟随(它去,直到点击()ADD1()语句,然后不继续重复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敢)
表达方式
a==1,b==1,c==1,d==1,e==1,f==1,g==1,h==1,i==1,j==1
完成所有的比较,但由于如何comma operator工作只返回最后一个,在这种情况下是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;
你用这个代码PIC16F54做错了,就是不知道如何Microchip的基线控制器的架构是在硅中实现。
编码方法使用的是看起来像某种Python或Java的脚本。
这是没有办法的,如PIC16F54一个严重的资源进行受限控制器创建代码。
阅读,PIC16F54数据表!了解架构!
在你目前的经验水平,你会不明白这样的解释:
你的代码失败的原因是你的嵌套函数调用超过调用堆栈的深度。