Tài liệu này dành cho sinh viên, giáo viên khối ngành công nghệ thông tin tham khảo và có những bài học bổ ích hơn, bổ trợ cho việc tìm kiếm tài liệu, giáo án, giáo trình, bài giảng các môn học khối ngành công nghệ thông tin
Trang 1BÀI 4:
LẬP TRÌNH ðIỀU KHIỂN PHÍM ðƠN – MA TRẬN PHÍM
I Mục ñích bài thí nghiệm
Bài thực hành nhằm giúp học viên:
• Hiểu cấu tạo và hoạt ñộng của Led ñơn, Led 7 ñoạn
• Hiểu ñược lưu ñồ chương trình, cấu trúc một chương trình hợp ngữ căn bản, cấu trúc vòng lặp, các lệnh hợp ngữ ñể truy xuất dữ liệu qua một PORT bất kỳ của
vi ñiều khiển (vñk) Từ ñó viết chương trình ñể ñiều khiển các led ñơn hoặc Led7ñoạn (led7doan) một cách có hiệu quả
II Cơ sở lý thuyết
1 Công tắc ñơn
Các phím ñơn dùng ñể ñiều khiển khi hệ thống không ñòi hỏi nhiều giá trị nhập (chẳng hạn như chỉ cần các ñiều khiển ñóng mở thiết bị) Khi thực hiện kiểm tra phím nhấn, vấn ñề cần thiết là phải thực hiện chống dội Quá trình chống dội có thể thực hiện
bằng phần mềm: Do thời gian dội của phím vào khoảng 20ms nên quá trình chống
dội bằng phần mềm ñơn giản là tạo một thời gian trễ ñủ lớn ñể chương trình bỏ qua
ảnh hưởng khi dội
Khi thực hiện giao tiếp giữa công tắc ñơn và vi ñiều khiển MCS-51 thì cần lưu ý phải set bit tương ứng của vi ñiều khiển lên mức logic 1 mới có thể ñọc dữ liệu vào Phần cứng giao tiếp có thể mô tả như hình vẽ, tuy nhiên ñối với họ MCS-51, các port
ñã có ñiện trở kéo lên nguồn (trừ port 0) nên ñối với sơ ñồ hình a và c có thể không
cần ñiện trở R
2 Bàn phím Hex
Khi không nhấn phím thì hàng của bàn phím Hex nối với Vcc thông qua ñiện trở
R nên có mức logic 1 ðể phân biệt ñược trạng thái của phím nhấn thì mức logic
Trang 2khi nhấn phím phải là mức logic 0 Mà khi nhấn một phím nào ñó thì tương ứng hàng
và cột của bàn phím Hex sẽ kết nối với nhau Do ñó, ñể thực hiện kiểm tra một phím thì ta phải cho trước cột chứa phím tương ứng ở mức logic 0, sau ñó kiểm tra hàng của phím, nếu hàng = 0 thì có nhấn phím còn hàng = 1 thì không nhấn phím
Ví dụ như muốn kiểm tra phím 4 thì ta cho cột chứa phím 4 ở mức logic 0 (chân 5 của J1, các cột khác = 1, nghĩa là dữ liệu tại J1 là 1000xxxxb), sau ñó thực hiện kiểm tra chân 2 của J1 (hàng của phím 4), nếu chân này = 0 thì phím 4 ñược nhấn
III Nội dung thực hành
Thiết bị thực hành:
- Bộ thí nghiệm ET-LAB3A MCS51 (board thí nghiệm, bộ nguồn và 3 dây bus
ñể kết nối các port của vi ñiều khiển với module Ma trận phím, Module
Led-Led 7 ñoạn
- Một máy tính ñể soạn chương trình, biên dịch và nạp chương trình xuống board thí nghiệm;
1 Nội dung thực hành 1:
Viết chương trình nhận 2 phím SW1 và SW2 Nếu SW ñược ấn thì tăng nôi dung của
ô nhớ có ñịa chỉ là 40H lên 1, ngược lại nếu ấn SW2 thì giảm nôi dung của ô nhớ 40H xuống 1 Giả sử nội dung của ô nhơ có giá tri ban ñầu là 0
a Chương trình mẫu gợi ý
Trang 3ORG 0000H
LJMP MAIN
MAIN:
SETB P3.2 ; set p3.2 là ngõ vào của SW1
SETB P3.3 ; set p3.3 là ngõ vào của SW2
MOV 40H,#0 ; cho nội dung ô nhớ tại 40H có giá tri ban ñầu bằng 0
JMP HIENTHI
BEGIN:
JNB P3.2,SW1 ; Nếu P3.2 = 0 thì nhấn SW1
JNB P3.3,SW2 ; Nếu P3.3 = 0 thì nhấn SW2
JMP BEGIN
SW1:
INC 40H ; Tăng ô nhớ 40h
MOV A,40H
CJNE A,#100,HIENTHI ; Nếu giá trị ô nhớ 40h = 100
MOV 40H,#0 ; thì gán 40h = 0
JMP HIENTHI ; Hiển thị ra Led 7 ñoạn
; -
SW2:
DEC 40H ; Giảm ô nhớ 30h
MOV A,40H
CJNE A,#255, HIENTHI ; Nếu giá trị giảm = -1 (255)
MOV 40H,#99 ; thì gán 40h = 99
JMP HIENTHI
; -
HIENTHI:
MOV A,40H
MOV B,#10
DIV AB
MOV DPTR,#Maled7
MOVC A,@A+DPTR
MOV P1,A ; xuất hàng chục
MOV P0, #01H ; chọn led 7s thứ 2
CALL DELAY MOV A,B MOV DPTR,#Maled7 MOVC A,@A+DPTR MOV P1,A ; xuất hàng ñơn vị MOV P0, #00H ; chọn led 7s thứ 1 CALL DELAY
JMP BEGIN
Trang 4; -
DELAY:
PUSH 07
PUSH 06
MOV R6,#100
DELAY1:
MOV R7,#255
DJNZ R7,$
DJNZ R6,Delay1 POP 06
POP 07 RET
END
b Yêu cầu
- Thực thi chương trình trên và quan sát kết quả
- Thay ñổi tần số quét hợp lý trên chương trình con Delay ñể quan sát kết quả
- Ấn vào các SWx, xem kết quả hiển thị trên Led 7 ñoạn và cho nhận xét
- Khi giá trị hiển thi trên Led 7 ñoạn là số 00 Ấn SW2 rồi quan sát trên Led 7
ñoạn kết quả hiển thị là bao nhiêu ? Tại sao không hiển thị ñược số âm ? Cho
biết ñoạn lệnh nào giải quyết vấn ñề này ?
- Vẽ lưu ñồ chương trình trên Mô tả các công việc thực hiện khi thực thi chương trình
- Hãy giải thích lệnh ñoạn lệnh:
DEC 40H ; Giảm ô nhớ 30h
MOV A,40H
CJNE A,#255,HIENTHI
- Khi SW1 và SW2 tác ñộng ngõ ra của các SWx này có mức logic là bao nhiêu ?
- Thử bỏ hai lệnh SETB P3.2 và SETB P3.3 trong chương trình Thi hành lại chương trình ñể kiểm chứng kết quả Chúng có ảnh hưởng ñến kết quả của chương trình không ? Hãy giải thích tại sao ? Có thể thay hai lệnh này thành một lệnh nào khác ñược không ? Nếu có hãy viết lệnh ñó ra
- Hãy tìm và thay thế một lệnh hay một số lênh nào ñó trong chương trình sao cho khi chạy chương trình, giá trị hiển thị lên led 7 ñoạn (khi chưa có phím nào
ñược ấn) là số 33
- Hãy viết chương trình theo một hướng khác mà vẫn giải quyết ñược ” Viết chương trình nhận 2 phím SW1 và SW2 Nếu SW ñược ấn thì tăng nôi dung của ô nhớ có ñịa chỉ là 40H lên 1, ngược lại nếu ấn SW2 thì giảm nôi dung của
ô nhớ 40H xuống 1 Giả sử nội dung của ô nhớ có giá tri ban ñầu là 0”
Trang 52 Nội dung thực hành 2
Viết chương trình ñơn giản ñể hiển thị mã của bàn phím lên LED 7 ñoạn khi có một
SW từ bàn phím ma trận ñược ấn Giả sử bàn phím ma trận kết nối có dạng như hình bên dưới
a Chương trình mẫu gợi ý
ORG 0000H
LJMP MAIN
MAIN:
MOV P3,#0FEH ; Chọn cột chứa
JNB P3.4,SW7 ;các phím 7,8,9,÷
JNB P3.5,SW8
JNB P3.6,SW9
JNB P3.7,SWCHIA
MOV P3,#0FDH ; Chọn cột chứa
JNB P3.4,SW4 ;các phím 4,5,6,X
JNB P3.5,SW5
JNB P3.6,SW6
JNB P3.7,SWNHAN
MOV P3,#0FBH ; Chọn cột chứa JNB P3.4,SW1 ; các phím 1,2,3,- JNB P3.5,SW2
JNB P3.6,SW3 JNB P3.7,SWTRU MOV P3,#0F7H ; Chọn cột chứa JNB P3.4,SWON; các phím ON/C,0,=,+ JNB P3.5,SW0
JNB P3.6,SWBANG JNB P3.7,SWCONG JMP Main
; - SW0:
Trang 6JMP HIENTHI
; -
SW1:
MOV 30H,#1
JMP HIENTHI
; -
SW2:
MOV 30H,#2
JMP HIENTHI
; -
SW3:
MOV 30H,#3
JMP Hienthi
; -
SW4:
MOV 30H,#4
JMP Hienthi
; -
SW5:
MOV 30H,#5
JMP Hienthi
; -
SW6:
MOV 30H,#6
JMP Hienthi
; -
SW7:
MOV 30H,#7
JMP Hienthi
; -
SW8:
MOV 30H,#8
JMP Hienthi
; -
SW9:
MOV 30H,#9
JMP Hienthi
; -
SWON:
MOV 30H,#10 JMP Hienthi
; - SWBANG:
MOV 30H,#11 JMP HIENTHI
; - SWCONG:
MOV 30H,#12 JMP HIENTHI
; - SWTRU:
MOV 30H,#13 JMP HIENTHI
; - SWNHAN:
MOV 30H,#14 JMP HIENTHI
; - SWCHIA:
MOV 30H,#15 JMP Hienthi
; - HIENTHI:
MOV A,30H MOV B,#10 DIV AB MOV DPTR,#MALED7 MOVC A,@A+DPTR MOV P1,A
MOV P0, #01H ; xuat hang chuc MOV A,B
MOV DPTR,#MALED7 MOVC A,@A+DPTR MOV P1,A
MOV P0, #00H; xuat hang don vi CALL DELAY
Trang 7LJMP MAIN
Maled7: DB 3FH, 06H, 5BH, 4FH, 66H,
6DH, 7DH, 07H, 7FH, 67H
; -
DELAY:
PUSH 07
PUSH 06
MOV R6,#100
DELAY1:
MOV R7,#255 DJNZ R7,$
DJNZ R6, DELAY1 POP 06
POP 07 RET END
b Yêu cầu
- Thực thi chương trình và quan sát kết quả, có nhận xét gì về kết quả ?
- Hãy sửa lại chương trình mẫu trên sau cho phù hợp với bàn phím ma trận ñã thiết kế cho board ET-LAB3A
Chú ý khi kết nối bàn phím ma trận 3 cột x 4 hàng với PORT của Vi ñiều khiển thì Px.0, Px.1 và P.2 sẽ tương ứng cho cột; Px.4, Px.5, Px.6 và Px.7 sẽ tương ứng cho các hàng
- Chúng ta có thể ñịnh nghĩa lại mã của bàn phím ñược hay không ? Nếu có thể hãy sửa lại chương trình ñể kiểm chứng sự thay ñổi này Cho thực thi chương trình kiểm tra kết quả
- Hãy viết lại chương trình theo hướng khác nhưng vẫn giải quyết ñược bài toán nêu trên nội dung thực tập 2
Trang 8- Nhấn phím +: thực hiện cộng nội dung ô nhớ 30h với 20 và xuất ra 2 Led 7
ñoạn
- Nhấn phím -: thực hiện trừ nội dung ô nhớ 30h với 1 và xuất ra 2 Led 7
ñoạn
- Nhấn phím x: thực hiện nhân nội dung ô nhớ 30h với 3 và xuất ra 2 Led 7
ñoạn
- Nhấn phím ÷: thực hiện chia nội dung ô nhớ 30h với 2 và xuất kết quả ra 2 Led 7 ñoạn
- Nhấn phím ON/C: thực hiện xoá nội dung ô nhớ 30h (gán bằng 0) và xuất ra
2 Led 7 ñoạn
3 Nội dung thực hành 3
Viết chương trình giao tiếp với bàn phím HEX có dạng như hình trên Khi phím ñược
ấn thì sẽ hiển thị mã của bàn phím hex ra Led 7 ñoạn
Chú ý khi kết nối bàn phím ma trận 3 cột x 4 hàng với PORT của Vi ñiều khiển thì Px.0, Px.1 và P.2 sẽ tương ứng cho cột; Px.4, Px.5, Px.6 và Px.7 sẽ tương ứng cho các hàng
a Chương trình mẫu gợi ý
; Chương trình hiển thị phím nhấn ra LED 7 ñoạn
; Bàn phím Hex ñược kết nối với Port3
; Dữ liệu xuất ra LED 7 ñoạn là Port0
; Chọn Led hiển thị Port1
Trang 9ORG 0000H
LJMP MAIN
MAIN:
LCALL READKB
MOV DPTR, #T7SEG
MOV A, @A+DPTR
MOV P0, A ; xuất mã của phím ñược ấn ra Led
MOV P1, #00H ; xuất ra Led 7 ñoạn thứ 1
JMP MAIN
READKB:
PUSH 07H
SCAN: MOV A, #11111110B ; hay giá trị 0Feh -> Colum_0 nối GND
CONTI: MOV R7, #0 ; R7=i
MOV P3, A ; nối colum_i với GND
MOV A, P3 ; ñọc row
JNB ACC.4, ROW_0 ; xét xem row nào ñược ấn ?
JNB ACC.5, ROW_1
JNB ACC.6, ROW_2
JNB ACC.7, ROW_3
RL A ; chuẩn bị nối GND
INC R7 ; cột tiếp theo ñược chọn
CJNE R7, #4, CONTI ; lần lượt nối GNd 4 cột
JMP SCAN ; quay lại quét từ cột 0
ROW_0:
MOV A, R7 ; row=0, colum=R7
ADD A, #0 ; A=0+R7
JMP EXIT
ROW_1:
MOV A, R7 ; row=1, colum=R7
ADD A, #4 ; A=4+R7
JMP EXIT
ROW_2:
Trang 10MOV A, R7 ; row=2, colum=R7
ADD A, #8 ; A=8+R7
JMP EXIT
ROW_3:
MOV A, R7 ; row=2, colum=R7
ADD A, #12 ; A=12+R7
EXIT: POP R7
RET
T7SEG: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 67H, 77H, 39H, 79H,
DB: 71H, 70H, 76H
END
b Yêu cầu
- Cho chạy chương trình ñể kiểm tra và cho nhận xét
- Nếu kết quả chưa ñúng hết tất cả các trường hợp theo yêu cầu, hãy thay ñổi chương trình sao cho có kết quả chính xác với bàn phím hex ñược thiết kế trên ET-LAB3A
- Có so sánh gì giữa cách viết chương trình yêu cầu trong nội dung thực hành 2
và nội dung thực hành 3 Hãy cho biết ưu ñiểm và nhược ñiểm của hai cách viết này
- Sửa lại chương trình theo một hướng khác nhưng vẫn giải quyết ñược bài toán nêu trên nội dung thực tập 3
IV Bài tập yêu cầu
1 Viết chương trình cho nhập 4 số trên bàn phím và hiển thị các số ñã nhập ra Led
7 ñoạn Chú ý khi chưa có phím nào ñược nhập thì trên Led 7 ñoạn hiển thi số
0000
2 Viết chương trình cho phép ñặt trước giá trị của số ñếm gồm có 4 chữ số Sau khi ñã nhập ñử 4 số thì chương trình sẽ ñếm từ giá trị ñặt ñến 9999 và xoá về
0000
3 Viết chương trình cho phép ñặt trước giá trị của số ñếm gồm có 4 chữ số Sau khi ñã nhập ñử 4 số thì chương trình sẽ ñếm từ giá trị ñặt ñến 0000
-Hết -