|
Двухразрядный светодиодный счётчик
Двухразрядный светодиодный счётчик, мультиплексирование
(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 в проект до компиляции.
|
|
|