Современная электроника №1/2020

ПРОЕКТИРОВАНИЕ И МОДЕЛИРОВАНИЕ 80 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 1 2020 В данном примере управление стро- ками светодиодной матрицы осущест- вляется с помощью выводов порта РA микроконтроллера, управление столб- цами – с помощью выводов порта PB. В качестве примера рассмотрим последовательный вывод символов «a», «b», «c» на дисплей микросхемы точечного индикатора разрешением 16 × 16. Двоичный код символов пред- ставлен в таблице 2. Точки, которые нужно зажечь на матричном индика- Таблица 2. Двоичные коды символов «a», «b», «c» 7 1 1 1 1 1 0 1 Двоичный код символа «a» 0 0 0 0 0 0 0 Двоичный код символа «b» 1 1 1 0 0 0 1 Двоичный код символа «c» 8 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 9 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 10 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 1 0 0 11 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 0 1 0 1 № н.в № в.в 5 6 7 8 9 10 11 5 6 7 8 9 10 11 5 6 7 8 9 10 11 Примечание: № н.в. – номер нижнего вывода матрицы светодиодов; № в.в. – номер верхнего вывода матрицы светодиодов. торе, обозначены в таблице нулями, точки, которые не используются – единицами. Формирование изображения на индикаторе (см. рис. 12) выполним при помощи программы микроконтролле- ра, написанной на языке программиро- вания С (см. листинг 4). Запустим в CodeVisionAVR компи- ляцию кода программы. Затем перей- дём в Proteus и укажем в окне свойств микросхемы ATmega16 путь к hex- Листинг 4 #include <mega16.h> #include <delay.h> const unsigned short a[35]={ // двоичный код символа «a» 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11011111, 0b11111111, 0b11111111, 0b11111111, 0b11111011, 0b11111111, 0b11101111, 0b11011111, 0b10111111, 0b11111111, 0b11111111, 0b11111011, 0b11110111, 0b11101111, 0b11111111, 0b10111111, 0b11111111, 0b11111111, 0b11111011, 0b11110111, 0b11101111, 0b11011111, 0b10111111, 0b11111111, 0b11111111, 0b11111111, 0b11110111, 0b11101111, 0b11011111, 0b10111111, }; const unsigned short b[35]={ // двоичный код символа «b» 0b11111110, 0b11111101, 0b11111011, 0b11110111, 0b11101111, 0b11011111, 0b10111111, 0b11111110, 0b11111101, 0b11111011, 0b11110111, 0b11101111, 0b11011111, 0b10111111, 0b11111111, 0b11111111, 0b11111011, 0b11111111, 0b11111111, 0b11111111, 0b10111111, 0b11111111, 0b11111111, 0b11111011, 0b11110111, 0b11101111, 0b11011111, 0b10111111, 0b11111111, 0b11111111, 0b11111111, 0b11110111, 0b11101111, 0b11011111, 0b11111111, }; const unsigned short c[35]={ // двоичный код символа «c» 0b11111111, 0b11111111, 0b11111111, 0b11110111, 0b11101111, 0b11011111, 0b11111111, 0b11111111, 0b11111111, 0b11111011, 0b11110111, 0b11101111, 0b11011111, 0b10111111, 0b11111111, 0b11111111, 0b11111011, 0b11111111, 0b11111111, 0b11111111, 0b10111111, 0b11111111, 0b11111111, 0b11111011, 0b11110111, 0b11111111, 0b11011111, 0b10111111, 0b11111111, 0b11111111, 0b11111111, 0b11110111, 0b11111111, 0b11011111, 0b11111111, }; unsigned short count, column, num, repeat; // определение типа данных переменных void main(void) { PORTA=PORTB=0x00; // инициализация портов DDRA=0xff; // порт PА работает на вывод данных DDRB=0xff; // порт PВ работает на вывод данных do{ for (repeat=0; repeat<25; repeat++){ // вывод символа «a» column = 0b00000001; // начиная с первого управляемого столбца for (num=0; num<5; num++) { // выполнение 5 проходов по столбцам for(count = num*7;count < (num*7+7);count++){ // выполнение прохода в каждом столбце по точкам матрицы PORTA = a[count]; // определение состояния каждого светодиода в столбце PORTB = column; // запись кода активного столбца в порт РB delay_ms(1);} // пауза длительностью 1 мс column = column<<1;} // переход на следующий столбец } // повтор вывода символа несколько раз для получения чёткого изо- бражения for (repeat=0; repeat<25; repeat++){ // вывод символа «b» column = 0b00000001; for (num=0; num<5; num++) { for(count = num*7;count < (num*7+7);count++){ PORTA = b[count]; PORTB = column; delay_ms(1);} column = column<<1;}} for (repeat=0; repeat<25; repeat++){ // вывод символа «c» column = 0b00000001; for (num=0; num<5; num++) { for(count = num*7;count < (num*7+7);count++){ PORTA = c[count]; PORTB = column; delay_ms(1);} column = column<<1;}} } while(1); } // бесконечный цикл Рис. 12. Результат вывода последовательно сменяющихся символов на дисплей точечной светодиодной матрицы разрешением 16 × 16: а) символ «а»; б) символ «b»; в) символ «c» а б в

RkJQdWJsaXNoZXIy MTQ4NjUy