Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 30

TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.

HCM

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

BÁO CÁO LAB 1

THÍ NGHIỆM VI XỬ LÝ

NHÓM 3 – LỚP L03

Ngày nộp: 06/04/2023

Giảng viên hướng dẫn: NGUYỄN TUẤN HÙNG

Sinh viên thực hiện MSSV

1 Nguyễn Hải Nam 2013821

2 Đàm Vũ Nhật Thành 2114773

3 Lê Công Sỹ Nguyên 2111870

1
LAB 1-1

GIAO TIẾP I/O VÀ CÁC LỆNH TÍNH TOÁN

MỤC TIÊU:

⮚ Thực hiện các giao tiếp I/O Port, các lệnh tính toán

THAM KHẢO:

⮚ Tài liệu hướng dẫn thí nghiệm, chương 1, 2

BÀI 1

a) Kết nối 1 port của AVR (VD PORT A) vào dip switch. Kết nối 1 port khác vào bar LED (Ví dụ PORT B)
b) Viết chương trình đọc liên tục trạng thái của DIP Switch và gửi ra LED. Nếu Swich ở trạng thái OFF, LED tương ứng sẽ tắt.

Trả lời các câu hỏi

a. Lấy giá trị từ 2 nibble của PORTA như thế nào

Để lấy 4byte thấp:

IN R18, PINA

MOV R19, R18

ANDI R18, $0F

Để lấy 4byte cao:

1
LAB 1-1

GIAO TIẾP I/O VÀ CÁC LỆNH TÍNH TOÁN

ANDI R19, $F0

SWAP R19

b. Enable điện trở pullup như thế nào?

PORTA là port nhập nên để xét điện trở kéo lên cho nó ta chỉ cần out giá trị $FF ra thanh ghi PORTA.

c. Khi Switch ở trạng thái ON/OFF, giá trị chân Port bằng bao nhiêu?

Switch ON: chân PORTA có giá trị 0, chân PORTB có giá trị 1

Switch OFF: chân PORTA có giá trị 1, chân PORTB có giá trị 0

d. Khi chân port ở trạng thái 1, BAR LED sáng hay tắt?

Port ở trạng thái 1 thì BAR LED sáng.

e. Mã nguồn với chú thích

.INCLUDE <M324PADEF.INC>

.EQU PORTIN = PINA

.EQU IOSETA = DDRA

.EQU PORTOUT = PORTB

.EQU IOSETB = DDRB

.ORG 0

RJMP XUATNHAP

.ORG $40

XUATNHAP:

LDI R16,0

OUT IOSETA,R16

LDI R16,0XFF

OUT PORTA,R16

OUT IOSETB,R16

MAIN:

LDI R16,0

OUT PORTOUT,R16

LDI R16,0XFF

START:

IN R17,PORTIN

EOR R17,R16

OUT PORTOUT,R17

END:

RJMP START

2
LAB 1-1

GIAO TIẾP I/O VÀ CÁC LỆNH TÍNH TOÁN

BÀI 2

a) Viết chương trình đọc giá trị của Port đang nối với Dip Switch, cộng thêm 5 và gửi ra Port đang nối với Bar LED.
b) Thay đổi trạng thái của Dip Switch và quan sát trạng thái Bar LED

Trả lời các câu hỏi


a. Mã nguồn với chú thích

.INCLUDE <M324PADEF.INC>

.EQU PORTIN = PINA

.EQU IOSETA = DDRA

.EQU PORTOUT = PORTB

.EQU IOSETB = DDRB

.ORG 0

RJMP XUATNHAP

.ORG $40

XUATNHAP:

3
LAB 1-1

GIAO TIẾP I/O VÀ CÁC LỆNH TÍNH TOÁN

LDI R16,0

OUT IOSETA,R16

LDI R16,0XFF

OUT PORTA,R16

OUT IOSETB,R16

MAIN:

LDI R16,0

OUT PORTOUT,R16

LDI R16,0XFF

LDI R18,5

START:

IN R17,PORTIN

EOR R17,R16

ADD R17,R18

OUT PORTOUT,R17

END:

RJMP START

BÀI 3

a) Kết nối và thực hiện chương trình tính tích của 2 nibble cao và thấp của PORTAvà gửi ra PORT B. Coi như 2 nibble này là 2 số không dấu
VD: PORTA = 0b0111_1111, thì PORTB = 3*15.
b) Thay đổi trạng thái của Dip Switch và quan sát trạng thái Bar LED

4
LAB 1-1

GIAO TIẾP I/O VÀ CÁC LỆNH TÍNH TOÁN

Trả lời các câu hỏi


Làm thế nào lấy giá trị từ 2 nibble của PORT A
Để lấy 4byte thấp:
IN R18, PINA
MOV R19, R18
ANDI R18, $0F
Để lấy 4byte cao:
ANDI R19, $F0
SWAP R19
a. Mã nguồn với chú thích

.INCLUDE <M324PADEF.INC>

.EQU PORTIN = PINA

.EQU IOSETA = DDRA

.EQU PORTOUT = PORTB

.EQU IOSETB = DDRB

.ORG 0

RJMP XUATNHAP

.ORG $40

XUATNHAP:

LDI R16,0

OUT IOSETA,R16

LDI R16,0XFF

OUT PORTA,R16

OUT IOSETB,R16

MAIN:

LDI R16,0

OUT PORTOUT,R16

LDI R16,0XFF

START:

IN R17,PORTIN

EOR R17,R16

MOV R18,R17

ANDI R17,15

SWAP R18

ANDI R18,15

MUL R17,R18

END:

OUT PORTOUT,R0

RJMP START

5
LAB 1-1

GIAO TIẾP I/O VÀ CÁC LỆNH TÍNH TOÁN

BÀI 4

a) Kết nối và thực hiện chương trình tính tích của 2 nibble cao và thấp của PORTAvà gửi ra PORT B. Coi như 2 nibble này là 2 số có dấu

VD: PORTA = 0b0111_1111, thì PORTB = 3* (-1).

b) Thay đổi trạng thái của Dip Switch và quan sát trạng thái Bar LED

Trả lời các câu hỏi


a. Mã nguồn với chú thích
.ORG 0

RJMP MAIN

.ORG 0x40

MAIN:

CLR R16

OUT DDRA, R16

SER R16

OUT DDRB, R16

OUT PORTA, R16

LAP: IN R16, PINA

COM R16

MOV R17, R16

ANDI R16, 0x0F

MOV R18, R16

6
LAB 1-1

GIAO TIẾP I/O VÀ CÁC LỆNH TÍNH TOÁN

ANDI R18, 0b00001000

BREQ TTUC ; kiểm tra 4 bit thấp âm hay dương

LDI R18, $F0

ADD R16, R18

TTUC: SWAP R17

ANDI R17, 0x0F

MOV R18, R17 ; R18 là thanh ghi trung gian

ANDI R18, 0b00001000

BREQ NHAN ; kiểm tra 4 bit cao âm hay dương

LDI R18, $F0

ADD R17, R18

NHAN: MULS R17, R16

OUT PORTB, R0

RJMP LAP

BÀI 5

a) Kết nối PA0 vào 1 Switch đơn và PA1 vào 1 LED đơn trên khối LED (lưu ý là cùng 1 Port)
b) Viết chương trình bật LED nếu SW nhấn, tắt LED nếu SW nhả.

Trả lời các câu hỏi

7
LAB 1-1

GIAO TIẾP I/O VÀ CÁC LỆNH TÍNH TOÁN

a. Khi Switch ở trạng thái nhấn/nhả, giá trị chân Port bằng bao nhiêu?

Nhấn: PORTA0 = 0

Nhả: PORTA0 = 1

b. Để LED sáng, chân port xuất ra mức logic gì?

LED sáng chân PORTA1 xuất mức 1

c. Mã nguồn với chú thích

.ORG 0

CBI DDRA, 0 ; make PA0 an input

SBI DDRA, 1 ; make PA1 an output

SBI PORTA, 0 ; enable pull - up resistor

MAIN: RCALL LOOP1

RJMP MAIN

LOOP1: LDI R16, 50

DEBOUNCING_0:

SBIC PINA,0

RJMP LOOP1

DEC R16

BRNE DEBOUNCING_0

SBI PORTA,1

LOOP2:

LDI R16,50

DEBOUNCING_1:

SBIS PINA,0

RJMP LOOP2

DEC R16

BRNE DEBOUNCING_1

CBI PORTA,1

RET

8
LAB 1-2

DELAY DÙNG LỆNH

MỤC TIÊU:

Thực hiện các lệnh tạo trễ dùng câu lệnh


Thực hiện giao tiếp với thanh ghi dịch


THAM KHẢO:

Tài liệu hướng dẫn thí nghiệm, chương 1, 2


BÀI 1

a) Cho chương trình như sau:


.include "m324PAdef.inc"

.org 00

ldi r16,0x01

out DDRA, r16

start:

sbi PORTA,PINA0

cbi PORTA, PINA0

rjmp start

Kết nối PA0 vào một kênh đo trên khối TEST STATION và đo dạng xung trên oscilloscope

9
LAB 1-2

DELAY DÙNG LỆNH


Trả lời các câu hỏi
a. Chụp ảnh dạng xung trên PA0

b. Tần số, thời gian tín hiệu bằng 1, thời gian tín hiệu bằng 0 là bao nhiêu?
Thời gian tín hiệu 1/0 là 250ns/500ns mỗi chu kỳ
c. Giải thích kết quả đo được.

Sbi PORTA,PINA0 (1MC; trước khi thực hiện lệnh tín hiệu bằng 0 sau khi thực hiện lệnh tín hiệu bằng 1)

Cbi PORTA, PINA0 (1MC; trước khi thực hiện lệnh tín hiệu bằng 1 sau khi thực hiện lệnh tín hiệu bằng 0)

Rjmp start (1MC; trước và sau khi thực hiện lệnh tín hiệu bằng 0)

BÀI 2

a) Viết chương trình con Delay1ms và dùng nó để viết chương trình tạo xung vuông tần số 1Khz trên PA0.

.INCLUDE <M324PADEF.INC>

.ORG 0

XUATNHAP:

LDI R16,1

OUT DDRA,R16

MAIN:

SBI PORTA,0

RCALL DELAY_1MS

CBI PORTA,0

RCALL DELAY_1MS

RJMP MAIN

10
LAB 1-2

DELAY DÙNG LỆNH


DELAY_1MS:

LDI R17,10

L1: LDI R18,200

L2: DEC R18

NOP

BRNE L2

DEC R17

BRNE L1

RET

b) Dùng chương trình con này viết các chương trình con Delay10ms, Delay100ms, Delay1s.

DELAY_1MS:

L1: LDI R17,10

L2: LDI R18,200

AGAIN:

NOP

DEC R18

BRNE AGAIN

DEC R17

BRNE L2

DEC R19

BRNE L1

RET

DELAY_10MS:

LDI R19,10

RCALL DELAY_1MS

RET

DELAY_100MS:

LDI R19,100

RCALL DELAY_1MS

RET

DELAY_1S:

LDI R20,10

LOOP:

RCALL DELAY_100MS

DEC R20

BRNE LOOP

RET

c) Dùng chương trình con Delay1s viết chương trình chớp/tắt 1 LED gắn vào PA0.
1. Trả lời các câu hỏi
a. Cách tính số chu kỳ máy để thực hiện chương trình con Delay1ms. Trình bày hình ảnh mô phỏng
+ Tần số của Atmega324 là 8MHz tương ứng với 1MC = 1uS.
+ Delay 1ms sẽ tương ứng với 1000MC.
+ Áp dụng công thức TDL = 4 x m x n = 1000.
+ Ta chọn được m = 250, n= 1.

11
LAB 1-2

DELAY DÙNG LỆNH


b. Hình ảnh xung 1Khz trên PA0.

2. Mã nguồn câu 2.c với chú thích


.ORG 0

SBI DDRA, 0

LOOP: LDI R20, 1

OUT PORTA, R20

RCALL DELAY1S

LDI R20, 0

OUT PORTA, R20

RCALL DELAY1S

RJMP LOOP

Delay1ms: LDI R16, 249

LAP: NOP

DEC R16

BRNE LAP ;4.n+4

RET

DELAY1S: LDI R19, 32

LP2: LDI R18, 250

LP1: RCALL DELAY1MS

DEC R18

BRNE LP1

DEC R19

BRNE LP2

12
LAB 1-2

DELAY DÙNG LỆNH

RET

BÀI 3

a) Kết nối các tín hiệu cần thiết từ 1 port của AVR đến các tín hiệu điều khiển thanh ghi dịch trên header J13. Kết nối ngõ ra của thanh ghi dịch đến Bar
LED.
b) Dùng các chương trình trong ví dụ mẫu trong tài liệu hướng dẫn thì nghiệm, viết chương trình tạo hiệu ứng LED sáng dần từ trái qua phải, sau đo tắt dần
từ trái qua phải sau mỗi khoảng thời gian 500ms.

Trả lời các câu hỏi


a. Mô tả kết nối trên kit thí nghiệm

13
LAB 1-2

DELAY DÙNG LỆNH

b. Theo như datasheet của 74HC595, tần số clock cao nhất mà nó có thể hoạt động được là bao nhiêu?
35MHz

c. Nếu muốn mở rộng hiển thị ra 16 LED thì ta phải làm như thế nào?
Sử dụng thêm một IC 74HC595 nữa để điều khiển thêm 8 LED
d. Mã nguồn với chú thích

.INCLUDE <M324PADEF.INC>

.ORG 0

RJMP XUATNHAP

.ORG $40

XUATNHAP:

LDI R16,7

OUT DDRB,R16

LDI R16,0

OUT PORTB,R16

STACK:

LDI R16,HIGH(RAMEND)

OUT SPH,R16

LDI R16,LOW(RAMEND)

OUT SPL,R16

MAIN:

LDI R16,8

LOOP1:

SBI PORTB,0

RCALL OUT_595

14
LAB 1-2

DELAY DÙNG LỆNH


RCALL DELAY_500MS

DEC R16

BRNE LOOP1

LDI R16,8

LOOP2:

CBI PORTB,0

RCALL OUT_595

RCALL DELAY_500MS

DEC R16

BRNE LOOP2

END:

RJMP MAIN

OUT_595:

SBI PORTB,1

CBI PORTB,1

SBI PORTB,2

CBI PORTB,2

RET

DELAY_500MS:

LDI R17,16

L1: LDI R18,250

L2: LDI R19,250

AGAIN:

NOP

DEC R19

BRNE AGAIN

DEC R18

BRNE L2

DEC R17

BRNE L1

RET

15
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN

BÀI 1

a) Kết nối một PORT của AVR vào J33 (Header điều khiển LCD) trên kit thí nghiệm.

PA0: RS PA1: RW PA2: E PA4  PA7: D4  D7

b) Dùng các chương trình mẫu trong tài liệu hướng dẫn thí nghiệm, viết chương trình khởi động LCD và xuất lên LCD như sau. (XX là số nhóm)

TN VXL-AVR

Nhom: XX

Trả lời các câu hỏi:

a) LCD phân biệt command và data bằng cách nào?

Dựa vào chân RS

b) Ngoài cách đọc bit BUSY, còn cách nào để đảm bảo là LCD rảnh khi gửi dữ liệu/command?

Delay cho mỗi lần thực thi lệnh

c) Mô tả kết nối trên kit thí nghiệm:

d) Mã nguồn chương trình với chú thích:

16
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN


.EQU RS = 0
.EQU RW = 1
.EQU EN = 2
.EQU CR = $0D ; Enter
.EQU NULL = $00 ; End string

.ORG 0
RJMP MAIN
.ORG 0X40
MAIN:
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
LDI R16, $FF
OUT DDRA, R16 ;PA7,6,5,4,2,1,0 is output
CBI PORTA, RS ;Recieve command
CBI PORTA, RW ;Write data
CBI PORTA, EN ;Unenable LCD
CALL RESET_LCD
CALL INIT_LCD4
START:
CBI PORTA, RS
LDI R17, $01 ;Clear display before
RCALL OUT_LCD4_2
LDI R16, 20 ;Delay 20ms after clearing
RCALL DELAY_US
CBI PORTA, RS
LDI R17, $80 ;Pointer start at line1, pos1
RCALL OUT_LCD4_2
LDI ZH, HIGH(TAB<<1)
LDI ZL, LOW(TAB<<1)
LINE1:
LPM R17, Z+
CPI R17, CR ;Check enter code
BREQ DOWN
SBI PORTA, RS ;Display on LCD
RCALL OUT_LCD4_2
RJMP LINE1
DOWN:
LDI R16, 1 ;Xuong dong phai doi 100us
RCALL DELAY_US
CBI PORTA, RS
LDI R17, $C0 ;Set pointer to line2 pos1
RCALL OUT_LCD4_2
LINE2:
LPM R17, Z+
CPI R17, NULL
BREQ DONE
SBI PORTA, RS
RCALL OUT_LCD4_2
RJMP LINE2
DONE:
RJMP DONE

17
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN

OUT_LCD4:
OUT PORTA, R17
SBI PORTA, EN
CBI PORTA, EN
RET

OUT_LCD4_2:
LDI R16, 1 ;Delay 1us
RCALL DELAY_US
IN R16, PORTA
ANDI R16, (1<<RS)
PUSH R16
PUSH R17
ANDI R17, $F0
OR R17, R16
RCALL OUT_LCD4
LDI R16, 1 ;Delay 1us between first and second access
RCALL DELAY_US
POP R17
POP R16
SWAP R17
ANDI R17, $F0
OR R17, R16
RCALL OUT_LCD4
RET
INIT_LCD4:
LDI R18, $28 ;Function set
LDI R19, $01 ;Clear display
LDI R20, $0C ;Display on, pointer off
LDI R21, $06
CBI PORTA, RS
MOV R17, R18
RCALL OUT_LCD4_2
MOV R17, R19 ;Clear display
RCALL OUT_LCD4_2
LDI R16, 20 ;Delay 20ms after clearing display
RCALL DELAY_US
MOV R17, R20
RCALL OUT_LCD4_2
MOV R17, R21
RCALL OUT_LCD4_2
RET

RESET_LCD:
LDI R16, 250 ;Delay 25ms
RCALL DELAY_US
LDI R16, 250 ;Delay 25ms
RCALL DELAY_US
CBI PORTA, RS
LDI R17, $30 ;Lan 1
RCALL OUT_LCD4

LDI R16, 250 ;Delay 25ms

18
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN


RCALL DELAY_US
LDI R16, 170 ;Delay 17ms
RCALL DELAY_US
CBI PORTA, RS
LDI R17, $30 ;Lan 2
RCALL OUT_LCD4

LDI R16, 2 ;Delay 200us


RCALL DELAY_US
CBI PORTA, RS
LDI R17, $32 ;Lan 3
RCALL OUT_LCD4_2
RET

DELAY_US:
MOV R15, R16
LDI R16, 200
LP1:
MOV R14, R16
LP2:
NOP
DEC R14
BRNE LP2
DEC R15
BRNE LP1
RET
TAB:

.DB "TN VXL-AVR",$0D,"Nhom: ","10",$00

BÀI 2

a) Kết nối 1 switch đến 1 chân port của AVR, kết nối module BAR LED đến 1 port của AVR, kết nối LCD đến 1 port của AVR

b) Viết chương trình đếm số lần nhấn nút và xuất kết quả ra barled, đồng thời xuất ra LCD (không chống rung)

c) Thêm tính năng chống rung phím vào chương trình

d) Thực hiện chương trình, nhấn/nhả nút và quan sát kết quả

19
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN

Trả lời các câu hỏi:

a) Hiện tượng gì xảy ra khi không chống rung phím

Do SW là tiếp điểm cơ khí nên sẽ có hiện tượng rung phím khi nhấn làm mạch nhận dạng hiểu nhầm nhấn/ nhả SW nhiều lần.

b) Mô tả cách kết nối trên kit thí nghiệm

+ Kết nối một PORTC của AVR vào J33 (Header điều khiển LCD) trên kit thí nghiệm.

PC0: RS PC1: RW PC2: E PC4  PC7: D4  D7

+ Kết nối chân 0 của PORTA của AVR vào switch0

+ Kết nối một PORTD của AVR vào BARLED.

c) Mã nguồn chương trình không chống rung phím và chú thích

.EQU RS = 0
.EQU RW = 1
.EQU EN = 2

.ORG 0
RJMP MAIN
.ORG 0X40
MAIN:
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
SER R16
OUT DDRA, R16 ;PortA is output LCD
OUT DDRC, R16 ;PortC is output Barled
CBI DDRB, 0 ;PB0 is input

20
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN


SBI PORTB, 0 ;Pull-up
CBI PORTA, RS ;Recieve command
CBI PORTA, RW ;Write data
CBI PORTA, EN ;Unenable LCD
CLR R24 ;R24 to contain result
LDI R25, $30 ;Change to ascii
CALL RESET_LCD
CALL INIT_LCD4
START:
CALL DISPLAY_LCD
CALL WAIT_PRESS
CALL DISPLAY_LCD
CALL WAIT_UNPRES
RJMP START
WAIT_PRESS:
SBIC PINB, 0
RJMP WAIT_PRESS
INC R24
OUT PORTC, R24
RET
WAIT_UNPRES:
SBIS PINB, 0
RJMP WAIT_UNPRES
CALL DELAY_50MS
SBIS PINB, 0
RJMP WAIT_UNPRES
RET

DISPLAY_LCD:
PUSH R24 ;Save R24
MOV R18, R24
LDI R21, 10
CLR R22
L1:
INC R22 ;Div10 lan 1
SUB R18, R21
BRCC L1
DEC R22
ADD R18, R21
PUSH R18 ;Cat hang don vi
MOV R18, R22 ;Lay phan nguyen chia 10 lan 2
CLR R22
L2:
INC R22 ;Div10 lan 2
SUB R18, R21
BRCC L2
DEC R22
ADD R18, R21
PUSH R18 ;Cat hang chuc
MOV R18, R22 ;Lay phan nguyen chia 10 lan 3
CLR R22
L3:
INC R22 ;Div10 lan 3
SUB R18, R21

21
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN


BRCC L3
DEC R22
ADD R18, R21
PUSH R18 ;Cat hang tram
CBI PORTA, RS
LDI R17, $01 ;Clear display before
CALL OUT_LCD4_2
LDI R16, 20 ;Delay 20ms after clearing
CALL DELAY_US
CBI PORTA, RS
LDI R17, $82 ;Pointer start at line1, pos3
CALL OUT_LCD4_2
LDI R26, 3 ;Lap 3 lan lay 3 so ra
LP:
POP R17
ADD R17, R25
SBI PORTA, RS
CALL OUT_LCD4_2
DEC R26
BRNE LP
POP R24 ;Restore R24
RET

RESET_LCD:
LDI R16, 250 ;Delay 25ms
CALL DELAY_US
LDI R16, 250 ;Delay 25ms
CALL DELAY_US
CBI PORTA, RS
LDI R17, $30 ;Lan 1
CALL OUT_LCD4

LDI R16, 250 ;Delay 25ms


CALL DELAY_US
LDI R16, 170 ;Delay 17ms
CALL DELAY_US
CBI PORTA, RS
LDI R17, $30 ;Lan 2
CALL OUT_LCD4

LDI R16, 2 ;Delay 200us


CALL DELAY_US
CBI PORTA, RS
LDI R17, $32 ;Lan 3
CALL OUT_LCD4_2
RET

INIT_LCD4:
LDI R18, $28 ;Function set
LDI R19, $01 ;Clear display
LDI R20, $0C ;Display on, pointer off
LDI R21, $06
CBI PORTA, RS
MOV R17, R18

22
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN


CALL OUT_LCD4_2
MOV R17, R19 ;Clear display
CALL OUT_LCD4_2
LDI R16, 20 ;Delay 20ms after clearing display
CALL DELAY_US
MOV R17, R20
CALL OUT_LCD4_2
MOV R17, R21
CALL OUT_LCD4_2
RET

OUT_LCD4:
OUT PORTA, R17
SBI PORTA, EN
CBI PORTA, EN
RET
OUT_LCD4_2:
LDI R16, 1 ;Delay 1us
CALL DELAY_US
IN R16, PORTA
ANDI R16, (1<<RS)
PUSH R16
PUSH R17
ANDI R17, $F0
OR R17, R16
CALL OUT_LCD4
LDI R16, 1 ;Delay 1us between first and second access
CALL DELAY_US
POP R17
POP R16
SWAP R17
ANDI R17, $F0
OR R17, R16
CALL OUT_LCD4
RET

DELAY_US:
MOV R15, R16
LDI R16, 200
LP1:
MOV R14, R16
LP2:
NOP
DEC R14
BRNE LP2
DEC R15
BRNE LP1
RET

DELAY_50MS:
LDI R16, 250 ;Delay 25ms
CALL DELAY_US

23
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN


LDI R16, 250 ;Delay 25ms
CALL DELAY_US
RET

d) Mã nguồn chương trình có chống rung và chú thích

Thêm 3 dòng này ở WAIT_PRES


CALL DELAY_50MS
SBIC PINB, 0
RJMP WAIT_PRESS

Tương tự với ctc WAIT_UNPRES

BÀI 3

a) Kết nối tín hiệu từ một port của AVR đến module bàn phím ma trận , kết nối module BAR LED và LCD đến 2 port khác của AVR.

b) Viết chương trình con SCANKEY để quét bàn phím ma trận và trả về giá trị từ 0x0 đến 0xF ứng với mã của phím được nhấn. Nếu không có phím nào được nhấn trả
về giá trị 0xFF. Giá trị trả về chứa trong R24

c) Dùng chương trình con này, viết chương trình thực hiện việc quét phím và xuất giá trị đọc được lên bar led và LCD.

d) Thực hiện chương trình, quan sát kết quả

Trả lời các câu hỏi:

a) Cách kết nối các module trên bài thí nghiệm

+ Kết nối một PORTC của AVR vào J33 (Header điều khiển LCD) trên kit thí nghiệm.

24
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN


PC0: RS PC1: RW PC2: E PC4  PC7: D4  D7

+ Kết nối PORTB của AVR vào phím ma trận.

PB4  PB7: C0  C3 PB4  PB7: C4  C7

+ Kết nối một PORTD của AVR vào BARLED.

b) Có hiện tượng rung phím đối với bàn phím ma trận hay không? Nếu có thì xử lý bằng cách nào?

- Có hiện tượng chống rung phím xử lý bằng cách viết CTC chống trung phí

- CTC chống rung phím:

KEY_RD: LDI R16,50 ;số lần nhận dạng phím nhấn (chống rung khi nhấn)

BACK1: RCALL GET_KEY16 ;gọi ctc nhận dạng phím

BRCC KEY_RD ;C=0 phím chưa nhấn lặp lại

DEC R16 ;đếm số lần nhận dạng phím

BRNE BACK1 ;lặp vòng cho đủ số lần đếm

PUSH R17 ;xác nhận phím nhấn,cất mã phím

WAIT_1: LDI R16,50 ;số lần nhận dạng phím nhả (chống rung khi nhả)

BACK2: RCALL GET_KEY16 ;gọi ctc nhận dạng phím

BRCS WAIT_1 ;C=1 phím chưa nhả

DEC R16 ;đếm số lần nhận dạng phím

BRNE BACK2 ;lặp vòng cho đủ số lần đếm

POP R17 ;xác nhận phím nhả lấy lại mã phím

RCALL CLEARLCD

c) Trình bày mã nguồn chương trình và chú thích:

.INCLUDE<M324PDEF.INC>

.EQU LCD=PORTA

.EQU LCD_DR=DDRA

.EQU LCD_IN=PINA

.EQU RS=0

.EQU RW=1

.EQU E=2

.ORG 0

RJMP START

.ORG 0x40

START: LDI R16, HIGH(RAMEND)

OUT SPH, R16

25
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN


LDI R16, LOW(RAMEND)

OUT SPL, R16

LDI R16, 0x0F

OUT DDRB, R16

LDI R16, 0xFF

OUT DDRD, R16

OUT DDRA, R16

LDI R16, 0xFF

OUT PORTB, R16

LDI R16, 0x00

OUT PORTD, R16

START1: RCALL KEY_RD

RCALL HEX_TO_ASCII

MOV R24, R17

OUT PORTD, R24

RJMP START2

KEY_RD: LDI R21, 50

BACK1: RCALL SCAN_KEY

BRCC KEY_RD; C=0 CH?A CÓ PHÍM NH?N

DEC R21

BRNE BACK1

PUSH R17

WAIT: LDI R21, 50

BACK2: RCALL SCAN_KEY

BRCS WAIT; C=1 PHÍM CH?A NH?

DEC R21

BRNE BACK2

POP R17

RET

SCAN_KEY:

LDI R17, 4

LDI R20, 0xFE

CHECK_KEY: OUT PORTB, R20

IN R19, PINB

IN R19, PINB

ANDI R19, 0xF0

CPI R19, 0xF0

BRNE KIEM_TRA

LSL R20

26
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN


INC R20

DEC R17

BRNE CHECK_KEY

CLC

RJMP EXIT

KIEM_TRA: SUBI R17, 4

NEG R17

LDI R20, 4

SWAP R19

LAP: ROR R19

BRCC SET_FLAG

INC R17

INC R17

INC R17

INC R17

DEC R20

BRNE LAP

CLC

RJMP EXIT

SET_FLAG: SEC

EXIT: RET

HEX_TO_ASCII:

CPI R17, 0x0A

BRCC CHU_CAI

LDI R18, 0x30

ADD R17, R18

RJMP KTHUC

CHU_CAI: LDI R18, 0x37

ADD R17, R18

KTHUC: RET

/*---------------------------------------------*/

/*LCD4BIT*/

START2: LDI R16, 0xFF

OUT LCD, R16

CBI LCD, RS

CBI LCD, RW

CBI LCD, E

//RESET NGUON

LDI R16, 250

RCALL DELAY_US

LDI R16, 250

RCALL DELAY_US

CBI LCD, RS

LDI R17, 0x30

RCALL OUT_LCD4

27
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN


LDI R16, 42

RCALL DELAY_US

CBI LCD, RS

LDI R17, 0x30

RCALL OUT_LCD4

LDI R16, 2

RCALL DELAY_US

CBI LCD, RS

LDI R17, 0x32

RCALL OUT_LCD4_2

/*LDI R16, 2

RCALL DELAY_US

CBI LCD, RS

LDI R17, 0x20

RCALL OUT_LCD4_2*/

/*LDI R16, 2

RCALL DELAY_US*/

LDI R18, 0x28;2 D̉NG, FONT 5X8

LDI R19, 0x01; CLEAR DISLAY

LDI R20, 0x0C

LDI R21, 0x06

RCALL INIT_LCD4

START3: CBI LCD, RS

LDI R17, 0x01

RCALL OUT_LCD4_2

LDI R16, 20; CH? 2MS

RCALL DELAY_US

CBI LCD, RS

LDI R17, 0x80

RCALL OUT_LCD4_2

LDI R16, 2; CH? 200US

RCALL DELAY_US

MOV R17, R24

SBI LCD, RS

RCALL OUT_LCD4_2

LDI R16, 2

RCALL DELAY_US

RJMP START1

OUT_LCD4_2:

LDI R16, 1

RCALL DELAY_US

IN R16, LCD

ANDI R16, (1<<RS)

PUSH R16

28
LAB 1-3

GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN


PUSH R17

ANDI R17, 0xF0

OR R17, R16

RCALL OUT_LCD4

LDI R16, 1

RCALL DELAY_US

POP R17

POP R16

SWAP R17

ANDI R17, 0xF0

OR R17, R16

RCALL OUT_LCD4

RET

OUT_LCD4: OUT LCD, R17

SBI LCD, E

CBI LCD, E

RET

DELAY_US: ANDI R16, 0xFF

LAP2: LDI R21, 200

LAP1: NOP

DEC R21

BRNE LAP1

DEC R16

BRNE LAP2

RET

INIT_LCD4: CBI LCD, RS

MOV R17, R18

RCALL OUT_LCD4_2

MOV R17, R19

RCALL OUT_LCD4_2

LDI R16, 20

RCALL DELAY_US

MOV R17, R20

RCALL OUT_LCD4_2

MOV R17, R21

RCALL OUT_LCD4_2

RET

29

You might also like