TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
BÁO CÁO
THÍ NGHIỆM VI XỬ LÝ
Giáo viên hướng dẫn: PHẠM ĐĂNG LÂM
Nhóm: L18
Sinh viên thực hiện:
1. Lương Trần Duy
2. Nguyễn Đình Trọng
3. Hồ Ngọc Uyên
4. Nguyễn Văn Trung
1510462
1513701
1513983
1513739
1
BÀI TN 1:LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ LED
Thí nghiệm 1: Viết chương trình thực hiện việc đọc liên tục trạng thái của nút nhấn
được nối đến P1.0 và hiển thị ra led được nối tại chân P3.0 (bit thứ 0 của led thanh
BL202).
ORG 2000H
LAP: MOV C, P1.0
MOV P3.0, C
SJMP LAP
END
Thínghiệm 3:Viết chương trình tạo xung vng 1 Khz, chu kỳ nhiệm vụ 50% trên
P3.0
ORG 2000H
LOOP:
MOV R2, #250
DJNZ R2, $
CPL P3.0
SJMP LOOP
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
LAP1: MOV R6, #250
MAIN:
LAP: MOV R5, #250
CPL P1.0
DJNZ R5, $
ACALL Delay1sIns
DJNZ R6, LAP
SJMP MAIN
DJNZ R7, LAP1
Delay1sIns:
RET
MOV R7, #8
END
2
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.
ORG 2000H
Delay1sIns:
TT: MOV A, #0FEH
MOV R7, #8
LAP: MOV P1, A
LAP1: MOV R6, #250
ACALL Delay1sIns
LAP2: MOV R5, #250
RL A
DJNZ R5, $
CJNE A, #FFH, LAP
DJNZ R6, LAP2
SJMP TT
DJNZ R7, LAP1
RET
END
BÀI TN2:LẬP TRÌNH CHO TIMER VÀ HIỂN THỊ LED 7
ĐOẠN
Thí nghiệm 1: Viết chương trình tạo sóng vng 1 Khz trên chân P1.0 sử dụng timer
0 ở chế độ 1
tH = 500 µs tL = 500 µs
ORG 2000H
JNB TF0
MOV TMOD, #01H
CLR TF0
LOOP: CPL P1.0
CLR TR0
MOV TH0, #HIGH(-500)
SJMP LOOP
MOV TL0,#LOW(-500)
END
SETB TR0
3
Thí nghiệm 2: Viết chương trình tạo sóng vng 10 Khz trên chân P1.0 sử dụng timer
0 ở chế độ 2
tH = 50 µs tL = 50 µs
ORG 2000H
LOOP: CPL P1.0
SETB P1.0
JNB TF0
MOV TMOD, #02H
CLR TF0
MOV TH0, #-50
SJMP LOOP
MOV TL0, #-50
END
SETB TR0
Thínghiệm 3:
-
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
-
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
DisplayLed0:
MOV A, R0
ORL A, #0E0H
MOV DPTR, #0000H
MOVX @DPTR, A
RET
END
Thí nghiệm 4: 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
MOV TMOD, #01H
4
LAP: MOV R0, #0
Delay1s:
LOOP: LCALL DisplayLed0
MOV R7, #20
LCALL Delay1s
LVONG:
INC R0
MOV TH0, #HIGH(-50000)
CJNE R0, #10, LOOP
MOV TL0, #LOW(-50000)
SJMP LAP
SETB TR0
JNB TF0, $
DisplayLed0:
CLR TF0
MOV A, R0
CLR TR0
ORL A, #0E0H
DJNZ R7, LVONG
MOV DPTR, #0000H
RET
MOVX @DPTR, A
END
RET
BÀI TN3:QUÉT LED 7 ĐOẠN VÀ GIAO TIẾP LCD
Thí nghiệm 1:
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.
ORG 2000H
SJMP $
MOV R0, #1
DisplayLED:
MOV R1, #3
MOV A, R1
LCALL DisplayLED
MOV DPTR, #POT
5
MOVC A, @A +DPTR
RET
ORL A, R0
POT: DB 0E0H, 0D0H, 0B0H, 70H
MOV DPTR, #0000H
MOVX @DPTR, A
END
Thí nghiệm 2: 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
JNB TF0, $
MOV TMOD, #01H
CLR TF0
TTUC: MOV R0, #1
CLR TR0
DJNZ R7, LVONG
MOV R1, #0
RET
LAP: LCALL DisplayLED
LCALL DELAY1s
INC R0
INC R1
CJNE R0, #5, LAP
SJMP TTUC
DisplayLED:
MOV A, R1
MOV DPTR, #POT
MOVC A, @A +DPTR
ORL A, R0
Delay1s:
MOV R7, #20
LVONG:
MOV TH0, #HIGH(-50000)
MOV DPTR, #0000H
MOVX @DPTR, A
RET
POT: DB 0E0H, 0D0H, 0B0H, 70H
MOV TL0, #LOW(-50000)
SETB TR0
END
Thí nghiệm 3: Viết chương trình hiển thị ra LCD tên của sinh viên ở hàng đầu.
LCD_E BIT P3.3
LCD_RS BIT P3.5
6
LCD_ADDR EQU 6000H
ORG 2000H
RET
WRITETEXT:
MOV TMOD, #01H
MOV DPTR, #LCD_ADDR
MOV DPTR, #LCD_ADDR
SETB LCD_E
LCALL LCD_INT
SETB LCD_RS
LCALL DISPLAY
MOVX @DPTR, A
SJMP $
CLR LCD_E
LCD_INT:
CALL WAIT
MOV A, #38H
LCALL WRITECOM
RET
DISPLAY:
MOV A, #0EH
MOV R3, #15
LCALL WRITECOM
MOV A, #0
MOV A, #06H
LOP:
LCALL WRITECOM
MOV DPTR, #TEXT
MOV R0, A
RET
MOVC A, @A + DPTR
WRITECOM:
JZ EXIT
MOV DPTR, #LCD_ADDR
CLR LCD_RS
CALL WRITETEXT
LU:
MOV A, R0
SETB LCD_E
INC A
MOVX @DPTR, A
DJNZ R3, LOP
CLR LCD_E
MOV A, #0C0H
LCALL WAIT
;tựđộngxuốnghàngthư 2 khichuỗidàihơn 16
kítự
RET
LCALL WRITECOM
WAIT:
MOV R3, #15
MOV R6,#10
SJMP LU
DL1: MOV R7,#250
DJNZ R7,$
DJNZ R6,DL1
EXIT:
RET
TEXT: DB "LuongTranDuy",0
7
END
Thínghiệm 4: - Viết thêm chương trình con CLRSCREEN để xóa màn hình LCD
- Viết thêm chương trình con GOTOXY để di chuyển con trỏ của LCD
đến hàng x cột y, với x chứa trong R0, y chứa trong R1
- Sửa chương trình để hiển thị thêm số nhóm ở hàng thứ 2
CLRSCREEN:
GOTOXY:
PUSH ACC
PUSH ACC
MOV A, #01H
MOV A, R1;hàng x → R0
CALL WRITECOM
CLR C
POP ACC
;cột y
→ R1
SUBB A, #1
RET
JZ GOTO
MOV A, #40H
GOTO: ADD A, #7FH
ADD A, R2
LCALL WRITECOM
POP ACC
RET
LCD_E BIT P3.3
LCD_RS BIT P3.5
SJMP $
LCD_INT:
LCD_ADDR EQU 6000H
MOV A, #38H
ORG 2000H
LCALL WRITECOM
MOV R1, #2
MOV A, #0EH
MOV R2, #1
LCALL WRITECOM
MOV TMOD, #01H
MOV A, #06H
MOV DPTR, #LCD_ADDR
LCALL WRITECOM
LCALL LCD_INT
LCALL CLRSCREEN
LCALL DISPLAY
RET
WRITECOM:
MOV DPTR, #LCD_ADDR
8
CLR LCD_RS
LU:
MOV A, R0
SETB LCD_E
INC A
MOVX @DPTR, A
DJNZ R3, LOP
CLR LCD_E
EXIT: LCALL GOTOXY
LCALL WAIT
RET
MOV A, #0
LOP1: MOV DPTR, #TEXT1
WAIT:
MOV R0, A
MOV R6,#10
MOVC A, @A + DPTR
DL1: MOV R7,#250
JZ EXIT1
DJNZ R7,$
LCALL WRITETEXT
DJNZ R6,DL1
MOV A, R0
RET
INC A
WRITETEXT:
MOV DPTR, #LCD_ADDR
SJMP LOP1
EXIT1:
RET
SETB LCD_E
TEXT: DB "LuongTranDuy",0
SETB LCD_RS
TEXT1: DB “Nhom 1” ,0
MOVX @DPTR, A
RET
CLR LCD_E
LCALL WAIT
RET
PUSH ACC
DISPLAY:
LOP:
GOTOXY:
MOV A, R1
MOV R3, #15
CLR C
MOV A, #0
SUBB A, #1
MOV DPTR, #TEXT
JZ GOTO
MOV R0, A
MOV A, #40H
MOVC A, @A + DPTR
GOTO: ADD A, #7FH
JZ EXIT
ADD A, R2
LCALL WRITETEXT
LCALL WRITECOM
9
POP ACC
RET
CALL WRITECOM
POP ACC
RET
CLRSCREEN:
PUSH ACC
END
MOV A, #01H
BÀI TH4:LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ BÀN PHÍM
SỐ HEX
Thínghiệm 1: Viết chương trình đếm số lần nhấn SW310 (phím đơn kết nối vào
P1.0), hiển thịl ên LCD theo cấu trúc: Push Number = xx (xx là số lần nhấn)
(khơng có chống rung phím)
LCD_E BIT P3.4
LCD_RS BIT P3.5
MOV R0, #48
LCD_ADDR EQU 6000H
MOV A, #48
TT: LCALL CLEAR
ORG 2000H
MOV R2, #2
MOV R1, #1
LCALL GOTOXY
MOV R2, #1
PUSH ACC
MOV TMOD, #01H
MOV A, R0
MOV DPTR, #LCD_ADDR
LCALL WRITETEXT
LCALL LCD_INT
POP ACC
10
MOV R2, #3
CLR LCD_E
LCALL GOTOXY
LCALL WAIT
LCALL WRITETEXT
RET
JNB P1.0, $
WAIT:
JB P1.0, $
PUSH 06H
INC A
PUSH 07H
CJNE A, #58, TT
MOV R6, #10
MOV A, #48
DL1: MOV R7, #250
INC R0
DJNZ R7, $
CJNE R0,#58, TT
DJNZ R6, DL1
MOV R0, #48
POP 07H
SJMP TT
POP 06H
RET
LCD_INT:
MOV A, #38H
WRITETEXT:
LCALL WRITECOM
MOV DPTR, #LCD_ADDR
MOV A, #0EH
SETB LCD_E
LCALL WRITECOM
SETB LCD_RS
MOV A, #06H
MOVX @DPTR, A
LCALL WRITECOM
CLR LCD_E
RET
LCALL WAIT
RET
WRITECOM:
MOV DPTR, #LCD_ADDR
CLR LCD_RS
CLEAR:
PUSH ACC
SETB LCD_E
MOV A, #01H
MOVX @DPTR, A
CALL WRITECOM
11
POP ACC
JZ GOTO
RET
MOV A, #40H
GOTO: ADD A, #7FH
ADD A, R2
GOTOXY:
LCALL WRITECOM
PUSH ACC
MOV A, R1
CLR C
SUBB A, #1
POP ACC
RET
END
Thí nghiệm 2: viết lại chương trình trên có chống rung phím
LCD_E BIT P3.3
PUSH ACC
LCD_RS BIT P3.5
MOV A, R0
LCD_ADDR EQU 6000H
LCALL WRITETEXT
ORG 2000H
;R1 hàng, 1-2
;R2 cột, 1-16
MOV R1, #1
POP ACC
MOV R2, #3
LCALL GOTOXY
LCALL WRITETEXT
MOV R2, #1
MOV R4, #20
MOV TMOD, #01H
SS1: JB P1.0, $
MOV DPTR, #LCD_ADDR
LCALL DELAY1ms
LCALL LCD_INT
DJNZ R4, SS1
LCALL GOTOXY
MOV R4, #20
SS2: JNB P1.0, $
MOV R0, #48
LCALL DELAY1ms
MOV A, #48
DJNZ R4, SS2
TT: LCALL CLEAR
MOV R2, #2
LCALL GOTOXY
INC A
CJNE A, #58, TT
12
MOV A, #48
DL1: MOV R7,#250
INC R0
DJNZ R7,$
CJNE R0,#58, TT
DJNZ R6,DL1
MOV R0, #48
POP 07H
SJMP TT
POP 06H
RET
LCD_INT:
MOV A, #38H
WRITETEXT:
LCALL WRITECOM
MOV DPTR, #LCD_ADDR
MOV A, #0EH
SETB LCD_E
LCALL WRITECOM
SETB LCD_RS
MOV A, #06H
MOVX @DPTR, A
LCALL WRITECOM
CLR LCD_E
RET
LCALL WAIT
RET
WRITECOM:
MOV DPTR, #LCD_ADDR
CLEAR:
CLR LCD_RS
PUSH ACC
SETB LCD_E
MOV A, #01H
MOVX @DPTR, A
CALL WRITECOM
CLR LCD_E
LCALL WAIT
POP ACC
RET
RET
GOTOXY:
WAIT:
PUSH ACC
PUSH 06H
MOV A, R1
PUSH 07H
CLR C
MOV R6,#10
SUBB A, #1
13
JZ GOTO
DELAY1ms:
MOV A, #40H
MOV TH0, #HIGH(-1000)
GOTO: ADD A, #7FH
MOV TL0, #LOW(-1000)
ADD A, R2
SETB TR0
LCALL WRITECOM
JNB TF0, $
POP ACC
CLR TR0
RET
CLR TF0
RET
END
Thí nghiệm 3: Viết chương trình con SCANKEY qt bàn phím ma trận 4x4 trên
board thí nghiệm. Các giá trị trả vềt ừ 0-15 nếu có phím được nhấn hoặc 255 nếu
khơng có phím được nhấn. Kết quả chứa trong R0.
Sử dụng chương trình con này viết chương trình gửi lên máy tính các ký tự từ '0' cho
đến 'F' ứng với phím được nhấn trên bàn phím, baudrate là 19200.
ORG 2000H
MAIN:
MOV P1, #0EFH
MOV SCON, #52H
CALL WAIT
MOV TMOD, #20H
MOV A, P1
MOV TH1, #-3
CJNE A, #0EEH, BUT01
MOV A, PCON
MOV A, “0”
SETB ACC.7
MOV PCON, A
CALL SCANKEY
CJNE A, #255, TT
SJMP MAIN
TT:
LCALL PHAT
SJMP MAIN
JMP DONE
BUT01: CJNE A, #0EDH, BUT02
MOV A, “4”
JMP DONE
BUT02: CJNE A, #0EBH, BUT03
MOV A, “8”
JMP DONE
BUT03: CJNE A, #0E7H, OW
SCANKEY:
MOV A, “C”
14
JMP DONE
MOV A, “D”
JMP DONE
OW:
MOV P1, #0DFH
OW2:
LCALL WAIT
MOV P1, #07FH
MOV A, P1
LCALL WAIT
CJNE A, #0DEH, BUT11
MOV A, P1
MOV A, “1”
CJNE A, #07EH, BUT31
JMP DONE
MOV A, “3”
BUT11: CJNE A, #0DDH, BUT12
JMP DONE
MOV A, “5”
BUT31: CJNE A, #07DH, BUT32
JMP DONE
MOV A, “7”
BUT12: CJNE A, #0DBH, BUT13
JMP DONE
MOV A, “9”
BUT32: CJNE A, #07BH, BUT33
JMP DONE
MOV A, “B”
BUT13: CJNE A, #0D7H, OW1
JMP DONE
MOV A, “D”
BUT33: CJNE A, #077H, OW3
JMP DONE
MOV A, “F”
OW1:
JMP DONE
MOV P1, #0BFH
CALL WAIT
OW3: MOV A, #255
MOV A, P1
DONE: NOP
CJNE A, #0BEH, BUT21
RET
MOV A, “2”
JMP DONE
WAIT:
BUT21: CJNE A, #0BDH, BUT22
MOV A, “6”
MOV R7, #40;
LAP:
JMP DONE
DJNZ R6, $
BUT22: CJNE A, #0BBH, BUT13
MOV A, “A”
MOV R6, #250;
DJNZ R7, LAP
RET
JMP DONE
BUT23: CJNE A, #0B7H, OW2
15
PHAT:
MOV SBUF, A
JNB TI, $
RET
CLR TI
END
BÀI TH5:LẬP TRÌNH GIAO TIẾP SERIAL PORT VÀ ADC
Thí nghiệm 1: Viết chương trình phát chuỗi ký tự “Hello, world” lên máy tính thơng
qua HyperTerminal với tốc độ baud 19200 pbs mỗi khi SW 310 (gắnvào P1.0)
đượcnhấn
ORG 2000H
MOV TMOD ,#20h
MOVC A, @A+DPTR
MOV TH1,#-3
MOV SBUF, A
MOV SCON,#52H
MOV A, R0
MOV A, PCON
INC A
SETB ACC.7
CLR TI
MOV PCON, A
SJMP LOOP
MOV DPTR, #TEXT
TEXT: DB "Hello, world"
MOV A , #0
DELAY1ms:
SETB TR1
LOOP: MOV R1, #20
SS1:
PUSH 01h
PUSH 02h
JNB P1.0, $
LCALL DELAY1ms
SS2:
MOV R0,A
MOV R1, #2
LL:
MOV R2, #250
DJNZ R1, SS1
DJNZ R2, $
MOV R1, #20
DJNZ R1, LL
JB P1.0, $
POP 02h
LCALL DELAY1ms
POP 01h
DJNZ R1, SS2
JNB TI, $
RET
END
16
Thí nghiệm 2: Viết chương trình nhận các ký tự từ máy tính gửi đến EME-MC8
thơng qua HyperTerminal (bằng cách gõ các ký tự trên bàn phím khi đang ở trong
chương trình HyperTerminal) và hiển thị lên LCD như sau:
Nếu ký tự là chữ thì hiển thị lên LCD; Enter thì xuống hàng; ESC thì xóa màn hình
LCD; Backspace thì xóa ký tự bên trái dấu nháy.
LCD_E BIT P3.3
LCALL WRITECOM
LCD_RS BIT P3.5
MOV A, #0
LCD_ADDR EQU 6000H
LCALL WRITETEXT
ORG 2000H
CLR RI
;R1hàng, 1-2
SJMP LAP
;R2cột 1-16
TT:
CJNE A, #10, TT1
MOV R1, #1
;ENTER
MOV R2, #1
PUSH 01H
MOV TMOD, #01H
PUSH 02H
MOV DPTR, #LCD_ADDR
MOV R1,#2
LCALL LCD_INT
MOV R2,#1
MOV TMOD, #20H
LCALL GOTOXY
MOV TH1, #-3
POP 02H
MOV SCON , #50H
POP 01H
MOV A, PCON
CLR RI
SETB ACC.7
SJMP LAP
MOV PCON, A
TT1:
SETB TR1
LAP:
CJNE A, #27, TT2
;XOA MAN HINH
JNB RI, $
LCALL CLEAR
MOV A, SBUF
CLR RI
CJNE A, #8, TT
SJMP LAP
;XOA KT
MOV A, #10H;
TT2:
CJNE A, #65,$+3
JC LAP
17
CJNE A, #91, $+3
CLR LCD_E
JNC TT3
LCALL WAIT
LCALL WRITETEXT
RET
CLR RI
SJMP LAP
TT3:
WAIT:
CJNE A, #97, $+3
MOV R6,#10
JC LAP
DL1: MOV R7,#250
CJNE A, #123, $+3
DJNZ R7,$
JNC LAP
DJNZ R6,DL1
LCALL WRITETEXT
RET
CLR RI
SJMP LAP
WRITETEXT:
MOV DPTR, #LCD_ADDR
SETB LCD_E
LCD_INT:
SETB LCD_RS
MOV A, #38H
MOVX @DPTR, A
LCALL WRITECOM
CLR LCD_E
MOV A, #0EH
CALL WAIT
LCALL WRITECOM
RET
MOV A, #06H
LCALL WRITECOM
CLEAR:
RET
MOV A, #01H
CALL WRITECOM
WRITECOM:
RET
MOV DPTR, #LCD_ADDR
CLR LCD_RS
GOTOXY:
SETB LCD_E
MOV A, R1
MOVX @DPTR, A
CLR C
18
SUBB A, #1
ADD A, R2
JZ GOTO
LCALL WRITECOM
MOV A, #40H
RET
GOTO: ADD A, #7FH
END
Thí nghiệm 3: Viết chương trình con READADC thực hiện đọc giá trị của kênh 0 và
trả về giá trị trong R0
Viết chương trình hiển thị giá trị của kênh 0 của ADC lên LCD dùng chương trình con
READADC đã viết
LCD_E BIT P3.3
ACALL WRITETEXT
LCD_RS BIT P3.5
SJMP LAP
LCD_ADDR EQU 6000H
ORG 2000H
READADC:
MOV A, #0
MOV R2, #1
MOV R7,#100
MOV TMOD, #01H
MOV DPTR, #4000H
MOVX @DPTR, A
ACALL LCD_INT
DJNZ R7,$
ACALL LCD_CLR
MOVX A, @DPTR
LAP:
MOV R0, A
MOV R1,#1
RET
ACALL GOTOXY
ACALL READADC
LCD_INT:
MOV B, #100
MOV A, #38H
DIV AB
LCALL WRITECOM
ADD A, #48
MOV A, #0EH
ACALL WRITETEXT
LCALL WRITECOM
MOV A, B
MOV A, #06H
MOV B, #10
LCALL WRITECOM
DIV AB
RET
ADD A, #48
ACALL WRITETEXT
WRITECOM:
MOV A, B
MOV DPTR, #LCD_ADDR
ADD A, #48
CLR LCD_RS
19
SETB LCD_E
GOTOXY:
MOVX @DPTR, A
PUSH ACC
CLR LCD_E
MOV A, R2
LCALL WAIT
CLR C
RET
SUBB A, #1
JZ GOTO
WAIT:
MOV A, #40H
MOV R6,#10
GOTO:
DL1: MOV R7,#250
ADD A, R1
DJNZ R7,$
LCALL WRITECOM
DJNZ R6,DL1
POP ACC
RET
ADD A, #7FH
RET
WRITETEXT:
MOV DPTR, #LCD_ADDR
LCD_CLR:
SETB LCD_E
PUSH ACC
SETB LCD_RS
MOV A, #01H
MOVX @DPTR, A
ACALL WRITECOM
CLR LCD_E
POP ACC
CALL WAIT
RET
RET
END
Thí nghiệm 4: Viết chương trình con CALADC tính tốn giá trị điện áp thực tế đặt
vào kênh 0 ADC từ giá trị đo được của ADC
Chương trình có giá trị vào chứa trong R0 (là kết quả của chương trình con
READADC)
Giá trị trả về chứa trong R0 và R1, R0 chứa giá trị nguyên và R1 chứa giá trị thập
phân.
LCD_E BIT P3.3
LCD_ADDR EQU 6000H
LCD_RS BIT P3.5
ORG 2000H
20
MOV A, #0
MOV R2, #1
MOV R7,#100
MOV TMOD, #01H
MOV DPTR, #4000H
MOV DPTR, #LCD_ADDR
MOVX @DPTR, A
LCALL LCD_INT
DJNZ R7,$
ACALL LCD_CLR
MOVX A, @DPTR
MOV R0, A
LAP:
RET
MOV R3, #1
ACALL GOTOXY
ACALL READADC
LCD_INT:
ACALL CALADC
MOV A, #38H
MOV A,R0
LCALL WRITECOM
ACALL WRITETEXT
MOV A, #0EH
MOV A, #2EH
LCALL WRITECOM
ACALL WRITETEXT
MOV A, #06H
MOV A, R1
LCALL WRITECOM
ACALL WRITETEXT
SJMP LAP
RET
WRITECOM:
CALADC:
MOV DPTR, #LCD_ADDR
MOV B, #50
CLR LCD_RS
DIV AB
SETB LCD_E
ADD A, #48
MOVX @DPTR, A
MOV R0, A
CLR LCD_E
MOV A, B
LCALL WAIT
MOV B, #5
DIV AB
RET
WAIT:
ADD A, #48
MOV R6,#10
MOV R1, A
DL1: MOV R7,#250
RET
DJNZ R7,$
DJNZ R6,DL1
READADC:
RET
21
WRITETEXT:
MOV A, #40H
MOV DPTR, #LCD_ADDR
GOTO: ADD A, #7FH
SETB LCD_E
ADD A, R3
SETB LCD_RS
LCALL WRITECOM
MOVX @DPTR, A
CLR LCD_E
POP ACC
RET
CALL WAIT
RET
LCD_CLR:
PUSH ACC
GOTOXY:
MOV A, #01H
PUSH ACC
ACALL WRITECOM
MOV A, R2
POP ACC
CLR C
RET
SUBB A, #1
JZ GOTO
END
BÀI TH 6: LẬP TRÌNH NGẮT
Thí nghiệm 1:Viết chương trình làm song song 2 công việ sau:
Nhận 1 byte từ máy tính và xuất ngược lại (echo) lên màn hình terminal. Bật LED gắn
vào P1.1 khi SW 317 (gắn vào P1.0) được nhấn, và tắt LED khi phím được nhả.
ORG 2000H
MOV SCON , #52H
JMP MAIN
MOV A, PCON
ORG 2023H
SETB ACC.7
JMP ISRPORT
MOV PCON, A
MAIN:
SETB TR1
MOV TMOD, #20H
MOV IE, #10010000B
MOV TH1, #-3
LOOP: MOV R1, #20
22
SS1:
JNB P1.0, $
MOV A, SBUF
LCALL DELAY1ms
MOV SBUF, A
DJNZ R1, SS1
SS2:
JMP DONE
MOV R1, #20
SKIP: CLR TI
SETB P1.1
DONE: RETI
JB P1.0, $
DELAY1ms:
LCALL DELAY1ms
DJNZ R1, SS2
MOV R7, #2
VONG: MOV R6, #250
CLR P1.1
DJNZ R6, $
JMP LOOP
DJNZ R7, VONG
ISRPORT:
RET
JNB RI, SKIP
END
CLR RI
Thí nghiệm 2: Viết chương trình hiển thị lên 4 LED 7 đoạn một số có 4 chữ số, 4 ký số
này chứa trong các ô nhớ 20H, 21H, 22H và 23H. Ô nhớ 20H chứa số hàng nghìn.
ORG 2000H
MOV TH0, #HIGH(-1000)
JMP MAIN
SETB TR0
ORG 200BH
MOV IE, #10000010B
JMP ISRT0
MOV R3, #20H
MAIN:
MOV R1, #3
MOV 20H, #1
SJMP $
MOV 21H, #3
ISRT0:
CLR TR0
MOV 22H, #1
MOV TL0, #LOW(-1000)
MOV 23H, #8
MOV TH0, #HIGH(-1000)
MOV TMOD, #01H
MOV A, R3
MOV TL0, #LOW(-1000)
ADD A, R1
23
MOV R0, A
MOV R2, A
LCALL DISPLAYLED
MOV A, @R0
DEC R1
SKIP:
CJNE R1, #0FFH, SKIP
ORL A, R2
MOV R1, #3
MOV DPTR, #0000H
SETB TR0
MOVX @DPTR, A
RETI
RET
DISPLAYLED:
MOV A, R1
POT: DB 070H, 0B0H, 0D0H, 0E0H
MOV DPTR, #POT
MOVC A, @A+DPTR
END
Thí nghiệm 3: Viết chương trình đếm số lần nhấn phím SW317, hiển thị lên 4 LED 7
đoạn
ORG 2000H
MOV TMOD, #01H
JMP MAIN
MOV TH0, #HIGH(-10000)
ORG 200BH
MOV TL0, #LOW(-10000)
JMP IRST0
MOV IE, #82H
ORG 2030H
SETB TR0
MAIN:
MOV R3, #23H
SKIP: MOV R7, #20
MOV R1, #0
T: JNB P1.7, $
LCALL DELAY1MS
MOV 20H, #0
DJNZ R7, T
MOV 21H, #0
MOV R7, #20
MOV 22H, #0
LOP: JB P1.7, $
MOV 23H, #0
LCALL DELAY1MS
24
DJNZ R7, LOP
MOV R0, A
LCALL FORLED
INC 23H
INC R1
MOV A, 23H
CJNE R1, #4, CONTI
CJNE A, #10, SKIP
MOV R1, #0
MOV 23H, #0
CONTI:
INC 22H
RETI
MOV A, 22H
FORLED:
CJNE A, #10, SKIP
MOV A, R1
MOV 22H, #0
MOV DPTR, #POT
INC 21H
MOVC A, @A + DPTR
MOV A, 21H
MOV R6,A
CJNE A, #10, SKIP
MOV A, @R0
MOV 21H, #0
ORL A, R6
INC 20H
MOV DPTR, #0000H
MOV A, 20H
MOVX @DPTR, A
CJNE A, #10, SKIP
RET
MOV 20H, #0
POT: DB 0E0H, 0D0H, 0B0H, 070H
SJMP SKIP
DELAY1MS:
MOV R4, #2
IRST0:MOV TH0, #HIGH(-10000)
MOV TL0, #LOW(-10000)
LAP: MOV R5, #250
DJNZ R5, $
DJNZ R4, LAP
MOV A, R3
RET
CLR C
END
SUBB A, R1
Thí nghiệm 4:Viết chương trình thực hiện đồng hồ bấmgiây, hiển thị lên LED 7 đoạn.
Hai LED 3 và 2 thể hiện số giây, 2 LED 1 và 0 thể hiện phần tram của giây.
Khi SW310 nhấn, đồnghồ reset về 0
SW 311 nhấn, đồng hồ bắt đầu chạy
25