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 dùng cách lấy dữ liệu khai báo trong bảng, để tắt mở 8 Led trên port 1 (8951)

* Nháy nhẩy qua trái 2 lần. 
* Nháy nhẩy qua phải 2 lần.
* Toàn phần nhấp nháy 2 lần.
(Thời gian trễ 0.2 giấy).

ORG    0000h 
START:               MOV DPTR,#TABLE     ; Lệnh cho đặt địa chỉ bảng vào thanh ghi con trỏ.                         
LOOP:                CLR A                            ; cho xóa nội dung trong thanh ghi a, lúc này a = 00000000b
                            MOVC A,@A+DPTR     ; Cho lấy nội dung trong bảng theo trị trong a, và cho cất kết quả vào a.
                            CJNE A,#01H,LOOP1   ; Nếu a chưa bằng 01h thì nhẩy qua tên nhãn LOOP1.
                            JMP START                   ; Nếu trong a đã bằng 01h thì nhẩy về tên nhãn START.
LOOP1:              MOV P1,A                       ; Chuyển nội dung trong a ra trên cảng port 1.
                           MOV R3,#20                   ; Nạp số thập phân 20 vào thanh ghi r3.
                            LCALL DELAY               ; Gọi chương trình làm trễ, tên nhãn là delay.
                            INC DPTR                      ; cho tăng địa chỉ bảng lên +1. 
                           JMP LOOP                      ; Nhẩy về tên nhãn LOOP.
DELAY:              MOV R4,#20                    ; Viết chương trình con dùng làm trễ, tên nhãn là delay
D1:                     MOV R5,#248                  ; Nạp trị thập phân 248 vào r5.
                            DJNZ R5,$                      ; Cho giảm theo bước -1, chờ r5 bằng 0.
                            DJNZ R4,D1                   ; Cho r4 giảm theo bước -1, chưa bằng 0, nhẩy về D1.
                           DJNZ R3,DELAY              ; Cho r3 giảm theo bước -1, chưa bằng 0, nhẩy về DELAY. 
                            RET                                ; Quay lại chạy câu lệnh nằm sau lệnh call.

TABLE:              DB 0FEH,0FDH,0FBH,0F7H   ; Khai báo các dữ liệu đặt trong bảng, tên bảng là TABLE.
                            DB 0EFH,0DFH,0BFH,07FH  ; các dữ liệu lần lượt sắp trong bảng.
                           DB 0FEH,0FDH,0FBH,0F7H   
; các dữ liệu lần lượt sắp trong bảng.
                            DB 0EFH,0DFH,0BFH,07FH   ; các dữ liệu lần lượt sắp trong bảng.              
                           DB 07FH,0BFH,0DFH,0EFH    
; các dữ liệu lần lượt sắp trong bảng.
                            DB 0F7H,0FBH,0FDH,0FEH   ; các dữ liệu lần lượt sắp trong bảng.
                            DB 07FH,0BFH,0DFH,0EFH   ; các dữ liệu lần lượt sắp trong bảng.
                            DB 0F7H,0FBH,0FDH,0FEH   ; các dữ liệu lần lượt sắp trong bảng.
                            DB 00H, 0FFH,00H, 0FFH       ; các dữ liệu lần lượt sắp trong bảng.
                            DB 01H                                    ; Dữ liệu dùng soa sánh để nhẩy (Xem câu lệnh trên).
  END                                                                   ; Dừng biên dịch tại đây.


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

Trong bài này, chúng ta cho lấy dữ liệu liệt kê trong bảng để làm sáng các Led trên port 1. Trình tự làm như sau:

Trước hết Bạn chọn cách làm sáng tắt cho 8 Led trên port 1 với mã 0/1. Chúng ta nhớ bit 0 làm Led sáng và bit 1 sẽ làm Led tắt. Thí dụ: Muốn Led sáng nhẩy qua trái, chúng ta sẽ chọn mã điều khiển như sau:

11111110b   đổi ra dạng mã hệ 16 sẽ là 0FEH.

11111101b   đổi ra dạng mã hệ 16 sẽ là 0FDH.
11111011b   đổi ra dạng mã hệ 16 sẽ là 0FBH.
11110111b   đổi ra dạng mã hệ 16 sẽ là 0F7H.
11101111b   đổi ra dạng mã hệ 16 sẽ là 0EFH.

11011111b   đổi ra dạng mã hệ 16 sẽ là 0DFH.
10111111b   đổi ra dạng mã hệ 16 sẽ là 0BFH.
01111111b   đổi ra dạng mã hệ 16 sẽ là 07FH.

Bạn cứ liệt kê ra trong bảng. Sau này sẽ dùng lệnh: movc a, @a + dptr. Để lấy các mã này cất vào a. Ý nghĩa của câu lệnh này như sau:

Nếu khởi đầu a=0 thì nó sẽ lấy mã dữ liệu đầu trong bảng và rồi cất vào thanh ghia.
Bạn dùng lệnh inc dptr dể cho trị trong a tăng lên +1.
Vậy khi dùng câu lệnh: movc a, @a +dptr, Bạn sẽ cho lấy mã dữ liệu tiếp theo...

Sau mỗi lần lấy dữ liệu từ bảng ra, Bạn dùng câu lệnh nhẩy theo phép so sánh: cjne a, #01h, loop1 để xem đã lấy đến mã dữ liệu cuối cùng chưa, vì Bạn đặt mả 01H ở cuối bảng.

Ghi nhận: Dùng cách viết này, Bạn rất dễ chọn các kiểu nhấp nháy cho các Led trên port 1. Bạn chỉ cần khai báo các mã điều khiển trong bảng là được. bạn có thể khai báo theo dạng mã nhị phân cho dễ nhìn thấy sự sáng tắt của các Led.