.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 ;----------------------------------------