BÀI 1: THÍ NGHIỆM VỚI NÚT NHẤN VÀ LED ĐƠN 1. Thí nghiệm 1: Viết chương trình thực hiện đọc liện tục trạng thái nút nhấn được nối đến P1.0 và hiển thị ra Led được nối tại chân P1.1 ( bit thứ 1 của port 1) ORG 2000H MAIN: MOV C,P1.0 MOV P1.1,C SJMP MAIN END a. Khi nhấn có 2 đèn sáng cùng lúc : khi mình nhấn P1.0 (đèn sáng) thì dữ liệu từ P1.0 được chuyển qua P1.1 thông qua cờ C, thời gian chuyển quá nhanh ( thời gian thực hiện lệnh là vài micro giây) => ta nhìn sẽ thấy 2 đèn cùng sáng/tắt cùng lúc. b. Các bit của 4 port được sử dụng trong thì nghiệm trên : Vì EME-MC8 thiết kế hoat động ở chế độ 3 bus, nên port 0: bus dữ liệu, port 2: bus địa chỉ, P3.0, P3.1, P3.6, P3.7 dùng làm bus điều khiển. Các chân còn lại của các port đều có thể dùng trong thí nghiệm này. 2. Thí nghiệm 2: Viết chương trình tạo xung vuông 1Hz được nối đến chân P1.0 với tần số dao động dùng trong hệ thống là 11.059MHz a. Duty cycle: 50% - Hz ORG 2000H LAP: CPL P1.0 CALL DL SJMP LAP DL: MOV R5,#10 L2: MOV R6,#100 L1: MOV R7,#250 DJNZ R7,$ DJNZ R6,L1 DJNZ R5,L2 RET END Dùng vòng lặp để tạo trễ 0.5s, với giá trị nạp cho R5, R6, R7 như trên tính theo công thức gần đúng là t=2*m*n*p Với giá trị nạp: R5 = 10, R6 = 200, R7 = 250 để giảm sai số. b. Duty cycle: 30% - tần số 0.5Hz ORG 2000H LAP: MOV R1,#3 MOV R2,#7 CLR P1.0 LAP1: ACALL DL DJNZ R1,LAP1 SETB P1.0 LAP2: ACALL DL DJNZ R2,LAP2 SJMP LAP DL: MOV R6,#100 L1:
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
BÀI 1: THÍ NGHIỆM VỚI NÚT NHẤN VÀ LED ĐƠN
1. Thí nghiệm 1: Viết chương trình thực hiện đọc liện tục trạng thái nút nhấn được nối đến P1.0 và hiển thị ra Led được nối tại chân P1.1 ( bit thứ 1 của port 1)
ORG 2000H
MAIN:
MOV C,P1.0
MOV P1.1,C
SJMP MAIN
END
a. Khi nhấn có 2 đèn sáng cùng lúc: khi mình nhấn P1.0 (đèn sáng) thì dữ liệu từ P1.0 được chuyển
qua P1.1 thông qua cờ C, thời gian chuyển quá nhanh ( thời gian thực hiện lệnh là vài micro giây)
=> ta nhìn sẽ thấy 2 đèn cùng sáng/tắt cùng lúc.
b. Các bit của 4 port được sử dụng trong thì nghiệm trên: Vì EME-MC8 thiết kế hoat động ở chế độ 3
bus, nên port 0: bus dữ liệu, port 2: bus địa chỉ, P3.0, P3.1, P3.6, P3.7 dùng làm bus điều khiển.
Các chân còn lại của các port đều có thể dùng trong thí nghiệm này.
2. Thí nghiệm 2: Viết chương trình tạo xung vuông 1Hz được nối đến chân P1.0 với tần số dao động
dùng trong hệ thống là 11.059MHz
a. Duty cycle: 50% - Hz ORG 2000H
LAP:
CPL P1.0
CALL DL
SJMP LAP
DL:
MOV R5,#10
L2:
MOV R6,#100
L1:
MOV R7,#250
DJNZ R7,$
DJNZ R6,L1
DJNZ R5,L2
RET
END
Dùng vòng lặp để tạo trễ 0.5s, với giá trị nạp cho R5, R6, R7 như trên tính theo công thức gần đúng là
t=2*m*n*p
Với giá trị nạp: R5 = 10, R6 = 200, R7 = 250 để giảm sai số.
b. Duty cycle: 30% - tần số 0.5Hz ORG 2000H
LAP:
MOV R1,#3
MOV R2,#7
CLR P1.0
LAP1:
ACALL DL
DJNZ R1,LAP1
SETB P1.0
LAP2:
ACALL DL
DJNZ R2,LAP2
SJMP LAP
DL:
MOV R6,#100
L1:
MOV R7,#250
DJNZ R7,$
DJNZ R6,L1
RET
END
3. Thí nghiệm 3:
a. Viết chương trình tạo xung vuông 1Hz dùng timer 0
ORG 2000H
MAIN:
CPL P1.0
ACALL DL500
SJMP MAIN
DL500:
MOV TMOD,#01H
MOV R7,#10
LOOP:
MOV TH0,#HIGH(-50000) ; giá trị nạp là 50000*10 = 500000us = 0.5s
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$ ; đợi cờ TF0 tràn và xóa cờ tràn
CLR TF0
CLR TR0
DJNZ R7,LOOP
RET
END
b. Dùng ngắt Timer 0:
ORG 2000H
LJMP MAIN
ORG 200BH
LJMP ISRT0
MAIN:
MOV TMOD,#01H
SETB TF0
MOV IE,#82H
MOV R7,#11
SJMP $
ISRT0:
DJNZ R7,NAP
CPL P1.0
MOV R7,#10
SJMP KT
NAP:
CLR TR0
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
KT: RETI
END
4. Thí nghiệm 4: Viết chương trình làm cho led nối đến chân P1.0 chớp tắt với tần số có thể tăng hoặc
giảm bằng cách nhấn nút nối đến chân P1.1 hoặc P1.2. Chu kì chớp tắt trung bình là 1s
ORG 2000H
MAIN:
CPL P1.0
MOV A,#10
JNB P1.1,KT_GIAM
DEC A ;Khi nhấn P1.1 thì f tăng => Chu kỳ giảm => giảm R7
MOV R7,A
SJMP LAP ; mỗi lần giảm là 1*25000us = 0.025s
KT_GIAM:
JNB P1.2,LAP
INC A
MOV R7,A
LAP:
ACALL DL500
DJNZ R7,LAP
SJMP MAIN
DL500:
MOV TMOD,#01H
MOV TH0,#HIGH(-25000) ; giá trị là 50000*R7 (R7TB = 10) = 500000us = 0.5s
MOV TL0,#LOW(-25000)
SETB TR0
JNB TF0,$ ; đợi cờ TF0 tràn và xóa cờ tràn
CLR TF0
CLR TR0
RET
END
BÀI TẬP:
1. Viết chương trình thực hiện cổng logic: XOR 2 ngõ vào ORG 2000H
MAIN:
CLR A
MOV C,P1.0
MOV ACC.0,C
MOV R0,A
MOV C,P1.1
MOV ACC.0,C
XRL A,R0
MOV C,ACC.0
MOV P1.5,C
SJMP MAIN
END
2. Viết chương trình thực hiện mạch đèn chạy: STTTTTT-SSTTTTTT-SSSTTTTT-SSSSTTTT…….-SSSSSSSS-TTTTTTT. Thời gian thực hiện chương trình là 4.5s (với S: đèn sáng, T: đèn tắt)
ORG 2000H
MAIN:
CLR A
MOV DPTR,#TABLE
MOV R7,#8
LAP:
MOVC A,@A+DPTR
ACALL DL500
INC A
DJNZ R7,LAP
SJMP MAIN
DL500:
MOV TMOD,#01H
MOV R6,#10
LOOP:
MOV TH0,#HIGH(-50000) ; giá trị nạp là 50000*10 = 500000us = 0.5s
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$ ; đợi cờ TF0 tràn và xóa cờ tràn
CLR TF0
CLR TR0
DJNZ R6,LOOP
RET
TABLE:
DB 7FH,3FH,1FH,0FH,07H,03H,01H,00H,0FFH
END
3. Viết chương trình thực hiện phép logic: P1.5 = (P1.0 XOR P1.1) AND P1.2) ORG 2000H
MAIN:
CLR A
MOV C,P1.0
MOV ACC.0,C
MOV R0,A
MOV C,P1.1
MOV ACC.0,C
XRL A,R0
MOV R0,A ; R0 = P1.0 XOR P1.1
MOV C,P1.2
MOV ACC.0,C
ANL A,R0
MOV C,ACC.0
MOV P1.5,C
SJMP MAIN
END
BÀI 2: THÍ NGHIỆM HIỂN THỊ DÙNG LED 7 ĐOẠN
1. Thí nghiệm 1:Viết chương trính thực hiện bộ đếm từ 0->9 và hiển thị trên led 7 đoạn, mỗi lần cách nhau 2s
ORG 2000H
MAIN:
MOV R7,#10
MOV R5,#0
LOOP:
MOV DPTR,#TABLE
MOV A,R5
MOVC A,@A+DPTR
ACALL DL2S
MOV DPTR,#0000H
MOVX @DPTR,A
INC R5
DJNZ R7,LOOP
SJMP MAIN
DL2S:
MOV R6,#40
MOV TMOD,#01H
LAP:
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
DJNZ R6,LAP
RET
TABLE:
DB 70H,71H,72H,73H,74H,75H,76H,77H,78H,79H
END
2. Thí nghiệm 2:
a. Viết chương trình hiển thị giá trị 1234 lên led 7 đoạn ORG 2000H
MAIN:
MOV R7,#4
MOV R5,#0
LOOP:
MOV DPTR,#TABLE
MOV A,R5
MOVC A,@A+DPTR
ACALL DL2MS
MOV DPTR,#0000H
MOVX @DPTR,A
INC R5
DJNZ R7,LOOP
SJMP MAIN
DL2MS:
MOV TMOD,#01H
MOV TH0,#HIGH(-2000)
MOV TL0,#LOW(-2000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
RET
TABLE:
DB 71H,0B2H,0D3H,0E4H ;tương ứng với giá trị 1234 hiển thị lên Led 1 2 3
4
END
b. Thay đổi chương trình để giá trị 1234 có thể hiển thị thông qua mã BCD nén chứa trong cặp thanh ghi R7 & R6,Biết R7 là MSB
ORG 2000H
MAIN:
MOV R7,#12H
MOV R6,#34H
MOV A,R7
ANL A,#0F0H
SWAP A
ADD A,#70H
MOV R1,A ; R1 chưa gía trị 71H tương ứng với giá trị 1 đươc xuất ra led 1
MOV A,R7
ANL A,#0FH
ADD A,#0B0H
MOV R2,A ; R2 chưa giá trị 0B2H tương ứng với giá trị 1 được xuất ra led 2
MOV A,R6
ANL A,#0F0H
SWAP A
ADD A,#0D0H
MOV R3,A ; R3 chưa giá trị 0D3H tương ứng với giá trị 1 được xuất ra led 3
MOV A,R6
ANL A,#0FH
ADD A,#0E0H
MOV R4,A ; R4 chưa giá trị 0E4H trương ứng với giá trị 1 đươc xuất ra led
4
LAP:
MOV DPTR,#0
MOV A,R1
MOVX @DPTR,A
ACALL DL2MS
MOV A,R2
MOVX @DPTR,A
ACALL DL2MS
MOV A,R3
MOVX @DPTR,A
ACALL DL2MS
MOV A,R4
MOVX @DPTR,A
ACALL DL2MS
SJMP LAP
DL2MS:
MOV TMOD,#01H
MOV TH0,#HIGH(-2000)
MOV TL0,#LOW(-2000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
RET
END
3. Thí nghiệm 3: Viết chương trình hiển thị giá trị nhị phân trong thanh ghi R7 lên led 7 đoạn ORG 2000H
MAIN:
MOV R7,#254 ; nạp tùy ý giá trị R7 để kiểm tra
MOV B,#10
MOV A,R7
DIV AB
MOV R4,B ; R4 chứa giá trị hàng đơn vị
MOV B,#10
DIV AB
MOV R3,B ; R3 chứa giá trị hàng chục
MOV R2,A ; R2 chưa giá trị hàng trăm
LAP:
MOV DPTR,#0
MOV A,R2
ADD A,#0B0H
MOVX @DPTR,A
ACALL DL2MS
MOV A,R3
ADD A,#0D0H
MOVX @DPTR,A
ACALL DL2MS
MOV A,R4
ADD A,#0E0H
MOVX @DPTR,A
ACALL DL2MS
SJMP LAP
DL2MS:
MOV TMOD,#01H
MOV TH0,#HIGH(-2000)
MOV TL0,#LOW(-2000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
RET
END
BÀI TẬP:
1. Đếm số từ 0-99 (giả sử <100) xuất ra led 7 đoạn. Mỗi lần xuất cách nhau ORG 2000H
MAIN:
MOV DPTR,#0
MOV R7,#0
MOV R6,#0
JNB P1.0,NHAY ; nhảy khi nhấn P1.0
SJMP MAIN
NHAY:
INC R7
CJNE R7,0AH,SKIP ; nhảy đến SKIP khi R7 # 0AH
MOV R7,#0
INC R6
SKIP:
MOV A,R7
ADD A,#0E0H
MOVX @DPTR,A
ACALL DL2MS
MOV A,R6
ADD A,#0D0H
MOVX @DPTR,A
JB P1.0,SKIP ; nhảy đến SKIP khi không nhấn P1.0
SJMP NHAY
DL2MS:
MOV TMOD,#01H
MOV TH0,#HIGH(-2000)
MOV TL0,#LOW(-2000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
RET
END
2. Viết chương trình đếm từ 0-60 rồi lặp lại, mỗi lần đếm cách nhau 1s ORG 2000H
MOV R6,#0
MOV R7,#0
LOOP1:
MOV R5,#100 ; gán R5 = 100*(5ms+5ms) = 1s để led xuất ra có sự lưu ảnh.
LOOP:
MOV DPTR,#0
MOV A,R7
ADD A,#0E0H
MOVX @DPTR,A
ACALL DL5MS
MOV A,R6
ADD A,#0D0H
MOVX @DPTR,A
ACALL DL5MS
DJNZ R5,LOOP
INC R7
CJNE R7,#0AH,LOOP1
MOV R7,#0
INC R6
CJNE R6,#6,LOOP1
MOV R6,#0
SJMP LOOP1
DL5MS:
MOV TMOD,#01H
MOV TH0,#HIGH(-5000)
MOV TL0,#LOW(-5000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
RET
END
BÀI 3: THÍ NGHIỆM HIỂN THỊ BẰNG LCD
1. Thí nghiệm 1: Hiển thị chuỗi “Hello world” lên LCD ORG 2000H
MAIN:
MOV DPTR,#8000H
ACALL CLEAR
ACALL INIT_LCD
ACALL HIEN_CHU
ACALL DELAY1
SJMP MAIN
;=============================================Chương trình con LCD
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:
SETB P3.4
CLR P3.5
MOVX @DPTR,A
CLR P3.4
ACALL DELAY_50MS
RET
WRITETEXT:
SETB P3.4
SETB P3.5
MOVX @DPTR,A
CLR P3.4
ACALL DELAY2
RET
HIEN_CHU:
MOV A,#'D'
ACALL WRITETEXT
MOV A,#'H'
ACALL WRITETEXT
MOV A,#'E'
ACALL WRITETEXT
MOV A,#'L'
ACALL WRITETEXT
MOV A,#' 'O’
ACALL WRITETEXT
MOV A,#'’W'
ACALL WRITETEXT
MOV A,#'’O'
ACALL WRITETEXT
MOV A,#'’R'
ACALL WRITETEXT
MOV A,#'’L'
ACALL WRITETEXT
MOV A,#'’D'
ACALL WRITETEXT
RET
; ===============================================Chương trình DELAY
DELAY_50MS:
MOV R3,#100
LOOP1:
MOV R7,#250
DJNZ R7,$
DJNZ R3,LOOP1
RET
DELAY1: ; delay 300ms
MOV R6,#3
LOP1:
MOV R5,#200
LOP:
MOV R4,#250
DJNZ R4,$
DJNZ R5,LOP
DJNZ R6,LOP1
RET
DELAY2:
MOV R3,#1
LOOP2:
MOV R7,#50
DJNZ R7,$
DJNZ R3,LOOP2
RET
END
BÀI TẬP:
Viết chương trình hiển thị chuỗi: “DHBK TPHCM” chạy trên màn hình, khi hết màn hình thì chạy ngược lại, lặp lại quá trình trên
ORG 2000H
MAIN:
MOV DPTR,#8000H
MOV R1,#6
ACALL CLEAR
ACALL INIT_LCD
ACALL HIEN_CHU
ACALL DELAY
LAP1:
MOV A,#1CH ; dịch phải
ACALL WRITECOM
ACALL DELAY
DJNZ R1,LAP1
MOV R1,#6
LAP:
MOV A,#18H ; dịch trái
ACALL WRITECOM
ACALL DELAY
DJNZ R1,LAP
MOV R1,#6
SJMP LAP1
;=============================================Chương trình con LCD
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:
SETB P3.4
CLR P3.5
MOVX @DPTR,A
CLR P3.4
ACALL DELAY_50MS
RET
WRITETEXT:
SETB P3.4
SETB P3.5
MOVX @DPTR,A
CLR P3.4
ACALL DELAY2
RET
HIEN_CHU:
MOV A,#'D'
ACALL WRITETEXT
MOV A,#'H'
ACALL WRITETEXT
MOV A,#'B'
ACALL WRITETEXT
MOV A,#'K'
ACALL WRITETEXT
MOV A,#' '
ACALL WRITETEXT
MOV A,#'T'
ACALL WRITETEXT
MOV A,#'P'
ACALL WRITETEXT
MOV A,#'H'
ACALL WRITETEXT
MOV A,#'C'
ACALL WRITETEXT
MOV A,#'M'
ACALL WRITETEXT
RET
; ===============================================Chương trình DELAY
DELAY_50MS:
MOV R3,#100
LOOP1:
MOV R7,#250
DJNZ R7,$
DJNZ R3,LOOP1
RET
DELAY:
MOV R6,#3
LOP1:
MOV R5,#200
LOP:
MOV R4,#250
DJNZ R4,$
DJNZ R5,LOP
DJNZ R6,LOP1
RET
DELAY2:
MOV R3,#1
LOOP2:
MOV R7,#50
DJNZ R7,$
DJNZ R3,LOOP2
RET
END
BÀI 4: THÍ NGHIỆM GIAO TIẾP QUA CỔNG NỐI TIẾP
1. Thí nghiệm 1: Phát chuỗi “Hello World” ra port nối tiếp ORG 2000H
MAIN:
MOV SCON,#52H
MOV TMOD,#20H
MOV TH1,#-3
SETB TR1
MOV DPTR,#TABLE
LAP:
CLR A
MOVC A,@A+DPTR
INC DPTR
ACALL OUT_CHAR
JNZ LAP
SJMP $
OUT_CHAR: ;phát kí tự ra port nối tiếp
JNB TI, $
CLR TI
MOV SBUF, A
RET
TABLE:
DB 'Hello, world',0 ; phát tới khi gặp kí tự 0 thì dừng
END
2. Thí nghiệm 2: Nhận kí tự từ port nối tiếp hiển thị ra LCD (tốc độ port chọn là 9600pbs) ORG 2000H
EN BIT P3.4
RS BIT P3.5
MAIN:
MOV DPTR, #8000H
ACALL LCD_INIT
ACALL UART_INIT
ACALL CLEAR
LOOP:
MOV R4,#16
LAP1:
ACALL IN_CHAR
ACALL WRITE_TEXT
DJNZ R4,LAP1
MOV R4,#16
MOV A,#0C0H ;để con trỏ xuống hàng
ACALL WRITE_COM
LAP2:
ACALL IN_CHAR
ACALL WRITE_TEXT
DJNZ R4,LAP2
ACALL CLEAR
SJMP LOOP
;============================================ Chương trình con port nối tiếp
UART_INIT:
MOV SCON,#52H
MOV TMOD,#20H
MOV TH1,#-3
SETB TR1
RET
OUT_CHAR:
JNB TI, $ ;khi phát hết TI=1
CLR TI
MOV SBUF, A
RET
IN_CHAR:
JNB RI, $
CLR RI
MOV A, SBUF
RET
;============================================== Chương trình con LCD
LCD_INIT:
MOV A,#38H
ACALL WRITE_COM
MOV A,#0EH
ACALL WRITE_COM
MOV A,#06H
ACALL WRITE_COM
RET
CLEAR:
MOV A,#01H
ACALL WRITE_COM
RET
WAIT_LCD:
MOV R7, #100
DEL1:
MOV R6, #250
DJNZ R6, $
DJNZ R7, DEL1
RET
WRITE_TEXT:
ACALL WAIT_LCD
SETB RS
MOVX @DPTR, A
SETB EN
CLR EN
RET
WRITE_COM:
ACALL WAIT_LCD
CLR RS
MOVX @DPTR, A
SETB EN
CLR EN
RET
END
3. Thí nghiệm 3: Nhận kí tự từ port nối tiếp hiển thị ra LCD đồng thời phát ra lại port nối tiếp (tốc độ port chọn là 9600pbs)
ORG 2000H
EN BIT P3.4
RS BIT P3.5
MAIN: ; chương trình chính
MOV DPTR, #8000H
ACALL LCD_INIT
ACALL UART_INIT
ACALL CLEAR
LOOP:
MOV R4,#16 ; gán R4 = 16 để nhập chữ đđủ trên hàng 1 rồi
xuống hàng 2
LAP1:
ACALL IN_CHAR
ACALL WRITE_TEXT
ACALL OUT_CHAR
DJNZ R4,LAP1
MOV R4,#16
MOV A,#0C0H ; để con trỏ xuống hàng
ACALL WRITE_COM
LAP2:
ACALL IN_CHAR
ACALL WRITE_TEXT
ACALL OUT_CHAR
DJNZ R4,LAP2
ACALL CLEAR
SJMP LOOP
;========================================= Chương trình con port nối tiếp
UART_INIT: ; khởi đđộng port nối tiếp
MOV SCON,#52H
MOV TMOD,#20H
MOV TH1,#-3
SETB TR1
RET
OUT_CHAR: ; phát kí tự ra port nối tiếp
JNB TI, $ ;khi phát hết TI = 1
CLR TI
MOV SBUF, A
RET
IN_CHAR: ; thu kí tự từ port nối tiếp
JNB RI, $
CLR RI
MOV A, SBUF
RET
;============================================== Chương trình con LCD
LCD_INIT: ; khởi đđộng LCD
MOV A,#38H
ACALL WRITE_COM
MOV A,#0EH
ACALL WRITE_COM
MOV A,#06H
ACALL WRITE_COM
RET
CLEAR:
MOV A,#01H
ACALL WRITE_COM
RET
WAIT_LCD: ; chương trình tạo delay chờ cho LCD
MOV R7, #100
DEL1:
MOV R6, #250
DJNZ R6, $
DJNZ R7, DEL1
RET
WRITE_TEXT: ; ghi kí tự ra LCD
ACALL WAIT_LCD
SETB RS
MOVX @DPTR, A
SETB EN
CLR EN
RET
WRITE_COM: ; ghi lệnh ra LCD
ACALL WAIT_LCD
CLR RS
MOVX @DPTR, A
SETB EN
CLR EN
RET
END
BÀI TẬP:
Viết chương trình nhập kí tự từ bàn phím về làm công việc sau đây:
a. Kiểm tra xem kí tự nhận được là A-Z hoặc a-z thì hiển thị lên LCD
b. Kiểm tra xem kí tự nhận nhấn được số từ 0-9 thì hiển thị qua led 7 đoạn c. Nếu nhấn phím Enter thì xuống hàng mã ASCII 13H
d. Nếu nhấn phím ESC thì xóa màn hình LCD mã ASCII 27H
ORG 2000H
EN BIT P3.4
RS BIT P3.5
MAIN:
MOV DPTR, #8000H
ACALL LCD_INIT
ACALL UART_INIT
ACALL CLEAR
LOOP:
MOV R4,#16
LAP1:
ACALL IN_CHAR
ACALL NHANKYTU
ACALL OUT_CHAR
DJNZ R4,LAP1
MOV R4,#16
MOV A,#0C0H ;để con trỏ xuống hàng
ACALL WRITE_COM
LAP2:
ACALL IN_CHAR
ACALL NHANKYTU
ACALL OUT_CHAR
DJNZ R4,LAP2
ACALL CLEAR
SJMP LOOP
;=======================================Chương trình con Port nối tiếp
UART_INIT:
MOV SCON,#52H
MOV TMOD,#20H
MOV TH1,#-3
SETB TR1
RET
OUT_CHAR:
JNB TI, $ ;khi phát hết TI = 1
CLR TI
MOV SBUF, A
RET
IN_CHAR:
JNB RI, $
CLR RI
MOV A, SBUF
RET
;========================================== Chương trình con LCD
LCD_INIT:
MOV A,#38H
ACALL WRITE_COM
MOV A,#0EH
ACALL WRITE_COM
MOV A,#06H
ACALL WRITE_COM
RET
CLEAR:
MOV A,#01H
ACALL WRITE_COM
RET
WAIT_LCD:
MOV R7, #100
DEL1:
MOV R6, #250
DJNZ R6, $
DJNZ R7, DEL1
RET
WRITE_TEXT:
ACALL WAIT_LCD
SETB RS
MOVX @DPTR, A
SETB EN
CLR EN
RET
WRITE_COM:
ACALL WAIT_LCD
CLR RS
MOVX @DPTR, A
SETB EN
CLR EN
RET
;=========Chương trình con kiểm tra kí tự nhận được từ Port nối tiếp về xử lí theo
đề bài
NHANKYTU:
PUSH ACC
;................................... kiểm tra ESC VA ENTER
CJNE A,#13,SKIP1
MOV A,#0C0H ;để con trỏ xuống hàng
ACALL WRITE_COM
SJMP THOAT
SKIP1:
CJNE A,#27,TIEP
ACALL CLEAR
SJMP THOAT
;.................................. kiểm tra 0-9
TIEP:
CJNE A,#30H,$+3
JNC KTRA3
SJMP THOAT
KTRA3:
CJNE A,#3AH,$+3
JC XUAT_LED
;................................... kiểm tra A-Z
CJNE A,#41H,$+3
JNC KTRA1
SJMP THOAT
KTRA1:
CJNE A,#5BH,$+3
JC XUAT_LCD ; C=1 thì A < 5AH
;..................................... kiểm tra a-z
CJNE A,#61H,$+3
JNC KTRA2
SJMP THOAT
KTRA2:
CJNE A,#7BH,$+3
JC XUAT_LCD
XUAT_LED:
PUSH DPH
PUSH DPL
MOV DPTR,#0
ANL A,#0FH
ADD A,#0E0H
MOVX @DPTR,A
ACALL DELAY_2MS
POP DPL
POP DPH
SJMP THOAT
XUAT_LCD:
ACALL WRITE_TEXT
THOAT:
POP ACC
RET
;========================Chương trình con tạo trễ tạo sự lưu ảnh trên led 7 đoạn
DELAY_2MS:
MOV R1,#4
LAP9:
MOV R2,#250
DJNZ R2,$
DJNZ R1,LAP9
RET
END
BÀI 5: THÍ NGHIỆM ĐIỀU KHIỂN ADC
1. Thí nghiệm 1: Viết chương trình thực hiện đọc điện áp của biến trở trên kênh 0 và hiển thị ra led 7 đoạn. ORG 2000H
MAIN:
MOV DPTR,#4000H ;địa chỉ khối ADC
MOV A,#0
MOVX @DPTR,A
ACALL DELAY_100US
MOVX A,@DPTR
MOV DPTR,#0000H
MOV B,#10
DIV AB
MOV R7,B
MOV B,#10
DIV AB
ORL A,#0B0H
MOVX @DPTR,A
ACALL DELAY_1MS
MOV A,B
ORL A,#0D0H
MOVX @DPTR,A
ACALL DELAY_1MS
MOV A,R7
ORL A,#0E0H
MOVX @DPTR,A
ACALL DELAY_1MS
SJMP MAIN
DELAY_100US:
MOV R6,#200
DJNZ R6,$
RET
DELAY_1MS:
MOV R6,#5
LOOP:
MOV R5,#100
DJNZ R5,$
DJNZ R6,LOOP
RET
END
2. Thí nghiệm 2: Viết chương trình đọc điện áp của kênh 0 và hiển thị lên LCD
ORG 2000H
MAIN:
MOV DPTR,#4000H ;địa chỉ khối ADC
MOV A,#0
MOVX @DPTR,A
ACALL DELAY_100US
MOVX A,@DPTR
MOV B,#10
DIV AB
MOV R2,B
MOV B,#10
DIV AB
MOV DPTR,#8000H
ACALL CLEAR
ACALL INIT_LCD
ACALL HIEN_CHU
ACALL DELAY1
SJMP MAIN
;=============================================Chương trình con LCD
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:
SETB P3.4
CLR P3.5
MOVX @DPTR,A
CLR P3.4
ACALL DELAY_50MS
RET
WRITETEXT:
SETB P3.4
SETB P3.5
MOVX @DPTR,A
CLR P3.4
ACALL DELAY2
RET
HIEN_CHU:
ACALL WRITETEXT
MOV A,B
ACALL WRITETEXT
MOV A,R2
ACALL WRITETEXT
RET
; ===============================================Chương trình DELAY
DELAY_50MS:
MOV R3,#100
LOOP1:
MOV R7,#250
DJNZ R7,$
DJNZ R3,LOOP1
RET
DELAY1: ; delay 300ms
MOV R6,#3
LOP1:
MOV R5,#200
LOP:
MOV R4,#250
DJNZ R4,$
DJNZ R5,LOP
DJNZ R6,LOP1
RET
DELAY2:
MOV R3,#1
LOOP2:
MOV R7,#50
DJNZ R7,$
DJNZ R3,LOOP2
RET
DELAY_100US:
MOV R6,#200
DJNZ R6,$
RET
END
BÀI 6: THÍ NGHIỆM VỚI LED MA TRẬN
1. Thí nghiệm 1: Viết chương trình hiển thị kí tự A lên LED ma trận.