You are on page 1of 49

ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH

ĐẠI HỌC BÁCH KHOA



BÁO CÁO VI XỬ LÝ

LỚP L06 HK 221

NGÀY NỘP 14/12/2022

Giảng viên hướng dẫn: Thầy Phạm Quang Thời

Sinh viên thực hiện Mã số sinh viên Điểm số

Nguyễn Tuấn Hưng 2011336

Thành phố Hồ Chí Minh – 2022


Bài 1: Thí nghiệm với nút nhấn
THÍ NGHIỆM 1: Đọc liên tục giá trị của nút nhấn P1.0 và xuất ra P3.0
ORG 2000H
LOOP: MOV C,P1.0 ; đọc nút nhấn
MOV P3.0, C ; xuất ra LED
SJMP LOOP
END
THÍ NGHIỆM 2: Viết chương trình tạo sóng tại P3.0

ORG 2000H

MAIN:

CPL P3.0

JMP MAIN

END

THÍ NGHIỆM 3: Viết chương trình tạo xung vuông 1 Khz, chu kỳ nhiệm vụ
50% trên P3.0.
F = 1Khz => T = 1 ms
Chu kỳ nhiệm vụ 50%
Tcao = Tthấp = 0.5 ms = 500us = 500 MC
Tdelay = 2 * 250 = 500 MC

ORG 2000H

MAIN:

CPL P3.0

ACALL DELAY_500US
SJMP MAIN

DELAY_500US

MOV R1, #250

DJNZ R1, $

RET

END

THÍ NGHIỆM 4: Viết chương trình con Delay1sIns và dùng chương trình con
này để chớp/tắt LED đơn gắn vào P1.0 sau mỗi khoảng thời gian 1s.
ORG 2000H
MAIN:
CPL P1.0
ACALL DELAY_1S
SJMP MAIN
DELAY_1S:
MOV R0, #8
L2: MOV R1, #250
L1: MOV R2, #250
DJNZ R2, $
DJNZ R1, L1
DJNZ R0, L2
RET
END
THÍ NGHIỆM 5: Viết chương trình tạo hiệu ứng quay LED: các LED đơn trên
BARLED1 sáng lần lượt từ trái sang phải sau thời gian 1s và lặp lại. Sử dụng
chương trình con 1s đã viết ở trên.
Mô tả chương trình:
Ban đầu tất cả các led đều tắt.
Sau 1s Led P1.7 sẽ sáng, sau 1s tiếp theo thì đến led P1.6 sẽ sáng, P1.7 vẫn sáng.
Làm tuần tự đến tất cả led đều sáng thì Reset lại chương trình.
ORG 2000H
MAIN:
MOV A, #11111110B
MOV R1,#8
LOOP:
MOV P1, A
ACALL DELAY_1S
RL A
CLR ACC.0
DJNZ R1, LOOP
SJMP MAIN
DELAY_1S:
MOV R5, #8
L2: MOV R6, #250
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
DJNZ R5, L2
RET
END
THÍ NGHIỆM 6: Viết chương trình theo mô tả sau:
Ban đầu: Tất cả led đều tắt
Sau 1s đầu thì led P1.7 sáng và tất cả các led còn đều tắt. Sau 1s kế tiếp led P1.6
sáng và tất cả các led còn đều tắt. Sau 1s nữa thì led P1.5 sáng và tất cả các led
còn đều tắt. Làm tuân tự đến led P1.0 và Reset quá trình.
ORG 2000H
MAIN:
MOV A, #11111110B
MOV R1,#8
LOOP:
MOV P1, A
ACALL DELAY_1S
RL A
DJNZ R1, LOOP
SJMP MAIN
DELAY_1S:
MOV R5, #8
L2: MOV R6, #250
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
DJNZ R5, L2
RET
END
THÍ NGHIỆM 7: Nhấn nút P1.0 thì led chạy như câu 5. Nhấn nút P1.1 thì led
như câu 6.
ORG 2000H
MAIN:
MOV A,P1
JNB ACC.0, CAU_5
JNB ACC.1, CAU_6
SJMP MAIN
CAU_5:
MOV A, #11111110B
MOV R1,#8
LOOP:
MOV P1, A
ACALL DELAY_1S
RL A
CLR ACC.0
DJNZ R1, LOOP
MOV A, #11111111B
MOV P1,A
RET
CAU_6:
MOV A, #11111110B
MOV R1,#8
LOOP_CAU_6:
MOV P1, A
ACALL DELAY_1S
RL A
DJNZ R1,LOOP_CAU_6
MOV A, #11111111B
MOV P1,A
RET
DELAY_1S:
MOV R5, #8
L2: MOV R6, #250
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
DJNZ R5, L2
RET
END

BÀI 2: Led 7 đoạn


THÍ NGHIỆM 0: Viết chương trình con DisplayLed0 hiển thị lên LED 7 đoạn
số 0 giá trị chứa trong thanh ghi R0

DISPLAYLED0:

MOV DPTR,#0000H

MOV A,#11101111B

ORL A, R0

MOVX @DPTR, A

RET
THÍ NGHIỆM 1: Viết chương trình chính hiển thị số 9 lên LED 7 đoạn số 0
bằng cách cho R0 bằng 9 và gọi chương trình con DisplayLed0.

ORG 2000H

MOV R0,#9

ACALL DISPLAYLED0

SJMP $

DISPLAYLED0:

MOV DPTR,#0000H

MOV A, #11100000B

ORL A,R0

MOVX @DPTR, A

RET

END

THÍ NGHIỆM 2: Viết chương trình hiển thị lên LED 7 đoạn số 0 các con số từ
0 đến 9 sau các khoảng thời gian 1s.
ORG 2000H
MAIN:
MOV R0,#0
MOV R1,#10
DISPLAY_FROM_0_TO_9:
ACALL DISPLAYLED0
ACALL DELAY_1S
INC R0
DJNZ R1, DISPLAY_FROM_0_TO_9
SJMP MAIN
DELAY_1S:
MOV R5, #8
L2: MOV R6, #250
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
DJNZ R5, L2
RET
DISPLAYLED0:
MOV DPTR,#0000H
MOV A, #11100000B
ORL A,R0
MOVX @DPTR, A
RET
END
THÍ NGHIỆM 3: Viết chương trình con DisplayLED xuất giá trị chứa trong
thanh ghi R0 lên LED 7 đoạn có số thứ tự chứa trong thanh ghi R1.
R0 nằm trong tầm từ 0-9 và R1 trong tầm từ 0-3.
Sau đó dùng chương trình con này viết chương trình chính xuất giá trị 1 lên
LED 7 đoạn số 3.
DisplayLED:
MOV B, R1
MOV A,#11101111B
LOOP:
RL A
DJNZ B, LOOP
ANL A, #0F0H

PUSH ACC

MOV A, R0

ANL A, #0FH

MOV R0, A

POP ACC

ORL A, R0

MOV DPTR,#0000H

MOVX @DPTR, A

RET

ORG 2000H
MOV R0,#1
MOV R1,#3
ACALL DisplayLED
SJMP $
DisplayLED:
MOV B, R1
MOV A,#11101111B
LOOP:
RL A
DJNZ B, LOOP
ANL A, #0F0H
PUSH ACC
MOV A, R0
ANL A, #0FH
MOV R0, A
POP ACC
ORL A, R0
MOV DPTR,#0000H
MOVX @DPTR, A
RET
END

THÍ NGHIỆM 4:Viết chương trình hiển thị số 1 lên LED7 đoạn 0, sau đó 1s
hiển thị số 2 lên LED 7 đoạn 1, sau đó 1s hiển thị số 3 lên LED 7 đoạn 2, sau đó
1s hiển thị số 4 lên LED 7 đoạn 3. Quá trình này lặp đi lặp lại. Việc hiển thị này
sử dụng chương trình con DisplayLED đã viết ở trên.
ORG 2000H
RESET:
MOV R0,#1
MOV R1,#0
MOV R2,#4
MAIN:
ACALL DisplayLED
ACALL DELAY_1S
INC R0
INC R1
DJNZ R2, MAIN
SJMP RESET
DisplayLED:
MOV A,#11101111B
MOV B,R1
LOOP:
RL A
DJNZ B, LOOP
ANL A, #0F0H
PUSHACC
MOV A, R0
ANL A, #0FH
MOV R0, A
POP ACC
ORL A, R0
MOV DPTR,#0000H
MOVX @DPTR, A
RET
DELAY_1S:
MOV R5, #8
L2: MOV R6, #250
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
DJNZ R5, L2
RET
END
Giảm thời gian trễ xuống còn 100 ms.
ORG 2000H
RESET:
MOV R0,#1
MOV R1,#0
MOV R2,#4
MAIN:
ACALL DisplayLED
ACALL DELAY_100MS
MOV DPTR,#0000H
MOVX @DPTR, A
INC R0
INC R1
DJNZ R2, MAIN
SJMP RESET
DisplayLED:
MOV A,#11101111B
MOV B,R1
LOOP:
RL A
DJNZ B, LOOP
ANL A, #0F0H
PUSHACC
MOV A, R0
ANL A, #0FH
MOV R0, A
POP ACC
ORL A, R0
RET
DELAY_100MS:
L2: MOV R6, #200
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
RET
END
Câu 5: Viết chương trình đếm từ 1 đến 100 bằng phương pháp quét Led
ORG 2000H
RESET_ALL:
MOV R3,#0
RESET:
MOV R4,#160
MAIN:
// TÁCH SỐ ĐƠN VỊ CHỤC TRĂM.
CJNE R3,#10,$+3
JC DON_VI
CJNE R3,#100,$+3
JC CHUC
TRAM:
MOV A, R3
MOV B,#100
DIV AB
MOV R0,A
MOV R2,B
MOV R1,#2
ACALL DisplayLED
ACALL DELAY_2MS
MOV A, R2
MOV R3,A
CHUC:
MOV A, R3
MOV B,#10
DIV AB
MOV R0,A
MOV R2,B
MOV R1,#1
ACALL DisplayLED
ACALL DELAY_2MS
MOV A,R2
DON_VI:
MOV A, R3
MOV B,#10
DIV AB
MOV R0,B
MOV R1,#0
ACALL DisplayLED
ACALL DELAY_2MS
DJNZ R4, MAIN
INC R3
CJNE R3,#101, $+3
JC RESET
SJMP RESET_ALL
//
DisplayLED:
MOV B, R1
MOV A,#11101111B
LOOP:
RL A
DJNZ B, LOOP
ANL A, #0F0H
PUSH ACC
MOV A, R0
ANL A, #0FH
MOV R0, A
POP ACC
ORL A, R0
MOV DPTR,#0000H
MOVX @DPTR, A
RET
//
DELAY_2MS:
MOV R6, #4
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
RET
END
Bài 3: Làm quen với LCD
THÍ NGHIỆM 1: Chạy mẫu đoạn code

LCD_E BIT P3.3 ;Định nghĩa LCD_E là chân P3.3

LCD_RS BIT P3.5 ;Định nghĩa LCD_RS là chân P3.5

LCDADDR EQU 6000H ;Định nghĩa LCDADDR là 6000H

ORG 2000H

MAIN:

MOV @R0, 30H

MOV DPTR, #LCDADDR

ACALL CLEAR

ACALL INIT_LCD

ACALL DISPLAYSTRING

SJMP $

INIT_LCD: ;Các dòng lệnh cấu hình LCD ban đầu

MOV A, #38H

ACALL WRITECOM

MOV A, #0EH

ACALL WRITECOM

MOV A, #06H

ACALL WRITECOM

RET

CLEAR: ; Hàm con xóa màn hình LCD

MOV A, #01H

ACALL WRITECOM

RET

WRITECOM: ;Hàm con ghi lệnh


MOV DPTR, #LCDADDR

SETB LCD_E

CLR LCD_RS

MOVX @DPTR, A

CLR LCD_E

ACALL WAIT_LCD

RET

WRITETEXT:; Hàm con ghi kí tự

MOV DPTR, #LCDADDR

SETB LCD_E

SETB LCD_RS

MOVX @DPTR, A

CLR LCD_E

ACALL WAIT_LCD

RET

DISPLAYSTRING: ; Hàm con xuất chuỗi ký tự bằng cách tra bảng

MOV A,#0

LOOP:

MOV DPTR, #MESSAGE

MOV R0,A

MOVC A,@A+DPTR

JZ EXIT

ACALL WRITETEXT

MOV A,R0

INC A

DJNZ B, LOOP
EXIT:

RET

WAIT_LCD: ;Hàm con delay cho LCD

MOV R6,#10

DL1:

MOV R7, #250

DJNZ R7, $

DJNZ R6,DL1

RET

MESSAGE:

DB "HELLO WORLD!",0
END
THÍ NGHIỆM 2: Viết “NGUYEN TUAN HUNG” và “NHOM 2” canh giữa.

LCD_E BIT P3.3

LCD_RS BIT P3.5

LCDADDR EQU 6000H

ORG 2000H

MAIN:

MOV DPTR, #LCDADDR

ACALL CLEAR

ACALL INIT_LCD

CLR F0

ACALL DISPLAYSTRING

SETB F0

ACALL DISPLAYSTRING

SJMP $
INIT_LCD:

MOV A,#38H

ACALL WRITECOM

MOV A, #0EH

ACALL WRITECOM

MOV A,#06H

ACALL WRITECOM

RET

CLEAR:

MOV A, #01H

ACALL WRITECOM

RET

WRITECOM:

MOV DPTR,#LCDADDR

SETB LCD_E

CLR LCD_RS

MOVX @DPTR, A

CLR LCD_E

ACALL WAIT_LCD

RET

WRITETEXT:

MOV DPTR,#LCDADDR

SETB LCD_E

SETB LCD_RS

MOVX @DPTR, A

CLR LCD_E
ACALL WAIT_LCD

RET

WAIT_LCD:

MOV R5, #10

L1: MOV R6, #250

DJNZ R6,$

DJNZ R5, L1

RET

DISPLAYSTRING:

ACALL COUNT

JB F0,HAI

MOV R0,#1H

SJMP TT_1

HAI: MOV R0,#2H

TT_1:

ACALL GOTOXY

MOV A,#0H

LOOP:

JB F0, HANG_2

MOV DPTR,#TEN

SJMP TT_2

HANG_2: MOV DPTR,#NHOM

TT_2:

MOV R0,A
MOVC A,@A+DPTR

JZ EXIT

ACALL WRITETEXT

MOV A,R0

INC A

DJNZ B, LOOP

EXIT:

RET

GOTOXY:

CJNE R0,#1H, DONG_2

MOV A,#80H

SJMP TT_3

DONG_2: MOV A,#0C0H

TT_3 :

ADD A,R1

ACALL WRITECOM

RET

COUNT:

MOV A,#0

GG: JB F0, A1

MOV DPTR, #TEN

SJMP TT

A1: MOV DPTR, #NHOM

TT:
MOV R1,A

MOVC A,@A+DPTR

JZ THOAT

MOV A, R1

INC A

DJNZ B ,GG

THOAT :

MOV A, R1

CPL A

INC A

ADD A,#16

MOV B,#2

DIV AB

MOV R1,A

RET

TEN: DB 'NGUYEN TUAN HUNG,0

NHOM: DB 'NHOM 2',0

END

THÍ NGHIỆM 3: Viết nội quy lên LCD.

LCD_E BIT P3.3 ;Ð?nh nghia LCD_E là chân P3.3

LCD_RS BIT P3.5 ;Ð?nh nghia LCD_RS là chân P3.5

LCDADDR EQU 6000H ;Ð?nh nghia LCDADDR là 6000H

ORG 2000H

MAIN:

MOV @R0, 30H


MOV DPTR, #LCDADDR

ACALL CLEAR

ACALL INIT_LCD

// Viết dòng “NỘI QUY”

MOV A,#82H

ACALL WRITECOM

ACALL DISPLAYSTRING_1

// Viết nội quy 1:

MOV A,#0C0H

ACALL WRITECOM

ACALL DISPLAYSTRING_2

ACALL DELAY_1S

ACALL XOA_DONG_2

MOV A,#0C0H

ACALL WRITECOM

ACALL DISPLAYSTRING_3

ACALL DELAY_1S

ACALL XOA_DONG_2

// Viết nội quy 2:

MOV A,#0C0H

ACALL WRITECOM

ACALL DISPLAYSTRING_4

ACALL DELAY_1S

ACALL XOA_DONG_2
MOV A,#0C0H

ACALL WRITECOM

ACALL DISPLAYSTRING_5

ACALL DELAY_1S

ACALL XOA_DONG_2

// Viết nội quy 3

MOV A,#0C0H

ACALL WRITECOM

ACALL DISPLAYSTRING_6

ACALL DELAY_1S

ACALL XOA_DONG_2

MOV A,#0C0H

ACALL WRITECOM

ACALL DISPLAYSTRING_7

ACALL DELAY_1S

ACALL XOA_DONG_2

SJMP MAIN

XOA_DONG_2:

MOV A,#0C0H

ACALL WRITECOM

ACALL DISPLAYSTRING_8

RET

INIT_LCD: ;Các dòng l?nh c?u hình LCD ban d?u

MOV A, #38H

ACALL WRITECOM
MOV A, #0EH

ACALL WRITECOM

MOV A, #06H

ACALL WRITECOM

RET

CLEAR: ; Hàm con xóa màn hình LCD

MOV A, #01H

ACALL WRITECOM

RET

WRITECOM: ;Hàm con ghi l?nh

MOV DPTR, #LCDADDR

SETB LCD_E

CLR LCD_RS

MOVX @DPTR, A

CLR LCD_E

ACALL WAIT_LCD

RET

WRITETEXT:; Hàm con ghi kí t?

MOV DPTR, #LCDADDR

SETB LCD_E

SETB LCD_RS

MOVX @DPTR, A

CLR LCD_E

ACALL WAIT_LCD

RET

DISPLAYSTRING_1: ; Hàm con xu?t chu?i ký t? b?ng cách tra b?ng


MOV A,#0

LOOP_1:

MOV DPTR, #MESSAGE_1

MOV R0,A

MOVC A,@A+DPTR

JZ EXIT_1

ACALL WRITETEXT

MOV A,R0

INC A

DJNZ B, LOOP_1

EXIT_1:

RET

DISPLAYSTRING_2: ; Hàm con xu?t chu?i ký t? b?ng cách tra b?ng

MOV A,#0

LOOP_2:

MOV DPTR, #MESSAGE_2

MOV R0,A

MOVC A,@A+DPTR

JZ EXIT_2

ACALL WRITETEXT

MOV A,R0

INC A

DJNZ B, LOOP_2

EXIT_2:

RET

DISPLAYSTRING_3: ; Hàm con xu?t chu?i ký t? b?ng cách tra b?ng


MOV A,#0

LOOP_3:

MOV DPTR, #MESSAGE_3

MOV R0,A

MOVC A,@A+DPTR

JZ EXIT_3

ACALL WRITETEXT

MOV A,R0

INC A

DJNZ B, LOOP_3

EXIT_3:

RET

DISPLAYSTRING_4: ; Hàm con xu?t chu?i ký t? b?ng cách tra b?ng

MOV A,#0

LOOP_4:

MOV DPTR, #MESSAGE_4

MOV R0,A

MOVC A,@A+DPTR

JZ EXIT_4

ACALL WRITETEXT

MOV A,R0

INC A

DJNZ B, LOOP_4

EXIT_4:

RET

DISPLAYSTRING_5: ; Hàm con xu?t chu?i ký t? b?ng cách tra b?ng


MOV A,#0

LOOP_5:

MOV DPTR, #MESSAGE_5

MOV R0,A

MOVC A,@A+DPTR

JZ EXIT_5

ACALL WRITETEXT

MOV A,R0

INC A

DJNZ B, LOOP_5

EXIT_5:

RET

DISPLAYSTRING_6: ; Hàm con xu?t chu?i ký t? b?ng cách tra b?ng

MOV A,#0

LOOP_6:

MOV DPTR, #MESSAGE_6

MOV R0,A

MOVC A,@A+DPTR

JZ EXIT_6

ACALL WRITETEXT

MOV A,R0

INC A

DJNZ B, LOOP_6

EXIT_6:

RET

DISPLAYSTRING_7: ; Hàm con xu?t chu?i ký t? b?ng cách tra b?ng


MOV A,#0

LOOP_7:

MOV DPTR, #MESSAGE_7

MOV R0,A

MOVC A,@A+DPTR

JZ EXIT_7

ACALL WRITETEXT

MOV A,R0

INC A

DJNZ B, LOOP_7

EXIT_7:

RET

DISPLAYSTRING_8: ; Hàm con xu?t chu?i ký t? b?ng cách tra b?ng

MOV A,#0

LOOP_8:

MOV DPTR, #MESSAGE_8

MOV R0,A

MOVC A,@A+DPTR

JZ EXIT_8

ACALL WRITETEXT

MOV A,R0

INC A

DJNZ B, LOOP_8

EXIT_8:

RET

WAIT_LCD: ;Hàm con delay cho LCD


MOV R6,#50

DL1:

MOV R7, #250

DJNZ R7, $

DJNZ R6,DL1

RET

DELAY_1S:

MOV R5,#8

L2:MOV R6,#250

L1:MOV R7,#250

DJNZ R7,$

DJNZ R6, L1

DJNZ R5, L2

RET

MESSAGE_1:

DB 'NOI QUY PTN’',0

MESSAGE_2:

DB '1. DI HOC DUNG',0

MESSAGE_3:

DB 'GIO',0

MESSAGE_4:

DB '2. PHAI CHUAN BI',0

MESSAGE_5:

DB 'BAI ',0

MESSAGE_6:

DB '3. KHONG DUNG',0


MESSAGE_7:

DB 'DIEN THOAI',0

MESSAGE_8:

DB ' ',0
END

Bài 4: Làm quen với ADC và Timer


THÍ NGHIỆM 1: Xuất giá trị trên ADC lên Port 1

ADCADDR EQU 4000H


ORG 2000H
MAIN:
MOV DPTR,#ADCADDR ;Start ADC

MOVX @DPTR,A

ACALL WAIT_LCD ;EOC

MOVX A,@DPTR ;OE

MOV R0,A

MOV P1,A

SJMP MAIN

WAIT_LCD:

MOV R6,#10

DL1:

MOV R7, #250

DJNZ R7, $

DJNZ R6,DL1

RET
END
THÍ NGHIỆM 2: Xuất giá trị ADC lên LCD

LCD_E BIT P3.3

LCD_RS BIT P3.5

LCDADDR EQU 6000H

ADCADDR EQU 4000H

ORG 0

MAIN:

ACALL READADC

PUSH ACC

ACALL CLEAR

ACALL INIT_LCD

ACALL DISPLAYSTRING

MOV A,#0C0H

ACALL WRITECOM

POP ACC

CJNE A,#10,$+3

JC DON_VI

CJNE A,#100,$+3

JC CHUC

TRAM:

MOV B,#100

DIV AB

ADD A,#30H

CALL WRITETEXT

MOV A,B

CHUC:
MOV B,#10

DIV AB

ADD A,#30H

CALL WRITETEXT

MOV A,B

DON_VI:

ADD A,#30H

CALL WRITETEXT

SJMP $

READADC:

MOV DPTR,#ADCADDR ;Start ADC

MOV A,#0

MOVX @DPTR,A

ACALL WAIT_LCD ;EOC

MOVX A,@DPTR ;OE

MOV R0,A

MOV P1,A

RET

INIT_LCD:

MOV A,#38H

ACALL WRITECOM

MOV A,#0CH

ACALL WRITECOM

MOV A,#06H

ACALL WRITECOM
RET

CLEAR:

MOV A,#01H

ACALL WRITECOM

RET

WRITECOM:

MOV DPTR,#LCDADDR

SETB LCD_E

CLR LCD_RS

MOVX @DPTR, A

CLR LCD_E

ACALL WAIT_LCD

RET

WRITETEXT:

MOV DPTR,#LCDADDR

SETB LCD_E

SETB LCD_RS

MOVX @DPTR, A

CLR LCD_E

ACALL WAIT_LCD

RET

WAIT_LCD:
MOV R6,#10

DL1:

MOV R7, #250

DJNZ R7, $

DJNZ R6,DL1

RET

DISPLAYSTRING:

MOV A,#0

LOOP:

MOV DPTR, #MESSAGE

MOV R0,A

MOVC A,@A+DPTR

JZ EXIT

ACALL WRITETEXT

MOV A,R0

INC A

SJMP LOOP

EXIT:

RET

MESSAGE: DB 'Gia tri kenh 0: ',0


END

THÍ NGHIỆM 3: Xuất giá trị điện áp lên ADC


LCD_E BIT P3.3
LCD_RS BIT P3.5
LCDADDR EQU 6000H
ADCADDR EQU 4000H
ORG 0
MAIN:
ACALL READADC
PUSH ACC
ACALL CLEAR
ACALL INIT_LCD
ACALL DISPLAYSTRING
MOV A,#0C0H
ACALL WRITECOM
POP ACC
MOV B,#5
MUL AB
PUSHACC
ACALL HIEN_THI
MOV A,#'.'
CALL WRITETEXT
MOV R5,#6
LP: POP ACC
MOV B,#10
MUL AB
PUSHACC
ACALL HIEN_THI
DJNZ R5, LP
SJMP $
HIEN_THI:
MOV A,B
ADD A,#30H
CALL WRITETEXT
RET
READADC:
MOV DPTR,#ADCADDR ;Start ADC
MOV A,#0
MOVX @DPTR,A
ACALL WAIT_LCD ;EOC
MOVX A,@DPTR ;OE
MOV R0,A
MOV P1,A
RET

INIT_LCD:
MOV A,#38H
ACALL WRITECOM
MOV A,#0CH
ACALL WRITECOM
MOV A,#06H
ACALL WRITECOM
RET

CLEAR:
MOV A,#01H
ACALL WRITECOM
RET

WRITECOM:
MOV DPTR,#LCDADDR
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET

WRITETEXT:
MOV DPTR,#LCDADDR
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET

WAIT_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
DISPLAYSTRING:
MOV A,#0
LOOP:
MOV DPTR, #MESSAGE
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT
ACALL WRITETEXT
MOV A,R0
INC A
SJMP LOOP
EXIT:
RET

MESSAGE: DB 'Gia tri kenh 0: ',0


END

THÍ NGHIỆM 4: Viết chương trình tạo sóng vuông 1 Hhz trên chân P1.0 sử
dụng timer 0 ở chế độ 1
T = 1S => TCAO = 0.5s.
ORG 2000H
MAIN:
CPL P1.0
ACALL DELAY
SJMP MAIN
DELAY:
MOV R7,#10
LOOP:
MOV TMOD,#01H
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SET TR0
JNB TF0,$
CLR TR0
CLR TF0
DJNZ R7, LOOP
RET

THÍ NGHIỆM 5: Viết chương trình tạo sóng vuông 1 Hhz trên chân P1.0 sử
dụng timer 0 ở chế độ 2
ORG 2000H
MAIN:
ACALL DELAY
CPL P1.0
SJMP MAIN
DELAY:
MOV TMOD,#02H
MOV TH0,#(-250)
MOV R6,#10
L2:
MOV R7,#200
L1:
SETB TR0
JNB TF0,$
DJNZ R7,L1
DJNZ R6,L2
RET
END

Bài 5: Làm quen với Seriport


THÍ NGHIỆM 1: Xuất port nối tiếp ra P1
ORG 2000H
MOV SCON,#50H
MOV PCON,#80H
MOV TMOD,#20H
MOV TH1,#(-3)
SETB TR1
MAIN:
ACALL THU
MOV P1,A
ACALL PHAT
SJMP MAIN
THU:
JNB RI,$
CLR RI
MOV A, SBUF
RET
PHAT:
MOV A, SBUF
JNB TI,$
CLR TI
MOV SBUF,A
RET
END
THÍ NGHIỆM 2: Đưa lên 1 ký tự truyền từ bàn phìm lên LCD.
LCD_E BIT P3.3 ;Định nghĩa LCD_E là chân P3.3
LCD_RS BIT P3.5 ;Định nghĩa LCD_RS là chân P3.5
LCDADDR EQU 6000H ;Định nghĩa LCDADDR là 6000H
ORG 2000H
MAIN:
MOV DPTR, #LCDADDR
ACALL CLEAR
ACALL INIT_LCD
ACALL THU
MOV R4,A
ACALL PHAT
MOV A,80H
ACALL WRITECOM
MOV A,R4
ACALL WRITETEXT
SJMP MAIN
THU:
JNB RI,$
CLR RI
MOV A, SBUF
RET
PHAT:
MOV A, SBUF
JNB TI,$
CLR TI
MOV SBUF,A
RET
INIT_LCD: ;Các dòng lệnh cấu hình LCD ban đầu
MOV A, #38H
ACALL WRITECOM
MOV A, #0EH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
RET
CLEAR: ; Hàm con xóa màn hình LCD
MOV A, #01H
ACALL WRITECOM
RET
WRITECOM: ;Hàm con ghi lệnh
MOV DPTR, #LCDADDR
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WRITETEXT: ; Hàm con ghi kí tự
MOV DPTR, #LCDADDR
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WAIT_LCD: ;Hàm con delay cho LCD
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
END
THÍ NGHIỆM 3: Đưa lên 1 chuỗi ký tự truyền từ bàn phìm lên LCD.
LCD_E BIT P3.3 ;Định nghĩa LCD_E là chân P3.3
LCD_RS BIT P3.5 ;Định nghĩa LCD_RS là chân P3.5
LCDADDR EQU 6000H ;Định nghĩa LCDADDR là 6000H
ORG 2000H
MAIN:
MOV DPTR, #LCDADDR
ACALL CLEAR
ACALL INIT_LCD
ACALL THU
MOV R1,#0
MOV R4,A
ACALL PHAT
DONG_1:
MOV A,#80H
ADD A,R1
ACALL WRITECOM
MOV A,R4
CJNE A, #08H, XOA_1
ACALL WRITETEXT
MOV A,#06H
ACALL WRITECOM
INC R1
CJNE R1,#17,$+3
JC DONG_1
MOV R1,#0

DONG_2:
MOV A,#0C0H
ADD A,R1
ACALL WRITECOM
MOV A,R4
CJNE A, #08H, XOA_2
ACALL WRITETEXT
MOV A,#06H
ACALL WRITECOM
INC R1
CJNE R1,#17,$+3
JC DONG_2
SJMP MAIN
THU:
JNB RI,$
CLR RI
MOV A, SBUF
RET
PHAT:
MOV A, SBUF
JNB TI,$
CLR TI
MOV SBUF,A
RET
XOA_1:
DEC A
DEC R1
ACALL WRITECOM
MOV A,#” ”
ACALL WRITETEXT
SJMP DONG_1
RET
XOA_2:
DEC A
DEC R1
ACALL WRITECOM
MOV A,#” ”
ACALL WRITETEXT
SJMP DONG_2
RET
INIT_LCD: ;Các dòng lệnh cấu hình LCD ban đầu
MOV A, #38H
ACALL WRITECOM
MOV A, #0EH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
RET
CLEAR: ; Hàm con xóa màn hình LCD
MOV A, #01H
ACALL WRITECOM
RET
WRITECOM: ;Hàm con ghi lệnh
MOV DPTR, #LCDADDR
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WRITETEXT: ; Hàm con ghi kí tự
MOV DPTR, #LCDADDR
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WAIT_LCD: ;Hàm con delay cho LCD
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
END

You might also like