Для того чтобы отобразить многоразрядное число на индикаторе с ним нужно предварительно провести хитрую манипуляцию, заключающуюся в разбивке числа на его составляющие. В качестве примера приведу отображение числа 1234 на счетверенный семисегментный индикатор с общим анодом.
Для отображения четырехразрядного числа необходимо завести одну общую переменную в которой будет лежать число которое хотим вывести (переменная W), четыре переменные в которых будут храниться данные для каждого знака (N) и еще четыре переменные для промежуточных преобразований (M), чтобы не трогать главную переменную. Переменная должна соответствовать тому значению, которое будет в ней хранится. Так для переменной W достаточным будет тип integer, так как переменная такого типа способна хранить значения от -32768 до +32767 (или word если не планируется использование отрицательных чисел). В переменных N будут лежать числа от 0 до 9 поэтому достаточным будет использование переменной типа byte. А в переменных M будут находиться те же значения что и в переменной W, поэтому ставим тип integer.
Dim W As Integer
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim M1 As Integer
Dim M2 As Integer
Dim M3 As Integer
Dim M4 As Integer
После объявления переменных настраиваем порты на выход которые будут использоваться для подключения индикатора:
DDRC = &B11111111
DDRD = &B11111111
‘Arial’,’sans-serif'”> Здесь я поставил на выход все ноги порта C и D, но можно оставить только те которые будут использоваться в качестве выходов, к примеру так: DDRC=&B00001111 и DDRD = &B01111111 (четыре первых ноги порта С под аноды и шесть первых порта D под сегменты).
W = 1234
‘Arial’,’sans-serif'”> В основном цикле программы присваиваем переменным М значение переменной W, я делаю так:
M1 = W
M2 = M1
M3 = M1
M4 = M1
‘Arial’,’sans-serif'”> Это не паранойя)), это сделано с той целью, чтобы в во всех переменных М лежало одно и тоже число, так как во время операции присваивания легко может ворваться прерывание (если такое имеется и не отключено), в обработчике которого переменная W может измениться. И в случае если присваивание шло таким образом: М1=W, M2=W, M3=W, M4=W в переменных М будут лежать разные значения что приведет к каше в показаниях.
После присвоения переменным значения начинаем работать с
каждой из них, преобразуя таким образом, чтобы в переменную N попало то значение, которое будет
отображаться на индикаторе: в переменной N1 должна оказаться «1», в N2 – «2», в N3 – «3», а в N4 – «4».
M1 = M1 / 1000 ‘ M1 = 1234/1000 = 1,234
N1 = Abs (m1) ‘ N1 = Abs (1,234) = 1
Abs – функция возвращающая целое число переменной. В переменную N1 попала единица, что собственно и требовалось.
M2= M2 Mod 1000 ‘ M2 =1234 Mod 1000 = 234
M2 = M2 / 100 ‘ M2 = 234 / 100 = 2,34
N2= Abs (m2) ‘ N2 = Abs (2,34) = 2
‘Arial’,’sans-serif'”> Для начала функцией Mod мы возвращаем переменной первые три
цифры числа (остаток от деления на 1000), а дальше все как в первом случае.
С двумя последними разрядами практически тоже самое:
M3 = M3 Mod100
M3 = M3 / 10
N3 = Abs(m3)
M4 = M4 Mod 10
N4= Abs(m4)
Теперь в наших переменных лежат те значения, которые мы хотим отобразить, самое время микроконтроллеру подрыгать ногами и вывести эти значения на индикатор, для этого вызываем подпрограмму обработки индикации: ‘Arial’,’sans-serif'”> Gosub Led
‘Arial’,’sans-serif'”> Процессор перепрыгнет на подпрограмму с меткой Led:
Led:
Portc =&B00001000
‘Arial’,’sans-serif'”> Здесь подаем высокий уровень на PORTC.3 , к этой ноге у нас подсоединен анод первого разряда. Затем выбираем, какие сегменты необходимо зажечь, чтобы отобразить значение первой переменной. Она у нас единица поэтому ноль будет на ногах Portd.1и Portd.2, что соответствует сегментам B и С индикатора.
Select Case N1
Case 0 : Portd = &B11000000
Case 1 : Portd = &B11111001
Case 2 : Portd = &B10100100
Case 3 : Portd = &B10110000
Case 4 : Portd = &B10011001
Case 5 : Portd = &B10010010
Case 6 : Portd = &B10000010
Case 7 : Portd = &B11111000
Case 8 : Portd = &B10000000
Case 9 : Portd = &B10010000
End Select
Waitms 5
‘Arial’,’sans-serif'”> После того как зажгли нужные сегменты ждем 5 мс и переходим к отображению следующих чисел:
Portc = &B00000100
Select Case N2
Case 0 : Portd = &B11000000
Case 1 : Portd = &B11111001
Case 2 : Portd = &B10100100
Case 3 : Portd = &B10110000
Case 4 : Portd = &B10011001
Case 5 : Portd = &B10010010
Case 6 : Portd = &B10000010
Case 7 : Portd = &B11111000
Case 8 : Portd = &B10000000
Case 9 : Portd = &B10010000
End Select
Waitms 5
Portc = &B00000010
Select Case N3
Case 0 : Portd = &B11000000
Case 1 : Portd = &B11111001
Case 2 : Portd = &B10100100
Case 3 : Portd = &B10110000
Case 4 : Portd = &B10011001
Case 5 : Portd = &B10010010
Case 6 : Portd = &B10000010
Case 7 : Portd = &B11111000
Case 8 : Portd = &B10000000
Case 9 : Portd = &B10010000
End Select
Waitms 5
Portc = &B00000001
Select Case N4
Case 0 : Portd = &B11000000
Case 1 : Portd = &B11111001
Case 2 : Portd = &B10100100
Case 3 : Portd = &B10110000
Case 4 : Portd = &B10011001
Case 5 : Portd = &B10010010
Case 6 : Portd = &B10000010
Case 7 : Portd = &B11111000
Case 8 : Portd = &B10000000
Case 9 : Portd = &B10010000
End Select
Waitms 5
‘Arial’,’sans-serif'”> После отображения информации на индикаторе необходимо возвратится в основной цикл программы, где нужно завершить цикл и обозначить конец программы.
‘Arial’,’sans-serif'”>Вот что получим в итоге:
‘Arial’,’sans-serif'”>
‘Arial’,’sans-serif'”> За счет маленькой задержки переключения не будут заметны человеческому глазу и мы увидим целое число 1234.
Скачать исходник и проект в протеусе можно ниже: ‘Arial’,’sans-serif'”>
‘Arial’,’sans-serif'”>Скачать ‘Arial’,’sans-serif'”>
Взято с: avrproject.ru
Последние статьи
- Лучшая практика проектирования при размещении компонентов печатной платы
- Android 6.0 на lancer X
- Простой усилитель мощности класса АВ своими руками.
- Двухтактный ультралинейный ламповый УНЧ на EL84 (6П14П).
- Люксметр на ATmega8 и цифровом датчике BH1750
- Контроллер для светодиодной ленты с ИК управлением
- Самодельный LED светильник на основе ИК датчика HC-SR501
- Простой усилитель низкой частоты на TDA7377 и NE5532
- Простейший звонок с двумя мелодиями
- LED Cube 8x8x8 на Arduino с RTC