PIC16F54的此代码在做什么?

时间:2019-01-29 14:17:57

标签: c pic microchip

我是新来的,希望我做得很好,并张贴在正确的部分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)

2 个答案:

答案 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数据表!!! 理解架构!!!

根据目前的经验,您将无法理解以下解释:

代码失败的原因是嵌套函数调用超出了调用堆栈的深度。