Bài viết trình bày về giao diện cơ bản giữa keypad và vi điều khiển 8051. Đây là yếu tố cần thiết trong các hệ thống nhúng khi cần nhậ...
Bài viết trình bày về giao diện cơ bản giữa keypad và vi điều khiển 8051. Đây là yếu tố cần thiết trong các hệ thống nhúng khi cần nhập ký tự hoặc số hoặc cả hai. Ví dụ như đồng hồ số, máy tính ... Trước khi đi vào giao diện chi tiết, ta cần xem xét về keypad
Hex Keypad
Bao gồm 16 phím sắp xếp tạo thành ma trận 4x4. Thường sử dụng số từ 0 tới 9 và các ký tự A tới F. Hình dưới là sơ đồ nguyên lý đơn giản của hex keypad:
Hex keypad gồm 8 đường giao tiếp với tên R1,R2,R3,R4,C1,C2,C3 và C4. R1 tới R4 tượng trưng cho 4 hàng và C1 tới C4 tượng trưng cho 4 cột. Khi bất kì phím nào được ấn thì hàng và cột tương ứng với phím đó sẽ được kết nối. Chương trình đọc phím sẽ nhận ra phím nào được ấn nhờ phương pháp quét cột. Trong phương pháp này, từng hàng được giữ ở mức điện áp thấp và kiểm tra các cột. Cột nào có mức điện áp thấp có nghĩa là phím kết nối giữa cột đó và hàng tương ứng (hàng đang ở mức thấp) được nhấn.
Giao diện hex keypad và 8051
Sơ đồ kết nối giữa hex keypad và 8051 như hình bên dưới. Chip AT89S51 được dử dụng trong project này. Mạch sẽ hiển thị chữ/số được ấn lên led 7 thanh.
Chương trình
ORG 00H
MOV DPTR,#LUT // moves starting address of LUT to DPTR
MOV A,#11111111B // loads A with all 1's
MOV P0,#00000000B // initializes P0 as output port
BACK:MOV P1,#11111111B // loads P1 with all 1's
CLR P1.0 // makes row 1 low
JB P1.4,NEXT1 // checks whether column 1 is low and jumps to NEXT1 if not low
MOV A,#0D // loads a with 0D if column is low (that means key 1 is pressed)
ACALL DISPLAY // calls DISPLAY subroutine
NEXT1:JB P1.5,NEXT2 // checks whether column 2 is low and so on...
MOV A,#1D
ACALL DISPLAY
NEXT2:JB P1.6,NEXT3
MOV A,#2D
ACALL DISPLAY
NEXT3:JB P1.7,NEXT4
MOV A,#3D
ACALL DISPLAY
NEXT4:SETB P1.0
CLR P1.1
JB P1.4,NEXT5
MOV A,#4D
ACALL DISPLAY
NEXT5:JB P1.5,NEXT6
MOV A,#5D
ACALL DISPLAY
NEXT6:JB P1.6,NEXT7
MOV A,#6D
ACALL DISPLAY
NEXT7:JB P1.7,NEXT8
MOV A,#7D
ACALL DISPLAY
NEXT8:SETB P1.1
CLR P1.2
JB P1.4,NEXT9
MOV A,#8D
ACALL DISPLAY
NEXT9:JB P1.5,NEXT10
MOV A,#9D
ACALL DISPLAY
NEXT10:JB P1.6,NEXT11
MOV A,#10D
ACALL DISPLAY
NEXT11:JB P1.7,NEXT12
MOV A,#11D
ACALL DISPLAY
NEXT12:SETB P1.2
CLR P1.3
JB P1.4,NEXT13
MOV A,#12D
ACALL DISPLAY
NEXT13:JB P1.5,NEXT14
MOV A,#13D
ACALL DISPLAY
NEXT14:JB P1.6,NEXT15
MOV A,#14D
ACALL DISPLAY
NEXT15:JB P1.7,BACK
MOV A,#15D
ACALL DISPLAY
LJMP BACK
DISPLAY:MOVC A,@A+DPTR // gets digit drive pattern for the current key from LUT
MOV P0,A // puts corresponding digit drive pattern into P0
RET
LUT: DB 01100000B // Look up table starts here
DB 11011010B
DB 11110010B
DB 11101110B
DB 01100110B
DB 10110110B
DB 10111110B
DB 00111110B
DB 11100000B
DB 11111110B
DB 11110110B
DB 10011100B
DB 10011110B
DB 11111100B
DB 10001110B
DB 01111010B
END