list b=4 list p=16f886 ; Kontroller típusának megadása #include ; __CONFIG _CONFIG1, _CP_OFF & _CPD_OFF & _WDT_OFF & _BOR_ON & _PWRTE_ON & _EC_OSC & _LVP_OFF & _IESO_OFF & _FCMEN_OFF & _MCLRE_OFF __CONFIG _CONFIG2, _WRT_OFF & _BOR40V cblock 0x20 ; Bank0 - 80 byte atmeneti ; A várakozás számlálója index_l ; Táblázat indexe index_h endc cblock 0x70 ; Közös memória terület - 16 byte ; Mentési tárolók w_save ; W regiszter mentési helye endc cblock 0x120 ; Bank2 - 80 byte ; Mentési tárolók pclath_save ; PCLATH regiszter mentési helye fsr_save ; FSR regiszter mentési helye status_save ; STATUS regiszter mentési helye endc ;-------- org 0x0000 ; Reset goto KEZD ;-------- org 0x0004 ; Megszakítási ruutin movwf w_save ; W regiszter mentése a közös memória területre swapf w_save,f ; Előkészület a visszaállításra, a swapf nem állít jelzőbitet swapf STATUS,w ; STATUS másolása a W regiszterbe, ; a bank kiválasztó bitek a STATUS regiszterből a W regiszterbe másolódnak banksel status_save ; Bank átállítása a mentési tárolókhoz movwf status_save ; A lemásolt STATUS érték mentése movf PCLATH,w ; PCLATH kiolvasása movwf pclath_save ; PCLATH mentése, csak akkor kell, ha a program nem csak a 0 page -t használja movf FSR,w ; FSR kiolvasása movwf fsr_save ; FSR mentése clrf PCLATH ; Page0 beállítása a megszakítási rutinnak banksel PORTA ; Bank átállítása Bank0 bankisel PORTA ; IRP=0 btfsc INTCON,T0IE ; Timer 0 megszakítás engedélyezett? btfss INTCON,T0IF ; Timer 0 megszakítás kérés aktív? goto INT_INT_VEGE ; Más megszakítás vizsgálata ha nem aktív vagy le van tiltva ; ..................... bcf INTCON,T0IF ; A megszakítási ok törlése ; ..................... INT_INT_VEGE INT_TMR2 movlw PIE1 ; PEIE a Bank1 -ben van, indirekt címzéssel teszteljük (IRP = 0) movwf FSR ; FSR ben a ram cím alsó 8 bitje, a 9. a STATUS IPR bitje btfsc INDF,TMR2IE ; Timer 2 megszakítás engedélyezett? btfss PIR1,TMR2IF ; Timer 2 megszakítás kérés aktív? goto INT_TMR2_VEGE ; Más megszakítás vizsgálata ha nem aktív vagy le van tiltva ; ..................... bcf PIR1,TMR2IF ; A megszakítási ok törlése ; ..................... INT_TMR2_VEGE ;-------- INT_VEGE banksel fsr_save ; Bank kiválasztása a mentési regiszterekhez movf fsr_save,w ; FSR mentett értékének kiolvasása movwf FSR ; FSR visszaállítása movf pclath_save,w ; PCLATH mentett értékének kiolvasása movwf PCLATH ; PCLATH visszaállítása swapf status_save,w ; STATUS mentett értékének kiolvasása movwf STATUS ; STATUS visszaállítása, visszaállítja a bank kiválasztást is swapf w_save,w ; W regiszter mentett értékének kiolvasása, a swapf nem rontja el a STATUS értékét retfie ; Visszatérés a megszakításból ;********************************* KEZD banksel index_l ; Táblázat index kezdőértéke clrf index_l clrf index_h pagesel INIT_TMR2 call INIT_TMR2 ; Timer 2 beállítása pagesel KEZD pagesel INIT_TMR0 call INIT_TMR0 ; Timer 0 beállítása pagesel KEZD bsf INTCON,PEIE ; Megszakítások engedélyezése bsf INTCON,GIE ; Globális megszakítás engedélyezés VAR pagesel VARAKOZIK ; Egy kis várakozás call VARAKOZIK ; Csak azért is másik lapra hivatkozik pagesel KEZD incfsz index_l,f ; A táblázat indexének léptetése goto TAB incf index_h,f movf index_h,w xorlw 0x03 btfsc STATUS,Z clrf index_h TAB call GetTabData ; Nagy táblázat kezelése pagesel VAR ; Page állítása az aktuálisra goto VAR ; Végtelen várakozási hurok GetTabData movf index_h,w ; A táblázat címének felső byte -ja addlw high(CharTab) ; A kezdőcím hozzáadása movwf PCLATH ; A felső byte tárolása - ezután nem szabad goto / call utasítást tenni a hivás utánig movf index_l,w ; A táblázat címének alsó byte -ja addlw low(CharTab) ; A kezdőcím hozzáadása btfsc STATUS,C ; Átvitel kezelése incf PCLATH,f ; Felső byte módosítása movwf PCL ; Ugrás a kiszámított címre ; A végrehajtás nem halad át ezen a ponton ;********************************* org 0x0800 INIT_TMR2 movlw (1 << TMR2ON) | (1 << T2CKPS0) movwf T2CON ; Timer 2 engedélyezése, előosztó 4 return ;********************************* org 0x1000 INIT_TMR0 banksel OPTION_REG movlw (1 << PSA) ; Timer 0 belső órajelről, előosztó nélkül movwf OPTION_REG banksel PORTA return ;********************************* org 0x1580 CharTab DT 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ; " " DT 0x00 , 0x00 , 0x79 , 0x00 , 0x00 , 0x00 ; "!" DT 0x00 , 0x70 , 0x00 , 0x70 , 0x00 , 0x00 ; """ DT 0x14 , 0x7F , 0x14 , 0x7F , 0x14 , 0x00 ; "#" DT 0x12 , 0x2A , 0x7F , 0x2A , 0x24 , 0x00 ; "$" DT 0x62 , 0x64 , 0x08 , 0x13 , 0x23 , 0x00 ; "%" DT 0x36 , 0x49 , 0x55 , 0x22 , 0x05 , 0x00 ; "&" DT 0x00 , 0x50 , 0x60 , 0x00 , 0x00 , 0x00 ; "'" DT 0x00 , 0x1C , 0x22 , 0x41 , 0x00 , 0x00 ; "(" DT 0x00 , 0x41 , 0x22 , 0x1C , 0x00 , 0x00 ; ")" DT 0x14 , 0x08 , 0x3E , 0x08 , 0x14 , 0x00 ; "*" DT 0x08 , 0x08 , 0x3E , 0x08 , 0x08 , 0x00 ; "+" DT 0x00 , 0x05 , 0x06 , 0x00 , 0x00 , 0x00 ; "," DT 0x08 , 0x08 , 0x08 , 0x08 , 0x08 , 0x00 ; "-" DT 0x00 , 0x03 , 0x03 , 0x00 , 0x00 , 0x00 ; "." DT 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x00 ; "/" DT 0x3E , 0x45 , 0x49 , 0x51 , 0x3E , 0x00 ; "0" DT 0x00 , 0x21 , 0x7F , 0x01 , 0x00 , 0x00 ; "1" DT 0x21 , 0x43 , 0x45 , 0x49 , 0x31 , 0x00 ; "2" DT 0x42 , 0x41 , 0x51 , 0x69 , 0x46 , 0x00 ; "3" DT 0x0C , 0x14 , 0x24 , 0x7F , 0x04 , 0x00 ; "4" DT 0x72 , 0x51 , 0x51 , 0x51 , 0x4E , 0x00 ; "5" DT 0x1E , 0x29 , 0x49 , 0x49 , 0x06 , 0x00 ; "6" DT 0x40 , 0x47 , 0x48 , 0x50 , 0x60 , 0x00 ; "7" DT 0x36 , 0x49 , 0x49 , 0x49 , 0x36 , 0x00 ; "8" DT 0x30 , 0x49 , 0x49 , 0x4A , 0x3C , 0x00 ; "9" DT 0x00 , 0x36 , 0x36 , 0x00 , 0x00 , 0x00 ; ":" DT 0x00 , 0x35 , 0x36 , 0x00 , 0x00 , 0x00 ; ";" DT 0x08 , 0x14 , 0x22 , 0x41 , 0x00 , 0x00 ; "<" DT 0x14 , 0x14 , 0x14 , 0x14 , 0x14 , 0x00 ; "=" DT 0x00 , 0x41 , 0x22 , 0x14 , 0x08 , 0x00 ; ">" DT 0x20 , 0x40 , 0x45 , 0x48 , 0x30 , 0x00 ; "?" DT 0x26 , 0x49 , 0x4F , 0x41 , 0x3E , 0x00 ; "@" DT 0x3F , 0x44 , 0x44 , 0x44 , 0x3F , 0x00 ; "A" DT 0x7F , 0x49 , 0x49 , 0x49 , 0x36 , 0x00 ; "B" DT 0x3E , 0x41 , 0x41 , 0x41 , 0x22 , 0x00 ; "C" DT 0x7F , 0x41 , 0x41 , 0x22 , 0x1C , 0x00 ; "D" DT 0x7F , 0x49 , 0x49 , 0x49 , 0x41 , 0x00 ; "E" DT 0x7F , 0x48 , 0x48 , 0x48 , 0x40 , 0x00 ; "F" DT 0x3E , 0x41 , 0x49 , 0x49 , 0x2F , 0x00 ; "G" DT 0x7F , 0x08 , 0x08 , 0x08 , 0x7F , 0x00 ; "H" DT 0x00 , 0x41 , 0x7F , 0x41 , 0x00 , 0x00 ; "I" DT 0x02 , 0x01 , 0x41 , 0x7E , 0x40 , 0x00 ; "J" DT 0x7F , 0x08 , 0x14 , 0x22 , 0x41 , 0x00 ; "K" DT 0x7F , 0x01 , 0x01 , 0x01 , 0x01 , 0x00 ; "L" DT 0x7F , 0x20 , 0x18 , 0x20 , 0x7F , 0x00 ; "M" DT 0x7F , 0x10 , 0x08 , 0x04 , 0x7F , 0x00 ; "N" DT 0x3E , 0x41 , 0x41 , 0x41 , 0x3E , 0x00 ; "O" DT 0x7F , 0x48 , 0x48 , 0x48 , 0x30 , 0x00 ; "P" DT 0x3E , 0x41 , 0x45 , 0x42 , 0x3D , 0x00 ; "Q" DT 0x7F , 0x48 , 0x4C , 0x4A , 0x31 , 0x00 ; "R" DT 0x31 , 0x49 , 0x49 , 0x49 , 0x46 , 0x00 ; "S" DT 0x40 , 0x40 , 0x7F , 0x40 , 0x40 , 0x00 ; "T" DT 0x7E , 0x01 , 0x01 , 0x01 , 0x7E , 0x00 ; "U" DT 0x7C , 0x02 , 0x01 , 0x02 , 0x7C , 0x00 ; "V" DT 0x7E , 0x01 , 0x06 , 0x01 , 0x7E , 0x00 ; "W" DT 0x63 , 0x14 , 0x08 , 0x14 , 0x63 , 0x00 ; "X" DT 0x70 , 0x08 , 0x07 , 0x08 , 0x70 , 0x00 ; "Y" DT 0x43 , 0x45 , 0x49 , 0x51 , 0x61 , 0x00 ; "Z" DT 0x00 , 0x7F , 0x41 , 0x41 , 0x00 , 0x00 ; "[" DT 0x54 , 0x34 , 0x1F , 0x34 , 0x54 , 0x00 ; "\" DT 0x00 , 0x41 , 0x41 , 0x7F , 0x00 , 0x00 ; "]" DT 0x10 , 0x20 , 0x40 , 0x20 , 0x10 , 0x00 ; "^" DT 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x00 ; "_" DT 0x00 , 0x40 , 0x20 , 0x10 , 0x00 , 0x00 ; "`" DT 0x02 , 0x15 , 0x15 , 0x15 , 0x0F , 0x00 ; "a" DT 0x7F , 0x09 , 0x11 , 0x11 , 0x0E , 0x00 ; "b" DT 0x0E , 0x11 , 0x11 , 0x11 , 0x02 , 0x00 ; "c" DT 0x0E , 0x11 , 0x11 , 0x09 , 0x7F , 0x00 ; "d" DT 0x0E , 0x15 , 0x15 , 0x15 , 0x0C , 0x00 ; "e" DT 0x08 , 0x3F , 0x48 , 0x40 , 0x20 , 0x00 ; "f" DT 0x18 , 0x25 , 0x25 , 0x25 , 0x3E , 0x00 ; "g" DT 0x7F , 0x08 , 0x10 , 0x10 , 0x0F , 0x00 ; "h" DT 0x00 , 0x11 , 0x5F , 0x01 , 0x00 , 0x00 ; "i" DT 0x02 , 0x01 , 0x11 , 0x5E , 0x00 , 0x00 ; "j" DT 0x7F , 0x04 , 0x0A , 0x11 , 0x00 , 0x00 ; "k" DT 0x00 , 0x41 , 0x7F , 0x01 , 0x00 , 0x00 ; "l" DT 0x1F , 0x10 , 0x0C , 0x10 , 0x0F , 0x00 ; "m" DT 0x1F , 0x08 , 0x10 , 0x10 , 0x0F , 0x00 ; "n" DT 0x0E , 0x11 , 0x11 , 0x11 , 0x0E , 0x00 ; "o" DT 0x3F , 0x28 , 0x28 , 0x28 , 0x10 , 0x00 ; "p" DT 0x10 , 0x28 , 0x28 , 0x18 , 0x3F , 0x00 ; "q" DT 0x1F , 0x08 , 0x10 , 0x10 , 0x08 , 0x00 ; "r" DT 0x09 , 0x15 , 0x15 , 0x15 , 0x02 , 0x00 ; "s" DT 0x10 , 0x7E , 0x11 , 0x01 , 0x02 , 0x00 ; "t" DT 0x1E , 0x01 , 0x01 , 0x02 , 0x1F , 0x00 ; "u" DT 0x1C , 0x02 , 0x01 , 0x02 , 0x1C , 0x00 ; "v" DT 0x1E , 0x01 , 0x06 , 0x01 , 0x1E , 0x00 ; "w" DT 0x11 , 0x0A , 0x04 , 0x0A , 0x11 , 0x00 ; "x" DT 0x18 , 0x05 , 0x05 , 0x05 , 0x1E , 0x00 ; "y" DT 0x11 , 0x13 , 0x15 , 0x19 , 0x11 , 0x00 ; "z" DT 0x00 , 0x08 , 0x36 , 0x41 , 0x00 , 0x00 ; "{" DT 0x00 , 0x00 , 0x7F , 0x00 , 0x00 , 0x00 ; "|" DT 0x00 , 0x41 , 0x36 , 0x08 , 0x00 , 0x00 ; "}" DT 0x04 , 0x04 , 0x15 , 0x0E , 0x04 , 0x00 ; "->" DT 0x04 , 0x0E , 0x15 , 0x04 , 0x04 , 0x00 ; "<-" DT 0x14 , 0x3E , 0x55 , 0x41 , 0x22 , 0x00 ; "€" DT 0x30 , 0x78 , 0x7C , 0x7C , 0x3E , 0x1F ; 1 of 2 Heart DT 0x3E , 0x7C , 0x7C , 0x78 , 0x30 , 0x00 ; 2 of 2 Heart DT 0x00 , 0x1C , 0x3E , 0x77 , 0x5B , 0x7B ; 1 of 2 Smilly DT 0x5B , 0x77 , 0x3E , 0x1C , 0x00 , 0x00 ; 2 of 2 Smilly DT 0x08 , 0x1C , 0x7F , 0x1C , 0x08 , 0x00 ; "" DT 0x08 , 0x14 , 0x41 , 0x14 , 0x08 , 0x00 ; "<>" DT 0x00 , 0x1F , 0x1F , 0x1F , 0x1F , 0x00 ; "[II]" DT 0x00 , 0x1F , 0x11 , 0x11 , 0x1F , 0x00 ; "[]" DT 0x0E , 0x13 , 0x15 , 0x19 , 0x0E , 0x00 ; "o" DT 0x00 , 0x00 , 0x02 , 0x00 , 0x00 , 0x00 ; "?" DT 0x7E , 0xA5 , 0xA9 , 0x81 , 0x7E , 0x00 ; "©" DT 0x3F , 0x44 , 0xC4 , 0x44 , 0x3F , 0x00 ; "Á" DT 0x7F , 0x49 , 0xC9 , 0x49 , 0x41 , 0x00 ; "É" DT 0x00 , 0x41 , 0xFF , 0x41 , 0x60 , 0x00 ; "Í" DT 0x3E , 0x41 , 0xC1 , 0x41 , 0x3E , 0x00 ; "Ó" DT 0x3E , 0xC1 , 0x41 , 0xC1 , 0x3E , 0x00 ; "Ö" DT 0x3E , 0xE1 , 0x41 , 0xE1 , 0x3E , 0x00 ; "Ő" DT 0x7E , 0x01 , 0xC1 , 0x01 , 0x7E , 0x00 ; "Ú" DT 0x7E , 0x41 , 0x01 , 0x41 , 0x7E , 0x00 ; "Ü" DT 0x7E , 0xC1 , 0x01 , 0xC1 , 0x7E , 0x00 ; "Ű" DT 0x6E , 0x71 , 0x11 , 0x11 , 0x02 , 0x00 ; "°C" DT 0x02 , 0x15 , 0x35 , 0x55 , 0x0F , 0x00 ; "á" DT 0x0E , 0x15 , 0x35 , 0x55 , 0x0C , 0x00 ; "é" DT 0x00 , 0x11 , 0x3F , 0x51 , 0x00 , 0x00 ; "í" DT 0x0E , 0x11 , 0x31 , 0x51 , 0x0E , 0x00 ; "ó" DT 0x0E , 0x51 , 0x11 , 0x51 , 0x0E , 0x00 ; "ö" DT 0x0E , 0x71 , 0x11 , 0x71 , 0x0E , 0x00 ; "ő" DT 0x1E , 0x01 , 0x61 , 0x02 , 0x1F , 0x00 ; "ú" DT 0x1E , 0x41 , 0x01 , 0x42 , 0x1F , 0x00 ; "ü" DT 0x1E , 0x61 , 0x01 , 0x62 , 0x1F , 0x00 ; "ű" DT 0x00 , 0x20 , 0x50 , 0x50 , 0x20 , 0x00 ; "°" CharGenEnd ;********************************* org 0x18F0 VARAKOZIK decfsz atmeneti,f ; Egy kis várakozás goto VARAKOZIK btfsc INTCON,T0IE ; Ha timer0 megszakítás engedélyezett goto Timer2 ; ugrás a Timer2 címkére bsf INTCON,T0IE ; Timer0 megszakítás engedélyezése return Timer2 bcf INTCON,T0IE ; Timer0 megszakítás tiltása banksel PIE1 movlw 1 << TMR2IE ; Timer2 megszakítás engedélyezés megfordítása xorwf PIE1,f banksel PORTA return END