0

私はマイクロコントローラーの初心者で、ADC を始めたばかりですが、変換を実行しようとするたびに、結果を LCD に表示しようとしていますが、問題は LCD ではありません。なぜなら、そのコードを単独で試してみて、それが機能したからです。したがって、問題は間違いなくADCのレジスタです。完全なコードは次のとおりです::

main.c:

#include "config.h"

int result;

void main(){
    TRISAbits.TRISA0 = 1;   //Set Port A for input
    ADCON0 = 0b01000000;    //Configuring ADCON0 register
    ADCON1 = 0b10000000;    //Configuring ADCON1 register

    ADCON0bits.ADON = 1;    //Turn on ADON bit in ADCON0 register to turn on ADC module
    __delay_us(50);         //Delay for the capacitor to be charged


    ADCON0bits.GO_DONE = 1;

    while(ADCON0bits.GO_DONE == 1);

    result = ADRESH && ADRESL;

    initLCD();
    write_character(result);

    while(1);
}

config.h:

#include <xc.h>

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON         // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

#define _XTAL_FREQ 4000000


void send_command(int command);
void write_character(int character);
void enable_blink(void);
void moveto(char b6, char b5, char b4, char b3, char b2, char b1, char b0);
void initLCD(void);

void send_command(int command){
    PORTCbits.RC0 = 0;
    PORTB = command;
    enable_blink();

}

void write_character(int character){
    PORTCbits.RC0 = 1;
    PORTB = character;
    enable_blink();

}

void enable_blink(){
    PORTCbits.RC1 = 1;
    __delay_ms(10);
    PORTCbits.RC1 = 0;
    __delay_ms(10);

}

void moveto(char b6, char b5, char b4, char b3, char b2, char b1, char b0){
    PORTCbits.RC0 = 0;
    PORTBbits.RB7 = 1;

    PORTBbits.RB6 = b6;
    PORTBbits.RB5 = b5;
    PORTBbits.RB4 = b4;
    PORTBbits.RB3 = b3;
    PORTBbits.RB2 = b2;
    PORTBbits.RB1 = b1;
    PORTBbits.RB0 = b0;

    enable_blink();

}

void initLCD(){

    TRISB = 0;
    TRISC = 0;
    send_command(0x38);
    __delay_us(40);
    send_command(0x01);
    __delay_ms(1.75);
    send_command(0x0C);
    __delay_us(40);

}
4

1 に答える 1

0

結果行に問題がある可能性があります。次のことを試してください。

result = ( ( ADRESH << 8 ) | ( ADRESL ) )

二重 & 演算子 ( && ) は論理 AND です。ADRESH と ADRESL の両方が 1 より大きい限り、AND は true (1) を返します。最下位バイト。

うまくいけば、これはうまくいきます!

于 2014-10-25T07:45:55.600 に答える