Professional Documents
Culture Documents
HCM
KHOA ĐIỆN – ĐIỆN TỬ
BÁO CÁO
THÍ NGHIỆM VI XỬ LÍ
Nhóm L15
Thành viên MSSV
Hoàng Hữu Đạt 1510670
Trần Công Minh 1512020
Vũ Thành Nhân 1512283
Trần Văn Trường 1513796
Mục tiêu
Nắm được cách thức điều khiển trực tiếp ngoại vi thông qua các port I/O của 8051.
Yêu cầu
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
LOOP:
SETB P1.0
MOV C, P1.0
MOV P3.0,C
SJMP LOOP
END
THÍ NGHIỆM 2
ORG 2000H
MAIN:
CPL P3.0
SJMP MAIN
END
THÍ NGHIỆM 3
Mục tiêu
Yêu cầu
Viết chương trình tạo xung vuông 1 Khz, chu kỳ nhiệm vụ 50% trên P3.0
ORG 2000H
MAIN:
CPL P3.0
ACALL DELAY05MS
SJMP MAIN
DELAY05MS:
MOV R7,#230
LOOP:
DJNZ R7,LOOP
RET
END
THÍ NGHIỆM 4
Mục tiêu
Yêu cầu
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
LOOP:
CPL 1.0
ACALL DELAY1SINS
SJMP LOOP
DELAY1SINS:
MOV R7, #7
LOOP1:
LOOP2:
LOOP3:
RET
END
THÍ NGHIỆM 5
Mục tiêu
Yêu cầu
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
MOV DPTR,#SIGNAL
LAP1:
MOV R1,#8
LAP2:
MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
ACALL DELAY1SINS
DJNZ R1,LAP2
MOV P1,#0FFH
SJMP LAP1
DELAY1SINS:
MOV R7,#25
LOOP1:
MOV R6,#250
LOOP2:
MOV R5,#250
LOOP3:
DJNZ R5,LOOP3
DJNZ R6,LOOP2
DJNZ R7,LOOP1
RET
SIGNAL:
DB 00H,01H,03H,07H,0FH,1FH,3FH,7FH
END
BÀI TN 2
LẬP TRÌNH CHO TIMER VÀ HIỂN THỊ LED 7 ĐOẠN
THÍ NGHIỆM 1
Mục tiêu
Yêu cầu
Viết chương trình tạo sóng vuông 1 Khz trên chân P1.0 sử dụng timer 0 ở chế độ 1
ORG 2000H
LOOP:
CPL P1.0
ACALL DELAY05MS
SJMP LOOP
DELAY05MS:
MOV TMOD,#01H
MOV TH0,#HIGH(-461)
MOV TL0,#LOW(-461)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
RET
END
THÍ NGHIỆM 2
Mục tiêu
Yêu cầu
Viết chương trình tạo sóng vuông 10 Khz trên chân P1.0 sử dụng timer 0 ở chế độ 2
ORG 2000H
MOV TMOD,#02H
MOV TH0,#(-46)
SETB TR0
LOOP:
JNB TF0,$
CLR TF0
CPL P1.0
SJMP LOOP
END
THÍ NGHIỆM 3
Mục tiêu
Yêu cầu
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 A,R0
ADD A,#0E0H
MOV DPTR,#0000H
MOVX @DPTR,A
RET
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 DONE
DISPLAYLED0:
MOV A,R0
ADD A,#0E0H
MOV DPTR,#0000H
MOVX @DPTR,A
RET
DONE: NOP
END
THÍ NGHIỆM 4
Mục tiêu
Kết hợp được các chương trình con, sử dụng được timer và hiển thị LED 7 đoạn
Yêu cầu
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
LAP1:
MOV R0, #0
LOOP:
LCALL DisplayLed0
LCALL Delay1s
INC R0
SJMP LAP1
DisplayLed0:
MOV A, R0
ORL A, #0E0H
MOVX @DPTR, A
RET
Delay1s:
LAP2:
SETB TR0
JNB TF0, $
CLR TF0
CLR TR0
RET
END
BÀI TN 3
QUÉT LED 7 ĐOẠN VÀ GIAO TIẾP LCD
THÍ NGHIỆM 1
Mục tiêu
Nắm được cách thức xuất giá trị lên LED 7 đoạn
Yêu cầu
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.
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
MOV R0, #1
MOV R1, #3
LCALL DisplayLED
SJMP $
DisplayLED:
MOV A, R1
MOVC A, @A +DPTR
ORL A, R0
MOVX @DPTR, A
RET
TABLE:
END
THÍ NGHIỆM 2
Mục tiêu
Yêu cầu
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
MAIN:
MOV R0, #1
MOV R1, #0
LAP:
LCALL DisplayLED
LCALL DELAY1s
INC R0
INC R1
SJMP MAIN
Delay1s:
LOOP:
SETB TR0
JNB TF0, $
CLR TF0
CLR TR0
RET
DisplayLED:
MOV A, R1
MOVC A, @A +DPTR
ORL A, R0
MOVX @DPTR, A
RET
TABLE:
END
THÍ NGHIỆM 3
Mục tiêu
Yêu cầu
Download chương trình mẫu LCD.A51 trên trang web bộ môn điện tử.
Sửa chương trình để hiển thị tên sinh viên lên hàng đầu
ORG 2000H
LCALL LCD_INT
LCALL DISPLAY
SJMP $
LCD_INT:
MOV A, #38H
LCALL WRITECOM
MOV A, #0EH
LCALL WRITECOM
MOV A, #06H
LCALL WRITECOM
RET
WRITECOM:
CLR LCD_RS
SETB LCD_E
MOVX @DPTR, A
CLR LCD_E
LCALL WAIT
RET
WAIT:
MOV R6,#10
DJNZ R7,$
DJNZ R6,DL1
RET
WRITETEXT:
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
CALL WAIT
RET
DISPLAY:
MOV A, #0
LOP:
MOV R0, A
MOVC A, @A + DPTR
JZ EXIT
ACALL WRITETEXT
LU:
MOV A, R0
INC A
MOV A, #0C0H ; tu dong xuong hang thu hai khi chieu dai hon 16 bits
LCALL WRITECOM
SJMP LU
EXIT:
RET
TEXT:
DB "Tranvantruong",0
END
THÍ NGHIỆM 4
Yêu cầu
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 và Y chứa trong R1
Sửa chương trình ở thí nghiệm 1 để hiển thị thêm số nhóm ở hàng thứ 2
CLRSCREEN:
PUSH ACC
MOV A, #01H
CALL WRITECOM
POP ACC
RET
BÀI TN 4
LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ BÀN PHÍM SỐ
HEX
THÍ NGHIỆM 1
Yêu cầu
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)
ORG 2000H
MOV R1, #1
MOV R2, #1
LCALL LCD_INT
MOV A, #48
TT:
LCALL CLEAR
MOV R2, #2
LCALL GOTOXY
PUSH ACC
MOV A, R0
LCALL WRITETEXT
POP ACC
MOV R2, #3
LCALL GOTOXY
LCALL WRITETEXT
JNB P1.0, $
JB P1.0, $
INC A
CJNE A, #58, TT
MOV A, #48
INC R0
CJNE R0,#58, TT
SJMP TT
LCD_INT:
MOV A, #38H
LCALL WRITECOM
MOV A, #0EH
LCALL WRITECOM
MOV A, #06H
LCALL WRITECOM
RET
WRITECOM:
CLR LCD_RS
SETB LCD_E
MOVX @DPTR, A
CLR LCD_E
LCALL WAIT
RET
WAIT:
PUSH 06H
PUSH 07H
DJNZ R7, $
POP 07H
POP 06H
RET
WRITETEXT:
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
LCALL WAIT
RET
CLEAR:
PUSH ACC
MOV A, #01H
CALL WRITECOM
POP ACC
RET
GOTOXY:
PUSH ACC
MOV A, R1
CLR C
SUBB A, #1
JZ GOTO
MOV A, #40H
GOTO:
ADD A, #7FH
ADD A, R2
LCALL WRITECOM
POP ACC
RET
END
THÍ NGHIỆM 2
Yêu cầu
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, có chống rung phím
ORG 2000H
LCALL LCD_INT
LCALL GOTOXY
MOV A, #48
TT:
LCALL CLEAR
MOV R2, #2
LCALL GOTOXY
PUSH ACC
MOV A, R0
LCALL WRITETEXT
POP ACC
MOV R2, #3
LCALL GOTOXY
LCALL WRITETEXT
SS1: JB P1.0, $
LCALL DELAY1ms
LCALL DELAY1ms
INC A
CJNE A, #58, TT
MOV A, #48
INC R0
CJNE R0,#58, TT
SJMP TT
LCD_INT:
MOV A, #38H
LCALL WRITECOM
MOV A, #0EH
LCALL WRITECOM
MOV A, #06H
LCALL WRITECOM
RET
WRITECOM:
CLR LCD_RS
SETB LCD_E
MOVX @DPTR, A
CLR LCD_E
LCALL WAIT
RET
WAIT:
PUSH 06H
PUSH 07H
MOV R6,#10
DJNZ R7,$
DJNZ R6,DL1
POP 07H
POP 06H
RET
WRITETEXT:
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
LCALL WAIT
RET
CLEAR:
PUSH ACC
MOV A, #01H
CALL WRITECOM
POP ACC
RET
GOTOXY:
PUSH ACC
MOV A, R1
CLR C
SUBB A, #1
JZ GOTO
MOV A, #40H
ADD A, R2
LCALL WRITECOM
POP ACC
RET
DELAY1ms:
SETB TR0
JNB TF0, $
CLR TR0
CLR TF0
RET
END
THÍ NGHIỆM 3
Yêu cầu
Viết chương trình con SCANKEY quét 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 SCON, #52H
MOV TMOD, #20H
MOV TH1, #-3
MOV A, PCON
SETB ACC.7
MOV PCON, A
CALL SCANKEY
CJNE A, #255, TT
SJMP MAIN
TT:
LCALL PHAT
SJMP MAIN
SCANKEY:
MOV P1, #0EFH
CALL WAIT
MOV A, P1
CJNE A, #0EEH, BUT01
MOV A, “0”
SJMP DONE
BUT01:
CJNE A, #0EDH, BUT02
MOV A, “4”
SJMP DONE
BUT02:
CJNE A, #0EBH, BUT03
MOV A, “8”
SJMP DONE
BUT03:
CJNE A, #0E7H, OW
MOV A, “C”
SJMP DONE
OW:
MOV P1, #0DFH
LCALL WAIT
MOV A, P1
CJNE A, #0DEH, BUT11
MOV A, “1”
SJMP DONE
BUT11:
CJNE A, #0DDH, BUT12
MOV A, “5”
SJMP DONE
BUT12:
CJNE A, #0DBH, BUT13
MOV A, “9”
SJMP DONE
BUT13:
CJNE A, #0D7H, OW1
MOV A, “D”
SJMP DONE
OW1:
MOV P1, #0BFH
CALL WAIT
MOV A, P1
CJNE A, #0BEH, BUT21
MOV A, “2”
SJMP DONE
BUT21:
CJNE A, #0BDH, BUT22
MOV A, “6”
SJMP DONE
BUT22:
CJNE A, #0BBH, BUT13
MOV A, “A”
SJMP DONE
BUT23:
CJNE A, #0B7H, OW2
MOV A, “E”
SJMP DONE
OW2:
MOV P1, #07FH
LCALL WAIT
MOV A, P1
CJNE A, #07EH, BUT31
MOV A, “3”
SJMP DONE
BUT31:
CJNE A, #07DH, BUT32
MOV A, “7”
SJMP DONE
BUT32:
CJNE A, #07BH, BUT33
MOV A, “B”
SJMP DONE
BUT33:
CJNE A, #077H, OW3
MOV A, “F”
SJMP DONE
OW3:
MOV A, #255
DONE: NOP
RET
WAIT:
MOV R7, #40;
LAP:
MOV R6, #250;
DJNZ R6, $
DJNZ R7, LAP
RET
PHAT:
JNB TI, $
CLR TI
MOV SBUF, A
RET
END
BÀI TN 5
LẬP TRÌNH GIAO TIẾP SERIAL PORT VÀ ADC
THÍ NGHIỆM 1
Mục tiêu
Yêu cầu
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ắn vào P1.0) được nhấn
ORG 2000H
MOV TH1,#-3
MOV SCON,#52H
MOV A, PCON
SETB ACC.7
MOV PCON, A
MOV A , #0
SETB TR1
LCALL DELAY1MS
SS2: JB P1.0, $
LCALL DELAY1MS
JNB TI, $
MOV R0,A
MOVC A, @A+DPTR
MOV SBUF, A
MOV A, R0
INC A
CLR TI
SJMP LOOP
DELAY1MS:
PUSH 01H
PUSH 02H
MOV R1, #2
DJNZ R2, $
POP 02H
POP 01H
RET
END
THÍ NGHIỆM 2
Yêu cầu
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.
ORG 2000H
LCALL LCD_INT
MOV A, PCON
SETB ACC.7
MOV PCON, A
SETB TR1
LAP:
JNB RI, $
MOV A, SBUF
CJNE A, #8, TT
MOV A, #10H
LCALL WRITECOM
MOV A, #0
LCALL WRITETEXT
CLR RI
SJMP LAP
TT:
PUSH 01H
PUSH 02H
MOV R1,#2
MOV R2,#1
LCALL GOTOXY
POP 02H
POP 01H
CLR RI
SJMP LAP
TT1:
CLR RI
SJMP LAP
TT2:
CJNE A, #65,$+3
JC LAP
CJNE A, #91,$+3
JNC TT3
LCALL WRITETEXT
CLR RI
SJMP LAP
TT3:
JC LAP
JNC LAP
LCALL WRITETEXT
CLR RI
SJMP LAP
LCD_INT:
MOV A, #38H
LCALL WRITECOM
MOV A, #0EH
LCALL WRITECOM
MOV A, #06H
LCALL WRITECOM
RET
WRITECOM:
CLR LCD_RS
SETB LCD_E
MOVX @DPTR, A
CLR LCD_E
LCALL WAIT
RET
WAIT:
MOV R6,#10
DJNZ R7,$
DJNZ R6,DL1
RET
WRITETEXT:
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
CALL WAIT
RET
CLEAR:
MOV A, #01H
CALL WRITECOM
RET
GOTOXY:
MOV A, R1
CLR C
SUBB A, #1
JZ GOTO
MOV A, #40H
GOTO: ADD A, #7FH
ADD A, R2
LCALL WRITECOM
RET
END
THÍ NGHIỆM 3
Yêu cầu
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
ORG 2000H
MOV R2, #1
ACALL LCD_INT
ACALL LCD_CLR
LAP:
MOV R1,#1
ACALL GOTOXY
ACALL READADC
MOV B, #100
DIV AB
ADD A, #48
ACALL WRITETEXT
MOV A, B
MOV B, #10
DIV AB
ADD A, #48
ACALL WRITETEXT
MOV A, B
ADD A, #48
ACALL WRITETEXT
SJMP LAP
READADC:
MOV A, #0
MOV R7,#100
MOVX @DPTR, A
DJNZ R7,$
MOVX A, @DPTR
MOV R0, A
RET
LCD_INT:
MOV A, #38H
LCALL WRITECOM
MOV A, #0EH
LCALL WRITECOM
MOV A, #06H
LCALL WRITECOM
RET
WRITECOM:
CLR LCD_RS
SETB LCD_E
MOVX @DPTR, A
CLR LCD_E
LCALL WAIT
RET
WAIT:
MOV R6,#10
DJNZ R7,$
DJNZ R6,DL1
RET
WRITETEXT:
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
CALL WAIT
RET
GOTOXY:
PUSH ACC
MOV A, R2
CLR C
SUBB A, #1
JZ GOTO
MOV A, #40H
GOTO:
ADD A, #7FH
ADD A, R1
LCALL WRITECOM
POP ACC
RET
LCD_CLR:
PUSH ACC
MOV A, #01H
ACALL WRITECOM
POP ACC
RET
END
THÍ NGHIỆM 4
Yêu cầu
Viết chương trình con CALADC tính toá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_RS BIT P3.5
LCD_ADDR EQU 6000H
ORG 2000H
MOV R2, #1
MOV TMOD, #01H
MOV DPTR, #LCD_ADDR
LCALL LCD_INT
ACALL LCD_CLR
LAP:
MOV R3, #1
ACALL GOTOXY
ACALL READADC
ACALL CALADC
MOV A,R0
ACALL WRITETEXT
MOV A, #2EH
ACALL WRITETEXT
MOV A, R1
ACALL WRITETEXT
SJMP LAP
CALADC:
MOV B, #50
DIV AB
ADD A, #48
MOV R0, A
MOV A, B
MOV B, #5
DIV AB
ADD A, #48
MOV R1, A
RET
READADC:
MOV A, #0
MOV R7,#100
MOV DPTR, #4000H
MOVX @DPTR, A
DJNZ R7,$
MOVX A, @DPTR
MOV R0, A
RET
LCD_INT:
MOV A, #38H
LCALL WRITECOM
MOV A, #0EH
LCALL WRITECOM
MOV A, #06H
LCALL WRITECOM
RET
WRITECOM:
MOV DPTR, #LCD_ADDR
CLR LCD_RS
SETB LCD_E
MOVX @DPTR, A
CLR LCD_E
LCALL WAIT
RET
WAIT:
MOV R6,#10
DL1: MOV R7,#250
DJNZ R7,$
DJNZ R6,DL1
RET
WRITETEXT:
MOV DPTR, #LCD_ADDR
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
CALL WAIT
RET
GOTOXY:
PUSH ACC
MOV A, R2
CLR C
SUBB A, #1
JZ GOTO
MOV A, #40H
GOTO:
ADD A, #7FH
ADD A, R3
LCALL WRITECOM
POP ACC
RET
LCD_CLR:
PUSH ACC
MOV A, #01H
ACALL WRITECOM
POP ACC
RET
END
BÀI TN 6
LẬP TRÌNH NGẮT
THÍ NGHIỆM 1
Mục tiêu
Yêu cầu
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
JMP MAIN
ORG 2023H
JMP ISRPORT
MAIN:
MOV TMOD, #20H
MOV TH1, #-3
MOV SCON , #52H
MOV A, PCON
SETB ACC.7
MOV PCON, A
SETB TR1
MOV IE, #10010000B
LOOP: MOV R1, #20
SS1:
JNB P1.0, $
LCALL DELAY1ms
DJNZ R1, SS1
MOV R1, #20
SETB P1.1
SS2:
JB P1.0, $
LCALL DELAY1ms
DJNZ R1, SS2
CLR P1.1
JMP LOOP
ISRPORT:
JNB RI, SKIP
CLR RI
MOV A, SBUF
MOV SBUF, A
JMP DONE
SKIP:
CLR TI
DONE: RETI
DELAY1ms:
MOV R7, #2
VONG:
MOV R6, #250
DJNZ R6, $
DJNZ R7, VONG
RET
END
THÍ NGHIỆM 2
Mục tiêu
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
SJMP MAIN
ORG 200BH
SJMP ISRT0
MAIN:
MOV 20H, #1
MOV 21H, #3
MOV 22H, #1
MOV 23H, #8
SETB TR0
MOV R1, #3
SJMP $
ISRT0:
CLR TR0
MOV A, R3
ADD A, R1
MOV R0, A
LCALL DISPLAYLED
DEC R1
MOV R1, #3
SKIP:
SETB TR0
RETI
DISPLAYLED:
MOV A, R1
MOVC A, @A+DPTR
MOV R2, A
MOV A, @R0
ORL A, R2
MOVX @DPTR, A
RET
POT:
END
THÍ NGHIỆM 3
Yêu cầu
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
JMP MAIN
ORG 200BH
JMP IRST0
ORG 2030H
MAIN:
MOV R1, #0
MOV 20H, #0
MOV 21H, #0
MOV 22H, #0
MOV 23H, #0
SETB TR0
SKIP:
T: JNB P1.7, $
LCALL DELAY1MS
DJNZ R7, T
LOP:
JB P1.7, $
LCALL DELAY1MS
INC 23H
MOV A, 23H
MOV 23H, #0
INC 22H
MOV A, 22H
MOV 22H, #0
INC 21H
MOV A, 21H
MOV 21H, #0
INC 20H
MOV A, 20H
MOV 20H, #0
SJMP SKIP
IRST0:
MOV A, R3
CLR C
SUBB A, R1
MOV R0, A
LCALL FORLED
INC R1
MOV R1, #0
CONTI:
RETI
FORLED:
MOV A, R1
MOVC A, @A + DPTR
MOV R6,A
MOV A, @R0
ORL A, R6
MOVX @DPTR, A
RET
DELAY1MS:
MOV R4, #2
DJNZ R5, $
RET
END
THÍ NGHIỆM 4
Yêu cầu
Viết chương trình thực hiện đồng hồ bấm giâ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 trăm của giây.
ORG 2000H
JMP MAIN
ORG 200BH
JMP IRST0
ORG 2030H
MAIN:
MOV R1, #0
MOV 21H, #0
MOV 22H, #0
MOV 23H, #0
JB P1.1, LL2
T2: SETB TR0
T: CLR TR0
MOV IE, #0
SJMP LL1
CLR TR0
MOV IE, #0
LCALL FORLED
JB P1.1, TA2
SJMP T2
IRST0:
LCALL FORLED
MOV A, 20H
INC 20H
MOV A, 20H
MOV 20H, #0
INC 21H
MOV A, 21H
INC 22H
MOV A, 22H
MOV 22H, #0
INC 23H
MOV A, 23H
MOV 23H, #0
SKIP: RETI
FORLED:
MOV A, R3
ADD A, R1
MOV R0, A
LCALL DISPLAY
INC R1
MOV R1, #0
DONE: RET
DISPLAY:
MOV A, R1
MOVC A, @A +DPTR
MOV R2, A
MOV A, @R0
ORL A, R2
MOVX @DPTR, A
RET
TABLE:
DB 0E0H,0D0H,0B0H,070H
END