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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Реализация работы с кнопками в Bascom при динамической индикации


Реализация работы с кнопками в Bascom при динамической индикации

Сообщений 1 страница 3 из 3

1

Здравствуйте. Bascom начал пользоваться относительно недавно. Подскажите пожалуйста, чем может быть плоха подобная реализация работы с кнопкой.
В дальнейшем нужно будет в прерывании обрабатывать режим динамической индикации. При этом необходимо отслеживать нажатия нескольких кнопок. Этот код без динамической индикации и с одной кнопкой, но принципиально ничего поменяться, насколько я понимаю, не должно. Работает именно так, как мне нужно. Но возможно есть какие-то подводные камни, о которых я не знаю или вообще такой подход чем-то принципиально неправилен. Подскажите пожалуйста. Спасибо!

Код:
$regfile "m8def.dat"
$crystal = 8000000


Config Pind.2 = Input
Config Portb = Output

Config Timer0 = Timer , Prescale = 64
On Ovf0 Refresh

Enable Interrupts
Enable Ovf0

Dim I As Integer

I = 0
Dim Maxi As Byte
Maxi = 7

Do

   Bitwait Pind.2 , Reset

   Decr Maxi
   If Maxi = 0 Then Maxi = 7

   Waitms 50

Loop


Refresh:

   Incr I
   If I > Maxi Then I = 0

   Portb = Lookup(i , Pics)

Return

End


Pics:

Data &B10000000 , &B01000000 , &B00100000 , &B00010000
Data &B00001000 , &B00000100 , &B00000010 , &B00000001

0

2

Посмотри тут кнопки с динамической индикацией. совтовые часы сбрасываются на ноль. Почему?

В твоем случае МК ожидает нажатие одной кнопки и не может больше ничего делать.

Bitwait Pind.2 , Reset пока не выполнится это условие следующая строка не будет выполненна
Bitwait Pind.3 , Reset

Тебе так надо для двух кнопок:

Код:
$regfile "m8def.dat"
$crystal = 8000000
DDRD=&B11110011 'Config Pind.2 = Input и Pind.3
DDRB= 255 :portb=&B00000001 'конфиг порта и включение лог 1 на одну лапу
do
Debounce Pind.2 , 0 , left_booton , Sub ' проверяем пин на наличие ноля, если условия выполненно - переходим к подпрограмме
Debounce Pind.3 , 0 , right_booton , Sub ' проверяем пин на наличие ноля, если условия выполненно - переходим к подпрограмме
' if Flag_left = 1 then : rotate Portb, left : reset Flag_left : end if ' если в подпрограмме кнопки был установлен флаг - сдвигаем порт, сбрасываем флаг
' if Flag_right = 1 then : rotate Portb, right : reset Flag_right : end if
loop

left_booton:
  rotate Portb, left ' сдвигаем порт
' set Flag_left 'также тут можно ставить флажок а в основном цикле обнулять этот флаг и по его наличию сдвигать порт.
Return
right_booton:
  rotate Portb, right ' сдвигаем порт
' set Flag_right ' также тут можно ставить флажок  а в основном цикле обнулять этот флаг и по его наличию сдвигать порт.
Return

0

3

Спасибо вам, Pasha!

Этот код мне в скором времени пригодится! С командой Debounce пока сталкиваться не приходилось.
В общем-то в теле программы мне как раз и нужно только узнать, что кнопка нажата (одна из) и в зависимости от этого изменить сообщение выводящееся в прерывании.
Да, только щас в вашем сообщении увидел еще одну интересную команду - rotate. Почитаю о ней.
По-хорошему, надо было бы прочитать книгу, а потом задавать (а точнее не задавать) вопросы, но когда в голове уже сидит готовое устройство, сложно прерваться на чтение книги =) Спасибо еще раз! Буду разбираться.

0


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Реализация работы с кнопками в Bascom при динамической индикации