В первой части, посвященной методике работы с драйвером светодиодных индикаторов MAX7221, было знакомство с этим драйвером. В частности был описан режим прямого управления сегментами. Осталось научится работать во втором режиме, при котором используется встроенный в микросхему декодер символов.
Если пропустили первую часть об этой микросхеме, советую почитать.
Итак, в прошлый раз мы выводили цифры на индикатор путем прямого управления сегментами, то есть зажигали каждый сегмент в каждом разряде по отдельности. Это заставляет поначалу поломать голову над подключением индикатора и соответствии регистров и сегментов. В режиме BCD code B с этим намного проще. Например, чтобы вывести в первый разряд какую-нибудь цифру, мы отправляем адрес этого разряда (как и в случае прямого управления) а затем отправляем саму эту цифру. Это стало доступно благодаря встроенному в микросхему декодера символов, который сам зажжет нужные сегменты индикатора. Декодер имеет память всего на 16 символов: цифры от 0 до 9, знак “-“, пустой символ и 4 буквы – “E”, “H”, “L”, “P”. Как это работает: например нам нужно вывести цифру 9, мы просто берем и отправляем эту цифру в микросхему (см. значение в Register Data в таблице ниже). Понятно что отправленная цифра будет соответствовать выводимой цифре.
Дальше идут спецсимволы, для того чтобы их вывести тоже нужно отправить цифру. Для вывода знака “-” отправляем цифру 10. Соответственно, чтобы вывести на индикатор букву “E” отправим в микросхему цифру 11 и так далее. На самом деле просто и очень удобно. Теперь перейдем к делу, подключим драйвер к микроконтроллеру и выведем какие нибудь данные на индикатор, настроив MAX7221 в режим декодирования.
Схема подключения драйвера осталась от прошлого раза:
Как и в прошлый раз для тестирования использовал 4х разрядный индикатор.
Вот исходник тестовой прошивки, которая сначала выведет на индикатор “—-“, затем слово “HELP” и потом увеличивающееся значение переменной А:
$regfile = “attiny2313.dat”
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40
Config Portd = Output
Cs Alias Portd.1
Ser_clk Alias Portd.2
Ser_data Alias Portd.3
Dim A As Word
Dim Digit(8)as Byte
Dim Y As Byte
Dim Disp_num As Byte
Dim Disp_data As Byte
Dim Digit_str As String * 4
Dim Temp_str As String * 2
Gosub Max7219_setup ‘выполняем обязательную настройку микросхемы
‘выведем эти строки на индикатор
Digit_str = “—-“
Gosub Prepare
Wait 2
Digit_str = “HELP”
Gosub Prepare
Wait 2
Do ‘в главном цикле будем отображать значение увеличивающейся переменной
Wait 1
Incr A ‘переменная значение которой выводим на индикатор
Digit_str = Str(a)
Digit_str = Format(digit_str , “0000”)
Gosub Prepare
Loop
End
‘Подготовка данных для передачи
Prepare:
Do
For Y = 1 To 4
Temp_str = Mid(digit_str , Y , 1)
Select Case Temp_str
‘каждый символ в Case имеет собственное цифровое значение (см. таблицу)
Case “0” : Temp_str = “0”
Case “1” : Temp_str = “1”
Case “2” : Temp_str = “2”
Case “3” : Temp_str = “3”
Case “4” : Temp_str = “4”
Case “5” : Temp_str = “5”
Case “6” : Temp_str = “6”
Case “7” : Temp_str = “7”
Case “8” : Temp_str = “8”
Case “9” : Temp_str = “9”
Case “-” : Temp_str = “10”
Case “E” : Temp_str = “11”
Case “H” : Temp_str = “12”
Case “L” : Temp_str = “13”
Case “P” : Temp_str = “14”
Case ” ” : Temp_str = “15”
End Select
Digit(y) = Val(temp_str)
Disp_num = Y ‘номер разряда в который будут записаны данные
Disp_data = Digit(y) ‘данные которые будут записаны в этот разряд
Gosub Disp_write
Next Y
Loop Until Y = 5
Return
‘Передаем данные в Max7221
Disp_write:
Ser_data = 0
Ser_clk = 0
Cs = 0
Shiftout Ser_data , Ser_clk , Disp_num , 1 ‘номер разряда для вывода информации
Shiftout Ser_data , Ser_clk , Disp_data , 1 ‘данные, выводимые в этот разряд
Cs = 1
Return
‘инициализации max7221
Max7219_setup:
Disp_num = &H0C : Disp_data = 0 ‘будим микросхему и начинаем ее настраивать
Gosub Disp_write
Disp_num = &H09 : Disp_data = &B11111111 ‘включаем режим BCD code B
Gosub Disp_write
Disp_num = &H0A : Disp_data = 10 ‘уровень свечения сегментов от 0 до 15
Gosub Disp_write
Disp_num = &H0B : Disp_data = 3 ‘число используемых разрядов (4 разряда)
Gosub Disp_write
Disp_num = &H0F : Disp_data = 0 ‘тестовый режим выключен (0-вык, 1-вкл)
Gosub Disp_write
Disp_num = &H0C : Disp_data = 1
Gosub Disp_write
Return
Видео работы (я тут немного изменил программу, для поочередного вывода символов)
Последние статьи
- Лучшая практика проектирования при размещении компонентов печатной платы
- Android 6.0 на lancer X
- Простой усилитель мощности класса АВ своими руками.
- Двухтактный ультралинейный ламповый УНЧ на EL84 (6П14П).
- Люксметр на ATmega8 и цифровом датчике BH1750
- Контроллер для светодиодной ленты с ИК управлением
- Самодельный LED светильник на основе ИК датчика HC-SR501
- Простой усилитель низкой частоты на TDA7377 и NE5532
- Простейший звонок с двумя мелодиями
- LED Cube 8x8x8 на Arduino с RTC