You are on page 1of 17

Nhóm học L06

Họ và Tên Võ Trọng Khôi


MSSV 1910284

Mở đầu:
1. Tất cả hình ảnh khi chụp màn hình máy tính trong bài này đều phải chụp toàn màn
hình, không cắt dán, chỉnh sửa. Nếu sinh viên có nguyện vọng cắt ảnh trên màn hình một
phần nào đó để trình bày cụ thể, hoặc muốn chỉnh sửa, thêm dòng ghi chú trên ảnh… thì
phải có hai hình: Một - ảnh toàn màn hình, hai - ảnh đã chỉnh sửa, cắt dán… Phím tắt cắt
ảnh nhanh của Window 10 là tổ hợp phím Window + Shift + S, để dán ảnh đã cắt vào báo
cáo dùng tổ hợp phím CTRL + V.
2. Bài thi sẽ có hai câu, sinh viên lập trình trên Keil C, chạy mô phỏng trên Proteus… và
hoàn thành bản báo cáo này theo yêu cầu đặt ra. Làm bài trực tiếp trên đề.
3. File nộp bài là một folder tổng hợp được nén lại và đặt tên theo cú pháp:
MSSV_HoVaTen, ví dụ 1813622_NguyenVanA. Trong folder gồm có:
- File word báo cáo (file này) với định dạng *.docx hoặc *.doc, được đặt tên theo
cú pháp MSSV_HoVaTen.
- File *.asm chứa chương trình các bạn thực hiện, được đặt tên theo cú pháp
MSSV_HoVaTen_Bai1 hoặc MSSV_HoVaTen_Bai2.
- Các file khác theo yêu cầu được đặt tên theo cú pháp MSSV_HoVaTen.
4. File tổng nộp trên BK e-learning.
Đề bài:
1. Viết chương trình thực hiện: Hiển thị số 100 lên các LED 7 đoạn, việc hiển thị LED 7
đoạn phải dùng ngắt timer. Sau đó đọc trạng thái các nút nhấn sau và xử lý:
- Nút nhấn P1.0 được nhấn: tăng giá trị lên 1 đơn vị. Giới hạn hiển thị là 255, vượt quá sẽ
giữ ở 255.
- Nút nhấn P1.1 được nhấn: giảm giá trị đi 1 đơn vị. Các kết quả âm đổi thành 0.
- Nút nhấn P1.2 được nhấn: nhân giá trị hiện tại lên 2 lần.
- Nút nhấn P1.3 được nhấn: chia giá trị hiện tại đi 2 lần, làm tròn xuống.
- Nút nhấn P1.7 được nhấn: giá trị được set lại là 100.
- Không cần chống rung phím.
Màn hình Keil C nơi sinh viên đã viết xong chương trình.
Đoạn code chương trình
ORG 0
LJMP MAIN
ORG 000BH
LJMP ISR_T0
ORG 0030H
MAIN:
MOV R1, #20H
MOV TMOD,#01H
SETB ET0
SETB EA
SETB TF0
MOV P1, #0FFH
RESET: MOV R5, #100
NUT0: JB P1.0, NUT1
CJNE R5, #255, TANG
ACALL DELAY
JMP NUT0
TANG: INC R5
ACALL DELAY
JMP NUT0
NUT1: JB P1.1, NUT2
CJNE R5, #0, GIAM
ACALL DELAY
JMP NUT0
GIAM: DEC R5
ACALL DELAY
JMP NUT0
NUT2: JB P1.2, NUT3
CJNE R5, #128, $+3
JC NHAN
MOV R5, #255
ACALL DELAY
JMP NUT0
NHAN: MOV A, R5
RL A
MOV R5, A
ACALL DELAY
JMP NUT0
NUT3: JB P1.3, NUT7
MOV A, R5
RR A
ANL A, #7FH
MOV R5, A
ACALL DELAY
JMP NUT0
NUT7: JB P1.7, NUT0
ACALL DELAY
JMP RESET
ISR_T0:
CLR TR0
PUSH ACC
ACALL THAPPHAN
MOV DPTR, #VITRI
MOV A, R0
MOVC A, @A+DPTR
MOV B, @R1
ORL A, B
MOV DPTR, #0
MOVX @DPTR, A
MOV TH0,#HIGH(-9216)
MOV TL0,#LOW(-9216)
SETB TR0
INC R0
INC R1
POP ACC
CJNE R0, #3, OUT
MOV R0, #0
MOV R1, #20H
OUT: RETI
THAPPHAN:
PUSH ACC
MOV A, R5
MOV B, #10
DIV AB
MOV 20H, B
MOV B, #10
DIV AB
MOV 21H, B
MOV 22H, A
POP ACC
RET
DELAY: MOV R7, #50
LAP1: MOV R6, #50
LAP2: MOV R4, #50
DJNZ R4, $
DJNZ R6, LAP2
DJNZ R7, LAP1
RET
VITRI: DB 0E0H, 0D0H, 0B0H
END
Thử chương trình: Nhấn lần lượt các nút nhấn sau:
P1.7__P1.3__P1.1__P1.1__P1.2__P1.0__P1.3
Các giá trị hiển thị trên LED 7 đoạn mong muốn sau khi một loạt các nút trên là (lấy máy
tính ra bấm coi nó sẽ ra bao nhiêu): 100 ->50->49->48->96->97->48
Các giá trị hiển thị trên LED 7 đoạn thu được: 100 ->50->49->48->96->97->48
Giá trị hiển thị trên LED 7 đoạn thu được sau khi nhấn nút cuối cùng trong chuỗi (hình
chụp):

Thử chương trình: Nhấn lần lượt các nút nhấn sau:
P1.7__ P1.2__P1.0__P1.0__P1.0__P1.2__P1.2
Các giá trị hiển thị trên LED 7 đoạn mong muốn sau khi một loạt các nút trên là (lấy máy
tính ra bấm coi nó sẽ ra bao nhiêu): 100 ->200->201->202->203->406->812
Các giá trị hiển thị trên LED 7 đoạn thu được: 100 ->200->201->202->203->255->255
do giới hạn hiển thị là 255
Giá trị hiển thị trên LED 7 đoạn thu được sau khi nhấn nút cuối cùng trong chuỗi (hình
chụp):
Thử chương trình: Nhấn lần lượt các nút nhấn sau:
P1.7__P1.3__P1.3__P1.3__P1.3__P1.3__P1.1__P1.1__P1.1__P1.1__P1.1
Các giá trị hiển thị trên LED 7 đoạn mong muốn sau khi một loạt các nút trên là (lấy máy
tính ra bấm coi nó sẽ ra bao nhiêu): 100 ->50->25->12->6->3->2->1->0->-1->-2
Các giá trị hiển thị trên LED 7 đoạn thu được: 100 ->50->25->12->6->3->2->1->0->0->0
Giá trị hiển thị trên LED 7 đoạn thu được sau khi nhấn nút cuối cùng trong chuỗi (hình
chụp):
2. Viết chương trình theo yêu cầu sau:
- Viết chương trình lấy 4 bit cuối của dữ liệu lưu trong ô nhớ 20H (tạm gọi là X) nhân
cho 4 bit cuối của dữ liệu lưu trong ô nhớ 21H (tạm gọi là Y), kết quả cất vào ô nhớ 22H
(gọi là Z) (4 bit nhân 4 bit kết quả tốt đa là 8 bit).
- Hiển thị kết quả phép toán trên lên LCD dưới cú pháp: X x Y = Z. Để dễ dàng, việc
hiển thị X, Y nên hiển thị theo kiểu hai chữ số: ví dụ 07, 14… Z hiển thị theo kiểu 3 chữ
số: ví dụ 010, 100.

Màn hình Keil C nơi sinh viên đã viết xong chương trình.
Đoạn code chương trình
LCD_E BIT P3.3
LCD_RS BIT P3.5
LCDADDR EQU 6000H
ORG 0
MAIN: ACALL CLEAR
ACALL INIT_LCD
MOV A, 20H
ANL A, #0FH
ACALL THAPPHAN2
ACALL HIENTHI2
MOV A, #'x'
ACALL WRITETEXT
MOV A, 21H
ANL A, #0FH
PUSH ACC
ACALL THAPPHAN2
ACALL HIENTHI2
MOV A, #'='
ACALL WRITETEXT
POP ACC
MOV B, 20H
ANL B, #0FH
MUL AB
ACALL THAPPHAN3
ACALL HIENTHI3
JMP $
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 R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
THAPPHAN2:
MOV B, #10
DIV AB
MOV R1, A
MOV R2, B
RET
HIENTHI2:
MOV A, R1
ORL A, #30H
ACALL WRITETEXT
MOV A, R2
ORL A, #30H
ACALL WRITETEXT
RET
THAPPHAN3:
MOV B, #10
DIV AB
MOV R3, B
MOV B, #10
DIV AB
MOV R2, B
MOV R1, A
RET
HIENTHI3:
MOV A, R1
ORL A, #30H
ACALL WRITETEXT
MOV A, R2
ORL A, #30H
ACALL WRITETEXT
MOV A, R3
ORL A, #30H
ACALL WRITETEXT
RET
END
Tiến hành test chương trình trên bằng cách gán trực tiếp giá trị:
06H vào ô nhớ 20H và 07H vào ô nhớ 21H, chạy chương trình, quan sát.
Kết quả mong muốn: 06 x 07 = 042
Kết quả nhận được (chụp kết quả trên LCD):

Tiến hành test chương trình trên bằng cách gán trực tiếp giá trị:
AAH vào ô nhớ 20H và BBH vào ô nhớ 21H, chạy chương trình, quan sát.
Kết quả mong muốn: 10 x 11 = 110
Kết quả nhận được (chụp kết quả trên LCD):
Tiến hành test chương trình trên bằng cách gán trực tiếp giá trị:
AFH vào ô nhớ 20H và BEH vào ô nhớ 21H, chạy chương trình, quan sát.
Kết quả mong muốn: 15 x 14 = 210
Kết quả nhận được (chụp kết quả trên LCD):

You might also like