Tải bản đầy đủ (.doc) (26 trang)

CHƯƠNG TRÌNH ĐIỀU KHIỂN LED VÀ VI ĐIỀU KHIỂN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (137.45 KB, 26 trang )

-1-

VI XƯ LÝ
CHƯƠNG TRÌNH ĐIỀU KHIỂN LED CHÓP TẮT
Nội dung của chương trình thư viện như sau:
;CHUONG TRINH CON DELAY 100 MICRO GIAY
DELAY100US: MOV 7FH,#048 ?
;NAP HANG SO DELAY LA 48
DJNZ 7FH,$
;GIAM GIA TRI DEM CHO DEN KHI BANG 0
RET
;THOAT KHOI CHUONG TRINH CON
;CHUONG TRINH CON DELAY 1 MILI GIAY
DELAY1MS: MOV 7EH,#10
DEL1MS:
MOV 7FH,#048
;NAP HANG SO DELAY LA 48
DJNZ 7FH,$
;GIAM GIA TRI DEM CHO DEN KHI BANG 0
DJNZ 7EH,DEL1MS
RET
;CHUONG TRINH CON DELAY 10 MILI GIAY
DELAY10MS: MOV 7EH,#100
DEL10MS:
MOV 7FH,#048
;NAP HANG SO DELAY LA 48
DJNZ 7FH,$
;GIAM GIA TRI DEM CHO DEN KHI BANG 0
DJNZ 7EH,DEL10MS
RET
;CHUONG TRINH CON DELAY 20 MILI GIAY


DELAY20MS: MOV 7EH,#200
DEL20MS:
MOV 7FH,#048
DJNZ 7FH,$
DJNZ 7EH,DEL20MS
RET
;CHUONG TRINH CON DELAY 50 MILI GIAY
DELAY50MS: MOV 7EH,#200
DEL50MS:
MOV 7FH,#250
DJNZ 7FH,$
DJNZ 7EH,DEL50MS
RET
;CHUONG TRINH CON DELAY 100MS
DELAY100MS: MOV 7DH,#4
DEL100S:
CALL DELAY50MS
DJNZ 7DH,DEL100S
RET
;CHUONG TRINH CON DELAY 200MS
DELAY200MS: MOV 7DH,#8
DEL200S:
CALL DELAY50MS
DJNZ 7DH,DEL200S
RET
;CHUONG TRINH CON DELAY 500MS
DELAY500MS: MOV 7DH,#10
DEL500S:
CALL DELAY50MS
DJNZ 7DH,DEL500S

RET
;CHUONG TRINH CON DELAY 1 GIAY
DELAY1S:
MOV 7DH,#20
DEL1S:
CALL DELAY50MS
DJNZ 7DH,DEL1S
RET
;CHUONG TRINH CON DELAY2 GIAY
DELAY2S:
MOV 7DH,#40
DEL2S:
CALL DELAY50MS


-2DJNZ 7DH,DEL2S
RET
;CHUONG TRINH CON DELAY3 GIAY
DELAY3S:
MOV 7DH,#60
DEL3S:
CALL DELAY50MS
DJNZ 7DH,DEL3S
RET
;CHUONG TRINH CON DELAY4 GIAY
DELAY4S:
MOV 7DH,#80
DEL4S:
CALL DELAY50MS
DJNZ 7DH,DEL4S

RET
;CHUONG TRINH DIEU KHIEN 16 LED CHOP TAT
ORG 0000H
LB:
MOV P0,#00H
;TAT PORT0
MOV P1,#00H
;TAT PORT1
CALL DELAY100MS
MOV P0,#0FFH
;SANG 8 LED
MOV P1,#0FFH
; SANG 8 LED
CALL DELAY100MS
JMP
LB
;QUAY LAI
$INCLUDE(TV_DELAY.ASM)
;LENH KHAI BAO THU VIEN
END

I.

Bài tập:
1. Hãy xem chương trình mẫu điều khiển 16 led chóp tắt dùng 2 port 0 và 1 và hãy
viết chương trình sáng tắt 3 port 0, 1 và 2.
2. Hãy viết chương trình sáng tắt 4 port: port0, port1, port2, port3.

CHƯƠNG TRÌNH ĐIỀU KHIỂN LED SÁNG VÀ TẮT DẦN.


;CHUONG TRINH DIEU KHIEN 8 LED SANG DAN LEN VA TAT HET – CACH I
ORG 0000H
LB:

MOV

MOV P0,#00000000B
CALL DELAY100MS

;TAT PORT0

MOV P0,#00000001B
CALL DELAY100MS

;sang 1 led

MOV P0,#00000011B
CALL DELAY100MS

;sang 2 led

MOV P0,#00000111B
CALL DELAY100MS

;sang 3 led

MOV P0,#00001111B
CALL DELAY100MS
P0,#00011111B
;sang 5 led

CALL DELAY100MS

;sang 4 led

MOV P0,#00111111B
CALL DELAY100MS

;sang 6 led

MOV P0,#01111111B
CALL DELAY100MS

;sang 7 led


-3-

MOV P0,#11111111B
CALL DELAY100MS
JMP

;sang 8 led

LB

$INCLUDE(TV_DELAY.ASM)
END
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;CHUONG TRINH DIEU KHIEN PORT 0 SANG DAN LEN TAT HET – CACH II
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

ORG 0000h
LB:
LB1:

MOV
CALL
SETB
MOV
RLC
MOV
JNC
JMP

P0,#00H
DELAY100MS
C
A,P0
A
P0,A
LB1
LB

;tat port 0
;goi chuong trinh con delay
;lam cho bit C = 1
;chuyen noi dung port0 vao thanh ghi A
;xoay noi dung thanh ghi A sang trai
;tra lai cho port0
;nhay ve de thuc hien tiepkhi c=o
;quay lai tu dau


$INCLUDE(TV_DELAY.ASM)
END

Giải thích : để led sáng dần lên ta phải dòch mức 1 vào thanh ghi A, mức 1 được chứa
trong bit C, lệnh xoay thanh ghi A sang trái sẽ dòch mức 1 từ C vào bit A0 của thanh ghi A.
Bit A7 sẽ dòch sang bit C.
Trong 8 lần dòch đầu tiên thì sau khi dòch, bit C luôn bằng 0. Nên ta dùng lệnh nhảy
có điều kiện khi C = 0 thì nhảy để quay lại tiếp tục thực hiện.
Cho đến lần xoay thứ 9 thì C = 1 thì điều kiện không còn thõa mãn nên lệnh nhảy có
điều kiện thì lệnh nhảy “JMP ” mới được thực hiện để làm lại từ đầu.
1. Thực hiện các bước giống như các bài trước.
I.

Các chương trình mẫu:
1. Chương trình điều khiển port 0 sáng dần và tắt dần: xem lưu đồ thứ 2 ở trên.

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;CHUONG TRINH DIEU KHIEN PORT0 SANG TAT DAN
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ORG 0000H
LB:
MOV P0,#00H
;TAT PORT 0
LB1:

CALL
SETB
MOV
RLC

MOV
JNC

DELAY100MS
C
A,P0
A
P0,A
LB1

;goi chuong trinh con delay
;lam cho bit C = 1
;chuyen noi dung port0 vao thanh ghi A
;xoay noi dung thanh ghi A sang trai
;tra lai cho port0
;nhay ve de thuc hien tiep khi c=0

LB2:

CALL
CLR
MOV
RLC
MOV

DELAY100MS
C
A,P0
A
P0,A


;goi chuong trinh con delay
;lam cho bit C = 0
;chuyen noi dung port0 vao thanh ghi A
;xoay noi dung thanh ghi A sang trai
;tra lai cho port0


-4JC
LB2
JMP
LB
$INCLUDE(TV_DELAY.ASM)
END

;nhay ve de thuc hien tiep khi c=1
;quay ve lam lai tu dau

2. Chương trình điều khiển port 0 và port 1 sáng dần và tắt dần:

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;chuong trinh dieu khien port 0, 1 sang dan len va tat dan
;ket noi port 0 den 8 led bang cap 8 soi tuong tu cho port1
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ORG 0000H
LB:
MOV P0,#00H
;tat port 0
MOV P1,#00H
;tat port 1

LB1:

LB2:

lcall
SETB
MOV
RLC
MOV

DELAY100MS
C
A,P0
A
P0,A

;goi chuong trinh con delay
;lam cho bit C = 1
;chuyen noi dung port0 vao thanh ghi A
;xoay noi dung thanh ghi A sang trai
;tra lai cho port0

MOV
RLC
MOV
JNC

A,P1
A
P1,A

LB1

;chuyen noi dung port1 vao thanh ghi A
;xoay noi dung thanh ghi A sang trai
;tra lai cho port1
;nhay ve de thuc hien tiep khi c=0

CALL
CLR
MOV
RLC
MOV

DELAY100MS
C
A,P0
A
P0,A

;goi chuong trinh con delay
;lam cho bit C = 0
;chuyen noi dung port0 vao thanh ghi A
;xoay noi dung thanh ghi A sang trai
;tra lai cho port0

MOV A,P1
RLC
A
MOV P1,A
JC

LB2
JMP
LB
$INCLUDE(TV_DELAY.ASM)
END

II.

;chuyen noi dung port1 vao thanh ghi A
;xoay noi dung thanh ghi A sang trai
;tra lai cho port1
;nhay ve de thuc hien tiep khi c=1
;quay ve lam lai tu dau

Bài tập ứng dụng:
1.
2.
3.

Dùng port 0 kết nối với 8 led, hãy viết chương trình điều khiển 1 led sáng và
di chuyển từ trái sang phải.
Hãy viết chương trình điều khiển 4 port 0, 1, 2, 3 sáng dần và tắt dần từ trên
xuống và từ dưới lên.
Hãy viết chương trình điều khiển 4 port 0, 1, 2, 3 sáng dần và tắt dần từ ngoài
vào trong và từ trong ra ngoài.

CHƯƠNG TRÌNH ĐIỀU KHIỂN LED SÁNG DỒN
chuong trinh dieu khien port 0 sang don va tat het - cach I
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ORG 0000H

;khai bao dia chi chtr chinh
LB:
LB1:

MOV DPTR,#DULIEU
CLR
A
MOVC A,@A+DPTR

;nap dia chi luu du lieu vao thghi dptr
;lay du lieu tu bo nho dua vao A


-5MOV P0,A
CALL DELAY100MS
INC
DPTR
CJNE A,#0FFH,LB1
JMP
LB
$INCLUDE(TV_DELAY.ASM)
;khai bao dia chi luu tru vung du lieu
DULIEU:
DB
00000000b
DB
00000001b
DB
00000010b
DB

00000100b
DB
00001000b
DB
00010000b
DB
00100000b
DB
01000000b
DB
10000000b
;lan thu hai la 7 byte
DB
10000001b
DB
10000010b
DB
10000100b
DB
10001000b
DB
10010000b
DB
10100000b
DB
11000000b
;lan thu 3 la 6 byte
DB
11000001b
DB

11000010b
DB
11000100b
DB
11001000b
DB
11010000b
DB
11100000b
;lan thu 4 la 5 byte
DB
11100001b
DB
11100010b
DB
11100100b
DB
11101000b
DB
11110000b
;lan thu 5 la 4 byte
DB
11110001b
db
11110010b
db
11110100b
db
11111000b
;lan thu 6 la 3 byte

db
11111001b
db
11111010b
db
11111100b
;lan thu 7 la 2 byte
db
11111101b
db
11111110b
;lan thu 8 la 1 byte
db
11111111b
END

;goi ra port 0
;goi chtr con delay
;tang dptr len o nho ke
;ktra co phai la byte ket thuc hay chua
;quay tro lam lai khi da het du lieu

;byte du lieu cuoi cung = FFH


-6Theo cách viết 1 ta hãy quan sát dữ liệu trong chương trình đã được sắp xếp theo đúng
trình tự và chương trình chỉ thực hiện nhiệm vụ là di chuyển lần lược các byte dữ liệu có trong
bộ nhớ đem gởi vào A và sau đó gởi ra port 0.
Lệnh “DULIEU: db dữ liệu” có chức năng nạp các byte dữ liệu vào vùng nhớ chương
trình.

Byte cuối cùng là FFH là byte báo cho biết hết dữ liệu.
Dữ liệu viết dưới dạng số nhò phân cho dễ nhìn thấy và có thể viết dưới dạng số hex –
khi đó chương trình sẽ ngắn hơn rất nhiều. Phần khai báo dữ liệu dưới dạng số hex như sau:
DULIEU:

DB
DB
DB
DB
DB
DB
DB
DB
DB

00H
001H,002H,004H,008H,010H,020H,040H,080H
81H,82H,84H,88H,90H,0A0H,0C0H
0C1H,0C2H,0C4H,0C8H,0D0H,0E0H
0E1H,0E2H,0E4H,0E8H,0F0H
0F1H,0F2H,0F4H,0F8H
0F9H,0FAH,0FCH
0FDH,0FEH
0FFH

Chương trình giống như trên nhưng viết theo cách II:
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;chuong trinh dieu khien 8 led sang don dung port 0
;ket noi port 0 den 8 led bang 1 soi cap 8 soi
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

;dinh nghia cac bien
X0
EQU 10H
Y0
EQU 20H
DEM
TAM

EQU
EQU

30H
31H

LED0 EQU P0
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;bat dau chuong trinh chinh
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ORG 0000H
LB:

LB2:
LB1:

MOV LED0,#00H
CALL DELAY100M

;8 LED TAT
;tat 16 led va delay


MOV
MOV

DEM,#8
X0,#0

;led 1 se di chuyen 8 vi tri

MOV
MOV

TAM,DEM
Y0,#00000001B

MOV
ORL
MOV

A,Y0
A,X0
LED0,A

;luu trng thai ban dau

CALL DELAY100MS
CLR

C

;xoa Cy de chi dich 1 led di



-7MOV
RLC
MOV

A,Y0
A
Y0,A

DJNZ TAM,LB1
MOV X0,LED0

;giam ndung o nho (11h)<> 0 thi quay lai

DJNZ DEM,LB2
JMP
LB

;giam bien dem de xu li lan ke

$INCLUDE(TV_DELAY.ASM)
END

Chương trình không khó ! Bạn hãy tự nghiên cứu giải thuật?

I.

Các chương trình mẫu:
Chương trình điều khiển 16 led sáng dồn:


;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;chuong trinh dieu khien 16 led sang don dung port 0, 1
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


-8;dinh nghia cac bien
X0
X1

EQU
EQU

10H
11H

Y0
Y1

EQU
EQU

20H
21H

DEM
TAM

EQU
EQU


30H
31H

LED0
LED1

EQU
EQU

P0
P1

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;bat dau chuong trinh chinh
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ORG 0000H
LB:

LB2:

LB1:

MOV LED1,#0
MOV LED0,#0
CALL DELAY100MS

;tat 16 led va delay

MOV


DEM,#16

;led 1 se di chuyen 16 vi tri

MOV
MOV

X0,#0
X1,#0

MOV
MOV
MOV

TAM,DEM
Y0,#00000001B
Y1,#00000000B

MOV
ORL
MOV

A,Y0
A,X0
LED0,A

MOV
ORL
MOV


A,Y1
A,X1
LED1,A

;luu trng thai ban dau

CALL DELAY100MS
CLR
MOV
RLC
MOV

C
A,Y0
A
Y0,A

MOV
RLC
MOV
DJNZ

A,Y1
A
Y1,A
TAM,LB1

MOV
MOV

DJNZ
JMP

X0,LED0
X1,LED1
DEM,LB2
LB

;xoa Cy de chi dich 1 led di

;giam ndung o nho (11h)<> 0 thi quay lai

;giam bien dem de xu li lan ke


-9$INCLUDE(TV_DELAY.ASM)
END

II.

Bài tập ứng dụng:
1.
2.
3.
4.

Hãy viết chương trình điều khiển 3 port: port0, port1, port2 sáng dồn.
Hãy viết chương trình điều khiển 4 port: port0, port1, port2 và port3 sáng
dồn.
Hãy viết chương trình sáng dồn 2 port 0 và 1 từ ngoài vào trong và từ trong ra

ngoài.
Hãy viết chương trình sáng dồn 4 port 0, 1, 2 và 3 từ ngoài vào trong và từ
trong ra ngoài.

CHƯƠNG TRÌNH ĐIỀU KHIỂN
ĐIỂM SÁNG DỊCH CHUYỂN MẤT DẦN
chuong trinh dieu khien 8 led sang het va diem sang dich chuyen tat dan
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;dinh nghia cac nhan
X0
Y0
Z0

EQU
EQU
EQU

11H
21H
R0

LED0
DEM

EQU
EQU

P0
40H


ORG
MOV
CALL
MOV

0000H
LED0,#0FFH
DELAY100MS
DEM,#8

MOV
MOV

X0,#11111110B
Y0,#00000001B

LB2:

MOV

Z0,Y0

LB1:

CALL
MOV
ORL
MOV
CALL


XPHAI_Z0
A,X0
A,Z0
LED0,A
DELAY100MS

LB:

CJNE Z0,#00,LB1
CALL XTRAI_X0
CALL XTRAI_Y0
DJNZ DEM,LB2
JMP
LB
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;bat dau cac chuong trinh con


- 10 ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
XPHAI_Z0:
CLR
C
MOV A,Z0
RRC A
MOV Z0,A
RET
XTRAI_X0:

CLR
MOV

RLC
MOV
RET

C
A,X0
A
X0,A

XTRAI_Y0:

CLR
C
MOV A,Y0
RLC
A
MOV Y0,A
RET
$INCLUDE(TV_DELAY.ASM)
END

I.

Các chương trình mẫu:

Chương trình mẫu điều khiển 16 led dòch chuyển tắt dần
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;chuong trinh dieu khien 16 led sang het va diem sang dich chuyen tat dan
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;dinh nghia cac nhan


LB:

LB2:

X1
X0

EQU
EQU

10H
11H

Y1
Y0

EQU
EQU

20H
21H

Z1
Z0

EQU
EQU

R1

R0

LED0
LED1
DEM

EQU
EQU
EQU

P0
P1
40H

ORG

0000H

MOV
MOV
CALL
MOV

LED1,#0FFH
LED0,#0FFH
DELAY100MS
DEM,#16

MOV
MOV


X1,#11111111B
X0,#11111110B

;byte cao
;byte thap

MOV
MOV

Y1,#00000000B
Y0,#00000001B

;byte cao
;byte thap

MOV

Z1,Y1


- 11 MOV
LB1:

Z0,Y0

CALL XPHAI_Z
CALL X_OR_Z
CALL DELAY100MS
CJNE

CJNE
CALL
CALL

Z0,#00,LB1
Z1,#00,LB1
XTRAI_X
XTRAI_Y

DJNZ DEM,LB2
JMP
LB
XPHAI_Z:

x_or_z:

XTRAI_X:

XTRAI_Y:

CLR
MOV
RRC
MOV

C
A,Z1
A
Z1,A


MOV
RRC
MOV
RET

A,Z0
A
Z0,A

MOV
ORL
MOV

A,X0
A,Z0
LED0,A

MOV
ORL
MOV
RET

A,X1
A,Z1
LED1,A

CLR
MOV
RLC
MOV


C
A,X0
A
x0,a

MOV
RLC
MOV
RET

A,X1
A
X1,A

CLR
MOV
RLC
MOV

C
A,Y0
A
Y0,A

MOV
RLC
MOV
RET


A,Y1
A
y1,a

$INCLUDE(TV_DELAY.ASM)
END


- 12 -

II.

Bài tập:
1.
2.
3.
4.

Hãy viết chương trình điều khiển 3 port: 0, 1, 2 giống như trên.
Hãy viết chương trình điều khiển 4 port: 0, 1, 2, 3 giống như trên.
Làm lại các bài cho các chiều di chuyển ngược lại.
Hãy viết chương trình điều khiển 4 port 0, 1, 2, 3 với điểm sáng dòch chuyển mất
dần từ theo chiều từ trong ra và từ ngoài vào.

CHƯƠNG TRÌNH DELAY SỬ DỤNG TIMER

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; chuong trinh sang tat 8LED su dung timer lam bo dinh thoi delay 65536 micro giay
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ORG 0000H

MOV TMOD,#01
; khoi tao timer T0 mode 1 dem 16 bit
SETB TR0
; cho phep timer 0 bat dau dem xung
LB:

MOV P0,#00H
CALL DELAY
; delay 65536 micro giay
MOV P0,#0FFH
CALL DELAY
JMP
LB
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; chuong trinh con delay 65535 micro giay
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DELAY:
CLR
TF0
; xoa co ngat cua timer 0
JNB
TF0,$
; Cho den khi tran
RET
END

1. Thực hiện các bước giống như trên và xem kết quả.
Giải thích :
Bài sáng tắt 8 LED trên giống như bài đã làm trước đây chỉ khác là thay chương trình
delay bằng cách sử dụng timer để việc tính toán thời gian dễ dàng hơn.

Hàng lệnh đầu tiên trong chương trình chính là chọn mode làm việc cho timer T0 –
hãy xem chương timer (timer T1 chưa sử dụng nên không cần quan tâm).
Lệnh thứ 2 là cho phép timer bắt đầu đếm xung nội từ mạch dao động bên trong.
Với chương trình trên thì timer T0 sẽ đếm từ giá trò nạp ban đầu 0000H đến FFFFH
và khi có thêm 1 xung nữa thì giá trò đếm sẽ là 10000H. Một cách đơn giản ta có thể xem con
số 10000H được chia ra làm 2: số “1” tương đương 1 bit được lưu trong cờ tràn TF0 và số
“0000H” tương đương 16 bit được lưu trong 2 thanh ghi TH0TL0.
Số xung đếm được là 10000H –0000H = 10000 (65536) xung và mỗi xung có chu kì 1
micro giây nên lượng thời gian mà timer T0 đếm được là 65536 micro giây.
I.

Các chương trình mẫu:
Để delay với lượng thời gian nhỏ hơn ta hãy tham khảo bài mẫu dưới đây:

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; chuong trinh sang tat 8 LED su dung timer lam bo dinh thoi delay 250 micro giay
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ORG

0000H


- 13 MOV TMOD,#01
SETB TR0

; khoi tao timer T0 mode 1 dem 16 bit
; cho phep timer 0 bat dau dem xung

LB:


MOV P0,#00H
CALL DELAY250
; delay 250 micro giay
MOV P0,#0FFH
CALL DELAY250
JMP
LB
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; chuong trinh con delay 250 micro giay
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DELAY250:
CLR
TF0
MOV TL0,#LOW(-250)
; nap 06 vao TL0
MOV TH0,#HIGH(-250)
; nap FF vao TH0
JNB
TF0,$
RET
END

Giải thích :
Lượng thời gian của bài này chỉ có 250 micro giây, vì giá trò ban đầu nạp cho timer là
FF06H nên khi đếm đến 10000H kết quả xung đếm được 10000H – FF06H = 00FA (250) và
mỗi xung có chu kỳ 1 micro giây nên lượng thời gian mà timer T0 đếm đượclà 250 micro
giây.
Để khỏi phải tính toán phức tạp ta có thể viết bằng hai lệnh như sau:
MOV


TL0,#LOW(-250)
; nap 06 vao TL0
MOV TH0,#HIGH(-250)
; nap FF vao TH0

Khi biên dòch thì trình biên dòch tự động tính toán cho chúng ta.
Chú ý với các chương trình điều khiển led sáng với thời gian trể nhỏ thì led sáng mờ
nhưng không chóp tắt như các bài ta đã viết ở trên. Trong phần tính toán chúng ta chưa tính
toán các lệnh trong chương trình con delay.
Muốn viết chương trình với các khoảng thời gian lớn hơn thì phải thêm thanh ghi ví dụ
muốn viết delay 5 giây thì ta viết chương trình trình con delay 50000 µs = 50ms và cho chúng
thực hiện 100 lần – sau này chúng ta sẽ dùng timer để tạo ra các xung chính xác về thời gian
cho các bài sau.
Bài tập:
1. Hãy viết chương trình sáng tắt port 2 sử dụng timer làm bộ đònh thời delay 5 giây.
2. Hãy viết chương trình giống trên nhưng delay 10 giây.
3. Tương tự hãy viết chương trình delay 1 giờ.

CHƯƠNG TRÌNH ĐIỀU KHIỂN 1 LED 7 ĐOẠN RỜI ĐẾM TỪ 0 ĐẾN 9
;CHUONG TRINH DEM TU 0 DEN 9 HIEN THI TREN 1L ED 7 DOAN ANODE CHUNG
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ORG 0000H
LB:
MOV P0,#0C0H
;so 0
CALL DELAY100MS
MOV P0,#0F9H
;so 1
CALL DELAY100MS



- 14 -

MOV P0,#0A4H
;so 2
CALL DELAY100MS
MOV P0,#0B0H
;so 3
CALL DELAY100MS
MOV P0,#099H
;so 4
CALL DELAY100MS
MOV P0,#092H
;so 5
CALL DELAY100MS
MOV P0,#082H
;so 6
CALL DELAY100MS
MOV P0,#0F8H
;so 7
CALL DELAY_100MS
MOV P0,#080H
;so 8
CALL DELAY100MS
MOV P0,#090H
; so 9
CALL DELAY100MS
JMP
LB
$INCLUDE(TV_DELAY.ASM)

END

1.

Đếm từ 0 đến 9 hiển thò trên 1 led – cách thứ 2:
- Giải thuật điều khiển:

-

Chương trình điều khiển như sau:

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


- 15 ;CHUONG TRINH DEM TU 0 DEN 9 HIEN THI TREN 1L ED 7 DOAN ANODE CHUNG
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DEM EQU R2
ORG 0000H
LB:

MOV
MOV

DPTR,#MA7DOAN
DEM,#0

LB1:

MOV
MOVC

MOV
CALL

A,DEM
A,@A+DPTR
P0,A
DELAY100MS

INC
DEM
CJNE DEM,#10,LB1
JMP
LB

;HIEN THI TREN LED 7 DOAN
;CHUAN BI CHO SO KE

$INCLUDE(TV_DELAY.ASM)
MA7DOAN:
DB
0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
END

I.

Câu hỏi và bài tập:
• Hãy điều chỉnh chương trình trên để mạch đếm xuống.

CHƯƠNG TRÌNH ĐIỀU KHIỂN 2 LED 7 ĐOẠN RỜI
ĐẾM TỪ 00 ĐẾN 99

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;CHUONG TRINH DEM TU 00 DEN 99 HIEN THI TREN 2 LED 7 DOAN ANODE CHUNG
;DUNG P0 VA P1 KET NOI VOI 2 LED DON VI VA CHUC
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DONVI EQU R2
CHUC EQU R3

LB:
LB2:
LB1:

ORG

0000H

MOV
MOV
MOV

DPTR,#MA7DOAN
CHUC,#0
DONVI,#0

MOV A,CHUC
MOVC A,@A+DPTR
MOV P1,A
MOV A,DONVI
MOVC A,@A+DPTR
MOV P0,A
CALL DELAY100MS

INC
DONVI
CJNE DONVI,#10,LB1
INC
CHUC
CJNE CHUC,#10,LB2
JMP
LB


- 16 -

$INCLUDE(TV_DELAY.ASM)
MA7DOAN:
DB
0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
END

I.

Câu hỏi và bài tập:
a.
b.

Hãy điều chỉnh lưu đồ và chương trình trên để mạch đếm từ 00 đến 25.
Hãy điều chỉnh lưu đồ và chương trình trên để mạch đếm từ 05 đến 25.

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;CHUONG TRINH DEM TU 05 DEN 25 HIEN THI TREN 2 LED 7 DOAN ANODE CHUNG
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

DONVI EQU R2
CHUC EQU R3

LB:
LB2:
LB1:

ORG

0000H

MOV
MOV
MOV

DPTR,#MA7DOAN
CHUC,#0
DONVI,#5

MOV A,CHUC
MOVC A,@A+DPTR
MOV P1,A
MOV A,DONVI
MOVC A,@A+DPTR
MOV P0,A
CALL DELAY100MS

LB3:

INC

CJNE
MOV
INC
JMP

DONVI
DONVI,#10,LB3
DONVI,#0
CHUC
LB1

MOV
SWAP
ORL
CJNE
JMP

A,CHUC
A
A,DONVI
A,#26H,LB1
LB

$INCLUDE(TV_DELAY.ASM)
MA7DOAN:
DB
0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
END

Hai biến chuc và donvi là 8 bit nhưng chỉ sử dụng có 4 bit, chương trình sau sẽ dùng 1

biến lưu cả hàng đơn vò và hàng chục.
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;CHUONG TRINH DEM TU 00 DEN 99 HIEN THI TREN 2 LED 7 DOAN ANODE CHUNG
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


- 17 DEM

EQU

R2

;4 BIT THAP LA HANG DONVI, 4 BIT CAO LA HANG

ORG
MOV
MOV
CALL
CALL

0000H
DPTR,#MA7DOAN
DEM,#00
GIAIMA
DELAY100MS

CHUC
LB:
LB2:
LB1:


MOV A,DEM
ADD A,#1
DA
A
MOV DEM,A
JMP
LB1
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
GIAIMA:
MOV A,DEM
ANL
A,#0FH
;XOA HANG CHUC, GIU LAI HANG DONVI
MOVC A,@A+DPTR
MOV P1,A
MOV A,DEM
ANL
A,#0F0H
;XOA HANG DON VI, GIU LAI HANG CHUC
SWAP A
MOVC A,@A+DPTR
MOV P0,A
RET
$INCLUDE(TV_DELAY.ASM)
MA7DOAN:
DB
0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
END


Trong chương trình này biếm DEM tăng giá trò theo kiểu BCD nhờ lệnh cộng và lệnh
hiệu chỉnh BCD nằm ngay sau lệnh cộng.
Chương trình giải mã sẽ lấy biến đếm xoá hàng đơn vò để giải mã hàng chục, sau đó
làm lại cho hàng chuc.
Chương trình sau có chức năng đếm từ 05 đến 25 và việc so sánh để dừng rất đơn giản
như sau:
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;CHUONG TRINH DEM TU 05 DEN 25 HIEN THI TREN 2 LED 7 DOAN ANODE CHUNG
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DEM EQU R2
ORG 0000H
LB:
MOV DPTR,#MA7DOAN
LB2:
MOV DEM,#05
LB1:
CALL GIAIMA
CALL DELAY100MS
MOV
ADD
DA
MOV

A,DEM
A,#1
A
DEM,A

;DEM BCD


CJNE A,#26H,LB1
JMP
LB2
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


- 18 GIAIMA:

MOV
ANL
MOVC
MOV

A,DEM
A,#0FH
A,@A+DPTR
P1,A

;XOA HANG CHUC, GIU LAI HANG DONVI

MOV A,DEM
ANL
A,#0F0H
;XOA HANG DON VI, GIU LAI HANG CHUC
SWAP A
MOVC A,@A+DPTR
MOV P0,A
RET
$INCLUDE(TV_DELAY.ASM)
MA7DOAN:

DB
0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
END

Chương trình sau viết theo cách khác dùng số nhò phân và phải thêm phần chuyển số
hex sang số BCD như sau:
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;CHUONG TRINH DEM TU 00 DEN 99 HIEN THI TREN 2 LED 7 DOAN ANODE CHUNG
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DEM EQU R2
;4 BIT THAP LA HANG DONVI, 4 BIT CAO LA HANG
CHUC
ORG 0000H
LB:
MOV DPTR,#MA7DOAN
LB2:
MOV DEM,#00
LB1:
CALL HEXTOBCD
;CHUYEN SO HEX SANG SO BCD
CALL GIAIMA
CALL DELAY100MS
INC
DEM
;DEM NHI PHAN
JMP
LB1
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
HEXTOBCD: MOV A,DEM
MOV B,#10

DIV
AB
;(A) LUU KET QUA, (B) LUU SO DU
RET
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
GIAIMA:
MOVC A,@A+DPTR
MOV P1,A
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
RET
$INCLUDE(TV_DELAY.ASM)
MA7DOAN:
DB
0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
END

CHƯƠNG TRÌNH ĐIỀU KHIỂN 8 LED 7 ĐOẠN QUÉT
HIỂN THỊ TỪ SỐ 0 ĐẾN SỐ 7 TRÊN 8 LED

chuong trinh thu 8 led 7 doan sang cac so 0 den so 7 tren 8 led
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
QUET
EQU P2
;DIEU KHIEN TRANSISOTR
LED7
EQU P0
;DIEU KHIEN CAC DOAN
ORG 0000H



- 19 -

LB:

MOV
MOV
CALL
MOV

QUET,#11111110B
LED7,#11000000B
DELAY1MS
QUET,#11111111B

; cho phep D1 sang
; ma cua so 0

MOV
MOV
CALL
MOV

QUET,#11111101B
LED7,#11111001B
DELAY1MS
QUET,#11111111B

; cho phep D2 sang

; ma cua so 1

MOV
MOV
CALL
MOV

QUET,#11111011B
LED7,#10100100B
DELAY1MS
QUET,#11111111B

; cho phep D3 sang
; ma cua so 2

MOV
MOV
CALL
MOV

QUET,#11110111B
LED7,#10110000B
DELAY1MS
QUET,#11111111B

; cho phep D4 sang
; ma cua so 3

MOV
MOV

CALL
MOV

QUET,#11101111B
LED7,#10011001B
DELAY1MS
QUET,#11111111B

; cho phep D5 sang
; ma cua so 4

MOV
MOV
CALL
MOV

QUET,#11011111B
LED7,#10010010B
DELAY1MS
QUET,#11111111B

; cho phep D6 sang
; ma cua so 5

MOV
MOV
CALL
MOV

QUET,#10111111B

LED7,#10000010B
DELAY1MS
QUET,#11111111B

; cho phep D7 sang
; ma cua so 6

MOV
MOV
CALL
MOV
JMP

QUET,#01111111B
LED7,#11111000B
DELAY1MS
QUET,#11111111B
LB

; cho phep D8 sang
; ma cua so 7

$INCLUDE(TV_DELAY.ASM)
END

Chú ý: Nếu khi chạy mà kết quả hiển thò không đúng thì hãy xem lại chương trình, nếu
chương trình hoàn toàn đúng thì hãy kiểm tra kết nối 2 port điều khiển với led.
Để sáng cùng 1 lúc 8 led ta sử dụng phương pháp quét led tức là tại một thời điểm chỉ
có 1 led sáng và khi giảm thời gian delay vừa với thời gian lưu ảnh của mắt. Lúc này, chúng
ta sẽ thấy 8 led sáng cùng một lúc. Nếu thời gian delay giữa các led lớn thì ta sẽ thấy 8 led

nhấp nháy hay chập chờn.
c. Hiển thò 8 số từ 0 đến 7 trên 8 led 7đoạn – cách 2:
- Giải thuật điều khiển:


- 20 -

-

Chương trình điều khiển như sau:

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;chuong trinh hien thi 8 so tu 0 den 7 tren 8 led theo cach viet thu 2
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
QUET EQU P2
LED7 EQU P0
DEM EQU R4
LB:

LB1:

ORG
MOV
MOV
MOV

0000H
DPTR,#MA7DOAN
DEM,#0
R3,#0FEH


MOV A,DEM
MOVC A,@A+DPTR
MOV LED7,A
MOV QUET,R3
CALL DELAY1MS
MOV QUET,#0FFH
MOV
RR
MOV
INC

;nap dia chi vung ma vao dptr
;ma quet 11111110B

;

;lay ma 7 doan

;tat het de chong lem

A,R3
A
R3,A
DEM

CJNE DEM,#8, LB1
JMP
LB2
;quay lai lam lai tu dau

MA7DOAN:
DB
0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
$INCLUDE(TV_DELAY.ASM)
END

Chú ý: Tạo thêm chương trình thư viện 7 đoạn “TV_7DOAN.ASM” như sau:
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


- 21 ;KHAI BAO BIEN DUNG CHO 8 LED 7 DOAN QUET
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
QUET EQU P2
LED7 EQU P0
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;khai bao du lieu ma 7 doan
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
MA7DOAN: DB
0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB
080H,090H,088H,083H,0C6H,0A1H,086H,08EH

CHƯƠNG TRÌNH ĐẾM GIÂY HIỂN THỊ Ở 2 LED – SỬ DỤNG NGẮT CỦA
TIMER ĐỂ ĐẾM CHÍNH XÁC VỀ THỜI GIAN.
chuong trinh dem len tu 00 den 60 hien thi tren 2 led cua 8 led quet
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
GIAY EQU R2
;gan bien dem giay la R2
BDN EQU R1
;gan bien dem ngat

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; CHUONG TRINH CHINH
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ORG
0000H
;bat dau chuong trinh
JMP
LB
;nhay den chtr chinh
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;CHUONG TRINH CON NGAT TIMER0 SAU KHOANG THOI GIAN 50MS
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ORG 000BH
INC
BDN
;tang bien dem giay len 1
MOV TH0,#HIGH(-50000)
;khoi tao timer delay 50ms
MOV TL0,#LOW(-50000)
CLR
TF0
RETI
LB:

MOV
MOV
MOV
SETB

DPTR,#MA7DOAN

IE,#10000010B
TMOD,#01H
TR0

;dptr quan ly vung ma 7 doan
;cho phep timer0 ngat
;timer0: mod 1 - dem 16 bit
;cho phep timer bat dau dem

LB0:
LB1:

MOV
MOV
CALL
CALL

GIAY,#00H
BDN,#00
GIAIMA
HIENTHI2

;giay=00
;nap bien den so lan ngat

CJNE
MOV
ADD
DA
MOV

CJNE

BDN,#20,LB2
A,GIAY
A,#1
A
GIAY,A
GIAY,#60H,LB1

;chua dung 20 lan [tuc 1 giay]
;chuyen giay sang A
;tang giay len 1
;hieu chinh so BCD trong A
;tra lai cho giay
;ss giay voi 60

LB2:

JMP
LB0
;lam lai tu dau
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; chuong trinh con giai ma
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


- 22 GIAIMA:

MOV
ANL

MOVC
MOV

A,GIAY
A,#0FH
A,@A+DPTR
27H,A

MOV
ANL
SWAP
MOVC
MOV
RET

A,GIAY
A,#0F0H
A
A,@A+DPTR
26H,A

;xoa 4 bit cao hang chuc giay
;lay ma 7 doan
;cat ma hang don vi giay vao o nho 27h
;xoa 4 bit thap hang dvi
;chuyen 4 bit cao xuong vi tri thap
;lay ma 7 doan hang chuc

;
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

xx
;chuong trinh con hien thi
;
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xx
HIENTHI2:
MOV A,# 11111110B
;ma quet
MOV R0,#27H
HT2A:

MOV
MOV
CALL
MOV
DEC
RL
JB
RET

LED7,@R0
QUET,A
DELAY1MS
QUET,#0FFH
R0
A
ACC.2, HT2A

;chuyen sang led ke


$INCLUDE(TV_DELAY.ASM)
$INCLUDE(TV_7DOAN.ASM)
END

1. Thực hiện các bước giống như các bài chuẩn cho đến khi mạch đếm đúng từ 00
đến 59.
I.

Câu hỏi và bài tập ứng dụng:
1. Hãy viết chương trình đếm lên từ 00 đến 99 thì làm như thế nào?
2. Hãy viết chương trình đếm xuống từ 60 về 00 thì làm như thế nào?

CHƯƠNG TRÌNH ĐẾM PHÚT - GIÂY HIỂN THỊ Ở 4 LED.
;chuong trinh dem phut giay, su dung ngat timer t0 de dem chinh xac ve thoi gian
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
GIAY EQU R2
;gan bien dem giay la R2
PHUT EQU R3
;gan bien dem phut cho R3
BDN EQU R1
;gan bien dem ngat
ORG
JMP

0000h
LB

;bat dau chuong trinh
;nhay den chtr chinh


;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


- 23 ;CHUONG TRINH CON NGAT TIMER0 SAU KHOANG THOI GIAN 50MS
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ORG 000BH
INC
BDN
;TANG BIEN DEM GIAY
MOV TH0,#HIGH(-50000)
;khoi tao lai cho timer delay 50ms
MOV TL0,#LOW(-50000)
CLR
TF0
RETI
LB:

MOV
MOV
MOV
SETB
MOV
MOV

DPTR,#MA7DOAN
TMOD,#01H
IE,#10000010B
TR0
22H,#0FFH
25H,#0FFH


;dptr quan ly vung ma 7 doan
;timer0: mod 1 - dem 16 bit
;cho phep timer ngat
;cho timer bat dau dem

LB3:
LB0:
LB1:

MOV
MOV
MOV
CALL
CALL

PHUT,#00H
GIAY,#00H
BDN,#00H
GIAIMA
HIENTHI4

;phut=00
;giay=00
;nap bien den so lan ngat

CJNE
MOV
ADD
DA

MOV
CJNE

BDN,#20,LB2
A,GIAY
A,#1
A
GIAY,A
GIAY,#60H,LB1

;chua dung 20 lan [tuc 1 giay]
;chuyen giay sang A
;tang giay len 1
;hieu chinh so BCD trong A
;tra lai cho giay
;ss giay voi 60

MOV
ADD
DA
MOV
CJNE

A,PHUT
A,#1
A
PHUT,A
PHUT,#60H,LB0

;chuyen phut sang A

;tang phut len 1
;hieu chinh so BCD trong A
;tra lai cho phut
;ss giay voi 60

LB2:

;goi chtr con hien thi

JMP
LB3
;lam lai tu dau
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; chuong trinh con giai ma
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
GIAIMA:
MOV A,GIAY
ANL
A,#0FH
;xoa 4 bit cao hang chuc giay
MOVC A,@A+DPTR
;lay ma 7 doan
MOV 27H,A
;cat ma vao o nho 20h
MOV
ANL
SWAP
MOVC
MOV


A,GIAY
A,#0F0H
A
A,@A+DPTR
26H,A

MOV
ANL
MOVC
MOV

A,PHUT
A,#0FH
A,@A+DPTR
24H,A

;xoa 4 bit thap hang dvi
;chuyen 4 bit cao xuong vi tri thap
;lay ma 7 doan hang chuc

;xoa 4 bit cao hang chuc phut
;lay ma 7 doan
;cat ma vao o nho 20h


- 24 MOV
ANL
SWAP
MOVC
MOV

RET

A,PHUT
A,#0F0H
A
A,@A+DPTR
23H,A

;xoa 4 bit thap hang dvi phut
;chuyen 4 bit cao xuong vi tri thap
;lay ma 7 doan hang chuc

;
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xx
;chuong trinh con hien thi
;
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xx
HIENTHI4:
MOV A,#11111110B
;ma quet
MOV R0,#27H
HT4A:
MOV LED7,@R0
MOV QUET,A
CALL DELAY1MS
MOV QUET,#0FFH
DEC R0
RL

A
;chuyen sang led ke
JB
ACC.6, HT4A
RET
$INCLUDE(TV_DELAY.ASM)
$INCLUDE(TV_7DOAN.ASM)
END

CHƯƠNG TRÌNH ĐẾM GIỜ - PHÚT - GIÂY HIỂN THỊ Ở 6 LED.
chuong trinh dem dong ho so gio phut giay
;su dung ngat timer t0 de dem chinh xac ve thoi gian
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
GIAY EQU R2
;gan bien dem giay la R2
PHUT EQU R3
;gan bien dem phut cho R3
GIO
EQU R4
BDN EQU R1
;gan bien dem ngat
ORG 0000h
;bat dau chuong trinh
JMP
LB
;nhay den chtr chinh
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;CHUONG TRINH CON NGAT TIMER0 SAU KHOANG THOI GIAN 50MS
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ORG 000BH

INC
BDN
;TANG BIEN DEM GIAY
MOV TH0,#HIGH(-50000)
;khoi tao lai cho timer delay 50ms
MOV TL0,#LOW(-50000)
CLR
TF0
RETI
LB:

MOV
MOV
MOV
SETB
MOV
MOV

DPTR,#MA7DOAN
TMOD,#01H
IE,#10000010B
TR0
22H,#0FFH
25H,#0FFH

;dptr quan ly vung ma 7 doan
;timer0: mod 1 - dem 16 bit
;cho phep timer ngat
;cho timer bat dau dem



- 25 LB4:
LB3:
LB0:
LB1:

MOV
MOV
MOV
MOV

GIO,#00H
PHUT,#00H
GIAY,#00H
BDN,#00H

;GIO=00
;phut=00
;giay=00
;nap bien den so lan ngat

LB2:

CALL GIAIMA
CALL HIENTHI8

;goi chtr con hien thi

CJNE
MOV

ADD
DA
MOV
CJNE

BDN,#20,LB2
A,GIAY
A,#1
A
GIAY,A
GIAY,#60H,LB1

;chua dung 20 lan [tuc 1 giay]
;chuyen giay sang A
;tang giay len 1
;hieu chinh so BCD trong A
;tra lai cho giay
;ss giay voi 60

MOV
ADD
DA
MOV
CJNE

A,PHUT
A,#1
A
PHUT,A
PHUT,#60H,LB0


;chuyen phut sang A
;tang phut len 1
;hieu chinh so BCD trong A
;tra lai cho phut
;ss giay voi 60

MOV
ADD
DA
MOV
CJNE

A,GIO
A,#1
A
GIO,A
GIO,#24H,LB3

;chuyen gio sang A
;tang gio len 1
;hieu chinh so BCD trong A
;tra lai cho gio
;ss gio voi 24

JMP
LB4
;lam lai tu dau
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; chuong trinh con giai ma

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
GIAIMA:
MOV A,GIAY
ANL
A,#0FH
;xoa 4 bit cao hang chuc giay
MOVC A,@A+DPTR
;lay ma 7 doan
MOV 27H,A
;cat ma vao o nho 27h
MOV
ANL
SWAP
MOVC
MOV

A,GIAY
A,#0F0H
A
A,@A+DPTR
26H,A

;xoa 4 bit thap hang dvi
;chuyen 4 bit cao xuong vi tri thap
;lay ma 7 doan
;cat ma vao o nho 26h

MOV
ANL
MOVC

MOV

A,PHUT
A,#0FH
A,@A+DPTR
24H,A

;xoa 4 bit cao hang chuc phut
;lay ma 7 doan
;cat ma vao o nho 24h

MOV
ANL
SWAP
MOVC
MOV

A,PHUT
A,#0F0H
A
A,@A+DPTR
23H,A

;xoa 4 bit thap hang dvi phut
;chuyen 4 bit cao xuong vi tri thap
;lay ma 7 doan hang chuc
;cat ma vao o nho 23h

MOV A,GIO
ANL

A,#0FH
MOVC A,@A+DPTR

;xoa 4 bit cao hang chuc phut
;lay ma 7 doan


×