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

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

  Для того чтобы отобразить многоразрядное число на индикаторе с ним нужно предварительно провести хитрую манипуляцию, заключающуюся в разбивке числа на его составляющие. В качестве примера приведу отображение числа 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
Просмотров: 55339 | Комментарии: 7 | Теги: исходники, индикатор, bascom-avr | Рейтинг: 4.7/13
Всего комментариев: 7
7 toddy_123   (27.11.2019 20:37) [Материал]
Привет! я вот написал вот такой вот код, который по плану будет управлять синтезатором
я вот хотел сделать управление при помощи энкодера но я не понимаю как его подключить
вот программа:
$regfile "m16def.dat"
$crystal = 16000000
Config Portc = Output

Config Portb.0 = Input
Config Portb.1 = Input
Config Portb.2 = Input
config int0 = Falling

Dim A As Long
Dim B As Long
Dim C As Long
Dim D As Long
dim E as long
'***********************
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim N5 as byte
'***********************
Dim Q As long ' main variable
Dim R As Byte
Dim Dat As Byte
dim steps as byte
'***********************
'Freqdec Alias Portb.0
'Freqinc Alias Portb.1
'Save Alias Portb.2
Declare Sub Mat()
Declare Sub 1()
Q=88000
'steps = 50

Do
Call Mat()

Loop

Mat:
A = Q
B = A
C = A
D = A
E = A
A = A / 10000
N1 = Abs(A)

B = B Mod 10000
B = B / 1000
N2 = Abs(B)

C = C Mod 1000
C = C / 100
N3 = Abs(C)

D = D Mod 100
D = D / 10
N4 = Abs(D)

E = E Mod 10
N5 = Abs(E)
Call 1
Return

1:
R = 239'247
Dat = Lookup(n5 , Numbers)
Gosub Tx1

R = 247'254
Dat = Lookup(n4 , Numbers)
Gosub Tx1

R = 251'253
Dat = Lookup(n3 , Numbers)
Gosub Tx1

R = 253'251
Dat = Lookup(n2 , Numbers)
Gosub Tx1

R = 254'247
Dat = Lookup(n1 , Numbers)
Gosub Tx1
Return

Tx1:
Shiftout Portc.2 , Portc.0 , Dat , 1
Shiftout Portc.2 , Portc.0 , R , 1
Pulseout Portc , 1 , 5
waitms 1
Return

Numbers:
Data &HEB '0
Data &H48 '1
Data &H73 '2
Data &H7A '3
Data &HD8 '4
Data &HBA '5
Data &HBB '6
Data &H68 '7
Data &HFB '8
Data &HFA '9

encode:
if Q
return

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

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






авторизация