Nothing Special   »   [go: up one dir, main page]

Microprocessor Interfacing & Programming: Laboratory Manual

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

Microprocessor Interfacing &

Programming
EL-303
LABORATORY MANUAL
Fall 2020

LAB 12

Keypad Matrix Interfacing with ATmega32


Engr. Ifrah Maqsood

________________________________________ __________ ___


STUDENT NAME ROLL NO SEC

______________________________________
LAB ENGINEER SIGNATURE & DATE

MARKS AWARDED: /10


________________________________________________________________
NATIONAL UNIVERSITY OF COMPUTER AND EMERGING SCIENCES (NUCES),
ISLAMABAD

Prepared by: Engr. Ahsan Khan Version: 2.00


Last Edited by: Engr. Khalid Usman Date: 14 November 2019
Verified by: Engr. Azhar Rauf Date: 14 November 2019
Microprocessor Interfacing & Programming LAB: 12
LAB: 12 Keypad Matrix Interfacing with ATmega32

Learning Objectives:
The objective of this lab is to learn how to read data from a keypad (4 x 4 = 16 buttons) and
then output the result to an LCD peripheral.

Equipment Required:
Software Required
a. Atmel Studio 6 or above
b. Proteus 8.5
c. Super Pro device programmer

Hardware Required
a. ATmega32 MCU
b. LCD
c. 4X4 Matrix Keypad
d. Personal Computer
e. Jumper Wires
f. Power Supply
g. DMM

Introduction:

Keypad:
Keypad is basically a push button combination, organized in the form of Row/Column matrix
to effectively minimize microcontroller I/O port utilization. A normal push button has a one-
to-one relationship with microcontroller’s port. In simple configuration each port can
accommodate only one push button at a time but when more buttons are required, use for a
keypad is almost essential.

Keys of the keypad are arranged in matrix of Rows and


Columns, which are connected to microcontroller ports
individually. A 12- button keypad (4 rows x 3 cols) uses 7
I/O ports, and a 16-button keypad (4 rows x 4 cols) uses
only 8 I/O ports of a microcontroller.

MIP Lab 12 NUCES, ISLAMABAD Page 2 of 7


Microprocessor Interfacing & Programming LAB: 12
Keypads are often used as a primary input device for embedded microcontrollers and since a
keypad consists of switches connected in a Row/Column arrangement, a keypad scanning
routine needs to be implemented to systematically scan Rows and Columns to determine the
input key value. It is important to understand the concept behind scanning mechanism.

Keypad and LCD Connection Diagram with ATmega32:

Tasks:
Task 12.1
Modify the given of 4x4 Assembly language code for implementing a 4x3 alphanumeric
keypad. The data should be displayed on the LCD.

Task 12.2
Implement Task 12.1 on Proteus.

Task 12.3
Implement Task 12.1 using interrupts.

MIP Lab 12 NUCES, ISLAMABAD Page 3 of 7


Microprocessor Interfacing & Programming LAB: 12

Appendix

; Replace with your application code


.INCLUDE "M32DEF.INC"
.EQU KEY_PORT = PORTC
.EQU KEY_PIN = PINC
.EQU KEY_DDR = DDRC

.EQU LCD_DPRT = PORTA


.EQU LCD_DDDR = DDRA
.EQU LCD_DPIN = PINA
.EQU LCD_CPRT = PORTB
.EQU LCD_CDDR = DDRB
.EQU LCD_CPIN = PINB
.EQU LCD_RS = 0
.EQU LCD_RW = 1
.EQU LCD_EN = 2

.org 0x00
LDI R20, HIGH (RAMEND)
OUT SPH,R20
LDI R20, LOW (RAMEND)
OUT SPL,R20
; ascii code for keypressed displayed on PORTD
LDI R21, 0xFF
OUT DDRA,R21
; PC0 – PC3 rows
; PC4 – PC7 columns
LDI R20, 0xF0 //portc 0-3 input pins
OUT KEY_DDR, R20

GroundAllColumns:
LDI R20, 0x0F // portc 0-3 display 111
OUT KEY_PORT, R20

LDI R21,0xFF;
OUT LCD_DDDR, R21 ;LCD data port is output
OUT LCD_CDDR, R21 ; A,B PORT AS OUTPUT
CBI LCD_CPRT,LCD_EN
CALL DELAY_2ms ;wait for power on
LDI R16,0x38 ; FOR 7X5 DISPLAY
CALL CMNDWRT ;call command function
CALL DELAY_2ms ;wait 2 ms
LDI R16,0x0E ;display on, cursor on
CALL CMNDWRT ;call command function
LDI R16,0x01 ;clear LCD
CALL CMNDWRT
CALL DELAY_2ms
LDI R16,0x06 ; INCREMENT CURSOR
CALL CMNDWRT
LDI R16,0x84 ; INCREMENT CURSOR IST LINE 4TH COLUMN
CALL CMNDWRT

LDI R16, 'F'


CALL DATAWRT
LDI R16, 'A'
CALL DATAWRT

MIP Lab 12 NUCES, ISLAMABAD Page 4 of 7


Microprocessor Interfacing & Programming LAB: 12

LDI R16, 'S'


CALL DATAWRT
LDI R16, 'T'
CALL DATAWRT

LDI R16,0xC3 ; INCREMENT CURSOR 2ND LINE 3RD COLUMN


CALL CMNDWRT
LDI R16, '0'
CALL DATAWRT

KPD_ISR:
LDI R21, 0b01111111
OUT KEY_PORT,R21
NOP
IN R21,KEY_PIN

ANDI R21,0x0F
CPI R21,0x0F
BRNE COL1

LDI R21, 0b10111111


OUT KEY_PORT, R21
NOP
IN R21, KEY_PIN
ANDI R21,0x0F
CPI R21,0x0F
BRNE COL2

LDI R21, 0b11011111


OUT KEY_PORT, R21
NOP
IN R21, KEY_PIN
ANDI R21,0x0F
CPI R21,0x0F
BRNE COL3

LDI R21, 0b11101111


OUT KEY_PORT, R21
NOP
IN R21, KEY_PIN
ANDI R21,0x0F
CPI R21,0x0F
BRNE COL4

COL1:
LDI R30, LOW(KCODE0<<1)
LDI R31, HIGH(KCODE0<<1)
RJMP Find
COL2:
LDI R30, LOW(KCODE1<<1)
LDI R31, HIGH(KCODE1<<1)
RJMP Find
COL3:
LDI R30, LOW(KCODE2<<1)
LDI R31, HIGH(KCODE2<<1)
RJMP Find

COL4:

MIP Lab 12 NUCES, ISLAMABAD Page 5 of 7


Microprocessor Interfacing & Programming LAB: 12

LDI R30, LOW(KCODE3<<1)


LDI R31, HIGH(KCODE3<<1)
Find:
LSR R21
BRCC Match
LPM R20, Z+
RJMP Find
MATCH:
LPM R20, Z

LDI R17,0x0f
IN R16,pinc
ANDI R16,0x0f
CP R16,R17
BREQ KPD_ISR

OUT PORTA, R20


MOV R16,r20
CALL DATAWRT // here
CALL BDELAY

RIMP KPD_ISR

.ORG 0x300
KCODE0: .DB '7', '4', '1', 'c' //col1
KCODE1: .DB 'p', '5', '2', '0'
KCODE2: .DB '9', '6', '3', '='
KCODE3: .DB '/', '*', '-', '+'

CMNDWRT:
OUT LCD_DPRT, R16
CBI LCD_CPRT,LCD_RS
CBI LCD_CPRT,LCD_RW
SBI LCD_CPRT,LCD_EN
CALL SDELAY
CBI LCD_CPRT,LCD_EN
CALL DELAY_100us
RET

DATAWRT:
OUT LCD_DPRT,R16
SBI LCD_CPRT,LCD_RS
CBI LCD_CPRT,LCD_RW
SBI LCD_CPRT,LCD_EN
CALL SDELAY
CBI LCD_CPRT,LCD_EN
CALL DELAY_100us
RET

BDELAY:

LDI R19, 8
LA:
CALL delay
DEC R19
BRNE LA
ret

MIP Lab 12 NUCES, ISLAMABAD Page 6 of 7


Microprocessor Interfacing & Programming LAB: 12
DELAY:
PUSH R17
LDI
R17,20
LDR1:
CALL DELAY_2ms
DEC R17
PUSH R17
LDI
R17,20
LDR5:
CALL DELAY_2ms
DEC R17
BRNE LDR5
POP R17
BRNE LDR1
POP R17
RET

DELAY_2ms
: PUSH
R17 LDI
R17,20
LDR0:
CALL DELAY_100us
DEC R17
BRNE LDR0
POP R17
RET

DELAY_100us
: PUSH
R17 LDI
R17,60
DR0:
CALL SDELAY
DEC R17
BRNE DR0
POP R17
RET

SDELAY
:
NOP
NOP
RET

.INCLUDE "M32DEF.INC"
.CSEG
RJMP BIG_MAIN
.ORG 0X200
BIG_MAIN:
LDI R16,HIGH(RAMEND)

MIP Lab 12 NUCES, ISLAMABAD Page 7 of 7


Microprocessor Interfacing & Programming LAB: 12
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
.EQU LCD_DPRT = PORTB
.EQU LCD_DDDR = DDRB
.EQU LCD_DPIN = PINB
.EQU LCD_CPRT = PORTD
.EQU LCD_CDDR = DDRD
.EQU LCD_CPIN = PIND
.EQU LCD_RS = 2
.EQU LCD_RW = 3
.EQU LCD_EN = 4
MAIN:
LDI R21, 0XFF
OUT LCD_DDDR, R21
OUT LCD_CDDR, R21
LDI R16, 0X33
CALL CMNDWRT
CALL DELAY_2ms
LDI R16, 0X32
CALL CMNDWRT
CALL DELAY_2ms
LDI R16, 0X28
CALL CMNDWRT
CALL DELAY_2ms
LDI R16, 0X0E
CALL CMNDWRT
CALL DELAY_2ms
LDI R16, 0X06
CALL CMNDWRT
LDI R16, 'H'
CALL DATAWRT
LDI R16, 'I'
CALL DATAWRT
LDI R16, ' '
CALL DATAWRT
LDI R16, 0XC0
CALL CMNDWRT
CALL DELAY_2mS
LDI R16, 'H'
CALL DATAWRT
LDI R16, 'I'
CALL DATAWRT
LDI R16, ' '
CALL DATAWRT
LOOP:
RCALL GET_CHAR_FROM_KEYPAD
RJMP LOOP
DISP_INPUT_ON_LCD:
MOV R16, R20
CALL DATAWRT
RJMP RETURN

;-----------------------------------------------------------------------
-------------------------------------------------
// DELAY FUNCTIONS

SDELAY:
NOP
NOP
NOP
NOP

MIP Lab 12 NUCES, ISLAMABAD Page 8 of 7


Microprocessor Interfacing & Programming LAB: 12
NOP
RET
DELAY_100us:
PUSH R17
LDI R17, 60
DR0:
CALL SDELAY
DEC R17
BRNE DR0
POP R17
RET
DELAY_2ms:
PUSH R17
LDI R17, 20
LDR0:
CALL DELAY_100us
DEC R17
BRNE LDR0
POP R17
RET
DELAY:
LDI R17, 175
D1:
LDI R20, 0
OUT TCNT0, R20
LDI R20, 221
OUT OCR0, R20
LDI R20, 0X0D
OUT TCCR0, R20
AGAIN:
IN R20, TIFR
SBRS R20, OCF0
RJMP AGAIN
LDI R20, 0X00
OUT TCCR0, R20
LDI R20, (1<<OCF0)
OUT TIFR, R20
DEC R17
BRNE D1
RET
CMNDWRT:
MOV R27, R16
ANDI R27, 0XF0
OUT LCD_DPRT, R27
CBI LCD_CPRT, LCD_RS
CBI LCD_CPRT, LCD_RW
SBI LCD_CPRT, LCD_EN
CALL SDELAY
CBI LCD_CPRT, LCD_EN
CALL DELAY_100us
MOV R27, R16
SWAP R27
ANDI R27, 0XF0
OUT LCD_DPRT, R27
SBI LCD_CPRT, LCD_EN
CALL SDELAY
CBI LCD_CPRT, LCD_EN
CALL DELAY_100us
RET
DATAWRT:
MOV R27,R16
ANDI R27, 0XF0

MIP Lab 12 NUCES, ISLAMABAD Page 9 of 7


Microprocessor Interfacing & Programming LAB: 12
OUT LCD_DPRT, R27
SBI LCD_CPRT, LCD_RS
CBI LCD_CPRT, LCD_RW
SBI LCD_CPRT, LCD_EN
CALL SDELAY
CBI LCD_CPRT, LCD_EN
MOV R27, R16
SWAP R27
ANDI R27, 0XF0
OUT LCD_DPRT, R27
SBI LCD_CPRT, LCD_EN
CALL SDELAY
CBI LCD_CPRT, LCD_EN
CALL DELAY_100us
RET
RETURN:
RET
GET_CHAR_FROM_KEYPAD:
.EQU KEY_PORT = PORTC
.EQU KEY_PIN = PINC
.EQU KEY_DDR = DDRC
LDI R21, 0XFF
OUT DDRB, R21
LDI R20, 0XF0
OUT KEY_DDR, R20
GROUND_ALL_ROWS:
LDI R20, 0X0F
OUT KEY_PORT, R20
WAIT_FOR_RELEASE:
NOP
IN R21, KEY_PIN
ANDI R21, 0X0F
CPI R21, 0X0F
BRNE WAIT_FOR_RELEASE
WAIT_FOR_KEY:
NOP
IN R21, KEY_PIN
ANDI R21, 0X0F
CPI R21, 0X0F
BREQ WAIT_FOR_KEY
CALL WAIT15MS
IN R21, KEY_PIN
ANDI R21, 0X0F
CPI R21, 0X0F
BREQ WAIT_FOR_KEY
LDI R21, 0B01111111
OUT KEY_PORT, R21
NOP
IN R21, KEY_PIN
ANDI R21, 0X0F
CPI R21, 0X0F
BRNE COL1
LDI R21, 0B10111111
OUT KEY_PORT, R21
NOP
IN R21, KEY_PIN
ANDI R21, 0X0F
CPI R21, 0X0F
BRNE COL2
LDI R21, 0B11011111
OUT KEY_PORT, R21
NOP

MIP Lab 12 NUCES, ISLAMABAD Page 10 of 7


Microprocessor Interfacing & Programming LAB: 12
IN R21, KEY_PIN
ANDI R21, 0X0F
CPI R21, 0X0F
BRNE COL3
COL1:
LDI R30, LOW(KCODE0<<1)
LDI R31, HIGH(KCODE0<<1)
RJMP FIND
COL2:
LDI R30, LOW(KCODE1<<1)
LDI R31, HIGH(KCODE1<<1)
RJMP FIND
COL3:
LDI R30, LOW(KCODE2<<1)
LDI R31, HIGH(KCODE2<<1)
RJMP FIND
FIND:
LSR R21
BRCC MATCH
LPM R20, Z+
RJMP FIND
MATCH:
LPM R20, Z
RCALL DISP_INPUT_ON_LCD
RJMP GROUND_ALL_ROWS

.ORG 0X300
KCODE0: .DB '1','4','7','A'
KCODE1: .DB '2','5','8','0'
KCODE2: .DB '3','6','9','B'
RET
DELAY_1MS:
LDI R20, 0
OUT TCNT0, R20
LDI R20, 124
OUT OCR0, R20
LDI R20, 0X0B
OUT TCCR0, R20
AGAIN_1MS:
IN R20, TIFR
SBRS R20, OCF0
RJMP AGAIN_1MS
LDI R20, 0X0
OUT TCCR0, R20
LDI R20, 1<<OCF0
OUT TIFR, R2
RET

MIP Lab 12 NUCES, ISLAMABAD Page 11 of 7


Microprocessor Interfacing & Programming LAB: 12

MIP Lab 12 NUCES, ISLAMABAD Page 12 of 7

You might also like