You are on page 1of 8

LAB 1-3

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

MỤC TIÊU:

 Hiểu cách chống rung phím


 Hiểu cách giao tiếp LCD
 Hiểu cách giao tiếp phím đơn
 Hiểu cách giao tiếp bàn phím ma trận

THAM KHẢO:

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

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.
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

https://doe.dee.hcmut.edu.vn/
LAB 1-3
GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN

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) (như bên dưới nhưng bỏ DELAY_500MS)

https://doe.dee.hcmut.edu.vn/
LAB 1-3
GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN
c) Thêm tính năng chống rung phím vào chương trình
.ORG 0 MOV R27,R26
LDI OUT PORTD,R27 OUT_LCD:
R16,HIGH(RAMEND) /* CPI R27,255 OUT PORTB,R17
OUT SPH,R16 BRLO LP SBI PORTC,2
LDI LDI R27,0 */ CBI PORTC,2
R16,LOW(RAMEND) RJMP LP RET
OUT SPL,R16
LDI R16,0X07 RESET_LCD: DELAY_US:
OUT DDRC,R16 LDI R16,250 PUSH R15
CBI PORTC,0 RCALL DELAY_US PUSH R14
CBI PORTC,1 LDI R16,250 MOV R15,R16
CBI PORTC,2 RCALL DELAY_US LDI R16,200
LDI R16,0XFF CBI PORTC,0; L1:
OUT DDRB,R16 LDI R17,$30 MOV R14,R16
OUT DDRD,R16 RCALL OUT_LCD L2:
SBI PORTA,0 LDI R16,42 DEC R14
CBI DDRA,0 RCALL DELAY_US NOP
LDI R26,0 CBI PORTC,0; BRNE L2
LDI R28,0 LDI R17,$30 DEC R15
LDI R29,0 RCALL OUT_LCD BRNE L1
LDI R30,0 LDI R16,2 POP R14
RCALL RESET_LCD RCALL DELAY_US POP R15
LDI R18,$38 CBI PORTC,0; RET
LDI R19,$01 LDI R17,$30 DELAY_500MS:
LDI R20,$0C RCALL OUT_LCD PUSH R16
LDI R21,$06 RET PUSH R17
RCALL INIT_LCD8 PUSH R18
;XUAT LCD INIT_LCD8: LDI R16,16
START: LDI R16,1 LP1: LDI R17,250
LDI R16,1 RCALL DELAY_US LP2: LDI R18,250
RCALL DELAY_US CBI PORTC,0 LP3: NOP
LP: CBI PORTC,0 MOV R17,R18 DEC R18
LDI R17,$81 RCALL OUT_LCD BRNE LP3
RCALL OUT_LCD LDI R16,1 DEC R17
LINE1: RCALL DELAY_US BRNE LP2
RCALL TACH CBI PORTC,0 DEC R16
MOV R17,R30 MOV R17,R19 BRNE LP1
RCALL XUAT RCALL OUT_LCD POP R18
LDI R30,0 LDI R16,20 POP R17
MOV R17,R29 RCALL DELAY_US POP R16
RCALL XUAT CBI PORTC,0 RET
LDI R29,0 MOV R17,R20 TACH:
MOV R17,R28 RCALL OUT_LCD PUSH R16
RCALL XUAT LDI R16,1 TRAM: CPI
LDI R28,0 RCALL DELAY_US R27,100
HERE: CBI PORTC,0 BRLO CHUC
RCALL MOV R17,R21 SUBI R27,100
DELAY_500MS RCALL OUT_LCD INC R30
SBIC PINA,0 LDI R16,1 RJMP TRAM
RJMP HERE RCALL DELAY_US CHUC: CLC
INC R26 RET CPI R27,10

https://doe.dee.hcmut.edu.vn/
LAB 1-3
GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN
BRLO DV
SUBI R27,10
INC R29
RJMP CHUC
DV: CLC
MOV R28,R27
POP R16
RET
XUAT:
PUSH R20
LDI R20,$30
ADD R17,R20
LDI R16,1
RCALL DELAY_US
SBI PORTC,0
RCALL OUT_LCD
POP R20
RET

https://doe.dee.hcmut.edu.vn/
LAB 1-3
GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN

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

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.

https://doe.dee.hcmut.edu.vn/
LAB 1-3
GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN

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
keypad_scan: ldi r23, 3 ; row 3 is pressed
ldi r22, 0b11110111 ; initial col rjmp keypad_scan_found
mask keypad_scan_next_row:
ldi r23, 0 ; initial pressed row ; check if all rows have been scanned
value cpi r24,0
ldi r24,3 ;scanning col index breq keypad_scan_not_found
keypad_scan_loop: ; shift row mask to scan next row
out PORTA, r22 ; scan current col ror r22
nop ;need to have 1us delay to dec r24 ;increase row index
stablize rjmp keypad_scan_loop
sbic PINA, 4 ; check row 0 keypad_scan_found:
rjmp keypad_scan_check_col2 ; combine row and column to get key
rjmp keypad_scan_found ; row 0 is value (0-15)
pressed ;key code = row*4 + col
keypad_scan_check_col2: lsl r23 ; shift row value 4 bits to
sbic PINA, 5 ; check row 1 the left
rjmp keypad_scan_check_col3 lsl r23
ldi r23, 1 ; row1 is pressed add r23, r24 ; add row value to
rjmp keypad_scan_found column value
keypad_scan_check_col3: mov r24,r23
sbic PINA, 6 ; check row 2 out portd,r24
rjmp keypad_scan_check_col4 rjmp START
ldi r23, 2 ; row 2 is pressed keypad_scan_not_found:
rjmp keypad_scan_found ldi r23, $ff ; no key pressed
keypad_scan_check_col4: mov r24,r23
sbic PINA, 7 ; check row 3 out portd,r24
rjmp keypad_scan_next_row
rjmp START

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.
.ORG 0 CBI PORTC,2 ldi r20,
LDI LDI R16,$FF 0b11111111 ; enable
R16,HIGH(RAMEND) OUT DDRB,R16 pull up resistor
OUT SPH,R16 OUT DDRD,R16 out PORTA, r20
LDI ldi r20, LDI R28,0
R16,LOW(RAMEND) 0b00001111 ; set LDI R29,0
OUT SPL,R16 upper 4 bits of PORTD RCALL RESET_LCD
LDI R16,0X07 as input with pull- LDI R18,$38
OUT DDRC,R16 up, lower 4 bits as LDI R19,$01
CBI PORTC,0 output LDI R20,$0C
CBI PORTC,1 out DDRA, r20 LDI R21,$06

https://doe.dee.hcmut.edu.vn/
LAB 1-3
GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN

RCALL INIT_LCD8 CBI PORTC,0 LP1: LDI R17,250


RJMP keypad_scan MOV R17,R18 LP2: LDI R18,250
;XUAT LCD RCALL OUT_LCD LP3: NOP
START: LDI R16,1 DEC R18
LDI R16,1 RCALL DELAY_US BRNE LP3
RCALL DELAY_US CBI PORTC,0 DEC R17
LP: CBI PORTC,0 MOV R17,R19 BRNE LP2
LDI R17,$81 RCALL OUT_LCD DEC R16
RCALL OUT_LCD LDI R16,20 BRNE LP1
LINE1: RCALL DELAY_US POP R18
MOV R27,R23 CBI PORTC,0 POP R17
RCALL TACH MOV R17,R20 POP R16
MOV R17,R29 RCALL OUT_LCD RET
RCALL XUAT LDI R16,1 TACH:
LDI R29,0 RCALL DELAY_US PUSH R16
MOV R17,R28 CBI PORTC,0 CHUC: CLC
RCALL XUAT MOV R17,R21 CPI R27,10
LDI R28,0 RCALL OUT_LCD BRLO DV
HERE: LDI R16,1 SUBI R27,10
RCALL DELAY_500MS RCALL DELAY_US INC R29
IN R18,PINA RET RJMP CHUC
CPI R18,$0F DV: CLC
BRNE keypad_scan_0 OUT_LCD: MOV R28,R27
RJMP HERE OUT PORTB,R17 POP R16
keypad_scan_0: RJMP SBI PORTC,2 RET
keypad_scan CBI PORTC,2 XUAT:
RESET_LCD: RET PUSH R20
LDI R16,250 LDI R20,$30
RCALL DELAY_US DELAY_US: ADD R17,R20
LDI R16,250 PUSH R15 LDI R16,1
RCALL DELAY_US PUSH R14 RCALL DELAY_US
CBI PORTC,0; MOV R15,R16 SBI PORTC,0
LDI R17,$30 LDI R16,200 RCALL OUT_LCD
RCALL OUT_LCD L1: POP R20
LDI R16,42 MOV R14,R16 RET
RCALL DELAY_US L2:
CBI PORTC,0; DEC R14 keypad_scan:
LDI R17,$30 NOP ldi r22, 0b11110111 ;
RCALL OUT_LCD BRNE L2 initial col mask
LDI R16,2 DEC R15 ldi r23, 0 ; initial
RCALL DELAY_US BRNE L1 pressed row value
CBI PORTC,0; POP R14 ldi r24,3 ;scanning
LDI R17,$30 POP R15 col index
RCALL OUT_LCD RET keypad_scan_loop:
RET DELAY_500MS: out PORTA, r22 ; scan
PUSH R16 current col
INIT_LCD8: PUSH R17 nop ;need to have 1us
LDI R16,1 PUSH R18 delay to stablize
RCALL DELAY_US LDI R16,16

https://doe.dee.hcmut.edu.vn/
LAB 1-3
GIAO TIẾP NÚT NHẤN, BÀN PHÍM MA TRẬN

sbic PINA, 4 ; check rjmp ror r22


row 0 keypad_scan_check_col dec r24 ;increase row
rjmp 4 index
keypad_scan_check_col ldi r23, 2 ; row 2 is rjmp keypad_scan_loop
2 pressed keypad_scan_found:
rjmp rjmp ; combine row and
keypad_scan_found ; keypad_scan_found column to get key
row 0 is pressed keypad_scan_check_col value (0-15)
keypad_scan_check_col 4: ;key code = row*4 +
2: sbic PINA, 7 ; check col
sbic PINA, 5 ; check row 3 lsl r23 ; shift row
row 1 rjmp value 4 bits to the
rjmp keypad_scan_next_row left
keypad_scan_check_col ldi r23, 3 ; row 3 is lsl r23
3 pressed add r23, r24 ; add
ldi r23, 1 ; row1 is rjmp row value to column
pressed keypad_scan_found value
rjmp keypad_scan_next_row: out portd,r23
keypad_scan_found ; check if all rows rjmp START
keypad_scan_check_col have been scanned keypad_scan_not_found
3: cpi r24,0 :
sbic PINA, 6 ; check breq ldi r23, $0 ; no key
row 2 keypad_scan_not_found pressed
; shift row mask to out portd,r23
scan next row
rjmp START

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

https://doe.dee.hcmut.edu.vn/

You might also like