Klawiatura 7x7 I2C

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Klawiatura 7x7 I2C

Post autor: Henryk » 08 kwie 2023, 13:32

Witam :)
Panowie mam nową zagwozdkę hmm .
Wpadła mi ręce klawiatura sterowana po I2C 7x7 , próbuje to ogarnąć najprościej jak tylko można , z marnym skutkiem .
Schemat organizacyjny klawiatury .
klawiatura 7x7.JPG
Zmian w układzie sterowania nie mogę zmienić bo to taki produkt fabryczny :cry:
Na chwilę obecną wydumałem coś takiego .
  1.   $regfile = "m8def.dat"
  2.     $crystal = 8000000
  3.     $hwstack = 32
  4.     $swstack = 32
  5.     $framesize = 128
  6.  
  7.  
  8.     Config Lcd = 20 * 4
  9.     Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinc.4 , Db7 = Pinc.5 , E = Pinc.1 , Rs = Pinc.0
  10.     Dim A As Byte
  11.     Dim B As Byte
  12.     Dim C As Byte
  13.     Dim Kol As Byte
  14.     Dim Row As Byte
  15.     Dim Temp As Byte
  16.     Dim Temp1 As Byte
  17.     Config Scl = Portd.6
  18.     Config Sda = Portd.7
  19.  
  20.      A = 0
  21.      B = 0
  22.      C = 0
  23.      Kol = &B01111111
  24.      Row = &B11111110
  25.  
  26.      Cursor Off , Noblink
  27.      Cls
  28.      I2cinit
  29.  
  30.  
  31.    Do
  32.  
  33.           I2csend &H40 , Kol                                'U1
  34.             Waitms 10
  35.              I2csend &H42 , Row                             'U2
  36.                 Temp = Kol + Row
  37.                 Temp1 = Temp
  38.               Waitms 10
  39.                I2creceive &H41 , B
  40.                  Waitms 10
  41.                 I2creceive &H43 , C
  42.                  Waitms 10
  43.                   Locate 3 , 2 : Lcd B ; "  " ; C ; "  "
  44.                    A = C + B
  45.              If Temp1 <> A Then
  46.                Locate 2 , 2 : Lcd Temp1 ; "   "
  47.  
  48.              End If
  49.               rotate Row , Left , 1
  50.               rotate kol , right , 1
  51.              Waitms 10
  52.  
  53.  
  54.    Loop
  55.  
  56.     End
Coś tam działa , ale nie tak jak powinno .
Jak za dawnych czasów ......Pomożecie to ogarnąć ? :D

Pozdrawiam Henryk .
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Klawiatura 7x7 I2C

Post autor: niveasoft » 09 kwie 2023, 10:32

Na jakich to jest układach? Pytam bo oprócz PCF8574 to robiłem jeszcze projekt na czterech MCP23017. Tam się włącza podciąganie do plusa wpisem do rejestru.
Warto by najpierw wiedzieć z czym mamy do czynienia.

C+B to chyba zły pomysł. Najlepiej by było zadeklarować 16bit Word i zrobić tak :
Word = C : Shift Word, Left , 8 : Word = Word + B
Wtedy możesz sobie wyświetlić wszystkie bity Lcd Bin(word)

To samo można osiągnąć przez overlay czyli
  1. Dim MyWord As Word
  2. Dim B As Byte At MyWord Overlay
  3. Dim C As Byte At Myword + 1 Overlay
Nie trzeba wtedy przesuwać Shift bo wpis do C od razu będzie we właściwym miejscu.

Jeżeli jakieś piny są nieużywane bo układ jest ośmiobitowy to warto zastosować maskowanie np. I2creceive &H41, B : B = B And &B0111_1111 wtedy ten bit 7 zawsze będzie miał zero niezależnie od wszystkiego.
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Klawiatura 7x7 I2C

Post autor: Henryk » 09 kwie 2023, 11:13

Dziękuje Bartek za podpowiedź .
Układy na płytce to PCF 8574 3 szt . ten trzeci mam ogarnięty bo steruje tylko diodami led na klawiaturze .
Bedziem kombinować dalej ;)

edit:
No i są piny nieużywane w pierwszym P3 a w drugim P7 .
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Klawiatura 7x7 I2C

Post autor: Henryk » 09 kwie 2023, 16:14

Kombinowałem z Word = C : Shift Word, Left , 8 : Word = Word + B działa ale mam problem z wyłapaniem zmieniających się wartości , są wysokie .
Pozostałem przy pierwszej myśli ;) i zmajstrowałem coś takiego :idea: :
  1.    Do
  2.  
  3.           I2csend &H40 , Kol   'U1
  4.             I2csend &H42 , Row   'U2
  5.                data_out = kol + row    ' suma wysłana kol + row
  6.                 Waitms 5
  7.                  I2creceive &H41 , B
  8.                    I2creceive &H43 , C
  9.                     data_inp = b + c   ' suma odebrana kol + row
  10.                      Locate 1 , 2 : Lcd "Out " ; data_out ; "  "
  11.                      Locate 1 , 11 : Lcd "Inp " ; data_inp ; "   "
  12.                      Locate 2 , 2 : Lcd Bin(c) ; " row "
  13.                      Locate 3 , 2 : Lcd Bin(b) ; " kol "
  14.                        Waitms 5
  15.  
  16.                    if data_out <> data_inp then  ' sprawdzam czy sumy są zgodne , jeśli nie .. wciśnięto klawisz
  17.                                            'wyświetl wartość na lcd .....dalej skok do suba który wykona coś tam :-)
  18.                      Locate 4 , 2 : Lcd data_out ; "  " ; data_inp ;"     "
  19.                      data_out = 0
  20.                      data_inp = 0
  21.                    end if
  22.                      rotate row , left , 1 'przemiatanie row
  23.                      incr a
  24.                    if a = 6 then  ' jeśl a = 8
  25.                      Row = 254      ' ustaw row
  26.                       rotate kol , left , 1'przesuń Kol w lewo o 1
  27.                      a = 0
  28.                    end if
  29.             waitms 500   ' dodano celowo do kontroli zmieniających się wartości na lcd
  30.    Loop
  31.  
  32.     End
  33.  
  34.     ' Tu sub w którym będą przypisywane konkretne wartości do naciskanych klawiszy .
  35.     'sub
  36.  
  37.  
  38.     'end sub
Teraz tylko.. tak myślę .... złapać wartości dla poszczególnych klawiszy i sprawdzić na pełnym gazie procka .
A może coś uprościć , ulepszyć :?:
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Klawiatura 7x7 I2C

Post autor: Henryk » 10 kwie 2023, 10:31

Wesołych Świąt Wielkanocnych :D kto nie świętuje Temu udanego wypoczynku :D

Problem klawiatury został rozwiązany , może niezbyt elegancki ale działa .
  1.     $regfile = "m8def.dat"
  2.     $crystal = 8000000
  3.     $hwstack = 32
  4.     $swstack = 32
  5.     $framesize = 128
  6.     Config Lcd = 20 * 4
  7.     Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinc.4 , Db7 = Pinc.5 , E = Pinc.1 , Rs = Pinc.0
  8.     Dim A As Byte
  9.     Dim B As Byte
  10.     Dim C As Byte
  11.     Dim Kol As Byte
  12.     Dim Row As Byte
  13.     Dim Data_out As Word
  14.     Dim Data_inp As Word
  15.     Dim Res As Bit
  16.     Config Scl = Portd.6
  17.     Config Sda = Portd.7
  18.  
  19.      A = 0
  20.      B = 0
  21.      C = 0
  22.      Kol = 255
  23.      Row = 254
  24.      Res = 0
  25.      Cursor Off , Noblink
  26.      Cls
  27.      I2cinit
  28.  
  29.    Do
  30.        skok:
  31.           I2csend &H40 , Kol           'U1
  32.             I2csend &H42 , Row             'U2
  33.                Data_out = Kol + Row            ' suma wysłana kol + row
  34.                  I2creceive &H41 , B
  35.                    I2creceive &H43 , C
  36.                     Data_inp = B + C             ' suma odebrana kol + row
  37.  
  38.       '==================================================================================================
  39.       ' Moja klawiatura jest nietypowa , odkomentuj linie  Locate by odczytać wartości ,
  40.       ' klawiszy Twojej podpiętej klawiatury  , następnie wpisać je do bloku spawdzających kolumny .
  41.       '
  42.       '  Jeśli masz prostsze rozwiązanie sterowania klawiaturą 7x7 , 8x8 proszę podziel się rozwiązaniem tu na forum ;-)
  43.       ' http://bart-projects.pl/forum/viewtopic.php?f=3&t=479&p=3906&sid=a4267fb246bd9ec3d9e814a2bd982e50#p3906
  44.       '===================================================================================================
  45.                      'Locate 1 , 2 : Lcd "Out " ; Data_out ; "  "
  46.                      'Locate 1 , 11 : Lcd "Inp " ; Data_inp ; "   "
  47.                      'Locate 2 , 2 : Lcd Bin(c) ; " row "
  48.                      'Locate 3 , 2 : Lcd Bin(b) ; " kol "
  49.  
  50.                      Waitms 5
  51.                    If Data_out <> Data_inp Then     ' sprawdzam czy sumy są zgodne , jeśli nie .. wciśnięto klawisz
  52.                         Res = 1       ' wyświetl wartość na lcd .....dalej skok do suba który wykona coś tam :-)
  53.                        Locate 4 , 2 : Lcd Data_out ; "  " ; Data_inp ; "     "
  54.  
  55.                      If B.0 = 0 Then           ' sprawdzam kolumnę 1  czy ma stan 0
  56.  
  57.                        if  Data_inp = 501 then  ' odebrana wartość A + B
  58.                           ' zamiast  Locate 4 , 15 : Lcd "1  "  .... podstawiamy zmienną np. wynik = 1 itd. która ,
  59.                           ' będzie dalej w programie przekazywać wartość , działanie klawiatury będzie wyraźnie szybsze .
  60.                           Locate 4 , 15 : Lcd "1  "  ' wartość przypisana
  61.                        elseif Data_inp = 505 then
  62.                           Locate 4 , 15 : Lcd "4  "
  63.                        elseif Data_inp = 507 then
  64.                           Locate 4 , 15 : Lcd "7  "
  65.                        elseif Data_inp = 508 then
  66.                           Locate 4 , 15 : Lcd "*  "
  67.                        end if
  68.                      End If
  69.  
  70.                      If B.1 = 0 Then            ' sprawdzam kolumnę 2 czy ma stan 0
  71.  
  72.                        if  Data_inp = 500 then
  73.                           Locate 4 , 15 : Lcd "2  "
  74.                        elseif Data_inp = 504 then
  75.                           Locate 4 , 15 : Lcd "5  "
  76.                        elseif Data_inp = 506 then
  77.                           Locate 4 , 15 : Lcd "8  "
  78.                        elseif Data_inp = 507 then
  79.                           Locate 4 , 15 : Lcd "0  "
  80.                        end if
  81.                      End If
  82.  
  83.                      If B.2 = 0 Then            ' sprawdzam kolumnę 3  czy ma stan 0
  84.  
  85.                        if  Data_inp = 498 then
  86.                           Locate 4 , 15 : Lcd "3  "
  87.                        elseif Data_inp = 502 then
  88.                           Locate 4 , 15 : Lcd "6  "
  89.                        elseif Data_inp = 504 then
  90.                           Locate 4 , 15 : Lcd "9  "
  91.                        elseif Data_inp = 505 then
  92.                           Locate 4 , 15 : Lcd "#  "
  93.                        end if
  94.                      End If
  95.  
  96.                      'tu wstawiamy kolejne bloki obsługi klawiszy
  97.  
  98.                      ' If B.3 = 0 Then            ' sprawdzam kolumnę 4  czy ma stan 0
  99.  
  100.                      ' itd. do kolumny B.7 = 0
  101.                        goto klawisz
  102.  
  103.                    End If
  104.            If Res = 0 Then
  105.               Rotate Row , Left , 1               'przemiatanie row
  106.                  Incr A
  107.               If A = 7 Then                        ' jeśl a = 7
  108.                  Row = 254                         ' ustaw row
  109.                  A = 0
  110.               End If
  111.            End If
  112.                                                 '
  113.    Loop
  114.  
  115.     End
  116.  
  117.     klawisz:
  118.      res = 0
  119.     goto skok
  120.    return
Przyjemnej zabawy
Pozdrawiam Henryk .
ODPOWIEDZ