Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * lab1.asm
- *
- * This is a driver for the 12-digit keyboard used in "Laboration 1".
- * The purpose of this program is:
- * - To read what button is pressed on the keyboard.
- * - To display a corresponding binary value for that key on
- * a simple LED-display.
- *
- * Authors: Dennis Wildmark, Kalle Kellokoski Adamsson
- *
- * Date: 2014-11-11
- */
- ;==============================================================================
- ; Definitions of registers, etc. ("constants")
- ;==============================================================================
- .EQU RESET = 0x0000 ; initializes constants and pointers
- .EQU PM_START = 0x0056
- .DEF TEMP = R16
- .DEF RVAL = R24
- .EQU NO_KEY = 0x0F
- ;==============================================================================
- ; Start of program
- ;==============================================================================
- .CSEG ;code segment starts here
- .ORG RESET
- RJMP init
- .ORG PM_START
- .INCLUDE "delay.inc"
- .INCLUDE "lcd.inc"
- ;==============================================================================
- ; Basic initializations of stack pointer, I/O pins, etc.
- ;==============================================================================
- init:
- ; Set stack pointer to point at the end of RAM.
- LDI TEMP, LOW(RAMEND)
- OUT SPL, TEMP
- LDI TEMP, HIGH(RAMEND)
- OUT SPH, TEMP
- ; Initialize pins
- CALL init_pins
- CALL lcd_init
- ; Initialize position for pressed key digit
- LDI RVAL, 0xC0
- RCALL lcd_write_instr
- ; Jump to main part of program
- RJMP main
- ;==============================================================================
- ; Initialize I/O pins
- ;==============================================================================
- init_pins:
- LDI TEMP, 0xF0 ;initializes outputs PF4-7 and PB4-7
- OUT DDRF, TEMP
- OUT DDRB, TEMP
- LDI TEMP, 0xBF
- OUT DDRE, TEMP ;initializes input PE6
- LDI TEMP, 0xC0
- OUT DDRD, TEMP ;initializes outputs PD
- RET
- ;==============================================================================
- ; Read the keyboard and stuff
- ;==============================================================================
- read_keyboard:
- LDI RVAL, 150
- RCALL delay_micros
- LDI R18, 0 ; reset counter
- scan_key:
- MOV R19, R18
- LSL R19 ; moves bits in R19 4 steps to the left.
- LSL R19
- LSL R19
- LSL R19
- OUT PORTB, R19 ; set column and row
- NOP ; a minimum of 20 NOP's is necessary to prevent propagation delay in multiplexer to interfere.
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- SBIC PINE, 6 ; skips next instruction if PE6 is 0 (=not that key)
- RJMP return_key_val
- INC R18 ; increments R18
- CPI R18, 12 ; compares R18 to 12
- BRNE scan_key ; if R18 was not equal to 12, call scan_key again, else
- LDI R18, NO_KEY ; no key was pressed!
- return_key_val:
- MOV RVAL, R18 ; data in R18 is copied to RVAL
- RET
- ;==============================================================================
- ; Subroutines for the exeptions
- ;==============================================================================
- char_a:
- LDI RVAL, 65
- RET
- char_b:
- LDI RVAL, 66
- RET
- ;==============================================================================
- ; Convert keyboard output to ASCII-value
- ;==============================================================================
- convert:
- LDI R18, 48
- ADD RVAL, R18 ;ˆka RVAL med 48, vilket motsvarar v‰rdet i ASCII-tabellen
- CPI RVAL, 58 ;om v‰rdet ‰r 58 (som ska vara
- BREQ char_a
- CPI RVAL, 59
- BREQ char_b
- RET
- ;==============================================================================
- ; Main part of program
- ;==============================================================================
- main:
- LDI R24, 0xC0
- RCALL lcd_write_instr ;s‰tter markˆren i nedre v‰nstra hˆrnet
- loop:
- RCALL read_keyboard ;l‰ser av keyboardet
- CPI RVAL, NO_KEY ;om ingen knapp trycks,
- BREQ loop ;hoppa tillbaka till loop
- MOV TEMP, RVAL ;kopiera RVAL till TEMP fˆr att j‰mfˆras senare
- RCALL convert ;talet konverteras
- RCALL lcd_write_chr ;det motsvarande ASCII-talet skrivs till displayen
- RCALL delay_keypressed ;stannar h‰r om samma knapp ‰r intryckt
- RJMP loop
- delay_keypressed:
- RCALL read_keyboard ;tar reda p vilken knapp som ‰r intryckt
- CP TEMP, RVAL ;j‰mfˆr med fˆrra knappen som var intryckt
- BREQ delay_keypressed ;‰r det samma knapp, loopa
- RET
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement