Что мне делать, если у меня есть семь сегментов в разных портах? - PullRequest
1 голос
/ 01 июля 2019

В моей схеме 7 сегментных контактов находятся в разных портах, например: Seg A - SegD (в RA0 - RA4) SegE (в RF1) SegF (RG4) SegG (RG3).Я могу сосчитать от 0 до 9 с установкой битов один за другим.Мне нужно сосчитать 0-9999, но я не могу хранить значения.Как я могу сделать это для моих спецификаций?

#include "mcc_generated_files/mcc.h"
#define DISP1 RD7
#define DISP2 RD6
#define DISP3 RD5
#define DISP4 RD4
#define SEGA  RA0
#define SEGB  RA1
#define SEGC  RA2
#define SEGD  RA3
#define SEGE  RF1
#define SEGF  RG4
#define SEGG  RG3
void main(void)
{
    // initialize the device
    SYSTEM_Initialize();



  TRISD = 0x00; // Set All Pins To Be Output Pins
  PORTD = 0x00; // Initially Clear All The 8-Pins
  while(1)
  {
       SEGA=1;SEGB=1;SEGC=1;SEGD=1;SEGE=1;SEGF=1;SEGG=0;DISP4=1;//0
      __delay_ms(500);

          SEGA=0;SEGB=1;SEGC=1;SEGD=0;SEGE=0;SEGF=0;SEGG=0;DISP4=1;//1
      __delay_ms(500);

          SEGA=1;SEGB=1;SEGC=0;SEGD=1;SEGE=1;SEGF=0;SEGG=1;DISP4=1;//2
      __delay_ms(500);

      SEGA=1;SEGB=1;SEGC=1;SEGD=1;SEGE=0;SEGF=0;SEGG=1;DISP4=1;//3
      __delay_ms(500);

      SEGA=0;SEGB=1;SEGC=1;SEGD=0;SEGE=0;SEGF=1;SEGG=1;DISP4=1;//4
      __delay_ms(500);

      SEGA=1;SEGB=0;SEGC=1;SEGD=1;SEGE=0;SEGF=1;SEGG=1;DISP4=1;//5
      __delay_ms(500);

      SEGA=1;SEGB=0;SEGC=1;SEGD=1;SEGE=1;SEGF=1;SEGG=1;DISP4=1;//6
      __delay_ms(500);

      SEGA=1;SEGB=1;SEGC=1;SEGD=0;SEGE=0;SEGF=0;SEGG=0;DISP4=1;//7
      __delay_ms(500);
     SEGA=1;SEGB=1;SEGC=1;SEGD=1;SEGE=1;SEGF=1;SEGG=1;DISP4=1;//8
      __delay_ms(500);

      SEGA=1;SEGB=1;SEGC=1;SEGD=1;SEGE=0;SEGF=1;SEGG=1;DISP4=1;//9
      __delay_ms(500);


  }

1 Ответ

0 голосов
/ 02 июля 2019

Некоторые подсказки:

Если вы хотите 4 цифры, вам пришлось мультиплексировать ваш дисплей.

Напишите таблицу, в которой вы определяете каждое число:

const uint8_t LEDTable[10] = {0b00111111,   //led drive for 0
                              0b00000110,   //led drive for 1
                              ....
                              0b01101101};   //led drive for 9

Выполните мультиплексирование в режиме прерывания. В прерывании вы должны были сделать вывод для каждой цифры:
те
десятки
охотники ...

Вывод для каждой цифры может выглядеть следующим образом:

SEGA = (value & 0x01) ? 1:0;
SEGB = (value & 0x02) ? 1:0;
SEGC = (value & 0x04) ? 1:0;
SEGD = ...
...