Strona 1 z 1

[BASCOM] Klawiatura ADC multi funkcyjna

: 02 lut 2018, 23:58
autor: Pikczu
Żeby nie być goło słownym dodaje bibliotekę klawiatury ADC mulit funkcyjnej.
Co to tak naprawdę oznacza?
Można wciskać kilka przycisków naraz aby uzyskać ukrytą funkcję.

Poniższy przykład to tak naprawdę trzy odrębne klawiatury na trzech odrębnych pinach ADC.
Wydaje mi się że nadal kwalifikuje się to do biblioteki.

Poniższy kod jest w pełni uzależniony od sprzętowego rozwiązania wymaga zastosowania rezystorów o tolerancji 1% lub lepszej.
Rezystory mają nie powtarzalne wartości.

Właśnie ta nie powtarzalność wartości daje nam możliwość uzyskania ukrytych funkcji klawiatury.
Przykład poniżej opisany jako kanał ADC 0 ma aż dwanaście przycisków.
od 1 do 9, 0 gwiazdke(*) i klawisz Enter.
Zamknięty jest w select case.

Do poprawnego działania potrzebna jest nam dodatkowo flaga.
Będziemy korzystać z zagnieżdżania i tym samym blokowania naszego przycisku.
Aby nie tracić 12 bajtów( bo jak wiadomo zadeklarowanie zmiennej jako bit i tak zabiera cały bajt) i definiować za każdym razem zmienna dim flaga as bit
Deklarujemy sobie w programie głównym zmienna globalną as word
'Dim Key_button_flag As Word ' variable for nesting to avoid multiple action
Oczywiście musimy zadeklarować jeszcze naszą zmienną która będzie przechwytywać naszą wartość z przetwornika ADC
'Dim Key_button As Word 'variable for adc keypad buttons
'Dim Analog0 As Word 'numeric keypad

Podpierając się Aliasami możemy nadać naszym przyciskom przyjazną nazwę więc "Aliasujemy":

'Key_1 Alias Key_button.1
'Key_2 Alias Key_button.2
'Key_3 Alias Key_button.3
'Key_4 Alias Key_button.4
'Key_5 Alias Key_button.5
'Key_6 Alias Key_button.6
'Key_7 Alias Key_button.7
'Key_8 Alias Key_button.8
'Key_ * Alias Key_button.9
'Key_0 Alias Key_button.0
'Key_9 Alias Key_button.10
'Key_enter Alias Key_button.11


I teraz zaczniemy ciut od tyłu od kasowania naszej wartości, pobierając nasza wartość z przetwornika sprawdzamy czy:
If Analog0 < 10 And Key_button <> 0 Then
Jeśli analog0 czyli nasza wartość z kanału 0 ADC jest mniejszy od 10.
I równocześnie jakiś przycisk miał wartość 1 czyli był wciśnięty ale już nie jest(świadczy o tym wartość poniżej 10).
To: Key_button = 0 wyzeruj nasz przycisk , Key_button_flag = 0 oraz wyzeruj flagę przycisku.

Poniżej dla lepszego zrozumienia jako kawałek kodu:
  1.  
  2.  
  3.  Analog0 = Getadc(0)  
  4. If Analog0 < 10 And Key_button <> 0 Then
  5.       Key_button = 0
  6.       Key_button_flag = 0
  7.       Debug "key_button_relesed"
  8.    End If
Przejdźmy do aktywacji naszego przycisku:
Powiedzmy że w pętli do loop najpierw umieścimy naszego suba od sprawdzania wartości ADC.
Program sprawdził wartości i ominął naszego IF-a powyżej bo wartość z adc było większe jak 10.
Case 985 To 1023 Teraz jeśli wartość z ADC mieści się w granicach 985 a 1023 to znaczy ze mamy wciśnięty przycisk 1, równocześnie musimy sprawdzić czy przycisk jest już wciśnięty jakiś czas. Musimy pamiętać że pracujemy w pętli nieskończonej i tu pomocą a raczej kluczem do poprawnego działania będzie sprawdzenie stanu poprzedniego Key_button.1 = 0:, jeśli obydwa te warunki zostały spełnione pomyślnie.
Nasz przycisk zostaje ustawiony w stan 1 Key_button.1 = 1
Nasz program wychodzi w końcu z naszego suba a my może sprawdzić stan przycisku.

IF key_1 = 1 then '(użyliśmy aliasa wcześniej więc możemy posłużyć się przyjazną dla oka nazwą Key_1 zamiast Key_button.1)
If key_button_flag.1 = 0 Then 'sprawdzamy nasza flagę w kolejnym If-e czyli zagnieżdżamy
Func_button_flag.1 = 1 'blokujemy nasz przycisk
' a w tym miejscu robimy co nam się podoba.
'czyli jak nasz program ma zareagować na wciśniecie przycisku.
Call buzzer
End If
End If



  1. Select Case Analog0
  2.  
  3.       Case 985 To 1023 And Key_button.1 = 0:
  4.          Key_button.1 = 1
  5.          Debug "key_1"
  6.       Case 965 To 975 And Key_button.2 = 0:
  7.          Key_button.2 = 1
  8.          Debug "key_2"
  9.       Case 910 To 930 And Key_button.3 = 0:
  10.          Key_button.3 = 1
  11.          Debug "key_3"
  12.       Case 865 To 890 And Key_button.4 = 0:
  13.          Key_button.4 = 1
  14.          Debug "key_4"
  15.       Case 690 To 720 And Key_button.5 = 0:
  16.          Key_button.5 = 1
  17.          Debug "key_5"
  18.       Case 665 To 680 And Key_button.6 = 0:
  19.          Key_button.6 = 1
  20.          Debug "key_6"
  21.       Case 645 To 659 And Key_button.7 = 0:
  22.          Key_button.7 = 1
  23.          Debug "key_7 "
  24.       Case 625 To 635 And Key_button.8 = 0:
  25.          Key_button.8 = 1
  26.          Debug "key_8"
  27.       Case 600 To 614 And Key_button.9 = 0:
  28.          Key_button.9 = 1
  29.          Debug "key_*"
  30.       Case 579 To 590 And Key_button.0 = 0:
  31.          Key_button.0 = 1
  32.          Debug "key_0"
  33.       Case 568 To 575 And Key_button.10 = 0:
  34.          Key_button.10 = 1
  35.          Debug "key_9"
  36.       Case 540 To 560 And Key_button.11 = 0:
  37.          Key_button.11 = 1
  38.          Debug "Key_enter"


Teraz przykład z ukrytymi funkcjami w moim przypadku ADC1:
  1.  Select Case Analog1
  2.  
  3.       Case 695 To 710 And Up_stop_down.0 = 0:     'key up
  4.          Up_stop_down.0 = 1
  5.          Debug "Key_UP: "
  6.       Case 590 To 620 And Up_stop_down.1 = 0:     'Key down
  7.          Up_stop_down.1 = 1
  8.          Debug "Key_Down: "
  9.       Case 315 To 335 And Up_stop_down.2 = 0:     ' Key stop
  10.          Up_stop_down.2 = 1
  11.          Debug "Key_Stop"
  12.       Case 740 To 750 And Up_stop_down.3 = 0:     'Key up and stop
  13.          Up_stop_down.3 = 1
  14.          Debug "key_up and down"
  15.       Case 670 To 685 And Up_stop_down.4 = 0:     ' key stop and down
  16.          Up_stop_down.4 = 1
  17.          Debug "key_stop and down"
  18.       Case 790 To 810 And Up_stop_down.5 = 0:     ' key up and down
  19.          Up_stop_down.5 = 1
  20.          Debug "key_up and down"
  21.  
  22.    End Select
Ukryte funkcje to nic innego jak osobne wartości dla kombinacji przycisków.
np Case 670 To 685 And Up_stop_down.4 = 0: ' key stop and down

Teraz cały kod dla trzech różnych klawiatur ADC.
  1. '-------------------------------------------------------------------------------
  2. ' By Pawel aka Pikczu 2013-2015
  3. 'version 1.4
  4. 'Know bugs: Using select case AND statment is not suported syntax by Bascom Version 2.0.7.9
  5. 'According to Mark Alberts
  6. ' http://www.mcselec.com/index2.php?option=com_forum&Itemid=59&page=viewtopic&t=12981
  7. ' How ever test done by me confirm it does work very well
  8. '-------------------------------------------------------------------------------
  9. ' name to include: $include "Sub convert_adc_button.inc"
  10. '-------------------------------------------------------------------------------------
  11. '-------------------You need to declare global variable in main.bas-------------------
  12. 'Dim Func_button As Byte                                     'function buttons under display
  13. 'Dim Key_flg As Byte                                         ' variable for nesting to avoid multiple action
  14. 'Dim Key_button As Word                                      'variable for  adc keypad buttons
  15. 'Dim Up_stop_down As Byte                                    ' cursors buttons
  16. '-------------------------------------------------------------------------------
  17. 'Dim Analog0 As Word                                         'numeric keypad
  18. 'Dim Analog1 As Word                                         'up, stop, down
  19. 'Dim Analog2 As Word                                         ' under screen buttons
  20. '-----------------------Optional Alias name to declare--------------------------
  21. '----------------------ADC keypad alias-----------------------------------------
  22. 'Key_1 Alias Key_button.1
  23. 'Key_2 Alias Key_button.2
  24. 'Key_3 Alias Key_button.3
  25. 'Key_4 Alias Key_button.4
  26. 'Key_5 Alias Key_button.5
  27. 'Key_6 Alias Key_button.6
  28. 'Key_7 Alias Key_button.7
  29. 'Key_8 Alias Key_button.8
  30. 'Key_ * Alias Key_button.9
  31. 'Key_0 Alias Key_button.0
  32. 'Key_9 Alias Key_button.10
  33. 'Key_enter Alias Key_button.11
  34. '-----------------five buttons under the screen---------------------------------
  35. '-------------------------------------------------------------------------------
  36. 'Key_park Alias Func_button.0
  37. 'Key_menu Alias Func_button.1
  38. 'Key_preset Alias Func_button.2
  39. 'Key_mode Alias Func_button.3
  40. 'Key_lsp Alias Func_button.4
  41. '-------------------------------------------------------------------------------
  42. '-------------------------------------------------------------------------------
  43. 'Key_up Alias Up_stop_down.0
  44. 'Key_down Alias Up_stop_down.1
  45. 'Key_stop Alias Up_stop_down.2
  46. 'Key_up_stop Alias Up_stop_down.3                            'spare for momnet
  47. 'Key_stop_down Alias Up_stop_down.4                          'spare for moment
  48. 'Key_up_down Alias Up_stop_down.5                            'spare for moment
  49. '-------------------------------------------------------------------------------
  50. ' How to use it:
  51.  'nesting is reqired same as with normal buttons
  52.   'If Key_menu = 1 Then                          'Key_menu Alias Func_button.1
  53.         'If Func_button_flag.1 = 0 Then
  54.             'Func_button_flag.1 = 1                'lock button
  55.      'your code here
  56.         'Un nesting is done by checking adc value in code below
  57.         'for expamle line 82(Func_button = 0 )
  58.         'End If
  59.     'End If
  60. '-------------------------------------------------------------------------------
  61. $nocompile
  62. Sub Convert_adc_button:
  63.    Analog0 = Getadc(0)
  64.    Analog1 = Getadc(1)
  65.    Analog2 = Getadc(2)
  66.                                                ' lsp, mode, menue, preset , park
  67.    Dbg                                            'for stack debug
  68.    If Analog0 < 10 And Key_button <> 0 Then
  69.       Key_button = 0
  70.       Key_button_flag = 0
  71.       Debug "key_button_relesed"
  72.    End If
  73.    If Analog1 < 10 And Up_stop_down <> 0 Then
  74.       Up_stop_down = 0
  75.       Up_stop_down_flag = 0
  76.       Debug "UP_stop_down_relesed"
  77.    End If
  78.    If Analog2 < 10 And Func_button <> 0 Then
  79.       Func_button = 0
  80.       Func_button_flag = 0
  81.       Debug "function_button_relesed"
  82.    End If
  83.  
  84.  
  85.    'ADC kanal pierwszy 12 ptrzycików
  86.    Select Case Analog0
  87.  
  88.       Case 985 To 1023 And Key_button.1 = 0:
  89.          Key_button.1 = 1
  90.          Debug "key_1"
  91.       Case 965 To 975 And Key_button.2 = 0:
  92.          Key_button.2 = 1
  93.          Debug "key_2"
  94.       Case 910 To 930 And Key_button.3 = 0:
  95.          Key_button.3 = 1
  96.          Debug "key_3"
  97.       Case 865 To 890 And Key_button.4 = 0:
  98.          Key_button.4 = 1
  99.          Debug "key_4"
  100.       Case 690 To 720 And Key_button.5 = 0:
  101.          Key_button.5 = 1
  102.          Debug "key_5"
  103.       Case 665 To 680 And Key_button.6 = 0:
  104.          Key_button.6 = 1
  105.          Debug "key_6"
  106.       Case 645 To 659 And Key_button.7 = 0:
  107.          Key_button.7 = 1
  108.          Debug "key_7 "
  109.       Case 625 To 635 And Key_button.8 = 0:
  110.          Key_button.8 = 1
  111.          Debug "key_8"
  112.       Case 600 To 614 And Key_button.9 = 0:
  113.          Key_button.9 = 1
  114.          Debug "key_*"
  115.       Case 579 To 590 And Key_button.0 = 0:
  116.          Key_button.0 = 1
  117.          Debug "key_0"
  118.       Case 568 To 575 And Key_button.10 = 0:
  119.          Key_button.10 = 1
  120.          Debug "key_9"
  121.       Case 540 To 560 And Key_button.11 = 0:
  122.          Key_button.11 = 1
  123.          Debug "Key_enter"
  124.  
  125.    End Select
  126.    'ADC kanal 2 przyciski   up, stop, down
  127.    Select Case Analog1
  128.  
  129.       Case 695 To 710 And Up_stop_down.0 = 0:     'key up
  130.          Up_stop_down.0 = 1
  131.          Debug "Key_UP: "
  132.       Case 590 To 620 And Up_stop_down.1 = 0:     'Key down
  133.          Up_stop_down.1 = 1
  134.          Debug "Key_Down: "
  135.       Case 315 To 335 And Up_stop_down.2 = 0:     ' Key stop
  136.          Up_stop_down.2 = 1
  137.          Debug "Key_Stop"
  138.       Case 740 To 750 And Up_stop_down.3 = 0:     'Key up and stop
  139.          Up_stop_down.3 = 1
  140.          Debug "key_up and down"
  141.       Case 670 To 685 And Up_stop_down.4 = 0:     ' key stop and down
  142.          Up_stop_down.4 = 1
  143.          Debug "key_stop and down"
  144.       Case 790 To 810 And Up_stop_down.5 = 0:     ' key up and down
  145.          Up_stop_down.5 = 1
  146.          Debug "key_up and down"
  147.  
  148.    End Select
  149.  
  150.   ' ADC kanal 3  dodatkowe przycki pod ekranem
  151.    Select Case Analog2
  152.  
  153.       Case 300 To 350 And Func_button.0 = 0:      '
  154.          Func_button.0 = 1
  155.          Debug "key_Park"
  156.       Case 540 To 555 And Func_button.1 = 0:
  157.          Func_button.1 = 1
  158.          Debug "key_Menue"
  159.       Case 690 To 710 And Func_button.2 = 0:
  160.          Func_button.2 = 1
  161.          Debug "Key_preset"
  162.       Case 600 To 610 And Func_button.3 = 0:      'alias Key_mode
  163.          Func_button.3 = 1
  164.          Debug "Key_Mode"
  165.       Case 1000 To 1023 And Func_button.4 = 0:
  166.          Func_button.4 = 1
  167.          Debug "Key_LSP"
  168.    End Select
  169. End Sub
Obrazek
Pozdrawiam Pikczu

Re: [BASCOM] Klawiatura ADC multi fukncyjna

: 03 lut 2018, 9:05
autor: Henryk
Witam :D
Pomysł ciekawy , tylko ma jedną poważną wadę , kiedy nasz układ będzie zasilany baterią i ta nam się rozładuje do połowy ,stracimy część klawiatury .
W podobny sposób można zbudować klawiaturę w oparciu o instrukcję Getrc ;)

Re: [BASCOM] Klawiatura ADC multi fukncyjna

: 03 lut 2018, 11:25
autor: Pikczu
Masz rację z tym rozładowaniem baterii ale w urządzeniu zasilanym na stałe mamy fajną klawiaturę np. 12 przyciskową używając tylko jednej nogi procesora.
Wczoraj było już późno dziś postaram się dopisać resztę i dołączyć schemat.
*************************************************************************************************
Edit dodałem resztę plus schematy.
Pozdrawiam
Paweł aka Pikczu