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.
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.