All pastes #804954 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-12-03 22:37 UTC
rendered paste body
.include "m169def.inc"

.cseg
.org 0x0000
	jmp start
.org 0x000A
	jmp int_T2



start: 
	ldi r16, 0x00	//STACKINIT
	out SPL, r16
	ldi r16, 0x04
	out SPH, r16
		
	call init_disp	


	
	cli ; globální zakázání p?erušení
	ldi r16, 0b00001000
	sts ASSR, r16 ; vyber hodiny od
	; krystalového
	; oscilátoru 32768 Hz
	ldi r16, 0b00000001
	sts TIMSK2, r16 ; povolení p?erušení
	; od e`asovae`e 2
	ldi r16, 0b00000101
	sts TCCR2A, r16 ; ti`nspuší e`ítae`e s
	; di`licím pomi`rem 128
	clr r16 ; zákaz p?erušení od joysticku
	sts EIMSK, r16
	sei ; globální povolení p?erušení

	in r17, DDRE
	andi r17, 0b11110011
	in r16, PORTE
	ori r16, 0b00001100
	out DDRE, r17
	out PORTE, r16
	ldi r16, 0b00000000
	sts DIDR1, r16
	in r17, DDRB
	andi r17, 0b00101111
	in r16, PORTB
	ori r16, 0b11010000
	out DDRB, r17
	out PORTB, r16





monitor:
call cekej
call cekej
call cekej
call sejmi_polohu
jmp monitor



sejmi_polohu:
in r16, PINE
in r17, PINB
add r16, r17

in r18, PINE
in r19, PINB
add r18, r19
cp r16, r18
breq pravo
ret





pravo:
andi r16, 0b00001000
cpi r16,0
brne levo

ldi r16,'R'
ldi r18,2
call show_char
jmp monitor


levo:
in r16, PINE
andi r16, 0b00000100
cpi r16,0
brne nahoru
ldi r16,'L'
ldi r18,2
call show_char
jmp monitor

nahoru:
in r16, PINB
andi r16, 0b01000000
cpi r16,0
brne dolu
ldi r16,'U'
ldi r18,2
call show_char
jmp monitor

dolu:
in r16, PINB
andi r16, 0b10000000
cpi r16,0
brne enter
ldi r16,'D'
ldi r18,2
call show_char
jmp monitor

enter:
in r16, PINB
andi r16, 0b00010000
cpi r16,0
brne nic
ldi r16,'E'
ldi r18,2
call show_char
jmp monitor

nic:
ldi r16,'N'
ldi r18,2
call show_char
nop
jmp monitor




cekej: 
push r19
ldi r19, 255

sm: dec r19
	cpi r19,0
	breq konec_sm
	jmp sm
konec_sm:
	pop r19
	ret





konec: jmp konec






int_T2:

show_char:
//zasobnik
push r28
push r29
push r30
push r31
push r17
push r19
push r18
push r16

in r28, SPL //uloz do Y stackpointer
in r29, SPH
ldd r16,Y+1 //nahraj ze zasobniku znak
ldd r18,Y+2 //nahraj ze zasobniku pozici




//znaky+4 * ( ASCII('A') ľ 42 )

//odecti 42

subi r16,42

//vynasob * 4
clr r17
lsl r16 //low
rol r17 //high
lsl r16
rol r17
//+znaky
ldi r30, low(znaky<<1)
ldi r31, high(znaky<<1)
ldi r28, low(LCDDR0) // ovladaci bity display
ldi r29, high(LCDDR0)

add r16, r30 //prictu znaky+pozice v tabulce
adc r17, r31
mov r30, r16 //presunu do Z
mov r31, r17

//pozice
subi r18,2 //disp zacina na druhe pozici - odectu 2
// ktera pozice ze dvou? vydelit dvema, suda licha?
lsr r18  //deli dvema
brlo horni //podle zbytku - CARRY skßŔe


dolni:

clr r19
add r28, r18 //pozice + LCDDR0
adc r29, r19

ld r18, Y
andi r18,0xF0 //r18 and 00001111 zachovß horni nibble dolni vycisti
lpm r0, Z+ // nacti z tabulky znaku
add r0, r18 //secti puvodni a novy
st Y,r0

adiw Y,5// - dalsi cast segmentu

ld r18, Y
andi r18,0xF0 //r18 and 00001111 zachovß puvodni bity
lpm r0, Z+ // nacti z tabulky znaku
add r0, r18 //secti puvodni a novy
st Y,r0

adiw Y,5

ld r18, Y
andi r18,0xF0 //r18 and 00001111 zachovß puvodni bity
lpm r0, Z+ // nacti z tabulky znaku
add r0, r18 //secti puvodni a novy
st Y,r0

adiw Y,5

ld r18, Y
andi r18,0xF0 //r18 and 00001111 zachovß puvodni bity
lpm r0, Z+ // nacti z tabulky znaku
add r0, r18 //secti puvodni a novy
st Y,r0

jmp konec_zobr

horni:
clr r19
add r28, r18
adc r29, r19


//nacti ulozene bity

ld r18, Y // nacti zobrazene hodnoty	
andi r18,0x0F //r18 and 00001111 zachovß dolni nibble, horni vymaze
lpm r0, Z+ // nacti z tabulky znaku
swap r0 // prohod nibbly
add r0, r18 //secti puvodni a novy
st Y,r0

adiw Y,5 //posunu na dalsi cast segmentu

ld r18, Y
andi r18,0x0F 
lpm r0, Z+
swap r0
add r0, r18
st Y,r0

adiw Y,5

ld r18, Y
andi r18,0x0F 
lpm r0, Z+
swap r0
add r0, r18
st Y,r0

adiw Y,5

ld r18, Y
andi r18,0x0F 
lpm r0, Z+
swap r0
add r0, r18
st Y,r0



konec_zobr: 

pop r16
pop r18
pop r19
pop r17
pop r31
pop r30
pop r29
pop r28


ret


clear_disp:
ldi r21,0x00
sts LCDDR0,r21
sts LCDDR1,r21
sts LCDDR2,r21
sts LCDDR3,r21
sts LCDDR0+5,r21
sts LCDDR1+5,r21
sts LCDDR2+5,r21
sts LCDDR3+5,r21
sts LCDDR0+10,r21
sts LCDDR1+10,r21
sts LCDDR2+10,r21
sts LCDDR3+10,r21
sts LCDDR0+15,r21
sts LCDDR1+15,r21
sts LCDDR2+15,r21
sts LCDDR3+15,r21

ret


init_disp:
ldi r16, 0xB7
sts LCDCRB, r16
ldi r16, 0x10
sts LCDFRR, r16
ldi r16, 0x0F
sts LCDCCR, r16
ldi r16, 0x80
sts LCDCRA, r16
ret


;*********************************************************
;
; Tabulka tvaru znaku pro AVR Butterfly
;
;*********************************************************
;

znaky: ; znaky ASCII tabulky od kodu 42 (*) do kodu 95 (_)
; platna je vzdy spodni polovina bitu
; prvni bajt:  0 0 0 0 K 0 0 A
; druhy bajt:  0 0 0 0 J F H B
; treti bajt:  0 0 0 0 L E G C
; ctvrty bajt: 0 0 0 0 M P N D
 .db 0x08, 0x0A, 0x0A, 0x0E    ; *
 .db 0x00, 0x08, 0x0A, 0x02    ; +
 .db 0x00, 0x00, 0x00, 0x00    ; , (nedefinovano)
 .db 0x00, 0x00, 0x0A, 0x00    ; -
 .db 0x01, 0x05, 0x0A, 0x00    ; .
 .db 0x08, 0x00, 0x00, 0x04    ; /
 .db 0x09, 0x05, 0x05, 0x05    ; 0
 .db 0x08, 0x01, 0x01, 0x00    ; 1
 .db 0x01, 0x01, 0x0E, 0x01    ; 2
 .db 0x01, 0x01, 0x0B, 0x01    ; 3
 .db 0x00, 0x05, 0x0B, 0x00    ; 4
 .db 0x01, 0x04, 0x0B, 0x01    ; 5
 .db 0x01, 0x04, 0x0F, 0x01    ; 6
 .db 0x01, 0x01, 0x01, 0x00    ; 7
 .db 0x01, 0x05, 0x0F, 0x01    ; 8
 .db 0x01, 0x05, 0x0B, 0x01    ; 9
 .db 0x00, 0x00, 0x00, 0x00    ; : (nedefinovano)
 .db 0x00, 0x00, 0x00, 0x00    ; ; (nedefinovano)
 .db 0x08, 0x00, 0x00, 0x08    ; <
 .db 0x00, 0x00, 0x0A, 0x01    ; =
 .db 0x00, 0x02, 0x00, 0x04    ; >
 .db 0x00, 0x00, 0x00, 0x00    ; ? (nedefinovano)
 .db 0x00, 0x00, 0x00, 0x00    ; @ (nedefinovano)
 .db 0x01, 0x05, 0x0F, 0x00    ; A
 .db 0x01, 0x09, 0x09, 0x03    ; B
 .db 0x01, 0x04, 0x04, 0x01    ; C
 .db 0x01, 0x09, 0x01, 0x03    ; D
 .db 0x01, 0x04, 0x0E, 0x01    ; E
 .db 0x01, 0x04, 0x0E, 0x00    ; F
 .db 0x01, 0x04, 0x0D, 0x01    ; G
 .db 0x00, 0x05, 0x0F, 0x00    ; H
 .db 0x00, 0x08, 0x00, 0x02    ; I
 .db 0x00, 0x01, 0x05, 0x01    ; J
 .db 0x08, 0x04, 0x06, 0x08    ; K
 .db 0x00, 0x04, 0x04, 0x01    ; L
 .db 0x08, 0x07, 0x05, 0x00    ; M
 .db 0x00, 0x07, 0x05, 0x08    ; N
 .db 0x01, 0x05, 0x05, 0x01    ; O
 .db 0x01, 0x05, 0x0E, 0x00    ; P
 .db 0x01, 0x05, 0x05, 0x09    ; Q
 .db 0x01, 0x05, 0x0E, 0x08    ; R
 .db 0x01, 0x02, 0x00, 0x09    ; S
 .db 0x01, 0x08, 0x00, 0x02    ; T
 .db 0x00, 0x05, 0x05, 0x01    ; U
 .db 0x08, 0x04, 0x04, 0x04    ; V
 .db 0x00, 0x05, 0x05, 0x0C    ; W
 .db 0x08, 0x02, 0x00, 0x0C    ; X
 .db 0x08, 0x02, 0x00, 0x02    ; Y
 .db 0x09, 0x00, 0x00, 0x05    ; Z
 .db 0x01, 0x04, 0x04, 0x01    ; [
 .db 0x00, 0x02, 0x00, 0x08    ; \
 .db 0x01, 0x01, 0x01, 0x01    ; ]
 .db 0x00, 0x00, 0x00, 0x00    ; ^ (nedefinovano)
 .db 0x00, 0x00, 0x00, 0x01    ; _
 .db 0x09, 0x0F, 0x0F, 0x0F    ; vse
;----------------------------------------