program
Moderátor: Moderátoři
program
.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
to ja viem...ale ci je ten program dobre?
Není dobře.
Chybí mi tam hlavní smyčka.
A v tomto místě podteče zásobník (RET bez CALL)
Kód: Vybrat vše
done:
retAB1 píše:to ja viem...ale ci je ten program dobre?
Není dobře.
Chybí mi tam hlavní smyčka.
A v tomto místě podteče zásobník (RET bez CALL)Kód: Vybrat vše
done:
ret
hm a to ma byt na konci asi takto, nie?a ber to s nadhladom pls, som len zaciatocnik
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
rcall done
Aby z toho byl program, musíš tam za řádek
Kód: Vybrat vše
out SPH, Tempdát hlavní smyčku, něco jako toto:
Kód: Vybrat vše
Main:
rcall get_key ;přečti klávesnici
cpi hodnota_klav,1 ;stisknuto 1?
brne L1 ;jestli ne, jdi na L1
; co se má udělat pokud byla stisknuta klávesa 1
;
L1:
cpi hodnota_klav,2
brne L2
; co se má udělat pokud byla stisknuta klávesa 2
;
L2:
;atd, atd
rjmp MainAsi by bylo nejlepší koupit nějakou knihu a začít od blikající ledky.
Nebo pokud chceš jenom kopírovat z internetu, tak si musíš vybírat fungující programy.