BÀI TẬP LỚN NHÓM 1
Phan Thanh An
MSSV: 2012564
Huỳnh Kỳ Anh
MSSV: 1912566
Bài tập 1:
1A: Cho 4 đèn LED sáng trên port 1 . Độ sáng giảm dần theo thứ tự , đèn thứ nhất sáng 100% đèn
thứ hai sáng 80% đèn thứ ba 3 sáng 60% đèn thứ tư sáng 40% .
Code :
ORG
2000H
MOV
P1, #11110000B
; cho 4 đèn P1.3, P1.2, P1.1, P1.0 đều sáng
CALL
DELAY
; sau 2/5 chu kì
CALL
DELAY
ORL
P1,#11111000B
; tắt đèn P1.3, P1.3 sáng trong 2/5 chu kì => sáng 40%
CALL
DELAY
; sau 3/5 chu kì
ORL
P1,#11111100B
; tắt đèn P1.2, P1.2 sáng trong 3/5 chu kì => sáng 60%
CALL
DELAY
; sau 4/5 chu kì
ORL
P1,#11111110B
; tắt đèn P1.1, P1.1 sáng trong 4/5 chu kì => sáng 80%
CALL
DELAY
; sau 5/5 cu kì đèn P1.0 vẫn sáng => sáng 100%
SJMP
LOOP
; lặp lại
DELAY:
MOV
R7,#250
; chương trình con tạo delay 1/5 chu kì
DL:
MOV
R6,#2
DJNZ
R6,$
DJNZ
R7,DL
LOOP:
RET
END
1B: Cho 4 đèn đèn led như trên chạy . (ta sẽ thấy giống như một con rắn mà đầu của nó sáng nhiều
nhất và đi của nó sáng ít nhất )
Code:
ORG
2000H
MOV
R0,#11110000B
; 4 đèn sáng
MOV
R1,#11111000B
; 3 đèn sáng
MOV
R2,#11111100B
; 2 đèn sáng
MOV
R3,#11111110B
; 1 đèn sáng
AGAIN:
MOV
R4,#100
; lặp vòng lặp LOOP 100 lần
LOOP:
MOV
P1,R0
; 4 đèn sáng
CALL
DELAY
; sau 2 chu kì
CALL
DELAY
MOV
A,P1
ORL
A,R1
MOV
P1,A
CALL
DELAY
MOV
A,P1
ORL
A,R2
MOV
P1,A
CALL
DELAY
MOV
A,P1
ORL
A,R3
; tắt 1 đèn, sáng 2 chu kì => độ sáng = 40%
; sau 3 chu kì
; tắt 2 đèn, sáng 3 chu kì => độ sáng = 60%
; sau 4 chu kì
; tắt 3 đèn, sáng 4/5 chu kì => độ sáng = 80%
MOV
P1,A
CALL
DELAY
; sau 5/5 chu kì đèn ngồi cùng vẫn sáng => 100%
DJNZ
R4,LOOP
; lặp lại 100 lần
MOV
A,R0
; dịch phải R0 tạo hiệu ứng chạy
RR
A
MOV
R0,A
MOV
A,R1
RR
A
MOV
R1,A
MOV
A,R2
RR
A
MOV
R2,A
MOV
A,R3
RR
A
MOV
R3,A
SJMP
AGAIN
; quay lại từ đầu
DELAY:
MOV
R7,#250
; chương trình con tạo delay 1/5 chu kì
DL:
MOV
R6,#2
DJNZ
R6,$
DJNZ
R7,DL
RET
END
; dịch phải R1 tạo hiệu ứng chạy
; dịch phải R2 tạo hiệu ứng chạy
; dịch phải R3 tạo hiệu ứng chạy
Bài tập 2 : (Bắt buộc)
2A: Viết chương trình đếm từ 0 tới 9. Hiển thị trên led 7 đoạn hàng đơn vị . Cứ sau 1 giây thì tăng lên
1 số và sau đó tăng tới 9 lặp lại từ 0.(Dùng dùng phần cứng của Kit thí nghiệm )
Code :
ORG
2000H
MOV DPTR,#0000H
; nạp địa chỉ của LED 7 đoạn vào DPTR
LOOP:
MOV A,#0E0H
; giá trị ban đầu = 0 và chọn LED đơn vị
AGAIN1:
MOV R5,#8
; lặp lại 8 lần 8x0.125 = 1s
AGAIN2:
MOVX @DPTR,A
; xuất giá trị trong A ra LED 7 đoạn
CALL
; delay
DELAY
DJNZ R5,AGAIN2
; lặp lại cho đủ 1s
INC
A
; tăng A lên 1 đơn vị
CJNE
A,#0EAH,AGAIN1
; nếu giá trị khác 10 tiếp tục xuất ra LED
SJMP LOOP
; nếu A = 10 quay lại từ đầu giá trị = 0
DELAY:
MOV R7,#250
; delay 0.125 s
DL1:
MOV R6,#250
DJNZ R6,$
DJNZ R7,DL1
RET
END
2B: Viết chương trình đếm từ 0 tới 9. Hiển thị trên led 7 đoạn hàng đơn vị . Cứ sau 1 giây thì tăng lên
1 số và sau đó tăng tới 9 thì lặp lại từ 0 Nhưng tự thiết kế phần cứng khơng dùng phần cứng của kit
thí nghiệm (Thiết kế sơ đồ phần cứng và trên Proteus Và chạy mô phỏng trên phần mềm này. Khi
viết chương trình khơng dùng lệnh MOVX )
Thiết kế phần cứng:
Code:
ORG
2000H
LOOP:
MOV
A,#10H
; giá trị ban đầu = 0, chọn LED hàng đơn vị
AGAIN1:
MOV
R5,#8
; lặp lại 8 lần, 8x0.125 = 1s
AGAIN2:
MOV
P1,A
; xuất giá trị trong A ra LED
CALL
DELAY
; delay 0.125s
DJNZ
R5,AGAIN2
; lặp lại cho đủ 1s
INC
A
; tăng A lên 1 đơn vị
CJNE
A,#1AH,AGAIN1
; nếu giá trị khác 10 tiếp tục xuất ra LED
SJMP
LOOP
; nếu giá trị = 10 quay lại từ đầu giá trị = 0
DELAY:
MOV
R7,#250
; chương trình con tạo delay 0.125s
DL1:
MOV
R6,#250
DJNZ
R6,$
DJNZ
R7,DL1
RET
END
Bài tập 3 :
3A: Viết chương trình đếm từ 00 tới 99. Hiển thị trên led 7 đoạn . Cứ sau 0.1 giây thì tăng lên 1 số và
sau đó Tới 99 thì lặp lại từ 00.(Dùng dùng phần cứng của Kit thí nghiệm )
Code:
ORG
2000H
MOV
R0,#0E0H
; chọn LED 0, giá trị 0
MOV
R1,#0D0H
; chọn LED 1, giá trị 0
MOV
R2,#0B0H
; chọn LED 2, giá trị 0
MOV
R3,#070H
; chọn LED 3, giá trị 0
LOOP1:
MOV
R5,#25
; lặp 25 lần, 25x4 = 100ms
LOOP2:
MOV
DPTR,#0000H
; nạp địa chỉ LED 7 đoạn vào DPTR
MOV
A,R0
; xuất LED0
LOOP:
MOVX @DPTR,A
CALL
DELAY
; delay
MOV
A,R1
; xuất LED1
MOVX @DPTR,A
DELAY:
MOV
DL1:
CALL
DELAY
; delay
DJNZ
R5,LOOP2
; lặp 2 cho đủ 100ms
INC
R0
; tăng giá trị đơn vị lên 1
CJNE
R0,#0EAH,LOOP1
; nếu giá trị đơn vị khác 10 tiếp tục xuất ra LED
MOV
R0,#0E0H
; nếu giá trị đơn vị = 10 gán giá trị đơn vị = 0
INC
R1
; tăng giá trị hàng chục
CJNE
R1,#0DAH,LOOP1
; nếu hàng chục khác 10 tiếp tục xuất ra LED
SJMP
LOOP
; nếu giá trị hàng chục = 10 quay lại giá trị 00
R6,#8
; delay 4ms
MOV
R7,#250
DJNZ
R7,$
DJNZ
R6,DL1
RET
END
3B: Viết chương trình đếm từ 00 tới 99. Hiển thị trên led 7 đoạn . Cứ sau 0.1 giây thì tăng lên 1 số và
sau đó tăng tới 99 thì lặp lại từ 00 Nhưng tự thiết kế phần cứng. Không dùng phần cứng của kit thí
nghiệm (Thiết kế sơ đồ phần cứng trên Proteus Và chạy mô phỏng trên phần mềm này,Khi viết
chương trình khơng dùng lệnh MOVX)
Thiết kế phần cứng:
Code:
ORG
0000H
MOV
R0,#10H
; LED0, giá trị 0
MOV
R1,#20H
; LED1, giá trị 1
LOOP1:
MOV
R5,#25
; lặp 25 lần, 25x4 = 100ms
LOOP2:
MOV
A,R0
; xuất giá trị LED0 ra P1
MOV
P1,A
CALL
DELAY
; delay 4ms
MOV
A,R1
; xuất giá trị LED1 ra P1
MOV
P1,A
CALL
DELAY
; delay 4ms
DJNZ
R5,LOOP2
; lặp lại cho đủ 100ms
INC
R0
; tăng hàng đơn vị
CJNE
R0,#1AH,LOOP1
; hàng đơn vị khác 10, tiếp tục xuất ra LED
MOV
R0,#10H
; hàng đơn vị = 10, gán hàng đơn vị = 0
INC
R1
; tăng hàng chục
CJNE
R1,#2AH,LOOP1
; hàng chục khác 10, tiếp tục xuất
SJMP
LOOP
; hàng chục = 10, quay lại từ đầu giá trị 00
LOOP:
DELAY:
DL1:
MOV
R6,#8
; delay 4ms
MOV
R7,#250
DJNZ
R7,$
DJNZ
R6,DL1
RET
END
Bài tập 4 :
4A: Một cân điện tử bán mít Tố nữ đặc sản hoạt động như sau:
Trái dưới một 1 kg giá giá 10.0 usd
Trái từ 1kg đến dưới 1,2 kg giá 12.0 usd
Trái từ 1,2 kg đến dưới 1,5 kg giá 14.5 usd
Trái từ 1,5 kg đến dưới 1,8 kg giá 20.0 usd
Trái từ 1,8 kg đến dưới 2,2 kg giá 18.0 usd
Trái từ 2,2 kg trở lên giá 16.5 usd
Cân điện tử này mỗi lần cân chỉ một trái và cân tối đa là 25,5 kg
Hãy viết chương trình dựa trên phần cứng của KIT thí nghiệm VXL để hiển thị khối lượng và giá của
mỗi trái mít Tố nữ khi được cân lên LCD. .Khối lượng lấy từ giá trị bộ ADC (0 - 255) tương đương với
0 - 22.5 kg.
Code:
MAIN:
RANK0:
LCD_E BIT
P3.4
LCD_RS BIT
P3.5
LCDADDR
EQU
6000H
ORG
2000H
MOV
DPTR, #LCDADDR
; nạp địa chỉ LCD vào DPTR
ACALL CLEAR
; xóa màn hình
ACALL INIT_LCD
; cấu hình LCD
CALL
READADC
; đọc giá trị ADC
MOV
A,#0C0H
; xuống hàng 2 cột 0
CALL
WRITECOM
; viết lệnh lên LCD
CJNE
R0,#10,$+3
; so sánh R0 (giá trị đọc được từ ADC) với 10
JNC
RANK1
; R0 >= 10
MOV
A,#0
; R0 < 10, xuất string 1
SJMP
DISPLAY
CJNE
R0,#12,$+3
; so sánh R0 (giá trị đọc được từ ADC) với 12
JNC
RANK2
; R0 >= 12
MOV
A,#9
; R0 < 12, xuất string 2
SJMP
DISPLAY
CJNE
R0,#15,$+3
; so sánh R0 (giá trị đọc được từ ADC) với 15
JNC
RANK3
; R0 >= 15
MOV
A,#18
; R0 < 15, xuất string 3
SJMP
DISPLAY
CJNE
R0,#18,$+3
; so sánh R0 (giá trị đọc được từ ADC) với 18
JNC
RANK4
; R0 >= 18
MOV
A,#27
; R0 < 18,xuất string 4
SJMP
DISPLAY
CJNE
R0,#22,$+3
; so sánh R0 (giá trị đọc được từ ADC) với 22
JNC
RANK5
; R0 >= 22
MOV
A,#36
; R0 < 22, xuất string 5
SJMP
DISPLAY
RANK5:
MOV
A,#45
; xuất string 6
DISPLAY:
CALL
DISPLAYSTRING
; gọi chương trình con xuất chuỗi lên LCD
CALL
DISPLAYADC
; gọi chương trình con tách số ADC
RANK1:
RANK2:
RANK3:
RANK4:
NEXT:
MOV
A,#80H
; hàng 1 cột 1
CALL
WRITECOM
; viết lệnh lên LCD
MOV
A,R2
; lấy giá trị hàng trăm lưu vào A
JZ
NEXT
; nếu A = 0 bỏ qua không xuất lên LCD
ADD
A,#30H
; A khác 0, cộng với 30H để được mã ASCII
ACALL WRITETEXT
; xuất kí tự lên LCD
MOV
A,R1
; tương tự
ADD
A,#30H
; xuất hàng chục lên LCD
ACALL WRITETEXT
MOV
A,#46
; mã ASCII của dấu “.”
ACALL WRITETEXT
; xuất kí tự lên LCD
MOV
A,R0
; xuất hàng đơn vị lên LCD
ADD
A,#30H
ACALL WRITETEXT
UPDATE:
MOV
A,#75
; mã ASCII của kí tự “K”
CALL
WRITETEXT
; xuất kí tự lên LCD
MOV
A,#71
; mã ASCII của kí tự “G”
CALL
WRITETEXT
; xuất kí tự lên LCD
MOV
R3,0H
; lấy giá trị hàng đơn vị lưu vào R3
CALL
READADC
; đọc ADC
CALL
DISPLAYADC
; tách số giá trị đọc được từ ADC
MOV
A,R3
; lấy giá trị hàng đơn vị cũ lưu vào A
CJNE
A,0H,MAIN
; giá trị cũ khác giá trị mới, xuất giá trị mới ra
SJMP
UPDATE
; giá trị cũ khác giá trị mới, tiếp tục đọc và so
MOV
A, #38H
; chương trình con cấu hình LCD
sánh
INIT_LCD:
ACALL WRITECOM
MOV
A, #0EH
ACALL WRITECOM
MOV
A, #06H
ACALL WRITECOM
MOV
A, #0CH
ACALL WRITECOM
RET
CLEAR:
MOV
A, #01H
; chương trình con xóa màn hình
ACALL WRITECOM
RET
WRITECOM:
MOV
DPTR, #LCDADDR
SETB
LCD_E
CLR
LCD_RS
; chương trình con viết lệnh lên LCD
MOVX @DPTR, A
CLR
LCD_E
ACALL WAIT_LCD
RET
WRITETEXT:
; chương trình con xuất kí tự lên LCD
MOV
DPTR, #LCDADDR
SETB
LCD_E
SETB
LCD_RS
MOVX @DPTR, A
CLR
LCD_E
ACALL WAIT_LCD
RET
DISPLAYSTRING:PUSH
0H
LOOP:
MOV
DPTR, #MESSAGE
; lấy địa chỉ của chuỗi
MOV
R0,A
; cất A vào R0
EXIT:
; chương trình con xuất chuỗi lên LCD
MOVC A,@A+DPTR
; lấy kí tự
JZ
EXIT
; kí tự = “0” thốt
ACALL WRITETEXT
; xuất kí tự lên LCD
MOV
A,R0
; lấy lại giá trị cũ
INC
A
; lấy kí tự tiếp theo
SJMP
LOOP
; lặp lại
POP
0H
; lấy lại R0
DPTR, #4000H
; nạp địa chỉ ADC vào DPTR
RET
READADC:
MOV
MOVX @DPTR, A
; bắt đầu chuyển đổi
ACALL DELAY_ADC
; chờ ADC
MOVX A, @DPTR
; đọc giá trị chuyển đổi
MOV
R0,A
; lưu vào R0
; chương trình con chờ LCD
RET
WAIT_LCD:
MOV
R6,#10
DL1:
MOV
R7, #250
DJNZ
R7, $
DJNZ
R6,DL1
RET
DELAY_ADC:
MOV
R4, #100
DJNZ
R4, $
; chương trình con chờ ADC
RET
DISPLAYADC:
MOV
A,R0
; chương trình con tách số giá trị đọc từ ADC
MOV
B,#10
; chia R0 cho 10
DIV
AB
MOV
R0, B
; hàng đơn vị
MOV
B,#10
; chia kết quả tiếp cho 10
DIV
AB
MOV
R1, B
; hàng chục
MOV
B,#10
; chia tiếp kết quả cho 10
DIV
AB
MOV
R2, B
; hàng trăm
RET
MESSAGE:
USD",0
DB "10.0 USD",0,"12.0 USD",0,"14.5 USD",0,"20.0 USD",0,"18.0 USD",0,"16.5
END
4B: Ấn phím P1.3 Để in kết quả trên mặt hiển thị LCD của cân lên màn hình máy tính .
MAIN:
DISPLAY:
LCD_E BIT
P3.4
LCD_RS BIT
P3.5
LCDADDR
EQU
6000H
ORG
2000H
MOV
SCON,#01000010B
; cho phép xuất serial port
MOV
TMOD,#20H
; cấu hình timer tạo baudrate
MOV
TL1,#-3
MOV
TH1,#-3
MOV
PCON,#80H
SETB
TR1
MOV
DPTR, #LCDADDR
; nạp địa chỉ LCD vào DPTR
ACALL CLEAR
; xóa màn hình
ACALL INIT_LCD
; cấu hình LCD
CALL
READADC
; đọc giá trị ADC
MOV
A,#0C0H
; xuống hàng 2 cột 0
CALL
WRITECOM
; viết lệnh lên LCD
CALL
SO_SANH
; gọi chương trình con so sánh
CALL
DISPLAYSTRING
; gọi chương trình con xuất chuỗi lên LCD
CALL
DISPLAYADC
; gọi chương trình con tách số ADC
MOV
A,#80H
; hàng 1 cột 1
CALL
WRITECOM
; viết lệnh lên LCD
MOV
A,R2
; lấy giá trị hàng trăm lưu vào A
JZ
NEXT
; nếu A = 0 bỏ qua không xuất lên LCD
ADD
NEXT:
A,#30H
; A khác 0, cộng với 30H để được mã ASCII
ACALL WRITETEXT
; xuất kí tự lên LCD
MOV
A,R1
; tương tự
ADD
A,#30H
; xuất hàng chục lên LCD
ACALL WRITETEXT
MOV
A,#46
; mã ASCII của dấu “.”
ACALL WRITETEXT
; xuất kí tự lên LCD
MOV
A,R0
; xuất hàng đơn vị lên LCD
ADD
A,#30H
ACALL WRITETEXT
TRANSMISS:
NEXT2:
MOV
A,#75
; mã ASCII của kí tự “K”
CALL
WRITETEXT
; xuất kí tự lên LCD
MOV
A,#71
; mã ASCII của kí tự “G”
CALL
WRITETEXT
; xuất kí tự lên LCD
SETB
P1.3
; đọc nút nhấn tại P1.3
JB
P1.3,UPDATE
; P1.3 =1 bỏ qua
CALL
DELAY_ADC
; gọi delay chống rung nút nhấn
JB
P1.3,UPDATE
; p1.3 = 1, bỏ qua
MOV
A,R2
; lưu hàng trăm vào A
JZ
NEXT2
; hàng trăm = 0, ko xuất
ADD
A,#30H
; cộng thêm 30H để được mã ASCII
CALL
PHAT
; phát ra màn hình máy tính
MOV
A,R1
; tương tự cho hàng chục
ADD
A,#30H
CALL
PHAT
PC_DISPLAY:
MOV
A,#46
; xuất dấu chấm “.” Ra màn hình máy tính
CALL
PHAT
MOV
A,R0
ADD
A,#30H
CALL
PHAT
MOV
A,#75
CALL
PHAT
MOV
A,#71
CALL
PHAT
MOV
A,#13
CALL
PHAT
CALL
READADC
; đọc ADC
CALL
SO_SANH
; gọi chương trình con so sánh
MOV
DPTR,#MESSAGE
; xuất chuỗi tương ứng với kết quả trả về A
PUSH
ACC
; tương tự cho hàng đơn vị
; xuất kí tự “K” Ra màn hình máy tính
; xuất kí tự “G” ra màn hình máy tính
; xuất “ENTER” xuống dịng
MOVC A,@A+DPTR
UPDATE:
sánh
JZ
UPDATE
CALL
PHAT
POP
ACC
INC
A
SJMP
PC_DISPLAY
MOV
R3,0H
; lấy giá trị hàng đơn vị lưu vào R3
CALL
READADC
; đọc ADC
CALL
DISPLAYADC
; tách số giá trị đọc được từ ADC
MOV
A,R3
; lấy giá trị hàng đơn vị cũ lưu vào A
CJNE
A,0H,MAIN
; giá trị cũ khác giá trị mới, xuất giá trị mới ra
SJMP
TRANSMISS
; giá trị cũ khác giá trị mới, tiếp tục đọc và so
INIT_LCD:
MOV
A, #38H
; chương trình con cấu hình LCD
ACALL WRITECOM
MOV
A, #0EH
ACALL WRITECOM
MOV
A, #06H
ACALL WRITECOM
MOV
A, #0CH
ACALL WRITECOM
RET
CLEAR:
MOV
A, #01H
; chương trình con xóa màn hình
ACALL WRITECOM
RET
WRITECOM:
MOV
DPTR, #LCDADDR
SETB
LCD_E
CLR
LCD_RS
; chương trình con viết lệnh lên LCD
MOVX @DPTR, A
CLR
LCD_E
ACALL WAIT_LCD
RET
WRITETEXT:
; chương trình con xuất kí tự lên LCD
MOV
DPTR, #LCDADDR
SETB
LCD_E
SETB
LCD_RS
MOVX @DPTR, A
CLR
LCD_E
ACALL WAIT_LCD
RET
DISPLAYSTRING:PUSH
0H
LOOP:
MOV
DPTR, #MESSAGE
; lấy địa chỉ của chuỗi
MOV
R0,A
; cất A vào R0
EXIT:
; chương trình con xuất chuỗi lên LCD
MOVC A,@A+DPTR
; lấy kí tự
JZ
EXIT
; kí tự = “0” thốt
ACALL WRITETEXT
; xuất kí tự lên LCD
MOV
A,R0
; lấy lại giá trị cũ
INC
A
; lấy kí tự tiếp theo
SJMP
LOOP
; lặp lại
POP
0H
; lấy lại R0
DPTR, #4000H
; nạp địa chỉ ADC vào DPTR
RET
READADC:
MOV
MOVX @DPTR, A
; bắt đầu chuyển đổi
ACALL DELAY_ADC
; chờ ADC
MOVX A, @DPTR
; đọc giá trị chuyển đổi
MOV
R0,A
; lưu vào R0
; chương trình con chờ LCD
RET
WAIT_LCD:
MOV
R6,#10
DL1:
MOV
R7, #250
DJNZ
R7, $
DJNZ
R6,DL1
RET
DELAY_ADC:
MOV
R4, #100
; chương trình con chờ ADC
DJNZ
R4, $
RET
DISPLAYADC:
MOV
A,R0
; chương trình con tách số giá trị đọc từ ADC
MOV
B,#10
; chia R0 cho 10
DIV
AB
MOV
R0, B
; hàng đơn vị
MOV
B,#10
; chia kết quả tiếp cho 10
DIV
AB
MOV
R1, B
; hàng chục
MOV
B,#10
; chia tiếp kết quả cho 10
DIV
AB
MOV
R2, B
; hàng trăm
CLR
TI
; xóa cờ TI
MOV
SBUF,A
; xuất data trong A ra serial port
JNB
TI, $
; chờ xuất xong
RET
PHAT:
RET
; return
SO_SANH:
RANK0:
RANK1:
CJNE
R0,#10,$+3
; so sánh R0 (giá trị đọc được từ ADC) với 10
JNC
RANK1
; R0 >= 10
MOV
A,#0
; R0 < 10, xuất string 1
SJMP
THOAT
CJNE
R0,#12,$+3
; so sánh R0 (giá trị đọc được từ ADC) với 12
JNC
RANK2
; R0 >= 12
MOV
A,#9
; R0 < 12, xuất string 2
SJMP
THOAT
RANK2:
CJNE
R0,#15,$+3
; so sánh R0 (giá trị đọc được từ ADC) với 15
JNC
RANK3
; R0 >= 15
MOV
A,#18
; R0 < 15, xuất string 3
SJMP
THOAT
CJNE
R0,#18,$+3
; so sánh R0 (giá trị đọc được từ ADC) với 18
JNC
RANK4
; R0 >= 18
MOV
A,#27
; R0 < 18,xuất string 4
SJMP
THOAT
CJNE
R0,#22,$+3
; so sánh R0 (giá trị đọc được từ ADC) với 22
JNC
RANK5
; R0 >= 22
MOV
A,#36
; R0 < 22, xuất string 5
SJMP
THOAT
RANK5:
MOV
A,#45
THOAT:
RET
MESSAGE:
USD",0
DB "10.0 USD",0,"12.0 USD",0,"14.5 USD",0,"20.0 USD",0,"18.0 USD",0,"16.5
RANK3:
RANK4:
; xuất string 6
END
Bài tập 5 :
Hãy thực hiện bài tập 4A Nhưng tự thiết kế phần cứng.Thiết kế sơ đồ phần cứng trên Proteus Và
chạy mô phỏng trên phần mềm này. Khi viết chương trình khơng dùng lệnh MOVX và khơng dùng
phần cứng của kit thí nghiệm .
Thiết kế phần cứng:
Code:
LCD_E
BIT P3.1
LCD_RS
BIT P3.0
START
BIT P3.2
OE
BIT P3.3
EOC
BIT P3.4
ORG
0000H
MAIN:
ACALL CLEAR
; xóa màn hình
ACALL INIT_LCD
; cấu hình LCD
CALL
READADC
; đọc ADC
MOV
A,#0C0H
; xuống hàng 2 cột 1
RANK0:
RANK1:
RANK2:
RANK3:
RANK4:
RANK5:
CALL
WRITECOM
; ghi lệnh lên LCD
CJNE
R0,#10,$+3
; so sánh R0(giá trị đọc từ ADC) với 10
JNC
RANK1
; R0 >= 10
MOV
A,#0
; R0 < 10, xuất chuỗi 1
SJMP
DISPLAY
CJNE
R0,#12,$+3
; so sánh R0(giá trị đọc từ ADC) với 12
JNC
RANK2
; R0 >= 12
MOV
A,#9
; R0 < 12, xuất chuỗi 2
SJMP
DISPLAY
CJNE
R0,#15,$+3
; so sánh R0(giá trị đọc từ ADC) với 15
JNC
RANK3
; R0 >= 15
MOV
A,#18
; R0 < 15, xuất chuỗi 3
SJMP
DISPLAY
CJNE
R0,#18,$+3
; so sánh R0(giá trị đọc từ ADC) với 18
JNC
RANK4
; R0 >= 18
MOV
A,#27
; R0 < 18, xuất chuỗi 4
SJMP
DISPLAY
CJNE
R0,#22,$+3
; so sánh R0(giá trị đọc từ ADC) với 22
JNC
RANK5
; R0 >= 22
MOV
A,#36
; R0 < 22, xuất chuỗi 5
SJMP
DISPLAY
MOV
A,#45
; xuất chuỗi 6
DISPLAY:
NEXT:
CALL
DISPLAYSTRING
; xuất chuỗi ra LCD
CALL
DISPLAYADC
; tách số từ giá trị đọc từ ADC
MOV
A,#80H
; hàng 1 cột1
CALL
WRITECOM
; viết lệnh lên LCD
MOV
A,R2
; lưu hàng trăm vào A
JZ
NEXT
; hàng trăm = 0, ko xuất hàng trăn
ADD
A,#30H
; khác 0, cộng với 30H để được mã ASCII
ACALL WRITETEXT
; viết kí tự lên LCD
MOV
A,R1
; tương tự xuất hàng chục lên LCD
ADD
A,#30H
ACALL WRITETEXT
MOV
A,#46
; xuất kí tự dấu chấm “.” Lên LCD
ACALL WRITETEXT
MOV
A,R0
ADD
A,#30H
; xuất hàng đơn vị lên LCD
ACALL WRITETEXT
UPDATE:
MOV
A,#75
; xuất kí tự “K” lên LCD
CALL
WRITETEXT
MOV
A,#71
CALL
WRITETEXT
MOV
R3,0H
; lưu giá trị đơn vị cũ vào R3
CALL
READADC
; đọc ADC
; xuất kí tự “G” lên LCD
INIT_LCD:
CALL
DISPLAYADC
; tách số của giá trị đọc được từ ADC
MOV
A,R3
; lưu giá trị cũ vào A
CJNE
A,0H,MAIN
; giá trị cũ khác giá trị mới, xuất giá trị mới
SJMP
UPDATE
; giá trị cũ = giá trị mới, kiểm tra lại
MOV
A, #38H
; chương trình con cấu hình LCD
ACALL WRITECOM
MOV
A, #0EH
ACALL WRITECOM
MOV
A, #06H
ACALL WRITECOM
MOV A, #0CH
ACALL WRITECOM
RET
CLEAR:
MOV
A, #01H
; chương trình con xóa màn hình
ACALL WRITECOM
RET
WRITECOM:
; chương trình con viết lệnh lên LCD
SETB
LCD_E
CLR
LCD_RS
MOV
P2, A
CLR
LCD_E
ACALL WAIT_LCD
RET
WRITETEXT:
; chương trình con viết kí tự lên LCD
SETB
LCD_E
SETB
LCD_RS