Witam Ponownie.
Jak wspomniałem w
tym temacie próbuje "dorobić" przejściówkę: klawiatura AT PS/2 podłączana do złącza klawiatury w C64 na Attiny2313.
No cóż... Lipa wyszła. Dlatego proszę o pomoc.
Do autora tematu poleconego przez kolegę @StaryMarabut
http://c64power.com/forumng/index.php?topic=7027.0 napisałem PM, lecz zdaję sobie sprawę, że "rzecz" raczej już nieaktualna od ponad roku.
Mój niechlujny i lamerski kod (BASCOM) wygląda tak:
'opis patrz nizej...
' przejsciowka PS/2 AT do C64 keyboard interface
'1. prawdopodobnie 6526 trzyma normalnie na pa7 low (chyba ze przalacza pot z gniazd joy lub stan niski na ktoryms z"rzedow")
'wiec jezeli na zadnej pa0 do pa6 nie ma low to znaczy ze "skanowana" jest pa7
'
'!!! W finalnej wersji zmienic Fuse BIta od RESET !!!
'
'Problemy do rozwiazania:
'1. wiadomo jaki :/
'2. Klawisze z shiftem
'3. wcisniecie kilku klawiszy na raz (pp. GetAtKbdRaw pomoze)
$regfile = "attiny2313a.dat"
$crystal = 8000000
$baud = 9600
'$prog &HFF , &HE4 , &HDF , &HFF ' generated. Take care that the chip supports all fuse bytes.
Config Portb = Output 'rzędy od 0 do 7 np. rząd0 pinb.0 czyli rzad1 pinb.1 (pb0-pb7) | pin12(złącze klawiatury) row0 > pin5 row7
'rzedy w tabeli keydata wpisywane sa +1 czyli rzad 2 wpisany jest jako 3
Config Porta.0 = Input 'kolumna h7 pin(zlacze klawiatury) 13
Config Porta.1 = Input 'kolumna g6 pin(zlacze klawiatury) 14
Config Porta.2 = Input 'kolumna f5.pin(zlacze klawiatury) 15
'.
Config Portd.0 = Input 'kolumn e4 pin(zlacze klawiatury) 16
Config Portd.1 = Output 'Odkomentowac W Finalnej Wersji Bedzie To Restore
Config Portd.2 = Input 'kolumna d3 pin(zlacze klawiatury) 17
Config Portd.5 = Input 'kolumna c2 pin(zlacze klawiatury) 18
Config Portd.6 = Input 'kolumna b1 pin(zlacze klawiatury) 19
'kolumny podobnie jak rzedy + 1 czyli kolumna c2 to kolumna 3 pind.5
'kolumna a0 pin(zlacze klawiatury) 20 jezeli na ktorymkolwiek z powyzszych stan 1 to kolumna H aktywna
Rzedy Alias Portb
'Kol.0 Alias 0 'to kolumna zadna z powyzszych
K1 Alias Portd.6
K2 Alias Portd.5
K3 Alias Portd.2
K4 Alias Portd.0
K5 Alias Porta.2
K6 Alias Porta.1
K7 Alias Porta.0
Rest Alias Portd.1
Config Keyboard = Pind.3 , Data = Pind.4 , Keydata = Keydata
Rzedy = 255
'Portb.0 = 1 'ustaw 1 na wyjściach rzędów
'Portb.1 = 1
'Portb.2 = 1
'Portb.3 = 1
'Portb.4 = 1
'Portb.5 = 1
'Portb.6 = 1
'Portb.7 = 1
'Porta.0 = 1 'ustaw 1 na kolumnach A, B, C
'Porta.1 = 1
'Porta.2 = 1
'Portd.0 = 1 ' ustaw 1 na kolumnach D-H
'Portd.1 = 1 ' odkomentowac w finalnej wersji bedzie to RESTORE
'Portd.2 = 1
'Portd.5 = 1
'Portd.6 = 1
Dim A As Word , B As Byte 'pomocnicze
Dim Klawisz As Byte , Nr As Byte , Nk As Byte , Rzad As Byte '"Nr" - numer rzedu, "Nk" - numer kolumny, "Rzad" - bajt ustawiany na porcie rzedow
Dim Cps As Bit 'Cps - stan caps lock (shift lock)
Cps = 0
Do
Do 'odczyt klawiatury + czeka na zwrocenie wartosci z taklicy keydata <>0
Klawisz = Getatkbd()
' If Klawisz = 0 Then
' Rzedy = 255
' End If
Loop Until Klawisz <> 0
' Klawisz = 56 ' zakomentowac w pelnej wersji - linia do testowania
If Klawisz = 42 Then Toggle Cps
Nr = Klawisz / 10 'rozbicie na rzedy
Nr = Nr - 1 '-1 patrz dlacego w opisie
Nk = Klawisz Mod 10 'rozbicie na kolumny
Nk = Nk - 1 '-1 patrz opis ponizej
Rzad = Lookup(nr , Dr) ' odczytaj wartosc z pozycji "rzad" tabeli "dr"
'Print Bin(klawisz) ; " wartosc " ; Rzad ; " " ; Nr ; " " ; Nk ; "" ' zakomentowac w pelnej wersji - linia do testowania zmiennych
If Cps = 0 Then
Gosub Lowerkeys 'problem caps locka do rozwiazania moze nie trza 2 subów robic...
Else
Gosub Upperkeys
End If
Waitms 5 ' czas przytrzymania stanu na rzedach
Rzedy = 255 ' ustaw 1 na wszystkich rzedach
Loop
Lowerkeys:
Select Case Nk
Case 0
'Do : Loop Until K1 = 1 And K2 = 1 And K3 = 1 And K4 = 1 And K5 = 1 And K6 = 1 And K7 = 1
Rzedy = Rzad
Case 1
Do : Loop Until K1 = 0
'Waitus 10
Rzedy = Rzad
Case 2
Do : Loop Until K2 = 0
'Waitus 10
Rzedy = Rzad
Case 3
Do : Loop Until K3 = 0
'Waitus 10
Rzedy = Rzad
Case 4
Do : Loop Until K4 = 0
'Waitus 10
Rzedy = Rzad
Case 5
Do : Loop Until K5 = 0
'Waitus 10
Rzedy = Rzad
Case 6
Do : Loop Until K6 = 0
'Waitus 10
Rzedy = Rzad
Case 7
Do : Loop Until K7 = 0
'Waitus 10
Rzedy = Rzad
Case 255 And Nr = 0
Rest = 0
Waitus 50
Rest = 1
End Select
'A = 0
'Do 'pewnie bedzie wygladala inaczej raczej dojda wait....
'A = A + 2
' If Nk = 1 Then
' Do ; Until K1 = 0
' Rzedy = Rzad
' Return
' End If
' If K2 = 0 And Nk = 2 Then
' Rzedy = Rzad
' Return
' End If
' If K3 = 0 And Nk = 3 Then
' Rzedy = Rzad
' Return
' End If
' If K4 = 0 And Nk = 4 Then
' Rzedy = Rzad
' Return
' End If
' If K5 = 0 And Nk = 5 Then
' Rzedy = Rzad
' Return
' End If
' If K6 = 0 And Nk = 6 Then
' Rzedy = Rzad
' Return
' End If
' If K7 = 0 And Nk = 7 Then
' Rzedy = Rzad
' Return
' End If
' If Nk = 0 Then : Rzedy = Rzad
' 'A = 1
' End If
' If Nk = 255 And Nr = 0 Then 'RESTORE - poprawic i odkomentowac
' Rest = 0
' Waitus 50
' Rest = 1
' Else
' Rest = 1
' End If
'Waitus 20
'Loop Until A = 1 Or A = 42 'zakoncz petle po wykryciu kolumny lub 20 powtorzeniach
Return
Upperkeys:
'A = 0
'Do 'pewnie bedzie wygladala inaczej raczej dojda wait....
'A = A + 2
'If K1 = 0 Then : Rzedy = 239 : End If 'problem caps locka do rozwiazania
A = 0
Do
If K7 = 0 And Nk = 7 Then
Rzedy = Rzad
'A = 1
End If
If K6 = 0 And Nk = 6 Then
Rzedy = Rzad
'A = 1
End If
If K5 = 0 And Nk = 5 Then
Rzedy = Rzad
'A = 1
End If
If K4 = 0 And Nk = 4 Then
Rzedy = Rzad
'A = 1
End If
If K3 = 0 And Nk = 3 Then
Rzedy = Rzad
'A = 1
End If
If K2 = 0 And Nk = 2 Then
Rzedy = Rzad
'A = 1
End If
If K1 = 0 And Nk = 1 Then
Rzedy = Rzad
'A = 1
End If
A = A + 1
Loop Until A = 10
If Nk = 0 Then : Rzedy = Rzad
'A = 1
End If
If Nk = 255 And Nr = 0 Then 'RESTORE - poprawic i odkomentowac
Rest = 0
Waitus 50
Rest = 1
Else
Rest = 1
End If
'Waitus 20
'Loop Until A = 1 Or A = 42 'zakoncz petle po wykryciu kolumny lub 20 powtorzeniach
Return
'------------------------------------------------------------------------------------------------
'Dane rzedow - rzedy od 0 do 7 np. dec127 = byte0111 1111
Dr:
'Data 127 , 191 , 223 , 239 , 247 , 251 , 253 , 254
Data 254 , 253 , 251 , 247 , 239 , 223 , 191 , 127
'mapa klawiatury rzedami - wybrana pozycja 0111 1111, 1011 1111
'------------------------------------------------------------------------------------------------
'Dane kolumn t.j. poukladane porty od 0 do 7
'Dk:
'Data 0 , "K1" , "K2" , "K3" , "K4" , "K5" , "K6" , "K7"
'------------------------------------------------------------------------------------------------
'talica znakow zapisana rzad kolumna np. 34 rzad 2 kolumna a3
Keydata:
'normal keys lower case
Data 0 , 58 , 0 , 0 , 0 , 0 , 0 , 88 , 0 , 68 , 0 , 0 , 0 , 31 , 21 , 0
Data 0 , 41 , 42 , 0 , 61 , 71 , 11 , 0 , 0 , 0 , 52 , 62 , 32 , 22 , 81 , 0
Data 0 , 53 , 43 , 33 , 72 , 82 , 12 , 0 , 0 , 51 , 44 , 63 , 73 , 23 , 13 , 0
Data 0 , 45 , 54 , 64 , 34 , 24 , 83 , 0 , 0 , 0 , 55 , 35 , 74 , 14 , 84 , 0
Data 0 , 46 , 65 , 25 , 75 , 85 , 15 , 0 , 0 , 56 , 47 , 36 , 66 , 26 , 16 , 0
Data 0 , 0 , 37 , 0 , 76 , 86 , 0 , 0 , 42 , 57 , 28 , 27 , 0 , 67 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 17 , 0 , 0 , 10 , 0 , 0 , 18 , 0 , 0 , 0
Data 87 , 77 , 48 , 0 , 38 , 0 , 0 , 0 , 78 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'shifted keys UPPER case
Data 0 , 58 , 0 , 0 , 0 , 0 , 0 , 88 , 0 , 68 , 0 , 0 , 0 , 31 , 21 , 0 '16
Data 0 , 41 , 42 , 0 , 61 , 71 , 11 , 0 , 0 , 0 , 52 , 62 , 32 , 22 , 81 , 0 '32
Data 0 , 53 , 43 , 33 , 72 , 82 , 12 , 0 , 0 , 51 , 44 , 63 , 73 , 23 , 13 , 0 '48
Data 0 , 45 , 54 , 64 , 34 , 24 , 83 , 0 , 0 , 0 , 55 , 35 , 74 , 14 , 84 , 0 '64
Data 0 , 46 , 65 , 25 , 75 , 85 , 15 , 0 , 0 , 56 , 47 , 36 , 66 , 26 , 16 , 0 '80
Data 0 , 0 , 37 , 0 , 76 , 86 , 0 , 0 , 42 , 57 , 28 , 27 , 0 , 67 , 0 , 0 '96
Data 0 , 0 , 0 , 0 , 0 , 0 , 17 , 0 , 0 , 10 , 0 , 0 , 18 , 0 , 0 , 0 '112
Data 87 , 77 , 48 , 0 , 38 , 0 , 0 , 0 , 78 , 0 , 0 , 0 , 0 , 0 , 0 , 0 '128
'przypisanie klawiszy c64 - atkeyb - kod getatkbd (hex) - rzad kolumna C64
'c64 key AT key scancode table position Keydata (rzad/kolumna)+1
'left arrow - "`" - 0e - 15 - 21
'1 - "1" - 16 - 23 - 11
'2 - "2" - 1e - 31 - 81
'3 - "3" - 26 - 39 - 12
'4 - "4" - 25 - 38 - 82
'5 - "5" - 2E - 47 - 13
'6 - "6" - 36 - 55 - 83
'7 - "7" - 3D - 62 - 14
'8 - "8" - 3E - 63 - 84
'9 - "9" - 46 - 71 - 15
'0 - "0" - 45 - 70 - 85
'+ - "-" - 4E - 79 - 16
'- - "=" - 55 - 86 - 86
'Funt - "BkSp" - 66 - 103 - 17
'crl/home - "Insert" - 70 - 113 - 87
'inst/del - "Home" - 6C - 109 - 18
'control - "Tab" - 0D - 14 - 31
'Q - "Q" - 15 - 22 - 71
'W - "W" - 1D - 30 - 22
'E - "E" - 24 - 37 - 72
'R - "R" - 2D - 46 - 23
'T - "T" - 2C - 45 - 73
'Y - "Y" - 35 - 54 - 24
'U - "U" - 3C - 61 - 74
'I - "I" - 43 - 68 - 25
'O - "O" - 44 - 69 - 75
'P - "P" - 4D - 78 - 26
'@ - "[" - 54 - 85 - 76
'* - "]" - 5B - 92 - 27
'arrow up - "Del" - 71 - 114 - 77
'RESTORE - "End" - 69 - 106 - 10 osobne wyjście attiny
'run/stop - "L Alt" - 11 - 18 - 41
'shift lock - "CpsLck" - 58 - 89 - 42
'A - "A" - 1C - 29 - 32
'S - "S" - 1B - 28 - 62
'D - "D" - 23 - 36 - 33
'F - "F" - 2B - 44 - 63
'G - "G" - 34 - 53 - 34
'H - "H" - 33 - 52 - 64
'J - "J" - 3B - 60 - 35
'K - "K" - 42 - 67 - 65
'L - "L" - 4B - 76 - 36
': - ";" - 4C - 77 - 66
'; - "'" - 52 - 83 - 37
'= - "\" - 5D - 94 - 67
'RETURN - "Enter" - 5A - 91 - 28
'COMMODORE - "L Ctr" - 14 - 21 - 61
'shift LEFT - "L Shift" - 12 - 19 - 42
'Z - "Z" - 1A - 27 - 52
'X - "X" - 22 - 35 - 43
'C - "C" - 21 - 34 - 53
'V - "V" - 2A - 43 - 44
'B - "B" - 32 - 51 - 54
'N - "N" - 31 - 50 - 45
'M - "M" - 3A - 59 - 55
', - "," - 41 - 66 - 46
'. - "." - 49 - 74 - 56
'/ - "/" - 4A - 75 - 47
'shift RIGHT - "R Shift" - 59 - 90 - 57
'crs UP/DWN - "D Arrow" - 72 - 115 - 48
'crs LFT/RIGHT - "R Arrow" - 74 - 117 - 38
'SPACE - "SPACE" - 29 - 42 - 51
'F1/F2 - "F9" - 01 - 02 - 58
'F3/F4 - "F10" - 09 - 10 - 68
'F5/F6 - "F11" - 78 - 121 - 78
'F7/F8 - "F12" - 07 - 08 - 88
Schemat:
![](https://naforum.zapodaj.net/thumbs/624b50382628.png)
Schemat klawiatury C64:
![](https://naforum.zapodaj.net/thumbs/e87020d2487e.png)
Działanie programu w skrócie:
1. czekaj na wciśnięcie klawisza i pobierz jego kod;
2. zdekoduj Nr rzędu i kolumny z tabeli;
3. czekaj aż na zdekodowanej kolumnie będzie stan 0 i w tym momencie ustaw 0 na zdekodowanym rzędzie
4. odczekaj określony czas
5. ustaw stan jeden na wszystkich rzędach
6. wróć do pk.1
Jak widać powyżej nie mam prawie żadnego doświadczenia z uC.
Jest to oczywiście wersja bardzo testowa, stąd np. rozbicie Lowerkeys - "CASE" i Upperkeys - "IF" (pozwala sprawdzić 2 możliwości za 1 zamachem ;p).
Przepraszam, ale kod musiałem wstawić inaczej pisałbym o niczym.... Oczywiście nie ponoszę żadnej odpowiedzialności za wykorzystanie...
![Chichot :D](http://c64power.com/forumng/Smileys/default/cheesy.gif)
Trochę to działa t.j. zależnie od ustawienia "WAITMS" (czas przytrzymania stanu na rzedach) - przy długim czasie mamy zapis wierszy głównie do kolumny A, przy krótkim i przytrzymaniu klawisza czasami "trafiamy" w inną kolumnę... Innymi słowy - najlepiej działa spacja
![Chichot :D](http://c64power.com/forumng/Smileys/default/cheesy.gif)
We wspomnianym wyżej temacie kolega @Kisiel napisał:
Witam
Zastanawia mnie kwestia emulowania klawiatury dla C64/128. O ile dobrze pamiętam, to były tam jakieś numery ze stanami logicznymi (to jest zwykła klawiatura multipleksowana), i nawet w którymś projekcie zastosowano matrycę łączników CMOS aby to ominąć. A ATMega jak to emuluje? Wykrywa kiedy linia jest wybierana i generuje wtedy sygnał wiersza?
A to akurat proste, masz bodaj siedem cykli procesora 6502 na odpowiedź , w tym czasie na przerwaniu wystawiasz wartość odpowiedzi.
Ja to zrobiłem na MSP430 plus level. Kolejny niedokończony projekt ![Uśmiech :)](http://c64power.com/forumng/Smileys/default/smiley.gif)
- rozumiem, że "wykładam" się na "...w przerwaniu...", choć nie do końca wiem o co chodzi.
W przypadku "Lowerkeys" (CASE) na pewno wykrywany jest stan niski na lini danej kolumny gdyż program kontynuuje działanie - pobiera kolejny wciśnięty klawisz.
Bardzo proszę o pomoc, bo poległem:
- nie jestem leniem - start projektu praktycznie od 0 i ok. 200 przetestowanych wersji tegoż programiku;
- wiem, że niewiele wiem - dlatego proszę o pomoc;
- wiem, że próbuje zrobić "coś" z "niczego" - wydaje mi się, że nie ma sensu strzelanie do komarów z armaty (analog switch + "duży" procek);
- bardzo przepraszam za ortografy i inne błędy - nie mam wytłumaczenia, moja wina.
Na czym mi zależy (wymieniłem w komentarzu do programu, ale powtórzę):
1. możliwość zmiany keymapy + rozszerzenia np.: osobno traktowane klawisze F1 do F7 (czyli po wciśnięciu na klawiaturze F7 C64 dostaje Shift+F6);
2. wykrywanie wciśnięcia więcej niż 1 klawisza;
3. obsługa CapsLocka jako ShiftLocka (również dioda LED na klawiaturze).
Może jednak uśmiechnąć się do Atmegi88P (więcej pinków) - wyłączanie Reset jest jednak uciążliwe pomimo Fuse Bit Doctora - przy testach nie podłączam tej linii.
Tak czy inaczej, jeszcze raz prosząc o pomoc pozdrawiam.
![Uśmiech :)](http://c64power.com/forumng/Smileys/default/smiley.gif)