Отключаемые счетчики электроэнергии на пульте. Все с документами пломбами, гарантией и без посредников!

Семисегментный индикатор. Организация динамической индикации

  Для того чтобы отобразить многоразрядное число на индикаторе с ним нужно предварительно провести хитрую манипуляцию, заключающуюся в разбивке числа на его составляющие. В качестве примера приведу отображение числа 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 то значение, которое собираемся вывести на индикатор:

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 попала единица, что собственно и требовалось.  Для присвоения двойки переменной N2 операция будет немного сложнее:

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


Категория: AVR
Метки:

Написать коментарий

*
= 3 + 3

Добавить изображение

Последние статьи