7-сегментный индикатор + драйвер MAX7219 = минимальный дисплей для Arduino. Драйвер индикатора


Когда не хватает ног. Часть 3. Драйвер индикаторов MAX7221 - Как подключить - AVR project.ru

  Сегодня будет представлен еще один способ сэкономить кучу ножек микроконтроллера в тех случаях когда нужно подключить семисегментные светодиодные индикаторы. Речь пойдет о использовании специализированного драйвера MAX7221 - это драйвера позволяют управлять семисегментными индикаторами (с общим катодом), светодиодными линейками или же с помощью него можно рулить до 64 светодиодами одновременно. Сами драйвера управляются по SPI интерфейсу, с максимальной поддерживаемой частотой работы интерфейса до 10 МГц.

 Распиновка ножек микросхемы:

 

     1 - DIN. Последовательный ввод данных. Данные загружаются в 16-ти разрядный сдвиговый регистр по переднему фронту тактового сигнала.

2,3,5-8,10,11 - DIG0-DIG7. Выводы для подключения общих катодов индикаторов.

4,9 - GND. Выводы для подключения земли

12 - LOAD (CS)  в MAX7221 данные загружаются в приёмный сдвиговый регистр только когда сигнал CS находится в состоянии низкого уровня (то есть только когда микросхема "выбрана", если говорить в терминах интерфейса SPI). Запоминаются и поступают к обработке также последние 16 принятых бит, происходит это также по переднему фронту сигнала CS.

13 - CLK. Вход сигнала тактирования, по которому происходит запись данных.

14-17, 20-23 - SEG A-SEG G, DP. Выводы для подключения сегментов семисегментных индикаторов. 

18 - ISET. К этому выводу подключается резистор (вторая нога резистора - к плюсу), позволяющий задавать пиковый ток сегмента и таким образом устанавливать яркость свечения сегментов. Минимальное сопротивление этого резистора должно быть 9,53 кОм, что примерно соответствует току сегмента 40мА.

19 - V+. Сюда подключается "+" питания.

24 - DOUT. Последовательный вывод данных. Эта нога понадобится если нужно будет соединить вместе два или более драйвера.

 Принцип работы с микросхемой MAX7221

 По сути MAX7221 (и его аналог MAX7219) по принципу работы схож с регистром 74HC595, с той лишь разницей что в микросхему загружается 16 бит данных. Первые загружаемые 8 бит необходимы для выбора регистра, в который нужно записать данные. Следующие 8 бит - те данные которые нужно записать в регистр. Говоря проще, сначала сообщаем микросхеме куда записать данные, а затем записываем нужные данные по выбранному адресу. 

 

 Чем интересен этот драйвер, так это тем, что он имеет два режима  работы.  Первый - работа в режиме обычного буфера с прямым управлением каждого сегмента. 

 Второй режим, так называемый BCD code B, который позволяет упростить вывод информации на индикатор за счет встроенного декодера символов. Символов кстати совсем немного, всего 16 - это цифры 0-9, знак "-", пустой символ и 4 быквы - "E", "H", "L", "P" (интересно какое слово можно составить?:)). Например, для того чтобы вывести во второй разряд цифру 2, нам нужно будет отправить адрес второго разряда (8 бит) и затем просто отправить двойку (еще 8 бит). Об этом режиме работы поговорим в следующей статье, сейчас же будет рассмотрен пример как работать с драйвером в режиме без декодирования.

 

 Для того чтобы управлять драйвером в первую очередь нужно ознакомится с картой адресов регистров. 

 

 

 

 

 

 Регистр No Op понадобится при совместном подключении нескольких драйверов. Для того, чтобы обратиться, например, к третьему драйверу в цепочке, не влияя на работу первых двух, - нужно для первых двух обратиться к регистру "No-op". Поскольку адрес этого регистра равен нулю, то сделать это очень просто: сначала за 16 тактов отправляем данные для третьего регистра, потом устанавливаем линию данных в ноль и отщёлкиваем ещё 2 раза по 16 тактов. В результате первый отправленный пакет будет загружен в третий регистр, а следующие два пакета (загруженные в первый и второй регистры) будут иметь адрес ноль, то есть будут обращаться к регистру "No-op".

 Digit 0-7 регистры, отвечающие за управление разрядами индикатора. Нумерация разрядов идет слева направо. Это очень удобно, например чтобы сменить одну цифру на индикаторе обращаемся по адресу регистра отвечающего за разряд, тем самым не трогая все остальные разряды.  Регистр Decode Mode отвечает за режимы работы драйвера, о которых говорилось чуть выше: им можно выставить режим декодирования символов BCD code B и режим без декодирования No decode. 

 

 

 Через регистр Intensity осуществляется программная(!) настройка яркости свечения индикатора. Удобная штука на разные случаи, от возможности энергосбережения до индикации разных режимов работы девайса. Всего можно выбрать один из 16 уровней яркости.

 

 Регистром Scan Limit устанавливается число используемых разрядов индикатора. Если планируется использовать не все 8, а меньше, то рекомендуется отключать неиспользуемые. От этого будет зависеть частота обновления индикатора, а также пиковый ток через сегменты. Когда задействованы все 8 разрядов, частота обновления составляет около 800 Гц. При уменьшении количества разрядов частота возрастает, ее можно определить по формуле 8*800/N  (где N - число разрядов). Пиковый ток через сегменты также возрастает при отключении неиспользуемых разрядов.

 

 Через регистр Shutdown можно включить режим энергосбережения, при котором все индикаторы гаснут, данные и состояние регистров при этом не теряются. Режим энергосбережения включается записью нуля в регистр shutdown. При записи туда единицы драйвер выходит из энергосбережения. 

Энергопотребление в этом режиме падает до 150 мкА.

 

 Display Test используется для проверки подключенного индикатора, в тестовом режиме включаются все сегменты индикатора. Даже если драйвер находится в режиме энергосбережения, режим тестирования включит сегменты. 

 

 После запитывания все регистры драйвера сброшены, поэтому в первую очередь нужно провести настройку. Настройки драйвера (запись нужных значений в регистры Decode Mode, Intensity, Scan Limit, Shutdown и Display Test) необходимо производить каждый раз после подачи питания, эти значения не сохраняются. 

 

 

 

 Работа с драйвером в режиме No-decode

 

 В режиме No decode мы можем управлять каждым сегментом любого разряда напрямую. Соответствие сегментов индикатора битам в регистре Digit представлено на картинке ниже и  для того чтобы зажечь определенный сегмент необходимо записать в соответствующий бит единицу.

 

 

 Для примера: нам нужно вывести в первый разряд 8-и разрядного индикатора цифру 1. Сначала отправляем первые 8 бит адреса регистра соответствующего первому разряду (см. таблицу с картой адресов регистров). Нумерация разрядов индикатора идет слева направо (вот таким образом 0.1.2.3.4.5.6.7.), поэтому первый справа разряд (Digit 7), будет иметь адрес &h08, это значение и отправляем. Затем отправляем данные которые должны включить сегменты В и С, по таблице соответствия (см. выше) за эти сегменты отвечают биты D5 и D4. Таким образом следующие 8 бит которые мы должны отправить будут такие: 00110000, или если в шестнадцатеричном представлении - &h58. Подобным образом можем управлять и другими разрядами и сегментами индикатора. Ничего сложного, правда? ;)

 

 

 

 

 А теперь небольшой рабочий пример. У меня оказался только четырехразрядный индикатор, для демонстрации возможностей вполне сгодится. Соединил по схеме ниже. Неиспользуемые выводы можно оставлять болтаться в воздухе. Микроконтроллер Attiny2313 тактируется от внутреннего генератора на 8 МГц, напряжение питания схемы 5 вольт.

 демо код в Bascom-AVR 

$regfile = "attiny2313.dat"$crystal = 8000000$hwstack = 32$swstack = 10$framesize = 40

Config Portd = Output

Cs Alias Portd.1Ser_clk Alias Portd.2Ser_data Alias Portd.3

Dim A As WordDim Digit(8)as ByteDim Y As ByteDim Disp_num As ByteDim Disp_data As ByteDim Digit_str As String * 4Dim Temp_str As String * 3Gosub Max7219_setup

Digit_str = "Good"           'строка которую выведем на дисплейGosub Prepare                'вызываем подпрограмму подготовки и отправки данных

Wait 3

Do                           'в главном цикле просто выводим увеличивающее на 1 числоWaitms 200Incr A                       'переменная значение которой выводим на индикаторDigit_str = Str(a)Digit_str = Format(digit_str , "0000")Gosub PrepareLoop

End

'Подготовка данных для передачиPrepare:DoFor Y = 1 To 4   Temp_str = Mid(digit_str , Y , 1)   Select Case Temp_str      Case "0" : Temp_str = "126"                           '&b01111110      Case "1" : Temp_str = "48"                            '&b00110000      Case "2" : Temp_str = "109"                           '&b01101101      Case "3" : Temp_str = "121"                           '&b01111001      Case "4" : Temp_str = "51"                            '&b00110011      Case "5" : Temp_str = "91"                            '&b01011011      Case "6" : Temp_str = "95"                            '&b01011111      Case "7" : Temp_str = "112"                           '&b01110000      Case "8" : Temp_str = "127"                           '&b01111111      Case "9" : Temp_str = "123"                           '&b01111011      Case "." : Temp_str = "128"                           '&b10000000      'можно и самостоятельно ввести нужные символы      Case "A" : Temp_str = "119"                           '&b01110111      Case "C" : Temp_str = "78"                            '&b01001110      Case "E" : Temp_str = "79"                            '&b01001111      Case "G" : Temp_str = "94"                            '&b01011110      Case "o" : Temp_str = "29"                            '&b00011101      Case "d" : Temp_str = "61"                            '&b00111101      Case " " : Temp_str = "0"                             '&b00000000      'и так далее...   End Select   Digit(y) = Val(temp_str)

      Disp_num = Y             'знакоместо (разряд) на который выводим текущую цифру

      Disp_data = Digit(y)     'данные которые отправляем на выбранный разряд      Gosub Disp_writeNext YLoop Until Y = 5    'когда вывели данные на все 4 разряда возвращаемся в главный циклReturn

'Передаем данные в max7221Disp_write:Ser_data = 0Ser_clk = 0Cs = 0Shiftout Ser_data , Ser_clk , Disp_num , 1   'отправляем номер разряда Shiftout Ser_data , Ser_clk , Disp_data , 1  'отправляем данные в этот разрядCs = 1Return

'инициализации и настройка регистров max7221Max7219_setup:Disp_num = &H0C : Disp_data = 0     'режим Shutdown (0-включен, 1-выключен)Gosub Disp_writeDisp_num = &H09 : Disp_data = 0     'режим прямого управления сегментами индикатораGosub Disp_writeDisp_num = &H0A : Disp_data = 10    'уровень свечения сегментов (0-минимум, 15-максимум)Gosub Disp_writeDisp_num = &H0B : Disp_data = 3     'число используемых разрядов (счет от 0)Gosub Disp_writeDisp_num = &H0F : Disp_data = 0     'тестовый режим выключен (0-выключен, 1-включен)Gosub Disp_writeDisp_num = &H0C : Disp_data = 1        Gosub Disp_writeReturn

 Код хорошо прокомментирован, поэтому дополнительного пояснения надеюсь приводить не нужно. А ниже результат работы 

 

 

 

 

 Далее будет описана работа с драйвером в режиме BCD code B ( вторая часть )

 

 

 

 

 И напоследок отдельное спасибо нашему камраду Максиму (известного под ником max) за то, что подкинул мне эти замечательные микрухи. 

 

 

 

 

avrproject.ru

MAX7219 - драйвер светодиодных индикаторов | RadioLaba.ru

          #include <P16F628A.INC>

            LIST        p=16F628A    

            __CONFIG    H'3F10'             ;Конфигурация микроконтроллера

                                    

            

Sec           equ         20h               ;регистры хранения временных данных для

Sec1          equ         21h               ;подпрограмм паузы

Sec2          equ         22h               ;  

scetbit       equ         23h               ;регистр счета битов для передачи по протоколу spi

dat_ind       equ         24h               ;регистр хранения данных для передачи по протоколу spi

adr_ind       equ         25h               ;регистр хранения адреса для передачи по протоколу spi

dat_tmp       equ         26h               ;промежуточный регистр данных для передачи по протоколу spi

adr_tmp       equ         27h               ;промежуточный адресный регистр для передачи по протоколу spi

shet          equ         28h               ;вспомогательный регистр счета

data_1        equ         29h               ;начальный регистр хранения данных для вывода на матрицу

 

#DEFINE       din         PORTB,5           ;линия входа данных драйвера MAX7219

#DEFINE       cs          PORTB,6           ;линия выбора драйвера MAX7219

#DEFINE       clk         PORTB,7           ;линия тактирования драйвера MAX7219

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

              org         0000h             ;начать выполнение программы с адреса 0000h

              goto        Start             ;переход на метку Start

          

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основная программа

                                            

Start         movlw       b'01000000'       ;установка выходных защелок порта B

              movwf       PORTB

              

              movlw       b'00000111'       ;выключение компараторов

              movwf       CMCON

 

              bsf         STATUS,RP0        ;выбрать 1-й банк    

              movlw       b'00011111'       ;настройка линий ввода\вывода порта B  

              movwf       TRISB             ;RB0-RB4 на вход, остальные на выход

              bcf         STATUS,RP0        ;выбрать 0-й банк                

              

              call        init_lcd          ;вызов подпрограммы инициализации драйвера(MAX7219)

              

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Последовательная запись 8-ми байт в регистры ОЗУ, из которых составляется буква 'R' на матрице

;запись байтов в регистры ОЗУ производится с помощью косвенной аддресации

                                            

met_1         movlw       data_1            ;установка начального адреса регистра для косвенной аддресации

              movwf       FSR               ;

              movlw       b'01111000'       ;запись 1-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01000100'       ;запись 2-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01000100'       ;запись 3-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01111000'       ;запись 4-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01010000'       ;запись 5-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01001000'       ;запись 6-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01000100'       ;запись 7-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'00000000'       ;запись 8-го байта в регистр ОЗУ

              movwf       INDF              ;

                                            ;

              call        vivod             ;вызов подпрограммы вывода данных на матрицу                  

              call        paus_2s           ;вызов подпрограммы паузы 2 сек

              

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Последовательная запись 8-ми байт в регистры ОЗУ, из которых составляется буква 'L' на матрице

;запись байтов в регистры ОЗУ производится с помощью косвенной аддресации

                                            

              movlw       data_1            ;установка начального адреса регистра для косвенной аддресации

              movwf       FSR               ;

              movlw       b'01000000'       ;запись 1-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01000000'       ;запись 2-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01000000'       ;запись 3-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01000000'       ;запись 4-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01000000'       ;запись 5-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01000100'       ;запись 6-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01111100'       ;запись 7-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'00000000'       ;запись 8-го байта в регистр ОЗУ

              movwf       INDF              ;

                                            ;

              call        vivod             ;вызов подпрограммы вывода данных на матрицу                  

              call        paus_2s           ;вызов подпрограммы паузы 2 сек

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Последовательная запись 8-ми байт в регистры ОЗУ, из которых составляется цифра 15 на матрице

;запись байтов в регистры ОЗУ производится с помощью косвенной аддресации

                                            

              movlw       data_1            ;установка начального адреса регистра для косвенной аддресации

              movwf       FSR               ;

              movlw       b'00101111'       ;запись 1-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01101000'       ;запись 2-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'10101000'       ;запись 3-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'00101111'       ;запись 4-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'00100001'       ;запись 5-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'00100001'       ;запись 6-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'00101111'       ;запись 7-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'00000000'       ;запись 8-го байта в регистр ОЗУ

              movwf       INDF              ;

                                            ;

              call        vivod             ;вызов подпрограммы вывода данных на матрицу                  

              call        paus_2s           ;вызов подпрограммы паузы 2 сек

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Последовательная запись 8-ми байт в регистры ОЗУ, из которых составляется узор 1 на матрице

;запись байтов в регистры ОЗУ производится с помощью косвенной аддресации

                                            

              movlw       data_1            ;установка начального адреса регистра для косвенной аддресации

              movwf       FSR               ;

              movlw       b'00111100'       ;запись 1-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01000010'       ;запись 2-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'10111101'       ;запись 3-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'10100101'       ;запись 4-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'10100101'       ;запись 5-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'10111101'       ;запись 6-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01000010'       ;запись 7-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'00111100'       ;запись 8-го байта в регистр ОЗУ

              movwf       INDF              ;

                                            ;

              call        vivod             ;вызов подпрограммы вывода данных на матрицу                  

              call        paus_2s           ;вызов подпрограммы паузы 2 сек

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Последовательная запись 8-ми байт в регистры ОЗУ, из которых составляется узор 2 на матрице

;запись байтов в регистры ОЗУ производится с помощью косвенной аддресации

                                            

              movlw       data_1            ;установка начального адреса регистра для косвенной аддресации

              movwf       FSR               ;

              movlw       b'11100111'       ;запись 1-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'11000011'       ;запись 2-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'10100101'       ;запись 3-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'00011000'       ;запись 4-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'00011000'       ;запись 5-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'10100101'       ;запись 6-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'11000011'       ;запись 7-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'11100111'       ;запись 8-го байта в регистр ОЗУ

              movwf       INDF              ;

                                            ;

              call        vivod             ;вызов подпрограммы вывода данных на матрицу                  

              call        paus_2s           ;вызов подпрограммы паузы 2 сек

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Последовательная запись 8-ми байт в регистры ОЗУ, из которых составляется узор 3 на матрице

;запись байтов в регистры ОЗУ производится с помощью косвенной аддресации

                                            

              movlw       data_1            ;установка начального адреса регистра для косвенной аддресации

              movwf       FSR               ;

              movlw       b'10011001'       ;запись 1-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01000010'       ;запись 2-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'00100100'       ;запись 3-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'10100101'       ;запись 4-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'10100101'       ;запись 5-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'00100100'       ;запись 6-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'01000010'       ;запись 7-го байта в регистр ОЗУ

              movwf       INDF              ;

              incf        FSR,F             ;инкремент регистра FSR

              movlw       b'10011001'       ;запись 8-го байта в регистр ОЗУ

              movwf       INDF              ;

                                            ;

              call        vivod             ;вызов подпрограммы вывода данных на матрицу                  

              call        paus_2s           ;вызов подпрограммы паузы 2 сек

              goto        met_1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;подпрограмма отправки 8-ми байт данных из регистров ОЗУ на драйвер MAX7219

 

vivod         movlw       .8                ;запись счетчика циклов

              movwf       shet              ;

              movlw       data_1            ;установка начального адреса регистра для косвенной аддресации

              movwf       FSR               ;

              movlw       .1                ;запись начального адреса для обращению к регистрам MAX7219 в  

              movwf       adr_ind           ;адресный регистр adr_ind

viv_1         movf        INDF,W            ;копирование содержимого из регистра ОЗУ в регистр

              movwf       dat_ind           ;данных (dat_ind) для отправки на драйвер MAX7219

              call        send              ;вызов подпрограммы отправки пакета данных на драйвер

              incf        FSR,F             ;инкремент регистра FSR

              incf        adr_ind,F         ;инкремент регистра adr_ind

              decfsz      shet,F            ;декремент счетчика циклов

              goto        viv_1             ;счетчик не равен нулю: переход на метку viv_1

              return                        ;счетчик равен нулю: выход из подпрограммы

              

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма инициализации драйвера(MAX7219)

 

init_lcd      call        pauslcd           ;вызов подпрограммы паузы 2 мс

              movlw       0x0F              ;выключить тестовый режим

              movwf       adr_ind           ;

              movlw       0x00              ;

              movwf       dat_ind           ;

              call        send              ;

 

              movlw       0x0C              ;включить драйвер в рабочий режим

              movwf       adr_ind           ;

              movlw       0x01              ;

              movwf       dat_ind           ;

              call        send              ;

 

              movlw       0x0A              ;установить интенсивность свечения 15/32

              movwf       adr_ind           ;

              movlw       0x07              ;

              movwf       dat_ind           ;

              call        send              ;

 

              movlw       0x09              ;отключить декодирование для всех индикаторов

              movwf       adr_ind           ;

              movlw       0x00              ;

              movwf       dat_ind           ;

              call        send              ;

 

              movlw       0x0B              ;использовать 8 индикаторов

              movwf       adr_ind           ;

              movlw       0x07              ;

              movwf       dat_ind           ;

              call        send              ;

              return                        ;выход из подпрограммы

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма отправки 2-х байт (пакета данных) на драйвер (MAX7219) по протоколу SPI

 

send          bcf         cs                ;Сбросить линию выбора драйвера CS

              movlw      .8                 ;Отправка содержимого адресного байта adr_ind на драйвер

              movwf      scetbit            ;

              movf       adr_ind,W          ;копирование данных для передачи в промежуточный регистр

              movwf      adr_tmp            ;

povtor        bcf        clk                ;

              btfsc      adr_tmp,7          ;

              bsf        din                ;

              btfss      adr_tmp,7          ;

              bcf        din                ;

              bsf        clk                ;

              rlf        adr_tmp,F          ;

              decfsz     scetbit,F          ;

              goto       povtor             ;

            

              movlw      .8                 ;Отправка содержимого байта данных dat_ind на драйвер

              movwf      scetbit            ;

              movf       dat_ind,W          ;копирование адреса для передачи в промежуточный регистр

              movwf      dat_tmp            ;

povtr1        bcf        clk                ;

              btfsc      dat_tmp,7          ;

              bsf        din                ;

              btfss      dat_tmp,7          ;

              bcf        din                ;

              bsf        clk                ;

              rlf        dat_tmp,F          ;

              decfsz     scetbit,F          ;

              goto       povtr1             ;

              bcf        clk                ;

              bsf        cs                 ;установить в 1 линию выбора драйвера CS                

              return                        ;выход из подпрограммы

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

pauslcd       movlw       .4                ;подпрограмма пауза 2 мс

              movwf       Sec1              ;

p2            movlw       .166              ;

              movwf       Sec               ;

p1            decfsz      Sec,F             ;

              goto        p1                ;

              decfsz      Sec1,F            ;

              goto        p2                ;

              return                        ;выход из подпрограммы

                                            

paus_2s       movlw       .10               ;подпрограмма пауза 2 сек

              movwf       Sec2              ;

p_3           movlw       .255              ;

              movwf       Sec1              ;

p_2           movlw       .255              ;

              movwf       Sec               ;

p_1           decfsz      Sec,F             ;

              goto        p_1               ;

              decfsz      Sec1,F            ;

              goto        p_2               ;

              decfsz      Sec2,F            ;

              goto        p_3               ;

              return                        ;выход из подпрограммы

                                            

              end                           ;конец всей программы

                                            ;

radiolaba.ru

Как работать с драйверами индикаторов MAX7219 и MAX7221

Сегодня мы поговорим об очень удобных и полезных микрухах - драйверах MAX7219 и MAX7221. Эти драйвера позволяют управлять семисегментными индикаторами (с общим катодом), светодиодными линейками или просто отдельными светодиодами. Максимум к ним можно подключить по 64 светодиода (ну или, соответственно, по восемь семисегментных индикаторов). Сами драйвера управляются по интерфейсу SPI (режим 0), поддерживая частоту работы интерфейса до 10 МГц. Надо сказать, что драйвер MAX7219 не полностью соответствует нормам SPI (в отличии от MAX7221), но тем не менее его прекрасно можно по SPI программировать, главное - чётко помнить в чём же всё таки заключается несоответствие (позднее расскажу об этом и ещё некоторых отличиях этих микросхем).

Распиновка и назначение ног.

11 - DIN. Последовательный ввод данных. Данные загружаются в 16-ти разрядный сдвиговый регистр по переднему фронту тактового сигнала.

2,3,5-8,10,11 - DIG0-DIG7. Выводы для подключения общих катодов индикаторов. В MAX7219 эти линии при отключении подтягиваются к плюсу, а в MAX7221 переходят в высокоомное состояние (в Z-состояние).

4,9 - GND. Сюда подключается "ноль" питания. Для правильной работы микрухи - к "нулю" должны быть подключены оба вывода.

12 - LOAD у MAX7219 и CS у MAX7221. У MAX7219 данные загружаются в сдвиговый регистр независимо от состояния сигнала LOAD. Запоминаются и поступают к дальнейшей обработке последние 16 принятых бит. Происходит это по переднему фронту сигнала LOAD (то есть только в момент переключения сигнала LOAD из 0 в 1). У MAX7221 данные загружаются в приёмный сдвиговый регистр только когда сигнал CS находится в состоянии низкого уровня (то есть только когда микросхема "выбрана", если говорить в терминах интерфейса SPI). Запоминаются и поступают к обработке также последние 16 принятых бит, происходит это также по переднему фронту сигнала CS.

13 - CLK. Вход тактирования. Как я уже сказал, микросхемы совместимы с SPI Mode 0, т.е. в отсутствии передачи на линии тактирования низкий уровень, по переднему фронту сигнала CLK происходит считывание данных со входа, по заднему - сдвиг (подробнее о том, как это работает - почитайте теорию SPI по ссылке в начале статьи).

14-17, 20-23 - SEG A-SEG G, DP. Выводы для подключения сегментов семисегментных индикаторов. В MAX7219 эти линии при отключении подтягиваются к GND, а в MAX7221 переходят в высокоомное состояние (в Z-состояние).

18 - ISET. К этому выводу подключается резистор (вторая нога резистора - к плюсу), позволяющий задавать пиковый ток сегмента и таким образом устанавливать яркость свечения сегментов. Минимальное сопротивление этого резистора должно быть 9,53 кОм, что примерно соответствует току сегмента 40мА. Ток, текущий через ISET номинально в 100 раз меньше пикового тока сегмента. Из даташита совершенно непонятно, одинаково ли падение напряжения на этом резисторе, но если считать, что оно одинаково, то это даст такую формулу для расчёта резистора: R=9,53*40/Ipk, где Ipk - требуемый пиковый ток сегмента. Подключив к этой ноге переменный резистор - можно регулировать яркость свечения сегментов.

19 - V+. Сюда подключается "+" питания.

24 - DOUT. Последовательный вывод данных. На этом выводе появляются принятые на входе DIN данные c задержкой в 16 с половиной тактов. Почему именно 16.5, а не 16 или 17? Потому что в SPI первая половина такта (после переднего фронта для MODE 0) - чтение, вторая половина такта (задний фронт для режима MODE 0) - сдвиг, а данные появятся на выходе только после сдвига. С помощью DOUT можно каскадно соединить несколько драйверов, при этом выход (DOUT) первого драйвера подключается ко входу (DIN) второго драйвера, выход второго - ко входу третьего и т.д.

Управляется MAX7219/MAX7221 через специальные регистры. Данные, как я уже говорил, загружаются в микросхему по SPI, в виде 16-ти битных пакетов (помните, на входе 16-ти битный сдвиговый регистр), старшим битом вперёд. В пакетах содержится адрес регистра, к которому обращаются, и данные, которые в него нужно загрузить.

Формат пакета:

2

Карта регистров:

Имя регистра Адрес регистра bin hex D15-D12 D11 D10 D9 D8
No-op XXXX 0 0 0 0 X0h
Digit 0 XXXX 0 0 0 1 X1h
Digit 1 XXXX 0 0 1 0 X2h
Digit 2 XXXX 0 0 1 1 X3h
Digit 3 XXXX 0 1 0 0 X4h
Digit 4 XXXX 0 1 0 1 X5h
Digit 5 XXXX 0 1 1 0 X6h
Digit 6 XXXX 0 1 1 1 X7h
Digit 7 XXXX 1 0 0 0 X8h
Decode Mode XXXX 1 0 0 1 X9h
Intensity XXXX 1 0 1 0 XAh
Scan Limit XXXX 1 0 1 1 XBh
Shutdown XXXX 1 1 0 0 XCh
Display Test XXXX 1 1 1 1 XFh

После подачи питания все регистры сброшены и MAX7219 / MAX7221 находится в остановленном состоянии. Прежде чем использовать драйвер - сначала нужно его настроить (записать в нужные регистры нужные данные).

Данные, записанные в регистрах "Digit0"-"Digit7" определяют состояния сегментов соответствующих семисегментных индикаторов. В зависимости от выбранного режима ("No decode", "BCD code B"), эти данные могут интерпретироваться двумя способами.

3В режиме "No decode" каждый бит данных в соответствующем регистре "Digit X" определяет состояние одного из сегментов семисегментного индикатора "X" (0 - сегмент погашен, 1 - сегмент горит). Карта сегментов и соответствующие им биты указаны на рисунке справа.

В режиме "BCD code B" 7 младших бит данных, записанных в регистре "Digit X", кодируют отображаемый на семисегментном индикаторе символ, в соответствии с таблицей ниже, а старший бит данных кодирует состояние сегмента DP (0 - сегмент погашен, 1 - сегмент горит).

Таблица кодировки режима "BCD code B":

Символ Данные в регистре Digit X Состояние сегментов индикатора
D6-D4 D3 D2 D1 D0 A B C D E F G
0 XXX 0 0 0 0 1 1 1 1 1 1 0
1 XXX 0 0 0 1 0 1 1 0 0 0 0
2 XXX 0 0 1 0 1 1 0 1 1 0 1
3 XXX 0 0 1 1 1 1 1 1 0 0 1
4 XXX 0 1 0 0 0 1 1 0 0 1 1
5 XXX 0 1 0 1 1 0 1 1 0 1 1
6 XXX 0 1 1 0 1 0 1 1 1 1 1
7 XXX 0 1 1 1 1 1 1 0 0 0 0
8 XXX 1 0 0 0 1 1 1 1 1 1 1
9 XXX 1 0 0 1 1 1 1 1 0 1 1
- XXX 1 0 1 0 0 0 0 0 0 0 1
E XXX 1 0 1 1 1 0 0 1 1 1 1
H XXX 1 1 0 0 0 1 1 0 1 1 1
L XXX 1 1 0 1 0 0 0 1 1 1 0
P XXX 1 1 1 0 1 1 0 0 1 1 1
пусто XXX 1 1 1 1 0 0 0 0 0 0 0

Режим выбирается индивидуально для каждого из регистров "Digit 0" - "Digit 7", установкой в 0 ("No decode") или 1 ("BCD code B") соответствующего бита регистра "Decode Mode".

Данные в регистре "Intensity" определяют средний ток сегмента (в долях от пикового тока, заданного резистором на ноге "ISET") в соответствии с таблицей ниже:

Доля от Ipk D4 - D7 D3 D2 D1 D0 HEX код MAX7219 MAX7221
1/32 1/16 XXXX 0 0 0 0 X0h
3/32 2/16 XXXX 0 0 0 1 X1h
5/32 3/16 XXXX 0 0 1 0 X2h
7/32 4/16 XXXX 0 0 1 1 X3h
9/32 5/16 XXXX 0 1 0 0 X4h
11/32 6/16 XXXX 0 1 0 1 X5h
13/32 7/16 XXXX 0 1 1 0 X6h
15/32 8/16 XXXX 0 1 1 1 X7h
17/32 9/16 XXXX 1 0 0 0 X8h
19/32 10/16 XXXX 1 0 0 1 X9h
21/32 11/16 XXXX 1 0 1 0 XAh
23/32 12/16 XXXX 1 0 1 1 XBh
25/32 13/16 XXXX 1 1 0 0 XCh
27/32 14/16 XXXX 1 1 0 1 XDh
29/32 15/16 XXXX 1 1 1 0 XEh
31/32 15/16 XXXX 1 1 1 1 XFh

В регистре "Scan Limit" можно выбрать обслуживаемые драйвером семисегментные индикаторы. Они определяются четырьмя младшими битами загруженного в этот регистр байта. Количество обслуживаемых драйвером индикаторов связано с их частотой обновления. Если задействованы все 8 семисегментных индикаторов, то частота обновления составляет 800 Гц, если меньше, то 8*800/N (N - количество задействованных индикаторов). Поскольку количество обслуживаемых индикаторов влияет на яркость, то не рекомендуется показывать пустые старшие символы простым отключением их от обслуживания в регистре "Scan Limit".

Таблица (обслуживаемые индикаторы, в зависимости от значения в регистре "Scan Limit"):

Номера обслуживаемых индикаторов Данные в регистре "Scan Limit" D3 - D7 D2 D1 D0 HEX
0 XXXXX 0 0 0 X0h
0,1 XXXXX 0 0 1 X1h
0,1,2 XXXXX 0 1 0 X2h
0,1,2,3 XXXXX 0 1 1 X3h
0,1,2,3,4 XXXXX 1 0 0 X4h
0,1,2,3,4,5 XXXXX 1 0 1 X5h
0,1,2,3,4,5,6 XXXXX 1 1 0 X6h
0,1,2,3,4,5,6,7 XXXXX 1 1 1 X7h

Регистр "Display test" позволяет провести тестирование исправности сегментов всех подключенных семисегментных индикаторов. При установки младшего бита этого регистра в 1 - драйвер включает все сегменты всех подключенных индикаторов. Чтобы прекратить тест и вернуться в нормальное состояние - нужно записать в младший бит регистра "Display test" ноль.

Регистр "No-op" используется при каскадном подключении драйверов. Для того, чтобы обратиться, например, к третьему драйверу в цепочке, не влияя на работу первых двух, - нужно для первых двух обратиться к регистру "No-op". Поскольку адрес этого регистра равен нулю, то сделать это очень просто: сначала за 16 тактов отправляем данные для третьего регистра, потом устанавливаем линию данных в ноль и отщёлкиваем ещё 2 раза по 16 тактов. В результате первый отправленный пакет будет загружен в третий регистр, а следующие два пакета (загруженные в первый и второй регистры) будут иметь адрес ноль, то есть будут обращаться к регистру "No-op".

А теперь небольшой пример того, как к этим драйверам подключать семисегментные индикаторы. Вместо семисегментных индикаторов могут быть просто диоды (собственно, семисегментный индикатор с общим катодом - это и есть всего лишь восемь светодиодов, у которых объединены катоды). Схема подключения семисегментных индикаторов к драйверу:

4Пример готовой платы (лицевая панель контроллера ICPCon) с пятью семисегментными индикаторами и драйвером MAX7219:

5

Вот и всё. Реализацию SPI на микроконтроллере можно посмотреть по этой ссылке:

- Программа для контроллера SPI-шлюза.

meandr.org

7-сегментный индикатор + драйвер MAX7219 = минимальный дисплей для Arduino

Что-то давно не было обзоров про Arduino-мелочевку. Сегодня дошли руки до этих деталек и решил их «обозреть»

Тех, кого пугают страшные слова из радиотехники — под кат прошу не заглядывать. дабы не терять свое драгоценное время зря. Для небольших поделок с Ардуино-образными и другими контроллерами есть множество решений по отображению информации.

Ставить можно от простейших светодиодов, до сложных табло и сенсорных панелей. В простейших устройствах лично мне понравились светодиодные семисегментные индикаторы требуемой разрядности. Они достаточно яркие, их видно хорошо на большом расстоянии и они достаточно просты в работе.

Если подключать такой индикатор напрямую к микроконтроллеру — тратится очень много дискретных выходов. Для подключения семисегментных и матричных индикаторов по 3-м проводам компания MAXIM разработала контроллеры MAX7219/MAX7221. Вот об этой связке будет мой обзор.

Сразу скажу, что для тех кто не любит паять, продаются готовые индикаторы за смешные деньги

Я такой тоже использовал в одном из своих проектов, но мне не понравились большие габариты дисплея (особенно по высоте).

Для создания универсального контроллера для своего «Умного дома» приобрел индикаторы и микросхемы россыпью.

Итак были приобретены 7-сегментный четырех-разрядные LED индикаторы с общим катодом и высотой цифр 0.4"

Контроллер 8-сегментного индикатора MAX7219 в корпусе DIP24

Индикаторы приехали в Пермь за 33 дня. Были упакованы в простой мягкий пакет. Ножки воткнуты в кусок пенопласта. Почта России их пощадила:

Размеры 40x16. Размер цифры около 10мм

Количество ножек — 12: 7 сегментов/анодов + точка-анод + 4 общих катода по числу разрядов Шаг между ножками 2.54мм

Даташит нашел только на аналогичный индикатор

Распиновка ножек индикатора

Драйвера MAX7219 приехали за 35 дней тоже в мелком пакете, наколотые на паролонину.

Даташит на MAX7219/7221 Данные микросхемы работают с индикаторами, имеющими общий катод. К одной микросхеме можно подцепить 8 разрядов. Сами микросхемы 7219 можно цеплять друг к другу каскадом. Еще драйвера MAX7219 можно использовать для работы с матричными светодиодными индикаторами 8x8 С микроконтроллером соединяются по 3-х проводному SPI интерфейсу.

Пора теперь собрать вместе индикатор и его драйвер

Так как я делал только прототип микроконтроллера — то собрал все навесным монтажом на макетной плате. На той же макетке установлен микроконтроллер ATMEGA 328P-PU из этого обзора и NRF24L01 mini из другого моего обзора.

Миниатюрный блок питания и корпус тоже были приобретены ранее на ТАОБАО

Для монтажа мне очень понравился китайский тефлоновый провод сечением 0.1мм. Разделывается он лучше, чем советский МГТФ и изоляция практически не плавится от паяльника.

Монтаж, конечно, не очень аккуратный, но для отладки прототипа сойдет

Плату подключил через переходник USB/RS232, который ранее использовал при программировании Arduino Pro Mini

Готовый прототип контроллера

Следующий шаг — изготовление контроллера на печатной плате.

Выводы: Связка индикаторы + драйверы вполне рабочая.

Паять или покупать готовое — выбор за вами. Кот вот тоже сильно удивлен, как можно было потрать столько времени не на сон

Прочитать про мой «Умный дом» можно в моем блоге

mysku.ru

Драйвер семисегментных индикаторов MAX7219/MAX7221.

Драйвер семисегментных индикаторов MAX7219/MAX7221.

Цоколевка MAX7219

Электрические характеристики.

Напряжение питания 4.0 – 5.5В

Минимальный потребляемый ток без индикации 150мкА

Частота обновления дисплея 500-1300Гц

Ток одного сегмента индикатора 30-45мА

Управление микросхемой.

Типовая схема включения

 

Для загрузки данных в микросхему используется последовательный пакет длиной 16 бит. Младшие 8 бит являются информационными, следующие 4 задают номер регистра микросхемы, старшие 4 не используются. Первым передается старший бит.

D15

D14

D13

D12

D11

D10

D9

D8

D7

D6

D5

D4

D3

D2

D1

D0

Не используется

Регистр

Данные

Адреса регистров

Регистр

Адрес

HEX CODE

D15-D12

D11

D10

D9

D8

Нет операции

х

0

0

0

0

X0

Индикатор 0

х

0

0

0

1

X1

Индикатор 1

х

0

0

1

0

X2

Индикатор 2

х

0

0

1

1

X3

Индикатор 3

х

0

1

0

0

X4

Индикатор 4

х

0

1

0

1

X5

Индикатор 5

х

0

1

1

0

X6

Индикатор 6

х

0

1

1

1

X7

Индикатор 7

х

1

0

0

0

X8

Режим декодирования

х

1

0

0

1

X9

Интенсивность

х

1

0

1

0

XA

Рабочие индикаторы

х

1

0

1

1

XB

Гашение

х

1

1

0

0

XC

Тест индикаторов

х

1

1

1

11

XF

Режим декодирования

Микросхема MAX7219 может работать в двух режимах – декодирования BCD кода или непосредственной установки каждого сегмента. Имеется возможность установки режима для отдельных индикаторов. Делается это с помощью регистра режима декодировании. При записи в этот  регистр, каждый разряд отвечает за отдельный семисегментный индикатор (одну цифру). Если в регистр записаны все 0, тогда декодирование не производится. Некоторые возможные варианты данных, для записи в регистр декодирования приведены в таблице.

Режим декодирования

D7

D6

D5

D4

D3

D2

D1

D0

HEX CODE

Нет декодирования

0

0

0

0

0

0

0

0

00

Декодирование в индикаторах 0-3.

0

0

0

0

1

1

1

1

0F

Декодирование во всех индикаторах

1

1

1

1

1

1

1

1

FF

Интенсивность свечения.

MAX7219/7221 позволяет задавать интенсивность свечения индикаторов, путем изменения скважности импульсов, реализующих режим динамической индикации. Для этого в соответствующий регистр заносится нужное значение. Для записи используются только 4 младших бита данных.

Соотношение цикла

D4-D7

D3

D2

D1

D0

HEX CODE

MAX7219

MAX7221

1/32

1/16

x

0

0

0

0

X0

3/32

2/16

x

0

0

0

1

X1

5/32

3/16

x

0

0

1

0

7/32

4/16

x

0

0

1

1

X3

9/32

5/16

x

0

1

0

0

X4

11/32

6/16

x

0

1

0

1

X5

13/32

7/16

x

0

1

1

0

X6

15/32

8/16

x

0

1

1

1

X7

19/32

9/16

x

1

0

0

0

X8

17/32

10/16

x

1

0

0

1

X9

21/32

11/16

x

1

0

1

0

XA

23/32

12/16

x

1

0

1

1

XB

25/32

13/16

x

1

1

0

0

XC

27/32

14/16

x

1

1

0

1

XD

29/32

15/16

x

1

1

1

0

XE

31/32

15/16

x

1

1

1

1

XF

Использование индикаторов

При работе микросхемы MAX7219 и MAX7221 позволяют использовать не все 8 индикаторов, а только необходимое количество. При этом отсчет начинается с 0 индикатора. Для задания используется 3 младших байта данных.

Индикатор

D3-D7

D2

D1

D0

HEX CODE

0

x

0

0

0

X0

0,1

x

0

0

1

X1

0,1,2

x

0

1

0

X2

0,1,2,3

x

0

1

1

X3

0,1,2,3,4

x

1

0

0

X4

0,1,2,3,4,5

x

1

0

1

X5

0,1,2,3,4,5,6

x

1

1

0

X6

0,1,2,3,4,5,6,7

x

1

1

1

X7

Тест дисплея

При записи в регистр теста единицы в младший разряд, микросхема включает все индикаторы. Это позволяет проверить работоспособность схемы и LED индикаторов.

Каскадирование индикаторов

Микросхемы MAX7219/7221 допускают каскадное включение. При этом информация передается последовательно из микросхемы в микросхему. Для целей недопущения искажения индикации, может быть использован регистр – Нет операции.  При его задействовании микросхемы не производят никаких действий с индикаторами.

Выбор резистора Rset.

Для задания тока через отдельный сегмент, используется вход ISET, к которому подключается резистор Rset. Выбрать номинал резистора в кОм можно по таблице:

Ток через сегмент (мА)

Напряжение питания индикатора (В)

1.5

2.0

2.5

3.0

3.5

40

12.2

11.8

11.0

10.6

9.69

30

17.8

17.1

15.8

15.0

14.0

20

29.8

28.0

25.9

24.5

22.6

10

66.7

63.7

59.3

55.4

51.2

Еще по теме:

Модуль семисегментных индикаторов

Работа с драйвером индикаторов MAX7219

Добавить комментарий

mcucpu.ru

049-Драйвер линейки 7-сегментных индикаторов на ATtiny13 (бегущая строка). — GetChip.net

титл

Уффф… Наконец-то добрался до паяльника! Сейчас сделаем что-нибуть интересненькое.

Раньше мы сказали «А», собрав устройство ввода – клавиатуру, теперь мы просто обязаны сказать «Б» и сделать устройство вывода, чем мы сегодня и займемся. В качестве устройства «Б» у нас будет выступать 7-сегментный индикатор. Но не просто один индикатор, а целая линейка семисегментных индикаторов, причем неограниченной длинны и с кучей эффектов отображения! Интересно? Ну, тогда, начнем!

Семисегментные индикаторы довольно неоднозначные устройства для отображения. По причине того, что они предназначены для отображения цифр (хотя, конечно, можно отобразить и буквы, но довольно условно и не все), круг их применения не очень широк. Но есть случаи, когда требуется яркое и четкое отображения цифр, которые, к тому же, должны быть видны издалека, и тут равных семисегментникам нет.

Часто, когда идет речь о семисегментных индикаторах, подразумевается включение их в схему с динамической индикацией, при этом, по очереди засвечивается только один символ, и при частоте выше 50Гц, создается иллюзия, что светятся все символы одновременно. Эта схема настолько распространена, что 3-4х циферные индикаторы имеют выводы только под динамическую индикацию. У такого способа включения, конечно, есть свои плюсы, но когда речь идет о количестве цифр больше чем четыре (а тем более, если не известно, сколько их вообще будет) – начинаются проблемы с этой самой динамической индикацией — падает яркость свечения становиться заметно мерцание. Очевидно, что для линейки семисегментных индикаторов неограниченной длинны, такой способ включения абсолютно не подходит. Как же быть в таком случае? Поступим нестандартно – включим наши индикаторы на статическое (постоянное) свечение. Чтобы такое подключение стало возможным, нам понадобятся одноциферные семисегментные индикаторы – вот, например, такие:

Одноциферный семисегментник

Кроме того, для засветки нужных сегментов индикатора, нам нужен драйвер светодиодов. Чтобы не увеличивать стоимость нашей линейки (микросхема-драйвер довольно дорогая) будем применять дешевые и распространенные сдвиговые регистры 74HC164. Это немного ухудшит яркость свечения, но значительно удешевит все устройство. Для управления линейкой будем использовать микроконтроллер ATtiny13 – больший не нужен. Сдвиговые регистры управляются всего двумя линиями (Data, Clock) и включаются последовательно, а значит, нет разницы для схемы управления регистрами, сколько их там стоит в линейке три или сто двадцать три. Значит, можно сделать нашу линейку безразмерной, то есть к линейке можно в любое время подключить дополнительные индикаторы или убрать ненужные. Схема устройства выглядит следующим образом:

Схама драйвера линейки

Как видно из схемы, семисегментные индикаторы с регистром 74HC164 установливаются на отдельные платы с разъемами по обе стороны для того, чтобы можно было собрать несколько индикаторов в линейку. Плата управления (драйвер линейки) на ATtiny13 управляет всеми индикаторами вне зависимости от их количества. Более того, в прошивке предусмотрена возможность для того, чтобы в линейку можно было включать вперемешку индикаторы с общим анодом и общим катодом. Символы отображаются справа налево. Этот вариант отображения удобен для случая, когда неизвестно, сколько индикаторов включено в линейке – последние введенные символы всегда находятся в первых индикаторах. Кроме сигнала данных (Data) и сигнала тактирования данных (Clock), драйвером формируется сигнал “/OE” (Output Enable) для того чтобы избежать мерцания сегментов при сдвиге символов по регистру. В момент сдвига данных по регистру драйвер выставляет на линии /ОЕ высокий уровень, схема управления индикаторами по этому уровню сигнала должна запретить вывод данных на индикатор. В данном схемном решении этот сигнал не задействован по причине отсутствия в сдвиговых регистрах 74HC164 ножки переводящей выходы в высокоомное состояние, но можно этим сигналом отключать общий вывод индикатора (через транзистор) или использовать другую микросхему, имеющую соответствующий вход.

Алгоритм работы устройства.Я долго размышлял над тем, как сделать управление линейкой простым и не обременительным для микроконтроллера Вашего проекта. Главная цель, которую я преследовал, максимально переложить функции управления на драйвер линейки, но в тоже время не потерять возможности гибкого управления со стороны Вашего проекта. В результате был разработан следующий алгоритм работы:

Драйвер линейки взаимодействует с Вашим проектом по UART (Скорость 9600, 8 бит данных, 1 стоп бит, бита четности нет). Драйвер работает как на прием, так и на передачу (хотя последнее не столь важно и можно данную возможность не использовать, тем самым свести управление драйвером всего к одной линии).В драйвер могут передаваться цифры, буквы латиницы, управляющие символы. Передача осуществляется в ASCII коде (пример: цифры -“123”, буквы-“Аbc”, управляющие символы-“>”). Другие символы игнорируются.

Драйвер, по UART, отправляет символы окончания эффектов. Их всего два — “V” и “D”. Это нужно для того, чтобы знать когда окончился эффект и можно отправить следующую команду эффекта для формирования сложных составных эффектов.

Переданные, для отображения, цифры и буквы латиницы записываются в буфер (размер буфера может быть 16, 32, 64 знака и выбирается по нуждам проекта). Переполнения буфера нет, он циклический (новые символы пишутся поверх самых старых). Управляющие символы в буфер не записываются – они активируют свои функции немедленно в момент приема по UART (например: при посылке строк “abcd>” и “ab>cd” результат будет идентичен). На линейку индикаторов символы попадают из буфера, при этом способ их отображения зависит от активированных эффектов. Такой вариант наименее ресурсоемок для контроллера Вашего проекта, так как введенная в буфер строка символов отображается с различными эффектами посредством лишь ресурсов драйвера.

По умолчанию драйвер отображает полученные символы на линейке без каких либо эффектов. Если по UART передавать цифры или букв латиницы (например, “1”, “4”, “A“, ”S” ”d” …) они сразу будут отображаться на линейке справа налево, причем следующий символ будет сдвигать влево предыдущий.Далее идет описание всех символов которые можно отправить в драйвер.

Отображаемые символы.Драйвер умеет отображать цифры и буквы латиницы (верхний и нижний регистр отображается одинаково), а также, пробел и десятичную точку.

Управляющие символы.Для выбора режима работы линейки или активации спецэффектов нужно передать по УАРТ специальные символы. Как я писал раньше, управляющие символы начинают работать немедленно, после приема по UART, и в буфер они не попадают. Соответственно их можно пересылать прямо в строке сообщения.Пример: “_Аbc>”, где “Аbc”-отображаемое сообщение, а “_” и “>”-управляющие символы.

Вот перечень символов управляющих режимом работы индикаторов:

“)” – разрешение автоматического отображения буфера (по умолчанию активировано).При включенном автоматическом обновлении буфер, с определенным периодом, перерисовывается на линейке. Каждый принятый по UART и записанный в буфер символ сразу же отобразится на линейке.

“(“ – запрет автоматического отображения буфера.Все принятые по UART символы продолжают записываться в буфер драйвера, но на линейке не происходит ни каких изменений (“светится” последнее сообщение). Запрет автоматического обновления линейки может понадобиться в том случае, если нужно вывести сразу всю строчку целиком, а не посимвольно, или для того, чтобы подготовить следующее сообщение, не изменяя предыдущее.Пример: переданная по UART строка “(2314” ни как не отобразится на линейке, но в буфере запишется. Если дальше включить автоматическое отображение — “)”, то на линейке мы увидим наше слово “2314”. Для того, чтобы выводить строку сообщения целиком, а не по факту передачи символов по UART, нужно послать следующую комбинацию “(2314)”. Это актуально если символы 2, 3, 1, 4 передаются по UART не сразу, а в течении определенного времени.

“!” – принудительный вывод буфера на линейку.Нужен для того, чтобы однократно отобразить буфер на линейке, при отключенном автоматическом обновлении.Пример: запретили автоматическое отображение “(“, передали символы “2314”, принудительно их отображаем “!”.

“_” (знак подчеркивания) – очистка буфера.После приема этого символа буфер немедленно очистится. Если запрещено автоматическое отображение буфера, на линейке не произойдет никаких изменений, так как очищается только буфер. Для очистки линейки, в этом случае, нужно запустить автоматическое отображение буфера или послать символ принудительного вывода буфера “!”.

”[“ – включение режима инверсии символов.В режиме инверсии, выводимые на линейку символы, инвертируются (побитно). Такой режим нужен, если Вы умудрились соединить в одну линейку вперемешку индикаторы с общим анодом и общим катодом. При подаче инверсного сигнала на индикатор противоположного подключения последний отобразит символ корректно. Даже если вся линейка индикаторов не соответствует прошивке в начале сеанса достаточно послать символ ”[“ и дальше все будет работать корректно.

“]” – выключение режима инверсии символов (по умолчанию активировано). Пример: Если прошивка для индикаторов с общим анодом, а индикаторы включены так: ОА—ОК—ОА. Передаем строку «3[4]5» получим на линейке 345. Если передать так — «345» то получим «3-черте-что-5».

Далее символы для организации спецэффектов:Пакет управляющих символов для исчезновения-проявления содержимого линейки.

“*“ – посимвольное «исчезновения» содержимого линейки. Символы на линейке последовательно гасят свои сегменты, пока совсем не «исчезнут» (содержимое буфера остается нетронутым). По окончании эффекта в UART выдается символ “D” и запрещается автоматическое отображение буфера.

“^“ – посимвольное «проявление» содержимого линейки. Символы на линейке последовательно зажигают свои сегменты до полного «проявления» (содержимое буфера остается нетронутым). По окончании эффекта в UART выдается символ “D” автоматическое отображение буфера разрешено.Для полноты эффекта линейка индикаторов должна быть пуста, запрещено автоматическое отображение буфера и в буфере должно находиться проявляемое слово (сделать это можно следующей строчкой “)_!проявляемое слово”). Данный эффект хорош после исчезновения предыдущего слова по “*”.

Пакет управляющих символов для горизонтального скроллинга (бегущей строки).Пакет позволяет организовать бегущую строку из содержимого буфера. От Вас требуется лишь поместить строку в буфер и управляющим символом задать направление движения, все остальное будет делать драйвер.

“>“ – Автоматический скроллинг содержимого линейки вправо (бегущая строка).Содержимое буфера не изменяется. Эффект бесконечен (движение по кругу), ни какие символы по UART не возвращаются. Остановить можно символом “|“.

“<“ – Автоматический скроллинг содержимого линейки влево (бегущая строка).Содержимое буфера не изменяется. Эффект бесконечен (движение по кругу), ни какие символы по UART не возвращаются. Остановить можно символом “|“.

“|“ – Остановка скроллинга. Позиция отображения возвращается в нормальное состояние.

Пакет управляющих символов для вертикального сдвига.Этот пакет эффектов позволяет организовать несколько интересных эффектов, например, имитация движения по пунктам меню; периодическое отображение какой-либо служебной информации (например, времени, выдвигая часы снизу и потом туда их убирая) и т.д.

“\“ – Вертикальный сдвиг-появление символов линейки вверх (появление вверх – с пустого места до полных символов). По окончании эффекта в UART выдается символ “V”, автоматическое отображение буфера разрешено.

“/“ – Вертикальный сдвиг-исчезновение символов линейки вверх (исчезновение вверх – с полных символов до пустого места). По окончании эффекта в UART выдается символ “V” и запрещается автоматическое отображение буфера.

“:“ – Вертикальный сдвиг-появление символов линейки вниз (появление вниз – с пустого места до полных символов). По окончании эффекта в UART выдается символ “V”, автоматическое отображение буфера разрешено.

“;“ – Вертикальный сдвиг-исчезновение символов линейки вниз (исчезновение вниз – с полных символов до пустого места). По окончании эффекта в UART выдается символ “V” и запрещается автоматическое отображение буфера.

Вот пример реализации движения по меню посредством эффектов пакета:

А это пример информационного сообщения:

Пакет управляющих символов для изменения скорости эффектов.Следующие символы изменяют скорость прохождения эффектов.

“-“ – активируется нормальная скорость.

“+“ – активируется повышенная скорость.

Дополнительные пояснения по управления эффектами.

— Все эффекты работают независимо друг от друга. Это значит, что Вы можете запустить сразу несколько эффектов одновременно! Строка вида «_Start>*;» очистит буфер, запишет в него слово «START», запустит бегущую строку вправо, во время пробега она будет исчезать посегментно и в придачу опускатся вниз. При помощи различных комбинаций можно получить совершенно новые эффекты. Экспериментируйте!

— При подаче взаимно исключающих команд, например ”<” и “>” – сработает последняя — “>”.

— Во время действия спецэффектов можно заполнять буфер новыми словами. Они сразу же начнут участвовать в эффекте.

— Очевидно, что если количество индикаторов меньше чем величина буфера, то будут отображаться только последние введенные символы, влезшие в количество индикаторов. В противоположном случае, если буфер меньше количества индикаторов, то буфер на индикаторах будет повторяться циклически.

Прошивки для индикаторов с общим анодом (OA)049-UART-to-7Seg-16-OA v1.0 - Прошивка для ATtiny13 драйвера линейки 7-сегментных индикаторов. Буфер - 16 символов. Индикаторы с общим анодом.049-UART-to-7Seg-32-OA v1.0 - Прошивка для ATtiny13 драйвера линейки 7-сегментных индикаторов. Буфер - 32 символов. Индикаторы с общим анодом. 

Прошивки для индикаторов с общим катодом (OK)049-UART-to-7Seg-16-OK v1.0 - Прошивка для ATtiny13 драйвера линейки 7-сегментных индикаторов. Буфер - 16 символов. Индикаторы с общим катодом.049-UART-to-7Seg-32-OK v1.0 - Прошивка для ATtiny13 драйвера линейки 7-сегментных индикаторов. Буфер - 32 символов. Индикаторы с общим катодом.

Фьюзы для всех прошивок одинаковы049-Fuse - Фьзы для прошивок драйвера линейки

Размер буфера следует выбирать, по возможности, наименьшим. Меньший буфер меньше шумит сегментами индикаторов при сдвигах и обновлениях линейки (это касается только схем без гашения индикаторов сигналом /ОЕ).

Прошивка для OA будет работать с OK-индикаторами, если в начале сеанса работы послать управляющий символ инвертирования “[“, и наоборот.

Файлы к статье:049-7Seg-shem - Схема драйвера линейки индикаторовATTiny13.pdf - Даташит для ATTiny13/13VRL-S10-SERIES - Даташит на дюймовый 7-сегментный индикатор74HC164 - Даташит на сдвиговый регистр049-AB-UART-to-7Seg v1 - Исходник на Algorithm Builder драйвера линейки 7-сегментных индикаторов

Смотрим также:Демонстрацию устройства в следующей статье.

P.S. В процессе написания статьи появились идеи еще по нескольким дополнительным функциям, которые еще больше смогут упростить работу Вашего проекта с драйвером. В скором времени будет вторая версия прошивок для этого устройства. Если у Вас есть какие идеи или пожелания, пишите, будем их реализовывать.

(Visited 5 299 times, 3 visits today)

www.getchip.net

Управление драйвером семисегментных индикаторов MAX7219

Вернуться

В этой статье хочу показать как программно управлять модулем с драйвером MAX7219 и восемью семисегментными индикаторами. Довелось пообщаться с этим модулем и надо сказать, мне он очень понравился. Понравилось и то, как легко им управлять и то, что он освобождает микроконтроллер от обслуживания динамической индикации. С ним можно вообще данные переписывать только при их изменении, как с LCD дисплеем. Привожу здесь код программы (демо) для микроконтроллера на языке Си.

В общем то управление драйвером простое, как сдвиговым регистром по трехпроводной схеме (3-Wire). Вернее он и имеет как раз в своем составе сдвиговый регистр. Алгоритм управления такой. Низким уровнем на входе CS разрешаем принимать данные. Данные отсылаются по 16 бит, старшим битом вперед. Биты с 15 по 8 это или адрес знакоместа (значения от 1 до 8), или служебная команда (значения от 9 до 15). Биты с 7 по 0 это данные, либо для инструкции, либо образ (маска) символа. Каждый выставленный бит на входе DIN записывается в регистр по фронту тактового импульса на входе CLK. После того как все биты переданы, "защелкиваем" их, выставив единичку на входе CS.

Управляет драйвер восемью светодиодными семисегментными индикаторами с общим катодом. Это означает, что чтобы погасить все сегменты индикатора, надо прописать в него 0, а что бы зажечь, нужно прописать 255. Каждый из разрядов индикатора имеет независимую адресацию и его содержимое может быть обновлено без необходимости перезаписи всего индикатора.

Внешний вид модуля MAX7219.

внешний вид модуля MAX7219

Сама плата выполнена качественно, а вот индикаторы на ней припаяны кривовато. Подключение индикаторов странное. Ожидалось, что под номером 1 будет индикатор расположенный слева, но как видим слева идут 8, 7, 6 и т. д.. Почему-то распаяны они именно так, хоть это и не критично, и легко корректируется в коде программы.

знакоместа идут справа налево

Даже на минимальной яркости индикаторы светят очень ярко для фотоаппарата. А вообще нормальная яркость свечения на середине регулировки, значения от шести до восьми.

вид модуля через светофильтр

А так индикаторы смотрятся через светофильтр. Яркость свечения не уменьшилась, а вот незасвеченные сегменты уже не видно.

Код "демки" на языке Си.

/**************************************************************/ /*** Управление драйвером семисегментных индикаторов MAX7219 **/ /************** нагруженным на восемь индикаторов. ************/ /************ Микроконтроллер: PIC16F628A *********************/ /************ Среда разработки MPLAB IDE v8.89 - язык C *******/ #include // нужен для HI-TECH C компилятора #include // для работы с функцией задержки #define _XTAL_FREQ 4000000 // прописываем частоту генератора /************* прописали выводы микроконтроллера **************/ #define knopkaup RA0 // кнопка больше #define knopkadown RA1 // кнопка меньше #define DIN RB0 // определение ввод данных #define CLK RB1 // определение тактирующего сигнала #define CS RB2 // определение выбор устройства #define DIN_OFF() DIN = 0; // данные в ноль #define DIN_ON() DIN = 1; // данные в еденичку #define STR_OFF() CLK = 0; // Строб в ноль #define STR_ON() CLK = 1; // Строб в еденичку #define WR_OFF() CS = 0; // начало передачи #define WR_ON() CS = 1; // завершение передачи /******************* логические операции **********************/ #define TestBit(x,y) (x & (1 // проверка бита /********************** конфигурация **************************/ __CONFIG // Биты конфигурации (INTIO // Внутренний генератор 4 мГц & UNPROTECT // off защиту памяти & BOREN // on контроль питания & MCLRDIS // off вывод начальной установки & PWRTEN // on таймер задержки запуска & WDTDIS // off сторожевой таймер & LVPDIS ); // off низковольтное программирование /************************ переменные **************************/ unsigned char const cifra[11] = {0b01111110, 0b00110000, 0b01101101, 0b01111001, 0b00110011, 0b01011011, 0b01011111, 0b01110000, 0b01111111, 0b01111011, 0b00000000}; unsigned char const segment[6] = {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100, 0b00000010}; unsigned char i, c, bright_indik, hg1, hg2, hhg1, hhg2; /************************* функции ****************************/ void podgot(void) { TRISA = 0b00000011; // направление работы ножек порта А TRISB = 0b00000000; // направление работы ножек порта В CMCON = 0x07; // отключение компараторов PORTB = 0xff; // очищаем порт B RBPU = 0x01; // подтягивающие R (0-вкл, 1-выкл) } void w3_write(unsigned char adres, unsigned char data) { char i; WR_OFF(); // начало передачи for(i = 8; i > 0;i --) { if(TestBit(adres, i - 1)) { DIN_ON(); // выставили единичку } else { DIN_OFF(); // выставили нолик } STR_ON(); // такт в единичку __delay_us(5); // длительность строба STR_OFF(); // такт в ноль } for(i = 8; i > 0; i --) { if(TestBit(data, i - 1)) { DIN_ON(); // выставили единичку } else { DIN_OFF(); // выставили нолик } STR_ON(); // такт в единичку __delay_us(5); STR_OFF(); // такт в ноль } WR_ON(); // завершение передачи } void clear(void) { char i; for(i = 8; i > 0; i --) { w3_write(i, cifra[10]); // гасим все индикаторы } } void inic7219(void) { w3_write(0x0F, 0x00); // тест выключен w3_write(0x0C, 0x01); // нормальный режим w3_write(0x0B, 0x07); // кол-во знаков 8 w3_write(0x09, 0x00); // дешифраторы отключены w3_write(0x0A, bright_indik); // яркость свечения clear(); } void klava(void) { if(knopkaup == 0 && bright_indik != 15) { bright_indik ++; clear(); w3_write(0x0A, bright_indik); // яркость свечения hg1 = bright_indik / 10; // значение первой цифры hg2 = bright_indik % 10; // значение второй цифры hhg1 = cifra[hg1]; // маска первой цифры hhg2 = cifra[hg2]; // маска второй цифры w3_write(5, hhg1); // прописали первую цифру w3_write(4, hhg2); // прописали вторую цифру __delay_ms(1500); clear(); return; } if(knopkadown == 0 && bright_indik != 0) { bright_indik --; clear(); w3_write(0x0A, bright_indik); hg1 = bright_indik / 10; hg2 = bright_indik % 10; hhg1 = cifra[hg1]; hhg2 = cifra[hg2]; w3_write(5, hhg1); w3_write(4, hhg2); __delay_ms(1500); clear(); } } /******************* основная программа ***********************/ void main(void) { podgot(); bright_indik = 8; // яркость по умолчанию inic7219(); __delay_ms(500); while(1) { for(c = 0; c 3; c ++) { for(i = 0; i 6; i ++) { w3_write(8, segment[i]); w3_write(7, segment[i]); w3_write(6, segment[i]); w3_write(5, segment[i]); w3_write(4, segment[i]); w3_write(3, segment[i]); w3_write(2, segment[i]); w3_write(1, segment[i]); __delay_ms(80); } } __delay_ms(500); clear(); klava(); for(i = 8; i > 0; i --) { w3_write(i, cifra[i]); __delay_ms(500); } __delay_ms(500); clear(); klava(); } }

Теперь о коде. Главная здесь функция w3_write(), на ней все построено. При вызове функция получает два аргумента, adres и data и засылает их в регистр. Сначала восемь бит адреса или инструкции, затем восемь бит данных. Как уже было сказано, старшим битом вперед. После подачи питания и конфигурирования микроконтроллера вызывается подпрограмма inic7219(), которая прописывает в микросхему некоторую последовательность команд, после которой микросхема начинает нормально работать. Без инициализации микросхема ничего высвечивать не будет.

Еще в коде программы производится опрос двух кнопок. Это регулировка яркости свечения индикаторов. Если подключить модуль к отладочной плате, то можно увидеть, как действует регулировка. В Протеусе к сожалению этого не видно. Значения яркости от трех до пятнадцати яркость одинаковая. От ноля до двух индикаторы вообще не светятся.

О соответствии битов data и сегментов индикаторов. Старший, седьмой бит управляет точкой (DP), биты с шестого по нулевой сегменты A,B,C,D,E,F и G соответственно. В принципе образы всех цифр уже прописаны в массиве cifra[]. Но если возникнет надобность закодировать какой-то иной символ, то можно воспользоваться онлайн-генератором здесь на сайте. В нем можно задать любую последовательность сегментов.

В заключении ссылка на проект Протеуса с hex файлом.

naladchikkip.ru


Смотрите также