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ỗi lần nhấn khóa điện SP1 trên chân 17 (p3.7) thì Led D1 trên chân 1 (p1.0), nhấp nháy. Khi nhấn SP1 lần nữa đến Led D2 trên chân 2 nhấp nháy, nhấn SP1 lần nữa đến Led D3 trên chân 3 nhấp nháy và nhấn SP1 lần nữa thì đến Led D4 trên chân 4 nhấp nháy, và qui trình tiếp tục lập lại như trên


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

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.