Tìm hiểu lệnh quay trái không cờ nhớ: Lệnh quay trái chỉ được thao tác trên thanh ghi A ngoài ra không thao tác được trên thanh ghi nào?. Quay Trái là thực hiện dịch bít thấp lên dần bi
Trang 1I Viết tổng hợp nhiều hiệu ứng 8 Led đơn? ( Bài Tập cho Học Viên phát triển)
1 Sáng đuổi 1 Led chạy từ trên xuống dưới, sau đó chạy từ dưới lên trên 2 lần:
2 Sáng dần từ trên xuống dưới , sau đó chạy tắt dần từ dưới lên trên
3 Sáng chạy 2 Led từ giữa ra 2 bên, rồi từ 2 bên vào giữa lặp lại 3 lần
3 Sáng nhấp nháy 8 bit, sau đó nhấp nháy tráo đổi 4 bít cao và 4 bít thấp
4 Sáng So le chẵn lẻ chạy từ trên xuốn dưới
5 Sáng dồn từ trên xuống, sáng dồn từ dưới lên, sáng dồn từ 2 ben vào giữa, sáng dồn từ giữa sang 2 bên
II Viết chương trình quảng cáo với các lệnh quay
1 Tìm hiểu lệnh quay trái không cờ nhớ:
Lệnh quay trái chỉ được thao tác trên thanh ghi A ngoài ra không thao tác được trên thanh ghi nào? Quay Trái là thực hiện dịch bít thấp lên dần bit cao
VD: MOV A,#00000001B; hieu ung sang duoi 1 led
LAP:
RL A; thuc hien quay trai
MOV P2,A; xuat hien thi
CALL DELAY; tre de nhin thay hieu ung
CJNE A,#00000001B,LAP; kiem tra neu bang 00000001B thi thoat, con neu chua bang ;thi quay lai nhan LAP de thuc hien lai
+ Quá trình thực hiện các lệnh:
Thực hiện lệnh MOV A,#00000001B , Thanh ghi A sẽ có Byte dữ liệu 00000001B
Thực hiện Lệnh RL A, khi đó thanh ghi A sẽ là 00000010B
Thực hiện lệnh MOV P2,A khi đó Led hiển thị các mức 00000010 tín hiệu
Trang 2Thực hiện Lệnh CALL DELAY sẽ cho mắt ta nhìn thấy hiệu ứng, không thì mắt thần mới thấy được ^^
Thực hiện lệnh CJNE A,#00000001B,LAP lệnh này tương ứng với lệnh IF trong lập trình C++ nếu thanh ghi A sau mỗi lần dịch bit nếu nó chưa bằng 00000001 thì nó phải quay lại nhãn LAP để thực hiện lại các lệnh RL A – MOV P2,A – CALL DELAY nếu sau quá trình lặp nó thấy thanh ghi A có giá trị bằng 00000001 rồi nó thoát khỏi chương trình hiệu ứng này, làm hiệu ứng tiếp theo bên dưới
+ VD: rõ hơn cho quá trình dịch bít trái
Lần 0 A = 0 0 0 0 0 0 0 1
Lần 1 A = 0 0 0 0 0 0 1 0
Lần 2 A = 0 0 0 0 0 1 0 0
Lần 3 A = 0 0 0 0 1 0 0 0
Lần 4 A = 0 0 0 1 0 0 0 0
Lần 5 A = 0 0 1 0 0 0 0 0
Lần 6 A = 0 1 0 0 0 0 0 0
Lần 7 A = 1 0 0 0 0 0 0 0
+ Như vậy Lệnh quay rất ngắn gọn , tối ưu chương trình bình thường chúng ta viết chường trình sáng đuổi thì rất dài:
MOV P2,#00000000B
CALL DELAY
MOV P2,#00000001B
CALL DELAY
MOV P2,#00000010B
CALL DELAY
MOV P2,#00000100B
CALL DELAY
MOV P2,#00001000B
CALL DELAY
MOV P2,#00010000B
CALL DELAY
MOV P2,#00100000B
CALL DELAY
MOV P2,#01000000B
CALL DELAY
MOV P2,#10000000B
CALL DELAY
2 Tìm hiểu lệnh quay phải không cờ nhớ:
Tương tự như đối với lệnh quay trái thì lệnh quay phải sẽ dịch bít sang phải tức là từ bít cao xuống bit thấp
RR A
Trang 3VD: MOV A,#10000000B; sáng đuổi từ dưới lên trên
LAP1:
RR A
MOV P2,A
CALL DELAY
CJNE A, #10000000B,LAP1
3 Tìm hiểu lệnh quay trái có cờ nhớ:
Như tìm hiểu 2 phần trên Lệnh quay trái và Lệnh quay phải chưa có cờ nhớ, sẽ chỉ chạy được hiệu ứng sáng đuổi 1 led hoặc 2 led, 3 led
Giờ sẽ là Lệnh quay có cờ nhớ Vậy cờ nhớ là gì, hãy coi nó như là 1 bít, bình thường thanh ghi Byte có 8 bít, ta tưởng tượng có thêm 1 bít nữa gán vào thanh 8 bít đó thành thanh ghi 9 bit việc lập trình quay với 9 bít cũng giống như đối với 8 bít
+ VD: Viết hiệu ứng sáng dần với 8 led từ trên xuống dưới
MOV A,#00000000B; nap gia tri 00000000 vao thanh ghi A
LAP:
SETB C; Thiet lap co nho len 1
RLC A; Quay trai thanh ghi A voi co nho
MOV P2,A; Xuat hien thi ra PORT 2
CALL DELAY; Tao chuong trinh tre hien thi
CJNE A,#11111111B,LAP; kiem tra xem thanh ghi A da la 11111111 chưa
Việc lập trình mục này sẽ liên quan đến 2 lệnh SETB và CLR Lệnh SETB là nâng bít lên 1, còn CLR là hạ bít xuống 0 ( nói nôm na như vậy cho dễ hiểu)
+ Giải thích chương trình:
Lệnh MOV A,#00000000B Nạp giá trị tắt hết led vào thanh ghi A
Lệnh SETB C Cài đặt ( nâng bít) cờ C lên 1 khi đó sẽ có thêm 1 bít nữa nằm cuối thanh ghi A và sẽ ở bít thấp nhất
00000000 1
Lệnh RLC A sẽ thực hiện quay trái thanh ghi A với Cờ C quay như sau Đổi bít cờ C cuối thành 1 vì nó chèn bít cao nhất của thang ghi A xuống, đẩy bít 1 thấp nhất lên
00000001 0
Lệnh MOV P2,A , Xuất hiển thị gia trị sau: 00000001 mà không xuất cờ C ( vì nó chỉ là ảo)
Lệnh CALL DELAY trễ hiển thị
Lệnh CJNE A,#11111111B,LAP dùng để kiểm tra xem thanh ghi A đã quay đủ 8 bít 1 chưa
+ Giải mã lệnh:
A7 A6 A5 A4 A3 A2 A1 C
Trang 4Lần 5 0 0 0 1 1 1 1 0
+ Như vậy Lệnh quay rất ngắn gọn , tối ưu chương trình bình thường chúng ta viết chương trình sáng dần thì rất dài:
MOV P2,#00000000B
CALL DELAY
MOV P2,#00000001B
CALL DELAY
MOV P2,#00000011B
CALL DELAY
MOV P2,#00000111B
CALL DELAY
MOV P2,#00001111B
CALL DELAY
MOV P2,#00011111B
CALL DELAY
MOV P2,#00111111B
CALL DELAY
MOV P2,#01111111B
CALL DELAY
MOV P2,#11111111B
CALL DELAY
4 Tìm hiểu lệnh quay phải có cờ nhớ
Tương tự như đối với lệnh quay trái có cờ nhớ, lệnh quay phải sẽ quay và set cờ C từ phía Bit cao nhất
VD: Sáng dần từ dưới lên trên
MOV A,#00000000B
LAP:
SETB C
RRC A
MOV P2,A
CALL DELAY
CJNE A,#11111111B,LAP
TÓM LẠI: Việc lập trình quảng cáo dùng lệnh MOV hay Lệnh quay phụ thuộc rất nhiều
và phần cứng biển led quảng cáo, thao tác chân Vi Điều Khiển, khi cần lập trình có độ uyển chuyển cao thì dùng lệnh MOV còn khi lập trình trong cùng 1 PORT tối ưu bộ nhớ
Trang 5chương trình thì dùng lệnh Quay - > Khi lập trình thật hay dùng lệnh MOV và lệnh SETB
và CLR nhất