ID EQU 30H ; Lấy thanh nhớ có địa chỉ 30h định nghĩa là thanh ID.
K1 BIT P3.7 ; Chân p3.7 định nghĩa với tên là K1
L1 BIT P1.0 ; Chân p1.0 định nghĩa với tên là L1.
L2 BIT P1.1 ; Chân p1.1 định nghĩa với tên là L2.
L3 BIT P1.2 ; Chân p1.2 định nghĩa với tên là L3.
L4 BIT P1.3 ; Chân p1.3 định nghĩa với tên là L4.
K1 BIT P3.7 ; Chân p3.7 định nghĩa với tên là K1
L1 BIT P1.0 ; Chân p1.0 định nghĩa với tên là L1.
L2 BIT P1.1 ; Chân p1.1 định nghĩa với tên là L2.
L3 BIT P1.2 ; Chân p1.2 định nghĩa với tên là L3.
L4 BIT P1.3 ; Chân p1.3 định nghĩa với tên là L4.
ORG 0000h
MOV ID,#00H ; Trị khởi đầu của ID là 0.
START: JB K1,REL ; Chưa nhấn phím thì nhẩy đến tên nhãn REL.
LCALL DELAY10MS ; Gọi chương trình làm trễ 10ms (tránh rung phím).
JB K1,REL ; Chưa nhấn phím thì nhẩy đến tên nhãn REL.
INC ID ; Tăng trị trong ID.
MOV A,ID ; Cho chuyển nội dung trong ID và thanh ghi a.
CJNE A,#04,REL ; Cho so sánh a với #04 để phát hiện số lần nhấn K1
MOV ID,#00H ; Trả trị trong ID về trị o.
REL: JNB K1,$ ; Chờ buông phím K1
MOV A,ID ; Cho chuyển nội dung trong ID và thanh ghi a.
CJNE A,#00H,IS0 ; Cho so sánh a với #00 để phát hiện số lần nhấn K1
CPL L1 ; Lấy bù L1 để tắt/mở Led D1
LCALL DELAY ; Gọi chương trình làm trễ với tên nhãn là delay.
SJMP START ; Nhẩy không điều kiện về tên nhãn START
IS0: CJNE A,#01H,IS1 ; Cho so sánh a với #01 để phát hiện số lần nhấn K1
CPL L2 ; Lấy bù L2 để tắt/mở Led D2
LCALL DELAY ; Gọi chương trình làm trễ với tên nhãn là delay.
SJMP START ; Nhẩy không điều kiện về tên nhãn START
IS1: CJNE A,#02H,IS2 ; Cho so sánh a với #02 để phát hiện số lần nhấn K1
CPL L3 ; Lấy bù L3 để tắt/mở Led D3
LCALL DELAY ; Gọi chương trình làm trễ với tên nhãn là delay.
SJMP START ; Nhẩy không điều kiện về tên nhãn START
IS2: CJNE A,#03H,IS3 ; Cho so sánh a với #03 để phát hiện số lần nhấn K1
CPL L4 ; Lấy bù L4 để tắt/mở Led D4
LCALL DELAY ; Gọi chương trình làm trễ với tên nhãn là delay.
SJMP START ; Nhẩy không điều kiện về tên nhãn START
IS3: LJMP START ; Nhẩy không điều kiện về tên nhãn START
MOV ID,#00H ; Trị khởi đầu của ID là 0.
START: JB K1,REL ; Chưa nhấn phím thì nhẩy đến tên nhãn REL.
LCALL DELAY10MS ; Gọi chương trình làm trễ 10ms (tránh rung phím).
JB K1,REL ; Chưa nhấn phím thì nhẩy đến tên nhãn REL.
INC ID ; Tăng trị trong ID.
MOV A,ID ; Cho chuyển nội dung trong ID và thanh ghi a.
CJNE A,#04,REL ; Cho so sánh a với #04 để phát hiện số lần nhấn K1
MOV ID,#00H ; Trả trị trong ID về trị o.
REL: JNB K1,$ ; Chờ buông phím K1
MOV A,ID ; Cho chuyển nội dung trong ID và thanh ghi a.
CJNE A,#00H,IS0 ; Cho so sánh a với #00 để phát hiện số lần nhấn K1
CPL L1 ; Lấy bù L1 để tắt/mở Led D1
LCALL DELAY ; Gọi chương trình làm trễ với tên nhãn là delay.
SJMP START ; Nhẩy không điều kiện về tên nhãn START
IS0: CJNE A,#01H,IS1 ; Cho so sánh a với #01 để phát hiện số lần nhấn K1
CPL L2 ; Lấy bù L2 để tắt/mở Led D2
LCALL DELAY ; Gọi chương trình làm trễ với tên nhãn là delay.
SJMP START ; Nhẩy không điều kiện về tên nhãn START
IS1: CJNE A,#02H,IS2 ; Cho so sánh a với #02 để phát hiện số lần nhấn K1
CPL L3 ; Lấy bù L3 để tắt/mở Led D3
LCALL DELAY ; Gọi chương trình làm trễ với tên nhãn là delay.
SJMP START ; Nhẩy không điều kiện về tên nhãn START
IS2: CJNE A,#03H,IS3 ; Cho so sánh a với #03 để phát hiện số lần nhấn K1
CPL L4 ; Lấy bù L4 để tắt/mở Led D4
LCALL DELAY ; Gọi chương trình làm trễ với tên nhãn là delay.
SJMP START ; Nhẩy không điều kiện về tên nhãn START
IS3: LJMP START ; Nhẩy không điều kiện về tên nhãn START
DELAY10MS: MOV R6,#20 ; Chương trình làm trễ
LOOP1: MOV R7,#248
DJNZ R7,$
DJNZ R6,LOOP1
RET
DELAY: MOV R5,#20
LOOP2: LCALL DELAY10MS
DJNZ R5,LOOP2
RET
END ; Dừng biên dịch tại đây.
Phân tích cách viết các câu lệnh:
Bạn hãy chú ý đến lệnh so sánh có điều kiện, dùng để phát hiện các mã trùng nhau hay khác nhau và từ đó đưa ra hướng sử lý vấn đề. Thí dụ:
CJNE A,#00H,IS0
; Cho so sánh a với số #00, nếu khác thì nhẩy đến tên nhãn IS0, nếu đúng thì xuống thi hành dòng lệnh bên dưới.
CPL L1 ; Lấy bù L1 để tắt/mở Led D1.
LCALL DELAY ; Gọi chương trình làm trễ với tên nhãn là delay.
SJMP START ; Nhẩy không điều kiện về tên nhãn START.