[BASCOM] Klawiatura drabinkowa (LCD Shield)

Gotowe kody obsługi układów elektronicznych udostępnione przez użytkowników forum.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

[BASCOM] Klawiatura drabinkowa (LCD Shield)

Post autor: niveasoft » 02 lut 2018, 19:25

Dzisiaj dotarło do mnie takie cudo więc postanowiłem to sobie przy kubku kawy oprogramować.
Może się komuś przydadzą gotowe opisy wyprowadzeń w kodzie no i funkcja do odczytu pięcioklawiszowej klawiatury na jednym pinie ADC
Funkcja ma wbudowane autorepeat czyli przy dłuższym wciśnięciu kliki się powtarzają same.

[media]https://drive.google.com/file/d/1bu99JG ... sp=sharing[/media]
  1. $regfile = "m328pdef.dat"
  2. $crystal = 16000000
  3. $hwstack = 64
  4. $swstack = 32
  5. $framesize = 128
  6.  
  7. '***********************************************
  8. '*                                             *
  9. '*         LDC KEYPAD SHIELD DEMO              *
  10. '*                                             *
  11. '*    RobotDyn Shield with resistive keypad    *
  12. '*                                             *
  13. '*  Demo shows hardware configuration, and     *
  14. '*      function for reading switches          *
  15. '*                                             *
  16. '*                                   by BARTek *
  17. '***********************************************
  18.  
  19. Config Submode = New
  20.  
  21. '***********************************************
  22. '*           ALPHANUMERIC LCD                  *
  23. '***********************************************
  24.  
  25.  Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
  26.  Config Lcd = 16x2
  27.  Cursor Off , Noblink : Cls
  28.  
  29. '***********************************************
  30. '*         CONFIG ADC FOR SWITCHES             *
  31. '***********************************************
  32.  
  33.  Config Adc = Single , Prescaler = Auto , Reference = Avcc
  34.  
  35. '***********************************************
  36. '*            TIMER2 FOR TIME BASE             *
  37. '***********************************************
  38.  
  39.  Config Timer2 = Timer , Prescale = 1024 , Compare_a = Disconnect , Clear_timer = 1
  40.  Compare2a = 155                                            '10ms @16MHz
  41.  
  42. '***********************************************
  43. '*                VARIABLES                    *
  44. '***********************************************
  45.  
  46.  Const Sw_r = 1
  47.  Const Sw_u = 2
  48.  Const Sw_d = 3
  49.  Const Sw_l = 4
  50.  Const Sw_s = 5
  51. 'switches
  52.   Dim Old_key As Byte , Key_cnt As Byte , Key As Byte
  53. 'demo
  54.   Dim Lr As Integer , Up_dn As Integer , Flip As Byte
  55.  
  56. Function Read_keypad() As Byte
  57.  
  58.  'function with autorepeat
  59.  
  60.  Local Adc_read As Word , Read_key As Byte , Key_val As Byte
  61.  
  62.    Adc_read = Getadc(0)
  63.  
  64.    Select Case Adc_read
  65.     Case 0 To 100 : Read_key = Sw_r                         'right = 0
  66.     Case 101 To 250 : Read_key = Sw_u                       'up = 145
  67.     Case 251 To 400 : Read_key = Sw_d                       'dwn = 330
  68.     Case 401 To 600 : Read_key = Sw_l                       'left = 506
  69.     Case 601 To 850 : Read_key = Sw_s                       'select = 743
  70.     Case Is > 851 : Read_key = 0                            'no key = 1023
  71.    End Select
  72.  
  73.    If Read_key <> 0 Then
  74.     If Old_key = Read_key Then
  75.  
  76.      If Key_cnt < 20 Then
  77.       Incr Key_cnt
  78.        Key_val = 0
  79.      Else
  80.       Key_cnt = 0
  81.        Key_val = Read_key
  82.      End If
  83.  
  84.     End If
  85.  
  86.    Else
  87.     Key_cnt = 15
  88.      Key_val = 0
  89.    End If
  90.  
  91.    Old_key = Read_key
  92.     Read_keypad = Key_val
  93.  
  94. End Function
  95.  
  96. 'for demo
  97. Locate 1 , 1 : Lcd "UpDn=0"
  98. Locate 2 , 6 : Lcd "< 0 >"
  99. Locate 1 , 14 : Lcd "*"
  100.  
  101. Do
  102.  
  103.  If Tifr2.ocf2a = 1 Then                                    '10ms
  104.    Tifr2.ocf2a = 1
  105.  
  106.    Key = Read_keypad()
  107.  
  108.  End If
  109.  
  110.    If Key <> 0 Then
  111.  
  112.     Select Case Key
  113.      Case Sw_u
  114.       If Up_dn < 9 Then Incr Up_dn
  115.        Locate 1 , 6 : Lcd Up_dn ; " "
  116.      Case Sw_d
  117.       If Up_dn > -9 Then Decr Up_dn
  118.        Locate 1 , 6 : Lcd Up_dn ; " "
  119.      Case Sw_r
  120.       If Lr < 9 Then Incr Lr
  121.        Locate 2 , 7 : If Lr >= 0 Then Lcd " " : Lcd Lr
  122.      Case Sw_l
  123.       If Lr > -9 Then Decr Lr
  124.        Locate 2 , 7 : If Lr >= 0 Then Lcd " " : Lcd Lr
  125.      Case Sw_s
  126.        Locate 1 , 14
  127.        If Flip = 0 Then
  128.         Lcd " *" : Flip = 1
  129.        Else
  130.         Lcd "* " : Flip = 0
  131.        End If
  132.  
  133.     End Select
  134.  
  135.     Key = 0
  136.    End If
  137.  
  138. Loop
  139. End
Pikczu
Posty: 388
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: [BASCOM] Klawiatura drabinkowa (LCD Shield)

Post autor: Pikczu » 02 lut 2018, 20:55

Kolega mnie ubiegł troszkę bo mam w zanadrzu małą biblioteczkę klawiatury na ADC.
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: [BASCOM] Klawiatura drabinkowa (LCD Shield)

Post autor: niveasoft » 03 lut 2018, 12:50

Dobrze wiedziałem, że używasz tej klawiatury od dłuższego czasu.
Chciałem napisać wykrywanie wciśnięcia dwóch przycisków, ale jeden przycisk w tym Shieldzie jest podłączony na żywca do masy a kombinacje innych przycisków dają bardzo zbliżone odczyty bo chyba źle dobrano rezystory.
Pikczu
Posty: 388
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: [BASCOM] Klawiatura drabinkowa (LCD Shield)

Post autor: Pikczu » 03 lut 2018, 16:53

Wiem o czym mówisz podobnie było zrobione na małej klawiaturze ADC z bangoods.com
Dlatego musiałem robić swoją płytkę.
ODPOWIEDZ