Báo cáo thí nghiệm Vi xử lý Đại học Bách Khoa Đại học Quốc Gia thành phố Hồ Chí Minh.Bài thí nghiệm 2: Lập trình hiển thị LED 7 đoạn và giao tiếp LED ma trận.Thí nghiệm 1: Mục tiêu: Nắm được cách thức hiển thị LED 7 đoạn.Yêu cầu: Viết chương trình con DisplayLED xuất giá trị 9 lên LED 7 đoạn thứ 0. Sau đó, dùng chương trình con này viết chương trình xuất giá trị 9 lên LED 7 đoạn số 0.
Trang 1MỤC TIÊU
Nắm được cách giao tiếp ngoại vi ở dạng ánh xạ bộ nhớ.
Nắm được cách giao tiếp LED 7 và quét LED 7 đoạn.
Nắm được cách giao tiếp LED ma trận.
CHUẨN BỊ
Đọc chương 4 và chương 12 của tài liệu hướng dẫn.
Viết chương trình và mô phỏng các bài thí nghiệm trên Proteus dựa trên bài thí nghiệm 0.
Trang 2THÍ NGHIỆM 1
Mục tiêu: Nắm được cách thức hiển thị LED 7 đoạn
Yêu cầu:
Viết chương trình con DisplayLED xuất giá trị 9 lên LED 7 đoạn thứ 0.
Sau đó, dùng chương trình con này viết chương trình xuất giá trị 9 lên LED 7 đoạn số 0.
Kiểm tra:
Biên dịch, thực thi và kiểm tra chương trình.
Để giao tiếp với LED 7 đoạn, ta phải ghi ra ngoại vi ở vùng nhớ (giá trị nạp vào thanh ghi DPTR) bao nhiêu?
Byte được ghi ra phải có định dạng như thế nào? Muốn hiển thị lên các LED còn lại, bit nào sẽ bằng 0?
BÁO CÁO:
1 Chương trình:
ORG 2000H ACALL DisplayLED SJMP $
DisplayLED:
MOV A, #11101001B MOV DPTR, #0000H MOVX @DPTR, A RET
END
Trang 32 Kết quả thí nghiệm
a Kết quả mô phỏng:
b Trả lời câu hỏi
1) Để giao tiếp với LED 7 đoạn, ta phải ghi ra ngoại vi ở vùng nhớ (giá trị nạp vào thanh
ghi DPTR) bao nhiêu?
Để giao tiếp với LED 7 đoạn, ta phải ghi vào vùng nhớ có giá trị 0000H- 1FFFH
2) Byte được ghi ra phải có định dạng như thế nào? Muốn hiển thị lên các LED còn lại,
bit nào sẽ bằng 0?
Byte ghi ra với 4 bit cao là tín hiệu chọn LED, theo thứ tự từ phải sang trái là LED 0 đến LED thứ 3, để cho phép 1 LED sáng thì ta cho giá trị tương ứng là 0, 4 bit sau là giá trị số BCD cần biểu diễn
Trang 4THÍ NGHIỆM 2
Mục tiêu: Nắm được cách thức xuất giá trị lên LED 7 đoạn
Yêu cầu: Sửa lại chương trình con DisplayLED ở Thí nghiệm 1 (có thể tham khảo đoạn chương
trình ở dưới) để thực hiện xuất giá trị chứa trong thanh ghi R0 lên LED 7 đoạn có số thứ tự chứa trong thanh ghi R1 (R0 nằm trong tầm từ 0-9 và R1 trong tầm từ 0-3 Sau đó, dùng chương trình con này viết chương trình xuất 1 giá trị bất kỳ lên LED 7 đoạn số 3
Đoạn chương trình tính toán để xuất ra điều khiển LED dựa vào R0, R1
Trang 5 Giải thích ý nghĩa các lệnh của đoạn chương trình trong hướng dẫn.
Viết lại chương trình DisplayLED sử dụng phương pháp tra bảng.
DisplayLED:
MOV B, R1 INC B MOV A, #11110111B SHIFTLOOP:
RL A DJNZ B, SHIFTLOOP ANL A, #0F0H
PUSH ACC MOV A, R0 ANL A, #0FH MOV R0, A POP ACC ORL A, R0 MOV DPTR, #0
Trang 6MOVX @DPTR, A RET
END
2 Kết quả thí nghiệm
a Kết quả mô phỏng:
b Trả lời câu hỏi
1) Giải thích ý nghĩa các lệnh của đoạn chương trình trong hướng dẫn.
MOV B, R1 ; chuyển vị trí LED cần hiển thị vào B
INC B ; (bổ sung) tăng B lên 1 để tạo số lần dịch
chuyển bit 0
MOV A, #11110111B ; tạo khung của 4 bit chọn LED
SHIFTLOOP:
RL A ; Thực hiện chuyển bit 0 sang trái 1 vị trí
DJNZ B, SHIFTLOOP ; Dời bit 0 sang trái n+1 vị trí (n là vị trí LED cần
Trang 7ANL A, #0FH ; Giữ lại 4 bit thấp (mã BCD xuất lên LED) và xóa
4 bit cao
MOV R0, A ; Chuyển A vào R0
POP ACC ; Lấy 4 bit chọn LED từ stack
ORL A, R0 ; Thực hiện OR logic 4 bit cao (bit chọn LED) và
4 bit thấp (mã BCD xuất lên LED )
2) Viết lại chương trình DisplayLED sử dụng phương pháp tra bảng.
ORG 2000H
ACALL DisplayLED SJMP $
DisplayLED:
MOV DPTR, #TAB MOV A, R1
MOVC A, @A + DPTR ORL A, R0
MOV DPTR, #0 MOVX @DPTR, A RET
END
Trang 8THÍ NGHIỆM 3
Mục tiêu: Kết hợp được các chương trình con để hiển thị LED 7 đoạn
Yêu cầu: Viết chương trình hiển thị lên LED 7 đoạn số 0 các con số từ 0 đến 9 sau các khoảng
thời gian 1s
HD: Viết chương trình Delay1sIns tạo trễ 1s như ở bài thí nghiệm 1 Trong chương trình chính,
đầu tiên cho thanh ghi R0 bằng 0, sau đó vào vòng lặp gọi chương trình con DisplayLED đã viết
ở phần trước, tạo trễ 1s, tăng R0 lên 1 và lặp lại quá trình Nếu R0 lớn hơn 9 thì cho R0 bằng 0 trở lại
Kiểm tra:
Biên dịch, thực thi và kiểm tra chương trình.
Để kiểm tra R0 lớn hơn 9 cần sử dụng lệnh nào? Vòng lặp nhảy như thế nào?
CJNE R0, #10, LOOP SJMP MAIN
DisplayLED:
MOV DPTR, #TAB MOV A, R1
Trang 9MOVC A, @A + DPTR ORL A, R0
MOV DPTR, #0 MOVX @DPTR, A RET
Trang 11b Trả lời câu hỏi
Để kiểm tra R0 lớn hơn 9 cần sử dụng lệnh nào? Vòng lặp nhảy như thế nào?
Để kiểm tra R0 lớn hơn 9 cần sử dụng lệch CJNE R0, #10, LOOP
Vòng lặp nhảy theo thứ tự:
- Nếu R0 sau khi tăng 1 nhỏ hơn hoặc bằng 9, nhảy đến vị trí LOOP: gọi chương trình con xuất giá trị chứa trong R0 lên LED 0
- Nếu R0 sau khi tăng bằng 10 (lớn hơn 9), nhảy để vị trí MAIN: thực hiện xóa R0 về
0 và sau đó tiếp tục vòng lặp ở trên
Trang 12trình này lặp đi lặp lại Việc hiển thị này sử dụng chương trình con DisplayLED đã viết ở trên
Giảm thời gian trễ xuống còn 100 ms Quan sát hiện tượng
Tính toán thời gian trễ sao cho không còn thấy LED nhấp nháy và áp dụng vào chương trình
Giảm thời gian trễ xuống bằng 0 (không sử dụng hàm delay) Quan sát hiện tượng
Kiểm tra:
Biên dịch, thực thi và kiểm tra chương trình
Thời gian trễ để không còn thấy LED nhấp nháy là bao nhiêu theo lý thuyết? Giải thích cách tính
Khi giảm rất nhỏ thời gian trễ, hiện tượng xảy ra là gì? Giải thích
ACALL Delay1sIns INC R0
Trang 13INC R1 CJNE R1, #4, LOOP SJMP MAIN
DisplayLED:
MOV DPTR, #TAB MOV A, R1
MOVC A, @A + DPTR ORL A, R0
MOV DPTR, #0 MOVX @DPTR, A RET
Trang 14 Thời gian trễ: 100ms
Trang 15 Thời gian trễ: 0.005s
Thời gian trễ: 0s
b Trả lời câu hỏi
1) Thời gian trễ để không còn thấy LED nhấp nháy là bao nhiêu theo lý thuyết? Giải thích
cách tính
Số khung hình mắt người có thể thấy trong 1 giây là 24 thời gian trễ giữa các khung
Trang 16hình là
hay trong là trong
bốn số phải hiển thị trên LED Thời gian trễ giữa mỗi lần hiển thị là
Thời gian trễ để không còn thấy LED nhấp nháy là bao nhiêu theo lý thuyết là 0.0104s
2) Khi giảm rất nhỏ thời gian trễ, hiện tượng xảy ra là gì? Giải thích
Khi giảm rất nhỏ thời gian trễ, LED không còn sáng nữa Vì thời gian giữa mỗi lần hiển thị số lên LED rất nhỏ làm cho LED không đủ thời gian để làm sáng đèn nên ta không thấy LED sáng nữa
Trang 17THÍ NGHIỆM 5
Mục tiêu: Nắm được phương pháp giao tiếp LED ma trận
Yêu cầu: Viết chương trình làm sáng các LED ở vị trí bất kỳ của hàng y trên LED ma trận Giá trị
y được chứa trong thanh ghi
Kiểm tra:
Biên dịch, thực thi và kiểm tra chương trình
Để chốt hàng và chốt cột của LED ma trận, ta lần lượt phải ghi ra ngoại vi ở vùng nhớ (giá trị nạp vào thanh ghi DPTR) bao nhiêu?
Để làm sáng LED ở vị trí bất kỳ thì dữ liệu xuất trên cột và hàng phải là mức cao hay thấp ?
Trang 19b Trả lời câu hỏi
1) Để chốt hàng và chốt cột của LED ma trận, ta lần lượt phải ghi ra ngoại vi ở vùng nhớ (giá trị nạp vào thanh ghi DPTR) bao nhiêu?
Để chốt hàng và chốt cột của LED ma trận, ta lần lượt phải ghi ra ngoại vi ở vùng nhớ 8000h-9FFFh (DPTR = 8000H) và A000h-BFFFh (DPTR = A000H)
2) Để làm sáng LED ở vị trí bất kỳ thì dữ liệu xuất trên cột và hàng phải là mức cao hay thấp?
Để làm sáng LED ở vị trí bất kì thì dữ liệu xuất trên hàng phải là mức thấp và dữ liệu xuất trên cột là mức cao
Trang 20THÍ NGHIỆM 6
Mục tiêu: Nắm được phương pháp quét LED ma trận
Yêu cầu: Viết chương trình làm hiển thị chữ B lên LED ma trận
HD:
- Viết các mã xuất theo 8 hàng của từng cột của chữ B cần hiển thị
- Viết chương trình tạo delay 1ms có tên Delay1ms
- Quy trình quét LED ma trận, đầu tiên hiển thị 8 hàng của cột 1, sau đó delay 1ms rồi hiển thị 8 hàng của cột 2, sau đó delay 1ms rồi hiển thị 8 hàng của cột 3, … tương tự như vậy đến khi hiển thị xong 8 hàng của cột 8 thì quay lại hiển thị cột 1
Kiểm tra:
Biên dịch, thực thi và kiểm tra chương trình
Khi tăng hoặc giảm thời gian delay, hiển thị trên LED ma trận sẽ thay đổi như thế nào?
Trang 21MOVC A, @A + DPTR MOV DPTR, #0A000H MOVX @DPTR, A POP ACC
INC R1 LCALL DL1ms CJNE R1, #8, LOOP SJMP MAIN
DJNZ R5, $ DJNZ R6, DL RET
CHAR_B: DB 0FFH, 0FFH, 0FFH, 93H, 6DH, 6DH, 6DH, 01H
END
2 Kết quả thí nghiệm
a Kết quả mô phỏng:
Trang 22b Trả lời câu hỏi
Khi tăng hoặc giảm thời gian delay, hiển thị trên LED ma trận sẽ thay đổi như thế nào?
Khi tăng hoặc giảm thời gian delay, hiển thị trên LED ma trận sẽ giảm hoặc tăng độ sáng tương ứng với thời gian delay nhỏ hơn 5ms