Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Проблема с LED индикатором


Проблема с LED индикатором

Сообщений 31 страница 32 из 32

1

Небольшая учебная программа. На двухразрядном индикаторе при запуске должно высветиться число 25, при нажатии на кнопку число должно увеличиваться.  Но почему-то в Протеусе выходит так: при включении 1 разряда первая цифра загорается на обоих разрядах, а затем точно так же на обоих разрядах загорается вторая цифра. Т.е. вместо числа 25 появляется сначала 22, потом 55. Не могу понять, в чем дело.

Код:
$regfile = "attiny2313.dat"
$Crystal=4000000
$hwstack=40
$swstack=16
$framesize=32

Dim A As Integer
Dim T As Byte
Dim Count As Byte
Dim Number(2) As Byte

Config Portb = Output                                       'индикатор
Config Portd.4 = Output                                     '1 разряд
Config Portd.5 = Output                                     '2 разряд
Config Pind.3 = Input                                       'кнопка

Dig1 Alias Portd.4
Dig2 Alias Portd.5
Button Alias Pind.3

T = 25
Gosub Rasch
Gosub Indic
Do
If Button = 0 Then
Waitms 200
Incr T : If T > 99 Then T = 1
Gosub Rasch
Gosub Indic
End If
Loop

Rasch:
Number(1) = 0
Number(2) = 0
A = T
Do
A = A - 10
If A < 0 Then Exit Do
Number(1) = Number(1) + 1
Loop
Number(2) = A + 10
Return

Indic:
Reset Dig1 : Reset Dig2 : Count = 0
Do
Incr Count : If Count > 2 Then Exit Do
Portb = Lookup(number(count) , Digits)
Select Case Count
Case 1 : Set Dig1
Case 2 : Set Dig2
End Select
Loop
Return

End

Digits:
Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110
Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111

http://s2.uploads.ru/t/Tzg4i.jpg

0

31

rojnov написал(а):

Do
Incr Count : If Count > 2 Then Exit Do
Portb = Lookup(number(count) , Digits)
Select Case Count
Case 1 : Set Dig1
Case 2 : Set Dig2
End Select
Loop


А теперь посмотрите что происходит в вашем коде:
Вы увеличиваете Count
Берете значение и посылаете его в Portb
Засвечиваете Dig1
опять увеличиваете Count
Берете значение и посылаете его в Portb
Не гася Dig1 вы включаете Dig2.
Если бы не инертность Протеуса то вы бы видели только последнюю выбранную цифру в обоих разрядах.
Делайте динамическую индикацию как было уже рассмотрено на форуме .
Поймите что в первый промежуток времени должен работать только  Dig1 в следующий промежуток времени Dig1 должен быть погашен и включен Dig2.
Все это делается по прерыванию таймера, что бы смена сигментов происходила переодически и с равным временным промежутком между засвечиванием сигментов.
Можно выбрать частоту прерывания скажем 100Гц.

Удачи.

0

32

Avus написал(а):

Сперва загорается на миг принимаемое число, только почему то отраженное (223 отображается как 322)

Тогда пишите с конца массива в начало.

Код:
  For I = 3 To 0 Sep -1
    Tmp = Val_b Mod 10
    Dinaminfo(i) = Tmp
    Val_b = Val_b / 10
  Next I

Отредактировано Пётр (2015-01-18 23:58:00)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Проблема с LED индикатором