[BASCOM] Klawiatura ADC multi funkcyjna
: 02 lut 2018, 23:58
Ż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:
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
Teraz przykład z ukrytymi funkcjami w moim przypadku ADC1:
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.
Pozdrawiam Pikczu
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:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Analog0 = Getadc(0)
- If Analog0 < 10 And Key_button <> 0 Then
- Key_button = 0
- Key_button_flag = 0
- Debug "key_button_relesed"
- End If
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
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Select Case Analog0
- Case 985 To 1023 And Key_button.1 = 0:
- Key_button.1 = 1
- Debug "key_1"
- Case 965 To 975 And Key_button.2 = 0:
- Key_button.2 = 1
- Debug "key_2"
- Case 910 To 930 And Key_button.3 = 0:
- Key_button.3 = 1
- Debug "key_3"
- Case 865 To 890 And Key_button.4 = 0:
- Key_button.4 = 1
- Debug "key_4"
- Case 690 To 720 And Key_button.5 = 0:
- Key_button.5 = 1
- Debug "key_5"
- Case 665 To 680 And Key_button.6 = 0:
- Key_button.6 = 1
- Debug "key_6"
- Case 645 To 659 And Key_button.7 = 0:
- Key_button.7 = 1
- Debug "key_7 "
- Case 625 To 635 And Key_button.8 = 0:
- Key_button.8 = 1
- Debug "key_8"
- Case 600 To 614 And Key_button.9 = 0:
- Key_button.9 = 1
- Debug "key_*"
- Case 579 To 590 And Key_button.0 = 0:
- Key_button.0 = 1
- Debug "key_0"
- Case 568 To 575 And Key_button.10 = 0:
- Key_button.10 = 1
- Debug "key_9"
- Case 540 To 560 And Key_button.11 = 0:
- Key_button.11 = 1
- Debug "Key_enter"
Teraz przykład z ukrytymi funkcjami w moim przypadku ADC1:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Select Case Analog1
- Case 695 To 710 And Up_stop_down.0 = 0: 'key up
- Up_stop_down.0 = 1
- Debug "Key_UP: "
- Case 590 To 620 And Up_stop_down.1 = 0: 'Key down
- Up_stop_down.1 = 1
- Debug "Key_Down: "
- Case 315 To 335 And Up_stop_down.2 = 0: ' Key stop
- Up_stop_down.2 = 1
- Debug "Key_Stop"
- Case 740 To 750 And Up_stop_down.3 = 0: 'Key up and stop
- Up_stop_down.3 = 1
- Debug "key_up and down"
- Case 670 To 685 And Up_stop_down.4 = 0: ' key stop and down
- Up_stop_down.4 = 1
- Debug "key_stop and down"
- Case 790 To 810 And Up_stop_down.5 = 0: ' key up and down
- Up_stop_down.5 = 1
- Debug "key_up and down"
- End Select
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.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '-------------------------------------------------------------------------------
- ' By Pawel aka Pikczu 2013-2015
- 'version 1.4
- 'Know bugs: Using select case AND statment is not suported syntax by Bascom Version 2.0.7.9
- 'According to Mark Alberts
- ' http://www.mcselec.com/index2.php?option=com_forum&Itemid=59&page=viewtopic&t=12981
- ' How ever test done by me confirm it does work very well
- '-------------------------------------------------------------------------------
- ' name to include: $include "Sub convert_adc_button.inc"
- '-------------------------------------------------------------------------------------
- '-------------------You need to declare global variable in main.bas-------------------
- 'Dim Func_button As Byte 'function buttons under display
- 'Dim Key_flg As Byte ' variable for nesting to avoid multiple action
- 'Dim Key_button As Word 'variable for adc keypad buttons
- 'Dim Up_stop_down As Byte ' cursors buttons
- '-------------------------------------------------------------------------------
- 'Dim Analog0 As Word 'numeric keypad
- 'Dim Analog1 As Word 'up, stop, down
- 'Dim Analog2 As Word ' under screen buttons
- '-----------------------Optional Alias name to declare--------------------------
- '----------------------ADC keypad alias-----------------------------------------
- '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
- '-----------------five buttons under the screen---------------------------------
- '-------------------------------------------------------------------------------
- 'Key_park Alias Func_button.0
- 'Key_menu Alias Func_button.1
- 'Key_preset Alias Func_button.2
- 'Key_mode Alias Func_button.3
- 'Key_lsp Alias Func_button.4
- '-------------------------------------------------------------------------------
- '-------------------------------------------------------------------------------
- 'Key_up Alias Up_stop_down.0
- 'Key_down Alias Up_stop_down.1
- 'Key_stop Alias Up_stop_down.2
- 'Key_up_stop Alias Up_stop_down.3 'spare for momnet
- 'Key_stop_down Alias Up_stop_down.4 'spare for moment
- 'Key_up_down Alias Up_stop_down.5 'spare for moment
- '-------------------------------------------------------------------------------
- ' How to use it:
- 'nesting is reqired same as with normal buttons
- 'If Key_menu = 1 Then 'Key_menu Alias Func_button.1
- 'If Func_button_flag.1 = 0 Then
- 'Func_button_flag.1 = 1 'lock button
- 'your code here
- 'Un nesting is done by checking adc value in code below
- 'for expamle line 82(Func_button = 0 )
- 'End If
- 'End If
- '-------------------------------------------------------------------------------
- $nocompile
- Sub Convert_adc_button:
- Analog0 = Getadc(0)
- Analog1 = Getadc(1)
- Analog2 = Getadc(2)
- ' lsp, mode, menue, preset , park
- Dbg 'for stack debug
- If Analog0 < 10 And Key_button <> 0 Then
- Key_button = 0
- Key_button_flag = 0
- Debug "key_button_relesed"
- End If
- If Analog1 < 10 And Up_stop_down <> 0 Then
- Up_stop_down = 0
- Up_stop_down_flag = 0
- Debug "UP_stop_down_relesed"
- End If
- If Analog2 < 10 And Func_button <> 0 Then
- Func_button = 0
- Func_button_flag = 0
- Debug "function_button_relesed"
- End If
- 'ADC kanal pierwszy 12 ptrzycików
- Select Case Analog0
- Case 985 To 1023 And Key_button.1 = 0:
- Key_button.1 = 1
- Debug "key_1"
- Case 965 To 975 And Key_button.2 = 0:
- Key_button.2 = 1
- Debug "key_2"
- Case 910 To 930 And Key_button.3 = 0:
- Key_button.3 = 1
- Debug "key_3"
- Case 865 To 890 And Key_button.4 = 0:
- Key_button.4 = 1
- Debug "key_4"
- Case 690 To 720 And Key_button.5 = 0:
- Key_button.5 = 1
- Debug "key_5"
- Case 665 To 680 And Key_button.6 = 0:
- Key_button.6 = 1
- Debug "key_6"
- Case 645 To 659 And Key_button.7 = 0:
- Key_button.7 = 1
- Debug "key_7 "
- Case 625 To 635 And Key_button.8 = 0:
- Key_button.8 = 1
- Debug "key_8"
- Case 600 To 614 And Key_button.9 = 0:
- Key_button.9 = 1
- Debug "key_*"
- Case 579 To 590 And Key_button.0 = 0:
- Key_button.0 = 1
- Debug "key_0"
- Case 568 To 575 And Key_button.10 = 0:
- Key_button.10 = 1
- Debug "key_9"
- Case 540 To 560 And Key_button.11 = 0:
- Key_button.11 = 1
- Debug "Key_enter"
- End Select
- 'ADC kanal 2 przyciski up, stop, down
- Select Case Analog1
- Case 695 To 710 And Up_stop_down.0 = 0: 'key up
- Up_stop_down.0 = 1
- Debug "Key_UP: "
- Case 590 To 620 And Up_stop_down.1 = 0: 'Key down
- Up_stop_down.1 = 1
- Debug "Key_Down: "
- Case 315 To 335 And Up_stop_down.2 = 0: ' Key stop
- Up_stop_down.2 = 1
- Debug "Key_Stop"
- Case 740 To 750 And Up_stop_down.3 = 0: 'Key up and stop
- Up_stop_down.3 = 1
- Debug "key_up and down"
- Case 670 To 685 And Up_stop_down.4 = 0: ' key stop and down
- Up_stop_down.4 = 1
- Debug "key_stop and down"
- Case 790 To 810 And Up_stop_down.5 = 0: ' key up and down
- Up_stop_down.5 = 1
- Debug "key_up and down"
- End Select
- ' ADC kanal 3 dodatkowe przycki pod ekranem
- Select Case Analog2
- Case 300 To 350 And Func_button.0 = 0: '
- Func_button.0 = 1
- Debug "key_Park"
- Case 540 To 555 And Func_button.1 = 0:
- Func_button.1 = 1
- Debug "key_Menue"
- Case 690 To 710 And Func_button.2 = 0:
- Func_button.2 = 1
- Debug "Key_preset"
- Case 600 To 610 And Func_button.3 = 0: 'alias Key_mode
- Func_button.3 = 1
- Debug "Key_Mode"
- Case 1000 To 1023 And Func_button.4 = 0:
- Func_button.4 = 1
- Debug "Key_LSP"
- End Select
- End Sub
Pozdrawiam Pikczu