0-999 Счетчик вверх - вниз с PIC16F877A - PullRequest
0 голосов
/ 03 мая 2020

У меня проблема с программированием микропроцессора C.

Изображение оборудования здесь!

Я должен написать код на компиляторе C, считая 10 ^ 0 di git на порту D, 10 ^ 1 di git на порту C и 10 ^ 2 di git на порту B для данного оборудования. Кроме того, направление счета с pin_a0 регулируется. Если pin_a0 = 1, аппаратный отсчет будет идти вперед, в противном случае - обратный.

Я действительно ценю любую помощь, большое спасибо

1 Ответ

0 голосов
/ 04 мая 2020

Во-первых, то, как вы задали свой вопрос, действительно не соответствует правилам этого форума.

Во-вторых, мне не очень важны рекомендации.

В-третьих, я Я публикую одно возможное решение для вашей домашней работы:

/*
 * File:   main.c
 * Author: dan1138
 *
 * Created   on May 3, 2020, 4:08 PM
 * Completed on May 3, 2020, 4:43 PM
 * Simulated on May 3, 2020, 4:55 PM
 */

// PIC16F877A Configuration Bit Settings

// 'C' source line config statements

// 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 = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#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)

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

#include <xc.h>
#include <stdint.h>

uint8_t  Digits[3];

void ZeroDigits( void )
{
    uint8_t i;

    for(i = 0; i < sizeof(Digits); i++)
    {
        Digits[i] = 0;
    }
}

void CountDigitsUp( void )
{
    uint8_t i;

    for(i = 0; i < sizeof(Digits); i++)
    {
        Digits[i]++;
        if(Digits[i] > 9)
        {
            Digits[i] = 0;
        }
        else break;
    }
}

void CountDigitsDown( void )
{
    uint8_t i;

    for(i = 0; i < sizeof(Digits); i++)
    {
        Digits[i]--;
        if(Digits[i] > 9)
        {
            Digits[i] = 9;
        }
        else break;
    }
}

void ShowDigits( void )
{
    PORTD = Digits[0]<<4;
    PORTC = Digits[1]<<2;
    PORTB = Digits[2];
}

void main(void) 
{
    uint16_t Ticks;

    INTCON = 0;
    PIE1   = 0;
    PIE2   = 0;

    OPTION_REG = 0b11000001;

    TRISA  =  0x03;
    TRISB  =  0x00;
    TRISC  =  0x00;
    TRISD  =  0x00;
    TRISE &= ~0x07; 

    /* Make all GPIO pins digital */
    CMCON  = 0x07;
    ADCON1 = 0x06;

    Ticks = 0;
    ZeroDigits();

    for(;;)
    {
        ShowDigits();
        if(PORTAbits.RA0 == 1)
        {
            CountDigitsUp();
        }
        else
        {
            CountDigitsDown();
        }
    }
}

Теперь я пропустил все важные комментарии, которые вам нужно будет предоставить, чтобы превратить это в законченное задание.

...