Вы вошли на сайт, как Гость
Регистрация

Двухразрядный светодиодный счётчик

Двухразрядный светодиодный счётчик, мультиплексирование
(Example №6)

Микроконтроллер работает здесь как двух-разрядный счетчик. Переменная увеличивается (достаточно медленно, чтобы быть видимыми) и ее значение отображается на двух-разрядный светодиодный дисплей (99-0). Задача состоит в том, чтобы преобразовать двоичные числа в десятичные, а затем разделить полученное число на две цифры (десятки и единицы). Так как светодиодные сегменты дисплея соединены параллельно, необходимо убедиться, что они быстро изменяют своё состояние до того, как мы заметим это глазом. В этом примере, таймер TMR0 отвечает за временное разделение каналов, в то время как маска преобразует двоичное число в десятичное.

/*Header******************************************************/
    
unsigned short mask(unsigned short num);
unsigned short digit_no, digit10, digit1, digit, i;

void interrupt() {
    if (digit_no==0) {
        PORTA = 0;                 // Выключить оба дисплея
        PORTD = digit1;            // Установить маску для отображения единиц в порте D
        PORTA = 1;                 // Включить дисплей для единиц (LSD)
        digit_no = 1;
    } else {
        PORTA = 0;                 // Выключить оба дисплея
        PORTD = digit10;           // Установить маску для отображения десятков в порте D
        PORTA = 2;                 // Включить дисплей для десятков (MSD)
        digit_no = 0;
    }
    TMR0 = 0;                      // Установить счётчик TMRO
    INTCON = 0x20;                 // Бит T0IF=0, T0IE=1
}

void main() {
    OPTION_REG = 0x80;             // Установить таймер TMR0
    TMR0 = 0;
    INTCON = 0xA0;                 // Запретить прерывания PEIE,INTE,RBIE,T0IE
    PORTA = 0;                     // Выключить оба дисплея
    TRISA = 0;                     // Все входы порта A настроены на вывод
    PORTD = 0;                     // Выключить все сегменты дисплея
    TRISD = 0;                     // Все входы порта D настроены на вывод
    
    do {
        for (i = 0; i<=99; i++) {  // Счёт от 0 до 99
            digit = i % 10u;
            digit1 = mask(digit);  // Подготовка маски для единиц
            digit = (char)(i / 10u) % 10u;
            digit10 = mask(digit); // Подготовка маски для десятков
            Delay_ms(1000);
        }
    } while (1);                   // Endless loop
}

mask.c file:

/*Header******************************************************/
unsigned short mask(unsigned short num) {
switch (num) {
case 0 : return 0x3F;
case 1 : return 0x06;
case 2 : return 0x5B;
case 3 : return 0x4F;
case 4 : return 0x66;
case 5 : return 0x6D;
case 6 : return 0x7D;
case 7 : return 0x07;
case 8 : return 0x7F;
case 9 : return 0x6F;
}
}

Для того, чтобы этот пример работал правильно, необходимо включить документ mask.c в проект до компиляции.