program
Napsal: 18 bře 2010, 18:14
cafte chcem sa spytat na tento program...ci je to dobre urobene, ked chcem pomocou toho ovladat led?teda pomocou klavesnice si chcem prepinat svetla, popr mi prosim poradte ako by sa to dalo lepsie urobit
.include "m16def.inc"
.equ stlpec1 = PINA0
.equ stlpec2 = PINA1
.equ stlpec3 = PINA2
.equ stlpec4 = PINA3
.equ svetlo1 = PINB0
.equ svetlo2 = PINB1
.equ svetlo3 = PINB2
.equ svetlo4 = PINB3
.def hodnota_klav = r16
.def temp = r17
.def flags = r18
.equ klaves = PORTA
.equ svetla = PORTB
.equ stlacenie = 0
key_init:
ldi Temp,0b11111111
out svetla, Temp
ldi hodnota_klav,0b11110000 ;Make Cols as i/p
out DDRA, hodnota_klav ;and Rows as o/p nastavi ako vystup ak je 1 a ak 0 tak ako vstup
ldi hodnota_klav,0b00001111 ;Enable pullups na jednotke pripojeny pull up rezistor
out klaves, hodnota_klav ;on columns
inicializacia_zasobniku:
ldi Temp,LOW(RAMEND)
out SPL, Temp
LDI Temp, HIGH(RAMEND)
out SPH, Temp
get_key:
ldi hodnota_klav,0b00000000 ;Scanning Row1
ldi temp,0b01111111 ;Make Row1 low
out klaves,temp ;Send to PortA
rcall citaj_stlpce ;Read Columns
sbrc flags,stlacenie ;If key pressed (flag,indikator-ukazovatel)
rjmp done ;Exit the routine
ldi hodnota_klav,0b00000100 ;Scanning Row2
ldi temp,0b10111111 ;Make Row2 Low port nemozme adresovat priamo
out klaves,temp ;Send to keyport
rcall citaj_stlpce ;Read Columns
sbrc flags,stlacenie ;If key pressed
rjmp done ;Exit from routine
ldi hodnota_klav,0b00001000 ;Scanning Row3
ldi temp,0b11011111 ;Make Row3 Low
out klaves,temp ;Send to keyport
rcall citaj_stlpce ;Read columns
sbrc flags,stlacenie ;If key pressed
rjmp done ;Exit the routine
ldi hodnota_klav,0b00001100 ;Scanning Row4
ldi temp,0b11101111 ;Make Row4 Low
out klaves,temp ;send to keyport
rcall citaj_stlpce ;Read columns
done:
ret
citaj_stlpce:
cbr flags, (1<<stlacenie) ;Clear status flag-stavový indikátor(ukazovatel)
;<<posunie lavy operand o tolko bitov vlavo, kolko je urcenych pravym operandom
sbic PINA, stlpec1 ;Check COL1
rjmp dalsi_stlpec ;Go to COL2 if not low, ked nie je povoleny
hold:
sbis PINA, stlpec1 ;Wait for key release- cakanie na uvolnenie
rjmp hold
sbr flags, (1<<stlacenie) ;Set status flag
ret ;key 1 pressed
dalsi_stlpec:
sbic PINA,stlpec2 ;Check COL2
rjmp dalsi_stlpec1 ;Goto COL3 if not low
hold1:
sbis PINA, stlpec2 ;Wait for key release, cakanie na uvolnenie klavesy
rjmp hold1
inc hodnota_klav ;Key 2 pressed
sbr flags,(1<<stlacenie) ;Set status flag nastavi status register
ret
dalsi_stlpec1:
sbic PINA, stlpec3 ;Check COL3
rjmp dalsi_stlpec2 ;Goto COL4 if no pressed
hold2:
sbis PINA, stlpec3 ;Wait for key release
rjmp hold2
inc hodnota_klav ;Key 3 pressed
inc hodnota_klav
sbr flags, (1<<stlacenie) ;Set status flag
ret
dalsi_stlpec2:
sbic PINA, stlpec4 ;Check COL4
rjmp exit ;Exit if not low
hold3:
sbis PINA, stlpec4 ;Wait for key release
rjmp hold3
inc hodnota_klav ;Key 4 Pressed
inc hodnota_klav
inc hodnota_klav
sbr flags, (1<<stlacenie) ;Set status flag
ret
LED:
in r20, klaves
bst r20, 1
bld Temp, 1
bst r20, 2
bld Temp, 2
bst r20, 3
bld Temp, 3
bst r20, 4
bld Temp, 4
out svetla, Temp
ret
exit:
clr hodnota_klav ;reset keyval
cbr flags, (1<<stlacenie) ;No Key Pressed
ret
.include "m16def.inc"
.equ stlpec1 = PINA0
.equ stlpec2 = PINA1
.equ stlpec3 = PINA2
.equ stlpec4 = PINA3
.equ svetlo1 = PINB0
.equ svetlo2 = PINB1
.equ svetlo3 = PINB2
.equ svetlo4 = PINB3
.def hodnota_klav = r16
.def temp = r17
.def flags = r18
.equ klaves = PORTA
.equ svetla = PORTB
.equ stlacenie = 0
key_init:
ldi Temp,0b11111111
out svetla, Temp
ldi hodnota_klav,0b11110000 ;Make Cols as i/p
out DDRA, hodnota_klav ;and Rows as o/p nastavi ako vystup ak je 1 a ak 0 tak ako vstup
ldi hodnota_klav,0b00001111 ;Enable pullups na jednotke pripojeny pull up rezistor
out klaves, hodnota_klav ;on columns
inicializacia_zasobniku:
ldi Temp,LOW(RAMEND)
out SPL, Temp
LDI Temp, HIGH(RAMEND)
out SPH, Temp
get_key:
ldi hodnota_klav,0b00000000 ;Scanning Row1
ldi temp,0b01111111 ;Make Row1 low
out klaves,temp ;Send to PortA
rcall citaj_stlpce ;Read Columns
sbrc flags,stlacenie ;If key pressed (flag,indikator-ukazovatel)
rjmp done ;Exit the routine
ldi hodnota_klav,0b00000100 ;Scanning Row2
ldi temp,0b10111111 ;Make Row2 Low port nemozme adresovat priamo
out klaves,temp ;Send to keyport
rcall citaj_stlpce ;Read Columns
sbrc flags,stlacenie ;If key pressed
rjmp done ;Exit from routine
ldi hodnota_klav,0b00001000 ;Scanning Row3
ldi temp,0b11011111 ;Make Row3 Low
out klaves,temp ;Send to keyport
rcall citaj_stlpce ;Read columns
sbrc flags,stlacenie ;If key pressed
rjmp done ;Exit the routine
ldi hodnota_klav,0b00001100 ;Scanning Row4
ldi temp,0b11101111 ;Make Row4 Low
out klaves,temp ;send to keyport
rcall citaj_stlpce ;Read columns
done:
ret
citaj_stlpce:
cbr flags, (1<<stlacenie) ;Clear status flag-stavový indikátor(ukazovatel)
;<<posunie lavy operand o tolko bitov vlavo, kolko je urcenych pravym operandom
sbic PINA, stlpec1 ;Check COL1
rjmp dalsi_stlpec ;Go to COL2 if not low, ked nie je povoleny
hold:
sbis PINA, stlpec1 ;Wait for key release- cakanie na uvolnenie
rjmp hold
sbr flags, (1<<stlacenie) ;Set status flag
ret ;key 1 pressed
dalsi_stlpec:
sbic PINA,stlpec2 ;Check COL2
rjmp dalsi_stlpec1 ;Goto COL3 if not low
hold1:
sbis PINA, stlpec2 ;Wait for key release, cakanie na uvolnenie klavesy
rjmp hold1
inc hodnota_klav ;Key 2 pressed
sbr flags,(1<<stlacenie) ;Set status flag nastavi status register
ret
dalsi_stlpec1:
sbic PINA, stlpec3 ;Check COL3
rjmp dalsi_stlpec2 ;Goto COL4 if no pressed
hold2:
sbis PINA, stlpec3 ;Wait for key release
rjmp hold2
inc hodnota_klav ;Key 3 pressed
inc hodnota_klav
sbr flags, (1<<stlacenie) ;Set status flag
ret
dalsi_stlpec2:
sbic PINA, stlpec4 ;Check COL4
rjmp exit ;Exit if not low
hold3:
sbis PINA, stlpec4 ;Wait for key release
rjmp hold3
inc hodnota_klav ;Key 4 Pressed
inc hodnota_klav
inc hodnota_klav
sbr flags, (1<<stlacenie) ;Set status flag
ret
LED:
in r20, klaves
bst r20, 1
bld Temp, 1
bst r20, 2
bld Temp, 2
bst r20, 3
bld Temp, 3
bst r20, 4
bld Temp, 4
out svetla, Temp
ret
exit:
clr hodnota_klav ;reset keyval
cbr flags, (1<<stlacenie) ;No Key Pressed
ret