Chữ chạy

"Con đường đến với tri thức không dễ dàng, nhưng nếu chúng ta quyết đi sẽ đến được bến bờ tri thức !". Chào mừng các bạn đến với trang thông tin của Võ Hoàng Tâm - GV Khoa Điện Điện tử - Trường Đại học SPKT Vĩnh Long. Trang cung cấp thông tin - tài liệu học tập cho các bạn học viên và sinh viên. Chúc các bạn thành công trên hành trình đi tìm tri thức ...

Viết chương trình để mạch đếm số lần nhấn phím SP1 trên chân 17 (p3.7), kết quả hiển thị trên đèn số dùng Led 7 đoạn. Số đếm bắt đầu từ 00, 01, 02,...99


Count                  EQU 30H                           ; Đặt tên thanh ghi 8 bit 30h là Count.
SP1                     BIT P3.7                            ; Đặt tên bit p3.7 là SP1.
ORG  0000h                                                  ; Bắt đầu từ thanh ghi Reset 0000h 
START:               MOV Count,#00H               ; Đặt Count về mức khởi đầu là số 0.
NEXT:                MOV A,Count                       ; Cho chuyển nội dung trong Count vào thanh ghi a.
                            MOV B,#10                          ; Đặt số 10 vào thanh ghi b.
                           DIV AB                                  ; Cho số trong a chia cho 10 (số trong b).
                            MOV DPTR,#TABLE          ; Đặt địa chỉ của bảng có tên là Table vào thanh ghi con trỏ.
                           MOVC A,@A+DPTR            ; Lấy số từ bảng theo trị có trong a và kết quả giữ trong a.
                            MOV P1,A                            ; Cho xuất nội dung trong a ra ở port 1. 
                            MOV A,B                              ; Bây giờ cho chuyển nội dung trong thanh ghi b vào a.
                           MOVC A,@A+DPTR            
; Lại lấy số từ bảng theo trị có trong a và kết quả giữ trong a.    
                            MOV P2,A                            
; Cho xuất nội dung trong a ra ở port 2. 
WT:                     JNB SP1,WT                        ; Chờ buông phím SP1. 
WAIT:                 JB SP1,WAIT                        ; Chờ nhấn phím SP1.
                            LCALL DELY10MS               ; Gọi chương trình trễ 10ms, tránh hiện tượng rung phím.
                           JB SP1,WAIT                         ; Kiểm tra buông phím
                            INC Count                             ; Tăng nội dung trong Count lên theo bước +1.
                            MOV A,Count                        ; Cho chuyển nội dung trong Count vào thanh ghi a.
                           CJNE A,#100,NEXT               ; So sánh trị trong a bằng 100 chưa? Nếu chưa thì tiếp tục. 
                            LJMP START                        ; Quay lại tù đầu.
DELY10MS:       MOV R6,#20                           ; Làm trễ 10ms để tránh ảnh hưởng của rung phím.
D1:                      MOV R7,#248 
                            DJNZ R7,$ 
                           DJNZ R6,D1 
                            RET 
TABLE:              DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH  ; Bảng mã số dùng cho Led 7 đoạn.
END                                                                    ; Dừng biên dịch tại dòng này.


Phân tích cách viết các câu lệnh:

Trong đoạn chương trình trên, chúng ta có dùng đến lệnh làm phép toán chia: div ab

Bạn lấy số có trong a chia cho b. Kết qua số chia có trong a và số dư có trong b. Để chia a cho 10, Bạn phải nạp vào thanh ghi b trị 10 với câu lệnh: mov b, #10.

Bạn chú ý đến trình làm trễ 10ms, ở đây dùng để tránh ảnh hưởng  đóc sai do rung phím, vì mỗi khi Bạn nhấn phím, trong khoảng thời gian ngắn phím bị rung và tạo ra sự ghi nhận sai.

Dùng câu lệnh so sánh (cjne: Compare Jump điều kiện Non-Zero) để kiểm tra trị trong thanh ghi a. Đây là một câu lệnh rất thường dùng.