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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Периферия » Двойной "клик" на конопке. Как?


Двойной "клик" на конопке. Как?

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

1

Доброго всем дня
Тут воюю над железкой, решил уменьшить количество кнопок управления
Как реализовать опрос "одиночное нажатие" и "быстрое нажатие два раза в течение Х времени"?

Интересует именно алгритм, а не код. Пока с алгоритмом у меня как-то туго ((

Спасибо

0

2

увсё, сделал :)

0

3

Делимся?)

0

4

там задача несколько специфична, поэтому и код заточен под задачу:

Код:
Wej1:
If Key_3 = 0 Then
        Waitms 1 : If Key_3 = 1 Then Goto Wej1       ' Защита от помехи

Led = 1

       Temp2 = 0
        If Key_3 = 0 Then
             For Temp = 0 To 250
                 Incr Temp2 : If Temp2 > 214 Then Goto Dolgoe_uderzhanie       ' На долгое удержание
                 If Key_3 = 1 Then Exit For       ' Выходим из цикла подсчета времени удержания кнопки
                 Waitms 14
             Next
        End If


       For Temp = 0 To 99     ' Проверка на нажатие кнопки второй раз
           If Key_3 = 0 Then Goto Dvojnoe_nazhatie
           Waitms 2
      Next


    Goto odinochnoe_nazhatie         ' Одиночное нажатие
    

    Led = 0
 End If

    My_end:
     Waitms 100
      ...
Loop

+1

5

пасиб!
я так и предполагал)

Отредактировано demonizer (2011-04-13 21:16:58)

0

6

Объясните, пожалуйста, а что значит Wej1, Temp и Temp2?
И что индицирует Led?

написал вот так

Код:
$regfile = "2313def.dat"                                    'specify the used micro
$crystal = 4000000                                          'used crystal frequency
$hwstack = 32                                               'default use 32 for the hardware stack
$swstack = 10                                               'default use 10 for the SW stack
$framesize = 40                                             'default use 40 for the frame space


Config Debounce = 20
Config Portd.1 = Output                                     
Config Portb.4 = Output                                    
Config Portd.3 = Input                                      'Key_3

'STATUS LED
Green Alias Portd.1                                  
Red Alias Portb.4                                    
Key_3 Alias Portd.3

Config Int1 = Rising
On Int1 Button
Enable Interrupts
Enable Int1


Do

Wej1:
If Key_3 = 0 Then
Waitms 1 : If Key_3 = 1 Then Goto Wej1       ' Защита от помехи

Led = 1
Temp2 = 0
If Key_3  = 0 Then
For Temp = 0 To 250
Incr Temp2 : If Temp2 > 214 Then Goto Dolgoe_uderzhanie       ' На долгое удержание
If Key_3  = 1 Then Exit For       ' Выходим из цикла подсчета времени удержания кнопки
Waitms 14
Next
End If


For Temp = 0 To 99     ' Проверка на нажатие кнопки второй раз
If Key_3 = 0 Then Goto Dvojnoe_nazhatie
Waitms 2
Next


Goto odinochnoe_nazhatie         ' Одиночное нажатие
    
Green = 0
End If

My_end:
Waitms 100


odinochnoe_nazhatie:
GREEN = 1

Dvojnoe_nazhatie
RED = 1

Loop

но у  меня вылезли 4 ошибки:
Assignment Error Led
Assignment Error Temp2
IF THEN expected
END IF expected

0

7

Очень много косяков по невнимательности

Код:
$regfile = "2313def.dat"                                    'specify the used micro
$crystal = 4000000                                          'used crystal frequency
$hwstack = 32                                               'default use 32 for the hardware stack
$swstack = 10                                               'default use 10 for the SW stack
$framesize = 40                                             'default use 40 for the frame space


Config Debounce = 20
Config Portd.1 = Output
Config Portb.4 = Output
Config Portd.3 = Input                                      'Key_3

Dim Temp As Byte
Dim Temp2 as  Byte

'STATUS LED
Green Alias Portd.1
Red Alias Portb.4
Key_3 Alias Portd.3

Config Int1 = Rising
On Int1 Button
Enable Interrupts
Enable Int1


Do

   Wej1:
   If Key_3 = 0 Then
      Waitms 1 : If Key_3 = 1 Then Goto Wej1                ' Защита от помехи


      Temp2 = 0
      If Key_3 = 0 Then
         For Temp = 0 To 250
            Incr Temp2 : If Temp2 > 214 Then Goto Dolgoe_uderzhanie       ' На долгое удержание
            If Key_3 = 1 Then Exit For                      ' Выходим из цикла подсчета времени удержания кнопки
            Waitms 14
         Next
      End If


      For Temp = 0 To 99                                    ' Проверка на нажатие кнопки второй раз
         If Key_3 = 0 Then Goto Dvojnoe_nazhatie
         Waitms 2
      Next


      Goto Odinochnoe_nazhatie                              ' Одиночное нажатие

      Green = 0
   End If
Loop

   My_end:
      Waitms 100


   Odinochnoe_nazhatie:
   Green = 1
   Goto Wej1

   Dvojnoe_nazhatie:
   Red = 1
   Goto Wej1

   Dolgoe_uderzhanie:
   'Ничего не написано
   Goto Wej1
End


Button:
'Тут нет ничего почему то
Return

Очень полезная вещь: Учебник_рус

+1

8

Спасибо, MACTEPok!
Компилирую - нет ошибок.
А вот в протеусе не пашет. Хотя все входы/выходы портов соответствуют.
Из вашего примера удалил  (я его по ошибке c др. проекта оставил)

Код:
Config Int1 = Rising
On Int1 Button
Enable Interrupts
Enable Int1

и

Код:
Button:
'Тут нет ничего почему то
Return

Вот схема подключения:
http://www.assa-media.com/download/2click.jpg

0

9

Опять же, для начала, определитесь, что хотите от программы?

0

10

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

Очень полезная вещь: Учебник_рус

Благодарю за ссылку!
Ничего подобного по Bascom'у, да и в таком объеме не встречал!
Жаль только частично на русском.
Там, где идет разбор кода - комменты на польском (имхо)
А жаль

0

11

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

0


Вы здесь » Программирование ATMEL в BASCOM. » Периферия » Двойной "клик" на конопке. Как?