Cho em/ mình hỏi là có viết code ASM 8051 để đếm số từ 0 đến 9, hiện số 0 xong rồi hiện ra số 1,, cứ thế hiện số 9 rồi quay vòng. Nhưng code em/ mình viết nó lại là dịch lên trên, dịch hết số 9 thì nó sáng hết đèn luôn, cứ thế sáng mãi. Các cao thủ giúp với nhé, cảm ơn ạ!
Quét led theo hàng từ trên xuống dưới, mã xuất theo cột.
ORG 0000h
MAIN:
CALL HIENTHI
JMP MAIN
HIENTHI:
; lay ma hien thi xuat ra P0
MOV DPTR, #MA_HIEN_THI ; tro den DB dau tien
MOV 55h, DPL
HANG:
MOV 54h, #01111111b
; lap lai nhieu lan de hien thi
MOV R2, #5
lap_de_hien_thi:
MOV R1, #0 ; lay o R1 lam bien dem tung byte cot cua DB
; lay byte dau tien : 0C7h
laybytecot:
MOV A, R1
MOVC A, @A+DPTR
MOV P0, A
; cat gia tri P0 vao ngan xep
;MOV 52h, P0
;PUSH 52h
;======
; bat hang dau tien P3 = 11111110b
MOV A, 54h
RL A
MOV P3, A
; cat gia tri P3 vao ngan xep
MOV 53h, P3
PUSH 53h
;======
CALL DELAY ; delay 1 time ngan de hien thi
CALL XOALED ; xoa led di de bat hang va byte cot tiep theo
; lay lai gia tri da cat
POP 53h
MOV 54h, 53h
;======
; lay lai gia tri da cat
;POP 52h
;MOV P0, 52h
;======
INC R1 ; tang gia tri R1 len 1 de lay byte tiep theo
CJNE R1, #8, laybytecot ; ket thuc lenh nay da xuat duoc 8 byte cua DB dau tien ra P0
DJNZ R2, lap_de_hien_thi
INC DPTR ; tang gia tri DPTR tro den hang ke tiep
MOV A, 55h
CJNE A, 55h+10, HANG
RET
DELAY:
MOV 51h, #50
L:
MOV 50h, #50
DJNZ 50h, $
DJNZ 51h, L
RET
XOALED:
MOV P0, #0xFF
MOV P3, #0xFF
RET
MA_HIEN_THI: ; 10X8
DB 0C7h, 0B3h, 0B3h, 0A3h, 093h, 0B3h, 0C7h, 0FFh ; 0
DB 0E7h, 0C7h, 0E7h, 0E7h, 0E7h, 0E7h, 0C3h, 0FFh ; 1
DB 0C7h, 0B3h, 0F3h, 0E7h, 0CFh, 09Bh, 083h, 0FFh ; 2
DB 0C7h, 0B3h, 0F3h, 0E7h, 0F3h, 0B3h, 0C7h, 0FFh ; 3
DB 0F3h, 0E3h, 0D3h, 0B3h, 083h, 0F3h, 0F3h, 0FFh ; 4
DB 083h, 0BFh, 087h, 0B3h, 0F3h, 0B3h, 0C7h, 0FFh ; 5
DB 0C7h, 0BBh, 0BFh, 087h, 0B3h, 0B3h, 0C7h, 0FFh ; 6
DB 083h, 0B3h, 0F3h, 0E7h, 0CFh, 0CFh, 0CFh, 0FFh ; 7
DB 0C7h, 0B3h, 0B3h, 0C7h, 0B3h, 0B3h, 0C7h, 0FFh ; 8
DB 0C7h, 0B3h, 0B3h, 0C3h, 0F3h, 0B3h, 0C7h, 0FFh ; 9
END
Quét led theo hàng từ trên xuống dưới, mã xuất theo cột.
ORG 0000h
MAIN:
CALL HIENTHI
JMP MAIN
HIENTHI:
; lay ma hien thi xuat ra P0
MOV DPTR, #MA_HIEN_THI ; tro den DB dau tien
MOV 55h, DPL
HANG:
MOV 54h, #01111111b
; lap lai nhieu lan de hien thi
MOV R2, #5
lap_de_hien_thi:
MOV R1, #0 ; lay o R1 lam bien dem tung byte cot cua DB
; lay byte dau tien : 0C7h
laybytecot:
MOV A, R1
MOVC A, @A+DPTR
MOV P0, A
; cat gia tri P0 vao ngan xep
;MOV 52h, P0
;PUSH 52h
;======
; bat hang dau tien P3 = 11111110b
MOV A, 54h
RL A
MOV P3, A
; cat gia tri P3 vao ngan xep
MOV 53h, P3
PUSH 53h
;======
CALL DELAY ; delay 1 time ngan de hien thi
CALL XOALED ; xoa led di de bat hang va byte cot tiep theo
; lay lai gia tri da cat
POP 53h
MOV 54h, 53h
;======
; lay lai gia tri da cat
;POP 52h
;MOV P0, 52h
;======
INC R1 ; tang gia tri R1 len 1 de lay byte tiep theo
CJNE R1, #8, laybytecot ; ket thuc lenh nay da xuat duoc 8 byte cua DB dau tien ra P0
DJNZ R2, lap_de_hien_thi
INC DPTR ; tang gia tri DPTR tro den hang ke tiep
MOV A, 55h
CJNE A, 55h+10, HANG
RET
DELAY:
MOV 51h, #50
L:
MOV 50h, #50
DJNZ 50h, $
DJNZ 51h, L
RET
XOALED:
MOV P0, #0xFF
MOV P3, #0xFF
RET
MA_HIEN_THI: ; 10X8
DB 0C7h, 0B3h, 0B3h, 0A3h, 093h, 0B3h, 0C7h, 0FFh ; 0
DB 0E7h, 0C7h, 0E7h, 0E7h, 0E7h, 0E7h, 0C3h, 0FFh ; 1
DB 0C7h, 0B3h, 0F3h, 0E7h, 0CFh, 09Bh, 083h, 0FFh ; 2
DB 0C7h, 0B3h, 0F3h, 0E7h, 0F3h, 0B3h, 0C7h, 0FFh ; 3
DB 0F3h, 0E3h, 0D3h, 0B3h, 083h, 0F3h, 0F3h, 0FFh ; 4
DB 083h, 0BFh, 087h, 0B3h, 0F3h, 0B3h, 0C7h, 0FFh ; 5
DB 0C7h, 0BBh, 0BFh, 087h, 0B3h, 0B3h, 0C7h, 0FFh ; 6
DB 083h, 0B3h, 0F3h, 0E7h, 0CFh, 0CFh, 0CFh, 0FFh ; 7
DB 0C7h, 0B3h, 0B3h, 0C7h, 0B3h, 0B3h, 0C7h, 0FFh ; 8
DB 0C7h, 0B3h, 0B3h, 0C3h, 0F3h, 0B3h, 0C7h, 0FFh ; 9
END
Comment