我是什么毛病此代码为PIC16F54在做什么?

问题描述 投票:0回答:2

我是新来的,我希望我做没事,并张贴在右侧部分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敢)

c pic microchip
2个回答
3
投票

表达方式

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;

0
投票

你用这个代码PIC16F54做错了,就是不知道如何Microchip的基线控制器的架构是在硅中实现。

编码方法使用的是看起来像某种Python或Java的脚本。

这是没有办法的,如PIC16F54一个严重的资源进行受限控制器创建代码。

阅读,PIC16F54数据表!了解架构!

在你目前的经验水平,你会不明白这样的解释:

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

© www.soinside.com 2019 - 2024. All rights reserved.