Sunteți pe pagina 1din 4

Conectarea unei tastaturi la un sistem cu 8051

Se utilizeaza o tastatura organizata sub forma matriciala, conectata conform schemei de mai jos:

Conectarea tastaturii la sistemul cu microcontroler 8051 este realizata conform schemei:

Butoanele utilizate sunt de tipul push button, adica contactul este realizat atita timp cit tasta este apasata. Pentru a putea determina daca o anumita tasta este apasata sau nu, se baleiaza tastele astfel: se pune 0 la rindul 1 si se citesc coloanele si se verifica daca este apasata o tasta. In caz afirmativ se asteapta pina cind tasta revine in pozitia initiala (este ridicat degetul de pe tasta), este salvata valoarea tastei apasate si se revine din subrutina.

Mai jos aveti declaratiile de variabile si functiile de citire ale valorii corespunzatoare tastei apasate. Tastatura este alfanumerica (cifrele 0-9, litere A-F ... sau valori hexazecimale 0F) . ;se definesc variabile (nume) pentru portul P2 si pentru primii 4 biti din P2, 0-3 ;la 4-7 fiind rindurile tastaturii, P2 fiind pe 8 biti, de exemplu 7Fh 7 reprezinta ;numarul corespunzator rindului si F corespunzator coloanei ;se va observa ca se pune pe 0 logic rindul si se citesc coloanele ... coloana ;apasata avind de asemenea valoarea 0 keyport equ P2 ;Keypad port connected here col1 equ P2.0 ;Column 1 col2 equ P2.1 ;Column 2 col3 equ P2.2 ;Column 3 col4 equ P2.3 ;Column 4 keyval equ 30H ;To store key number este definita o variabila la adresa de ;memorie 30H, in loc sa apelez locatia respectiva de memorie pot sa scriu numele ei pressed bit 0H ;Flag similar se defineste o variabile de tip bit key_init: mov keyport,#0FH ret ;Make rows as o/p and col as i/p

get_key: mov keyval,#0 ;reset the number mov keyport,#7FH ;make Row1 low acall read_col ;read columns jb pressed, done ;check if flag is set

mov keyval,#4 ;if not then read next row mov keyport,#0BFH ;make Row2 low acall read_col ;read columns jb pressed, done ;check if flag is set

mov keyval,#8 ;if not then read next row mov keyport,#0DFH ;make row3 low acall read_col ;read columns jb pressed, done ;check if flag is set

mov keyval,#12 ;if not read row4 mov keyport,#0EFH ;make row4 low acall read_col ;read columns

done: ret read_col: clr pressed jb col1, nextcol jnb col1,$ setb pressed ret ;read columns routine ;reset the flag ;check if first key is pressed ;if yes then wait for key release ;set the flag

nextcol: ;read col2 jb col2, nextcol1 ;check if second key is pressed jnb col2,$ ;if yes then wait for key release inc keyval ;its key number 2 setb pressed ;set the flag ret nextcol1: ;read col3 jb col3, nextcol2 ;check if third key is pressed jnb col3,$ ;if yes then wait for key release inc keyval ;its key 3 inc keyval setb pressed ;set the flag ret nextcol2: jb col4, exit jnb col4,$ inc keyval inc keyval inc keyval setb pressed ret exit: clr pressed clr keyval ret end Tema laboratorului: Implementarea unui cifru digital utilizind subrutinele de citire ale valorilor tastelor apasate, scrieti un program care sa citeasca valoarea tastei apasate (pentru 4 taste apasate succesiv adica sa obtin un numar ;read column 4 ;check if fourth key pressed ;if yes then wait for key release ;its key 4 ;set the flag ;if no key is pressed ;clr the flag ;reset the number

din 4 cifre hexazecimale) si sa compare valorile citite cu alte 4 cifre predefinite, memorate in registri pe care puteti sa-i alegeti dvs, iar la aparitia unui numar (4 cifre hexazecimale . .. de exemplu 8F3Ah) sa transmita pe portul serial (9600 baud) textul OK. Daca numerele tastate nu corespund cu cele memorate sa transmita pe portul serial textul CANCEL. Cu alte cuvinte, se presupune ca exista memorate 4 cifre in 4 registri (R0-R7 la alegere) si citesc 4 taste, apasate pe rind, si compar valorile citite cu cele stocate in registrii respectivi. Se poate face citire si comparare pentru fiecare apasare sau sa memorez valorile celor 4 taste apasate si sa le compar la sfirsit, la alegere (prima varianta e mai usoara ca nu ocupa asa multi registri). Programul se trimite pe adresa de email: sebastian.sabou@ubm.ro pina la data de 16 ianuarie 2012.

Evaluare