5. Giáo vieđn hướng dăn : Th.S TÁ COĐNG ĐỨC
3.5.4. Giao tiêp với bàn phím sô hex sử dúng ngaĩt ngoài INT0
Múc tieđu thiêt keâ: Viêt moơt chương trình đĩc kí tự sô hex từ bàn phím moêi khi có phím nhân và cho hieơn thị ra 8 led (kêt nôi ở port 2 thođng qua IC chôt 74HC573) ở dáng mã nhị phađn.
Kêt nôi phaăn cứng
Hình 3 - 19 : Sơ đoă giao tiêp giữa Vi đieău khieơn và bàn phím
Vieơc kêt nôi bàn phím sô hex với vi đieău khieơn táo neđn moơt giao dieơn giao tiêp giữa người sử dúng với heơ thông dùng vi đieău khieơn. Bàn phím sô
giúp cho người sử dúng thiêt laơp các thođng sô cài đaịt, và nhaơp các leơnh đieău khieơn heơ thông.
Hình tređn trình bày cách giao tiêp giữa port 1 cụa vi đieău khieơn với bàn phím sô hex. Bàn phím có 16 phím, được saĩp xêp thành 4 hàng (Row) và 4 coơt (Column). Các đường coơt được nôi với các bit từ P1.0 đên P1.3, các đường hàng được nôi với các bit từ P1.4 đên P1.7 cụa port1. Các hàng được đưa vào 4 ngõ vào cụa coơng AND dùng diode, ngõ ra cụa coơng AND được đưa đên bit INT0 cụa vi đieău khieơn đeơ có theơ táo ra moơt ngaĩt khi có phím được nhân. Chađn 1 và 4, chađn 2 và 3 cụa các SW đã được kêt nôi beđn trong nút nhân.
Viêt chương trình
Chương trình được chia thành chương trình chính và chương trình con phúc vú ngaĩt.
Chương trình chính goăm các bước sau:
1. Khởi táo các thođng sô caăn thiêt. 2. Nhạy tái choê, khođng làm gì cạ.
Chương trình con phúc vú ngaĩt goăm các bước sau:
1. Nhaơp kí tự từ bàn phím. 2. Gửi mã hieơn thị ở 8 led. 3. Quay veă bước 1.
Chương trình thực hieơn yeđu caău tređn được viêt như sau:
LE0 Bit P2.7
OE0_2 Bit P2.4
Org 000h
Sjmp Main ;Nhạy qua các địa chư ngaĩt. Org 003h ;Khai báo tái địa chư ngaĩt INT0. Lcall KeyIQR ;Đĩc mã từ bàn phím và hieơn thị. RETI ;Trở veă từ chương trình phúc vú ngaĩt. Org 030h ;Khai báo địa chư ch.trình chính. Main: Mov P1,#0F0h ;Cho các coơt =0 đeơ táo ngaĩt. Clr OE0_2 ;Cho phép IC chôt làm vieơc.
Mov P2,#00h ;Xuât dữ lieơu 00h
Setb LE0 ;Đieău khieơn chôt dữ lieơu
Clr LE0 ;đeơ taĩt các led.
Setb IE.0 ;Cho phép ngaĩt ngoài INT0.
Setb IE.7 ;Cho phép ngaĩt toàn cúc.
Sjmp $ ;Nhạy tái choê, khođng làm gì.
;====================================================== ;KeyIQR :Chương trình phúc vú ngaĩt,
; từ 00h đên 0Fh tương ứng cho 16 phím.
;====================================================== KeyIQR: Lcall ScanKey ;Gĩi chương trình nhaơn mã 1phím. Jnb F0,EndKeyIQR ;Có phím đã nhân?.
Mov P2,A ;Có: hieơn thị ra 8 led.
Setb LE0 ;Cho dữ lieơu qua IC chôt
Clr LE0 ;Chôt dữ lieơu lái.
EndKeyIQR: RET ;Quay veă.
;====================================================== ;ScanKey :Chương trình đĩc mã sô từ bàn phím,
; Có phím nhân : Cờ F0=[1], mã phím chứa trong thanh ghi A. ; Khođng có phím nhân : Cờ F0=[0].
;====================================================== ScanKey: Clr IE.0 ;Câm ngaĩt ngoài INT0.
Clr F0 ;Maịc định khođng có phím nhân.
Mov R3,#50 ;Sô đêm
Back1: Lcall GetKey ;Phím được nhân?.
Jnc EndScan ;Khođng : thoát.
Djnz R3,Back1 ;Có: kieơm tra lái 50 laăn.
Push Acc ;Lưu mã sô Hex
Back2: Mov R3,#50 ;Chờ phím nhạ.
Back3: Lcall GetKey ;Phím được nhân?.
Jc Back2 ;Có: kieơm tra lái.
Djnz R3,Back3 ;Khođng: laịp lái 50 laăn.
Pop Acc ;Khođi phúc sô Hex.
Setb F0 ;Có phím nhân.
EndScan: Mov P1,#0F0h ;Cho các coơt =0 đeơ táo ngaĩt.
Setb IE.0 ;Cho phép ngaĩt ngoài INT0.
RET ;Quay veă.
;====================================================== ;GetKey :Chương trình con kieơm tra tráng thái bàn phím.
;Nêu có phím đang nhân : Cờ nhớ C được set leđn [1] và mã phím trong
; thanh ghi A
;Nêu khođng có phím đang nhân : Cờ C được Clear baỉng [0].
;====================================================== Getkey: Mov A,#0FEh ;Baĩt đaău với coơt 0
Mov R6,#4 ;Sử dúng R6 làm biên đêm.
Getkey0: Mov P1,A ;Tích cực coơt.
Mov R7,A ;Lưu Acc.
Mov A,p1 ;Đĩc lái port 1.
Cjne A,#0f0h,keypress ;Hàng tích cực?.
Mov A,R7 ;Khođng: chuyeơn đên coơt kê.
Rl A
Djnz R6,getkey0
Clr C ;Khođng có phím được nhân.
Sjmp Endgetkey ;Quay veă với C=[0].
Keypress: Mov R7,A ;Lây mã hàng.
Mov A,#4 ;Chuaơn bị tính.
Clr C ;Tính trĩng sô cụa coơt.
Subb A,R6 ;4-(R6)=trĩng sô.
Mov R6,A ;Lưu trong R6.
Mov A,R7 ;Phúc hoăi mã quét.
Swap A ;Đaịt trong 4 bit thâp.
Cjne A,#00001110b,keypress0 ;So sánh mã quét đeơ
Sjmp Endkeypress ;xác định hàng tích cực.
Keypress0: Cjne A,#00001101b,keypress1
Mov A,R6 ;Coơng theđm 4 nêu
Add A,#4 ;là hàng 1
Mov R6,A
Sjmp Endkeypress
Keypress1: Cjne A,#00001011b,keypress2
Mov A,R6 ;Coơng theđm 8 nêu
Add A,#8 ;là hàng 2
Mov R6,A
Sjmp Endkeypress
Mov A,R6
Keypress2: Add A,#12 ;Coơng theđm 12 nêu
Mov R6,A ;là hàng 3.
Setb C ;C=[1] (có phím nhân).
Endkeypress: Mov A,R6 ;Mã phím trong A
Endgetkey: RET
END
Baĩt đaău chương trình ở địa chư 000h với leơnh Sjmp Main đeơ nhạy đên chương trình chính được khai báo tái địa chư 030h, đoăng thời nhạy qua khỏi vùng địa chư cụa các vector ngaĩt. Ở đađy sử dúng ngaĩt ngoài INT0, do đó địa chư cụa vector ngaĩt tái 003h, chương trình phúc vú ngaĩt ngoài INT0 phại được khai báo tái địa chư này.
Chương trình GetKey thực hieơn quét các coơt và hàng cụa bàn phím đeơ xác định xem có phím nhân hay khođng. Nêu khođng có phím nào được nhân,
GetKey trạ veă C=[0]; còn nêu có moơt phím được nhân, GetKey trạ veă C=[1], mã sô hex cụa phím nhân được lưu vào thanh ghi A ở các bít từ 0 đên 3.
Chương trình ScanKey thực hieơn vieơc chông xung nạy khi ân và nhạ phím baỉng phaăn meăm. Vieơc chông xung nạy được thực hieơn baỉng cách laịp lái vieơc gĩi GetKey cho đên khi 50 laăn gĩi lieđn tiêp đeău trạ veă C=[1]. Nêu có 1 laăn gĩi nào đó trạ veă C=[0] đeău được hieơu là nhieêu (nghĩa là có xung nạy) và sẽ kêt thúc chương trình. Sau khi phát hieơn có moơt phím được nhân hợp leơ, ScanKey chờ 50 laăn gĩi lieđn tiêp GetKey trạ veă C=[0] đeơ đạm bạo raỉng phím được nhạ hoàn toàn. Nêu có phím nhân, cờ F0=[1], mã phím chứa trong thanh ghi A; nêu khođng có phím được nhân, cờ F0=[0].
Chương trình phúc vú ngaĩt KeyIQR được gĩi moêi khi xạy ra ngaĩt do moơt phím được nhân, chương trình này gĩi chương trình con ScanKey đeơ xác định xem thực sự có moơt phím được nhân hay khođng, mã phím nhân được xác định nêu có. Sau khi gĩi chương trình con ScanKey, tiên hành kieơm tra cờ F0 đeơ biêt kêt quạ thực hieơn cụa chương trình ScanKey; nêu F0=0 thì khođng làm gì cạ, nêu F0 =1 tức là có phím được nhân, mã phím được xuât ra IC chôt được kêt nôi ở port 2 đeơ hieơn thị tređn 8 led.