Przykłady połączeń i kodu dla klawiatury 4x4 podłączonej do kontrolerów AVR. Wpisywane z klawiatury liczby będą przesyłane do komputera przez port szeregowy lub wysyłane do wyświetlacza LCD.
Na razie opisy są bardzo skromne ale będę je stopniowo poszerzał . 
W przykładach wykorzystane są biblioteki Petera Fleury.
Niedługo przykłady z bibliotekami polskich autorów.
Wszystkie podane przykłady były skompilowane zarówno pod Linuksem jak i pod Windows 2000 z WinAVR20050214.

Klawiatura 4x4, kontroler AT90S2313 i UART

Program był wypróbowany na AT90S2313 i AT90S8515.
Kliknij tutaj żeby zobaczyć schemat połączeń.
Kod jest tutaj.
Pliki spakowane do "rar" są tutaj.
Układ klawiatury jak w poniższej tabelce.
0 (S1) 1 (S2) 2 (S3) 3 (S4)
4 S(5) 5 (S6) 6 (S7) 7 (S8)
8 (S9) 9 (S10) A (S11) B (S12)
C (S13) D (S14 E (S15) F (S16)

 Jest to baaaaardzo prymitywny kalkulator czterodziałaniowy w którym zostawiłem tylko dodawanie. Klawiatura działa w pętli. W sieci spotkałem kilka przykładów ale wszystkie były oparte na przerwaniach.
Klawiatura składa się z czterech kolumn i czterech wierszy jak widac na schemacie i jak pokazuje powyższa tabela.
Port B jest ustawiony w połowie jako wyjścia (bity 0, 1, 2, 3) i w połowie jako wejścia (bity 4, 5, 6, 7). Wyjścia są podłączone do kolumn klawiatury, a wejścia do jej wierszy. Jedno z wyjśc jest wyzerowane. Co 20 obiegów pętli zero przesuwane jest na następne wyjście zmienną "kol". Wejścia mają włączone podciąganie czyli jeśli nie są nigdzie podłączone to są w stanie wysokim.
Jeśli żaden klawisz nie jest wciśnięty to możliwe są następujące stany portu B:
1111 1110
1111 1101
1111 1011
1111 0111
  Wciśnięcie klawisza łączy określone wyjście z wejściem, np. wciśniecie klawisza "4" zwiera wyjście PB0 z wejściem PB5. . Jeśli w tej sytuacji wyjście PB0 będzie miało stan niski to również wejście PB5 będzie w stanie niskim.
Daje to następujący stan portu B:
1101 1110
Stan portu B przy wciśnięcie klawisza "7" i w chwili gdy na wyjściu PB3 jest zero będzie:
1101 0111
Starszy półbajt jest taki sam ale różnice występują w młodszym.
Jeśli naciśnięty jest tylko jeden klawisz starszy półbajt może mieć tylko jedną z pięciu wartości:
1110
1101
1011
0111
1111
Jak było już mówione młodsze cztery bity są kolejno zerowane w pętli. Naciśnięcie dowolnego pojedynczego klawisza spowoduje, że starszy półbajt przyjmie jedną z pierwszych czterech podanych wyżej wartości w chwili gdy wyzerowane jest wyjście przyłączone do kolumny do której należy wciśnięty klawisz.
Dalej określenie, który klawisz jest naciśnięty jest proste.
1110
 (PB3, PB2, PB1, PB0)
1101
 (PB3, PB2, PB1, PB0)
1011
 (PB3, PB2, PB1, PB0)
0111
 (PB3, PB2, PB1, PB0)
1110
 (PB7, PB6, PB5, PB4)
0 1 2 3
1101
(PB7, PB6, PB5, PB4)
4 5 6 7
1011
 (PB7, PB6, PB5, PB4)
8 9 A B
0111
(PB7, PB6, PB5, PB4)
C D E F
Wystarczy sprawdzić wartość starszego półbajtu. Służy temu polecenie przesunięcia PINB o cztery bity w prawo i odczytania wartości bajtu.
Jeśli jest różna od 15 to oznacza, że jakiś klawisz został naciśnięty.
Wtedy zerujemy flagę naciśnięcia klawisza i zerujemy zmienną "licznik".
Sprawdzamy ponownie starszy półbajt PINB i jeśli jego jego wartość:
  w zależności od tego, na którą kolumnę klawiatury podawane jest aktualnie zero.
Zmienna "licznik" podczas naciśnięcia klawisza jest zerowana co 20 obiegów pętli liczonych w zmiennej "licz_ob". Nawet po zwolnieniu klawisza jest on traktowany jako naciśnięty dopóki zmienna "licznik" nie osiągnie 50. Pozwala to na eliminację wpływu drgań styków klawiatury. Oczywiście limity dla "licznik_ob" (w przykładzie 20) i "licznik" (w przykładzie 50) można zmieniać dostosowując opóźnienie do swoich potrzeb. Komunikaty i liczby są wysyłane do PC poprzez RS. Liczby są konwertowane do ASCII funkcją "utoa". Wynik konwersji jest wysyłany do bufora "buffer_n".
Komunikacja odbywa sie z prędkością 9600 bodów. Dla zapewnienia synchronizacji prawidłowa wartość UBRR jest wyliczana dzięki definicji w wierszu 48 pliku "uart.h".
#define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu)/((baudRate)*16l)-1)
Dlatego niezbędne jest poinformowanie preprocesora o częstotliwości kwarcu i żądanej prędkości transmisji, co jest zrobione dwiema dyrektywami preprocesora:
#define XTAL_CPU         6000000      /* 6Mhz */
#define UART_BAUD_RATE      9600      /* 9600 baud */
w pliku "klawisze_4x4_uart.c".
Pliki "uart.c", "uart.h" oraz "test_uart.c" są autorstwa Petera Fleury. Ten trzeci nie jest niezbędny ale umożliwia szybkie poznanie możliwości biblioteki.
Plik nagłówkowy "uart.h" włączamy dyrektywą #include.

Włączanie plików źródłowych do Makefile

Plik "uart.c" powinien być dopisany do listy plików źródłowych w Makefile (otwórz Makefile w edytorze i zobacz linię 11). W ten sposób można dopisywać inne pliki zawierające kod źródłówy lub użyć programu Mfile w nastepujący sposób.
Uruchom Mfile
Otwórz plik Makefile
Z menu wybierz "Makefile >> C/C++ source file(s)...". Pojawi się okienko jak niżej. Wpisz nazwę pliku, w tym przypadku "uart.c".

I "OK".
Teraz odpowiedni fragment Makefile wygląda jak poniżej.


    Mój plik Makefile jest dla Linuksa i żeby dostosować go do WinAVR należy w linii 86 zmienić nazwę portu  z "/dev/parport0" na "lpt1" używając programu Mfile lub dowolnego edytora tekstu.

Klawiatura 4x4 na dwóch portach i UART.

    Program był wypróbowany na ATmega16 i AT90S8515.
Kliknij tutaj żeby zobaczyć schemat połączeń.
Kod jest tutaj.
Pliki spakowane do "rar" są tutaj.
    Róznice w programie wynikają z innego sposobu przyłączenia klawiatury. Kolumny są przyłączone jak porzednio, natomiast wiersze są przyłączone do pierwszych czterech bitów portu C. Ponieważ w przypadku ATmega8 dwa wyprowadzenia portu D są potrzebne do komunikacji z PC, a ponadto musimy użyć kwarcu co zabiera nam wyprowadzenia 6 i 7 portu B, dlatego klawiatura została przyłączona tak jak na schemacie.

Klawiatura 4x4 i LCD. Kontrolery Atmega8, Atmega16 i AT90S8515

    Ten przykład był dotychczas przetestowany z AT90S8515 i ATmega16. Powinien bez problemu chodzić z ATmega8 ale jeszcze nie sprawdzałem.
Funkcja klawiatury jest taka sama jak w poprzednim przykładzie. Różnicą jest to, że liczby i komunikaty są wyświetlane na LCD.
Schemat dla ATmega16 jest tutaj.
Schemat dla AT90S8515 jest tutaj.
Schemat dla ATmega8 jest tutaj.
Kod dla ATmega16 i AT90S8515 jest tutaj. Pliki spakowane tutaj.
Kod dla ATmega8 i wyższych jest tutaj. Sprawdzony z ATmega16. Pliki spakowane tutaj.
Ponieważ dostępne na rynku wyświetlacze są różnie zorganizowane jeśli idzie o ilość linii i znaków w wierszu, należy zdefiniować jaki rodzaj wyświetlacza użyliśmy.
W pliku "lcd.h" jest mozliwość wpisania konfiguracji naszego LCD, sekcja zaczyna się od wiersza 50. Poza tym dobrze jest wpisać częstotliwość z jaką taktujemy nasz kontroler. Można to zrobić w wierszu 47. Od wiersza 79 zaczyna się sekcja opisująca sposób przyłączenia wyświetlacza do kontrolera. O ile nie potrzebujesz zupełnie egzotycznych podłączeń wystarczy przypiąć wyświetlacz do któregoś z portów tak jak pokazano na schematach i w linii 79 wpisać stosowny port np.
#define LCD_PORT   PORTD        /**< port for the LCD lines   */

Kilka słów o wyswietlaczu LCD.

Jeżeli wcześniej nie miałeś do czynienia z LCD, to powinieneś przede wszystkim zapoznać się z dokumentacją dostarczaną przez producenta lub dostępną na jego stronie. Niektóre szczegóły, jak np. numeracja wyprowadzeń, mogą odbiegać od standartu. Poniżej typowe funkcje wyprowadzeń wyswietlacza.
Numer
wyprowadzenia
Symbol  Poziom  Funkcja Opis
1 Vss - - Masa (0V) zasilania (GND)
2 Vcc - - Plus zasilania(+5V)
3 Vee - - Regulacja kontrastu
4 RS 0/1 I 0 = Wprowadzanie instrukcji
1 = Wprowadzanie danych
5 R/W 0/1 I 0 = Wpisywanie do LCD
1 = Czytanie z LCD
6 E 1, 1->0 I Sygnał zezwolenia
7 DB0 0/1 I/O Linia danych 0 (LSB)
8 DB1 0/1 I/O Linia danych 1
9 DB2 0/1 I/O Linia danych 2
10 DB3 0/1 I/O Linia danych 3
11 DB4 0/1 I/O Linia danych 4
12 DB5 0/1 I/O Linia danych 5
13 DB6 0/1 I/O Linia danych 6
14 DB7 0/1 I/O Linia danych 7 (MSB)

Innym zagadnieniem jest podświetlanie. Najpowszechniejszym rozwiązaniem jest stosowanie diod świecących. W wielu przypadkach są one podzielone na dwie grupy, których wyprowadzenia są oznaczone jako K1 A1 i K2 A2.
Jeśli nie znasz dokładnych danych podświetlania i zaleceń producenta jak je podłączyć to bądź ostrożny i nigdy nie podłączaj wyprowadzeń K i A bezpośrednio do zasilania 5V!!!
W takim przypadku diody mogą zaświecić równie intensywnie jak krótko i tylko jeden raz. Jeżeli nie masz szczegółowych danych o podświetlaniu podłącz szeregowo od wyprowadzenia A do +5V opornik około 220-390 Ohm i oceń jasność podświetlania (nie będzie wystarczająca ale diody będą bezpieczne). Na tej podstawie lub metodą dalszych prób (zmniejszania oporności), możesz określić jaki opornik będzie potrzebny.