Главная » Статьи » Как подключить

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

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

 Здесь я поставил на выход все ноги порта C и D, но можно оставить только те которые будут использоваться в качестве выходов, к примеру так:
DDRC=&B00001111 и DDRD = &B01111111 (четыре первых ноги порта С под аноды и шесть первых порта D под сегменты).

 Затем присваиваем переменной W то значение, которое собираемся вывести на индикатор:

W = 1234

 В основном цикле программы присваиваем переменным М значение переменной W, я делаю так:

M1 = W
M2 = M1
M3 = M1
M4 = M1

 Это не паранойя)), это сделано с той целью, чтобы в во всех переменных М лежало одно и тоже число, так как во время операции присваивания легко может ворваться прерывание (если такое имеется и не отключено), в обработчике которого переменная 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

 Для начала функцией Mod мы возвращаем переменной первые три
цифры числа (остаток от деления на 1000), а дальше все как в первом случае.

 С двумя последними разрядами практически тоже самое:

M3 = M3 Mod100                                  
M3 = M3 / 10
N3 = Abs(m3)
 
M4 = M4 Mod 10                                    
N4= Abs(m4)

 Теперь в наших переменных лежат те значения, которые мы хотим отобразить, самое время микроконтроллеру подрыгать ногами и вывести эти значения на индикатор, для этого вызываем подпрограмму обработки индикации:
   
Gosub Led

 Процессор перепрыгнет на подпрограмму с меткой Led:

Led:

  Portc =&B00001000    

 Здесь подаем высокий уровень на 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  

 После того как зажгли нужные сегменты ждем 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


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

Вот что получим в итоге:


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

Скачать исходник и проект в протеусе можно ниже:


Категория: Как подключить | Добавлено: 21.02.2011
Просмотров: 39717 | Комментарии: 6 | Теги: исходники, индикатор, bascom-avr | Рейтинг: 4.7/13
Всего комментариев: 6
6 Петр   (28.08.2016 21:58)
Индикацию нужно выполнять в прерывании таймера и тогда мерцаний не будет.

5 жулик   (28.08.2016 17:43)
ребята подскажите пожта. если в динамике работает мк как собрать алгоритм что бы бы еще и опрос ацп и исполнительных контактов? ведь мерцание будет. или я торможу

4 exersizze   (10.10.2013 10:25)
У индикатора на схеме не использован вывод DP, вот он отвечает за точку. Принцип отображения точки абсолютно такой же. По поводу резисторов, лучше конечно ставить на ножки отвечающие за сегменты (A, B, C и т.д.)

3 Scorpushka   (10.10.2013 06:46)
токоограничительные сопротивления не нужны?

2 Scorpushka   (09.10.2013 20:52)
а как вывести запятую?

+1   Спам
1 yuzax   (29.06.2013 18:47)
Так тоже работает но весит меньше.

$regfile = "m8def.dat"
$crystal = 8000000

Dim A 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
Dim W As Integer
Dim Nx As Byte

A = &B00000001

Ddrb = &B11111111
Ddrd = &B11111111

Portb = A
Portd = &B11000000
W = 4321

Do

M1 = W
M2 = M1
M3 = M1
M4 = M1

M1 = M1 / 1000 ' M1 = 1234/1000 = 1,234
N1 = Abs(m1) ' N1 = Abs (1,234) = 1

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

M3 = M3 Mod 100
M3 = M3 / 10
N3 = Abs(m3)

M4 = M4 Mod 10
N4 = Abs(m4)

Nx = N1
Gosub Select_n
Gosub Led

Nx = N2
Gosub Select_n
Gosub Led

Nx = N3
Gosub Select_n
Gosub Led

Nx = N4
Gosub Select_n
Gosub Led

Loop
End

Select_n:
Select Case Nx
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
Return

Led:
Waitms 5
Rotate Portb , Left
If Portb = &B00010000 Then Portb = A

Return

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






   EasyEDA:  бесплатный редактор схем

   ✓ Создание схем
   ✓ Возможность симуляции
   ✓ Быстрое создание печатных плат
   ✓ Интуитивно понятный интерфейс

   Нарисуй свою схему прямо сейчас!
   Изготовление печатных плат   https://easyeda.com/order
авторизация
Логин:
Пароль:
Комментарии
Сетевой диммер 220V на микроконтроллере
09.12.2016 - vakulyuk:
Спасибо) Я принцип действия понял, а вот откуда взялась именно цифра 195 не поня...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - exersizze:
pchela5, ну так это в военное, а у нас в мирное время все примерно)) Наше...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - pchela5:
> Полуволна в нашей электросети по времени длится примерно 10 мс

...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - exersizze:
Чтобы понять откуда взялась цифра 195 надо сначала въехать в принцип работы: ког...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - vakulyuk:
А почему минимальный накал при 195? Насколько минимум можно занизить Wt?
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
08.12.2016 - exersizze:
yorx выдалось немного свободного времени, проверил в симуляторе. Проблема...
Логгер температуры 2.0
05.12.2016 - Evgeny6873:
Хотел повторить схему и долго ждал дисплей, два раза заказывал с Китая, пришел. ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
01.12.2016 - yorx:
Доброго времени суток, exersizze попробовал Ваш код все равно не работает как на...
Помни об усадке!
30.11.2016 - pchela5:
Автомобильные никакие не лезут?


Лучшие цены на 3D принтеры
успей сделать себе подарок к Новому Году! ;)


Prusa i3

Prusa i3 от 12500 р.



Rostoсk

Rostock от 15000 р.