LIST P = 16F628, R = DEC #include ; HSosc 4MHz ;zapojeni displeje ; RB1 OUT - DISP E ; RB2 OUT - DISP RS ; RA0 OUT - DISP DB4 ; RA1 OUT - DISP DB5 ; RA2 OUT - DISP DB6 ; RA3 OUT - DISP DB7 #define TLD PORTB,7 ; #define TLU PORTB,6 ; #define TLM PORTB,5 ;Menu ;#define TLU PORTB,4 ; #define MXA PORTB,3 ;multiplex 0=A #define RS PORTB,2 ; #define E PORTB,1 ; #define GATE PORTB,0 ;blokuje nacitani z RA4 T1 equ 252 ; first timing loop T2 equ 5 ; second timing loop T3 equ 22 ; third timing loop T4 equ 2 ; last timing loop rpmT1 equ 34 ; first timing loop rpmT2 equ 72 ; second timing loop rpmT3 equ 21 ; third timing loop rpmT4 equ 1 ; last timing loop mTESTTL equ 255 ;pocet testovani uvolneni tlacitek COUNTON equ B'11110001' COUNTOFF equ B'11110000' TMP0 EQU OFFRAM ;pomocne promenne pro smycky TMP1 EQU OFFRAM+1 ;pomocne promenne pro smycky TMP2 EQU OFFRAM+2 ;pomocne promenne pro smycky TMP3 EQU OFFRAM+3 ;pomocne promenne pro smycky TEMPH EQU OFFRAM+4 ;horni bajt teploty TEMPL EQU OFFRAM+5 ;dolni bajt teploty TEXT equ OFFRAM+6 ; zobrazeni textu na LCD ZNAK equ OFFRAM+7 ; zobrazeni znaku na LCD POM EQU OFFRAM+8 ;pomocne promenne POCET equ OFFRAM+9 ;pomocne promenne ADRESA equ OFFRAM+10 ; inicializace cestiny, adresa pro misto znaku CISLO equ OFFRAM+11 ; pomocne cislo TimerH equ OFFRAM+12 ; the highest byte of SW counter LowB equ OFFRAM+13 ; low byte of resulted frequency MidB equ OFFRAM+14 ; middle byte of resulted frequency HigB equ OFFRAM+15 ; high byte of resulted frequency TEMP equ OFFRAM+16 ; temporary register HIndex equ OFFRAM+17 ; index register LEDIndex equ OFFRAM+18 ; LED pointer R1 equ OFFRAM+19 ; Timing counters R2 equ OFFRAM+20 R3 equ OFFRAM+21 Index equ OFFRAM+22 Count equ OFFRAM+23 LED0 equ OFFRAM+24 LED1 equ OFFRAM+25 LED2 equ OFFRAM+26 LED3 equ OFFRAM+27 LED4 equ OFFRAM+28 LED5 equ OFFRAM+29 LED6 equ OFFRAM+30 LED7 equ OFFRAM+31 LED8 equ OFFRAM+32 LED9 equ OFFRAM+33 SH1 equ OFFRAM+34 SH2 equ OFFRAM+35 SH3 equ OFFRAM+36 NejB equ OFFRAM+37 Help equ OFFRAM+38 ;promenne pro menu mLEVEL equ OFFRAM+39 ;aktualni uroven mROW equ OFFRAM+40 ;aktualni radek mPOM equ OFFRAM+41 ;pomocna promenna mADRTXT equ OFFRAM+42 ;adresa kde je ulozen text mMAXLEV equ OFFRAM+43 ;maximalni hodnota radku v aktualni urovni mPOM2 equ OFFRAM+44 ;maximalni hodnota radku v aktualni urovni mROW1 equ OFFRAM+45 ;radek v menu na urovni 1 mROW2 equ OFFRAM+46 ;radek v menu na urovni 2 mROW3 equ OFFRAM+47 ;radek v menu na urovni 3 KANAL equ OFFRAM+48 ;slouzi pro zobrazeni jednotek ;nastavovaci promenne vstup A aJEDN equ OFFRAM+49 ;0=kHz 1=MHz 2=GHz aNASO equ OFFRAM+50 ;pocet rotaci vlevo aDELE equ OFFRAM+51 ;pocet rotaci vpravo ;nastavovaci promenne vstup B bJEDN equ OFFRAM+52 ;0=kHz 1=MHz 2=GHz bNASO equ OFFRAM+53 ;pocet rotaci vlevo bDELE equ OFFRAM+54 ;pocet rotaci vpravo ;nastavovaci promenne vstup A aT4 equ OFFRAM+55 ;kalibrace A bT4 equ OFFRAM+56 ;kalibrace B inR1 equ OFFRAM+57 ; Timing counters inR2 equ OFFRAM+58 inR3 equ OFFRAM+59 inHelp equ OFFRAM+60 ;******************************************************************* ORG 0x0 goto start ;odskok na zacatek programu ORG 0x5 ;************************************************************************ ; Numeric routines ;************************************************************************ ;------------------------------------------------------------------------ ; Tables for 3 byte constants ;------------------------------------------------------------------------ ; Table of decades ;------------------------------------------------------------------------ DecTable addwf PCL,F ; W + PCL -> PCL retlw 0 ; 10 retlw 0 ; retlw 0 ; retlw 0Ah ; retlw 0 ; 100 retlw 0 ; retlw 0 ; retlw 064h ; retlw 0 ; 1 000 retlw 0 ; retlw 03h ; retlw 0E8h ; retlw 0 ; 10 000 retlw 0 ; retlw 027h ; retlw 010h ; retlw 0 ; 100 000 retlw 01h ; retlw 086h ; retlw 0A0h ; retlw 0 ; 1 000 000 retlw 0Fh ; retlw 042h ; retlw 040h ; retlw 0 ; 10 000 000 retlw 098h ; retlw 096h ; retlw 080h ; retlw 5 ; 100 000 000 retlw 0F5h ; retlw 0E1h ; retlw 0h ; retlw 03Bh ; 1 000 000 000 retlw 09Ah ; retlw 0CAh ; retlw 0h ; ;************************************************************************ lcd_getbyte ;42 v pameti addwf PCL,F ;0 offset/ pamet 43 /delka 4+3 - Citac dt 2,0x0C,'A','n','o','?',255 ;7 offset/ pamet 51 /delka 3+3 - fw:03/03/2003 dt 2,0x0D,'N','e','?',255 ;13 offset/ pamet 51 /delka 1+3 - fw:03/03/2003 dt 2,0x0C,'G',255 ;17 offset/ pamet 51 /delka 1+3 - fw:03/03/2003 dt 2,0x0C,'M',255 ;21 offset/ pamet 51 /delka 1+3 - fw:03/03/2003 dt 2,0x0C,'k',255 ;25 offset/ pamet 67 /delka 14+3 - Nastav vstup_ dt 1,0,'N','a','s','t','a','v',' ','v','s','t','u','p',' ',255 ;41 offset/ pamet 84 /delka 2+3 - A? dt 1,0x0D,'A','?',255 ;46 offset/ pamet 90 /delka 2+3 - B? dt 1,0x0D,'B','?',255 ;51 offset/ pamet 90 /delka 6+3 - B? dt 1,0,'S','e','t','u','p','?',255 ;60 offset/ pamet 90 /delka 5+3 - B? dt 1,0,'Z','p','e','t','?',255 ;68 offset/ pamet 90 /delka 10+3 - B? dt 1,0,'V','y','n','a','s','o','b','i','t','?',255 ;81 offset/ pamet 90 /delka 8+3 - B? dt 1,0,'V','y','d','e','l','i','t','?',255 ;92 offset/ pamet 90 /delka 9+3 - B? dt 1,0,'J','e','d','n','o','t','k','y','?',255 ;104 offset/ pamet 90 /delka 14+3 - B? dt 1,0,'M','e','z','i','f','r','e',255 ;114 offset/ pamet 90 /delka 4+3 - B? dt 2,0x0C,'r','p','m','?',255 ;121 offset/ pamet 84 /delka 2+3 - A? dt 1,0x0E,'+','?',255 ;126 offset/ pamet 84 /delka 2+3 - A? dt 1,0x0E,'-','?',255 ;131 offset/ pamet 84 /delka 7+3 - A? dt 1,0,'U','l','o','z','i','t','?',255 ;141 offset/ pamet 84 /delka 7+3 - A? dt 1,0,'N','a','c','i','s','t','?',255 ;151 offset/ pamet 84 /delka 6+3 - A? dt 1,0,'R','e','s','e','t','?',255 ;160 offset/ pamet 84 /delka 2+3 - A? dt 2,0x0E,'1','?',255 ;165 offset/ pamet 84 /delka 2+3 - A? dt 2,0x0E,'2','?',255 ;170 offset/ pamet 84 /delka 2+3 - A? dt 2,0x0E,'4','?',255 ;175 offset/ pamet 84 /delka 2+3 - A? dt 2,0x0E,'8','?',255 ;180 offset/ pamet 84 /delka 3+3 - A? dt 2,0x0D,'1','6','?',255 ;186 offset/ pamet 84 /delka 3+3 - A? dt 2,0x0D,'3','2','?',255 ;192 offset/ pamet 84 /delka 3+3 - A? dt 2,0x0D,'6','4','?',255 ;198 offset/ pamet 84 /delka 4+3 - A? dt 2,0x0C,'1','2','8','?',255 ;205 offset/ pamet 84 /delka 3+3 - A? dt 2,0x0D,'H','z','?',255 ;******************************************************************* testtl movlw mTESTTL movwf mPOM movlw 0xff movwf mPOM2 testtl2 decf mPOM2,F testtl1 btfss TLM goto testtl btfss TLU goto testtl btfss TLD goto testtl btfss STATUS,Z goto testtl2 decfsz mPOM,F goto testtl1 return ;**************************************************************************** mroll movf PORTB,W iorlw B'00011111' bcf STATUS,Z xorlw 0xff btfsc STATUS,Z goto mroll ;cekam dokud neni neco zmackly btfss TLD goto mrolld ;stisknuto Dn btfss TLU goto mrollu ;stisknuto Up btfss TLM goto mrollm ;stisknuto Menu goto mroll ;tlacitko nezustalo seply mrolld bcf STATUS,Z movf mMAXLEV,W xorwf mROW,W btfss STATUS,Z goto mrollinc movlw 1 movwf mROW goto mrollend mrollinc incf mROW,F goto mrollend mrollu bcf STATUS,Z movlw 1 xorwf mROW,W btfss STATUS,Z goto mrolldec movf mMAXLEV,W movwf mROW goto mrollend mrolldec decf mROW,F goto mrollend mrollm bsf STATUS,Z ;stisknuto Menu tak nastavime Z=1 return mrollend bcf STATUS,Z ;stisknuto Dn/Up tak pro jistotu Z=0 return ;**************************************************************************** zobrtxt bcf STATUS,Z movlw 1 xorwf mLEVEL,W btfsc STATUS,Z goto zl1 bcf STATUS,Z movlw 2 xorwf mLEVEL,W btfsc STATUS,Z goto zl2 bcf STATUS,Z movlw 3 xorwf mLEVEL,W btfsc STATUS,Z goto zl3 return ;chyba ;**************************************************************************** zl1 call C_LCD bcf STATUS,Z movlw 1 xorwf mROW,W btfsc STATUS,Z goto zl1p1 bcf STATUS,Z movlw 2 xorwf mROW,W btfsc STATUS,Z goto zl1p2 bcf STATUS,Z movlw 3 xorwf mROW,W btfsc STATUS,Z goto zl1p3 bcf STATUS,Z movlw 4 xorwf mROW,W btfsc STATUS,Z goto zl1p4 return ;chyba zl1p1 movlw 25 ;Vstup A movwf mADRTXT call mTEXT movlw 41 movwf mADRTXT call mTEXT return zl1p2 movlw 25 ;Vstup B movwf mADRTXT call mTEXT movlw 46 movwf mADRTXT call mTEXT return zl1p3 movlw 51 ;Setup movwf mADRTXT call mTEXT return zl1p4 movlw 60 ;Exit movwf mADRTXT call mTEXT return ;**************************************************************************** zl2 call C_LCD bcf STATUS,Z ;tady testuji zda se nejedna o zobrazeni SETUPu movlw 3 ;vse ostatni je stejne tak neni treba testovat xorwf mROW1,W btfsc STATUS,Z goto zl2_3 zl2_12 bcf STATUS,Z ;jsem na zobrazeni Nastaveni A nebo B - jsou stejne movlw 1 xorwf mROW,W btfsc STATUS,Z goto zl21p1 bcf STATUS,Z movlw 2 xorwf mROW,W btfsc STATUS,Z goto zl21p2 bcf STATUS,Z movlw 3 xorwf mROW,W btfsc STATUS,Z goto zl21p3 bcf STATUS,Z movlw 4 xorwf mROW,W btfsc STATUS,Z goto zl1p4 ;jdu na Exit return ;chyba zl21p1 movlw 68 ;Vynasobit movwf mADRTXT call mTEXT return zl21p2 movlw 81 ;Vydelit movwf mADRTXT call mTEXT return zl21p3 movlw 92 ;Jednotky movwf mADRTXT call mTEXT return zl2_3 bcf STATUS,Z movlw 1 xorwf mROW,W btfsc STATUS,Z goto zl23p1 bcf STATUS,Z movlw 2 xorwf mROW,W btfsc STATUS,Z goto zl23p2 bcf STATUS,Z movlw 3 xorwf mROW,W btfsc STATUS,Z goto zl23p3 bcf STATUS,Z movlw 4 xorwf mROW,W btfsc STATUS,Z goto zl1p4 ;jdu na Exit return ;chyba zl23p1 movlw 131 ;Ulozit movwf mADRTXT call mTEXT return zl23p2 movlw 141 ;Nacist movwf mADRTXT call mTEXT return zl23p3 movlw 151 ;Reset movwf mADRTXT call mTEXT return ;**************************************************************************** zl3 call clin2 ;vymazu 2.radku displeje bcf STATUS,Z ;tady testuji zda se nejedna o zobrazeni SETUPu movlw 3 ;nemusim testovat na urovni 2 staci na 1. xorwf mROW1,W btfsc STATUS,Z goto zl3_3 bcf STATUS,Z movlw 1 xorwf mROW2,W btfsc STATUS,Z goto zl311p1 bcf STATUS,Z movlw 2 xorwf mROW2,W btfsc STATUS,Z goto zl311p1 bcf STATUS,Z ;Jdu zobrazovat kHz atd.. movlw 3 xorwf mROW2,W btfsc STATUS,Z goto zl313p1 return zl313p1 bcf STATUS,Z ;jsem na zobrazeni kHz,MHz atd... movlw 1 xorwf mROW,W btfsc STATUS,Z goto z313r1 bcf STATUS,Z movlw 2 xorwf mROW,W btfsc STATUS,Z goto z313r2 bcf STATUS,Z movlw 3 xorwf mROW,W btfsc STATUS,Z goto z313r3 bcf STATUS,Z movlw 4 xorwf mROW,W btfsc STATUS,Z goto z313r4 z313r1 movlw 21 ;k movwf mADRTXT call mTEXT movlw 205 ;Hz movwf mADRTXT call mTEXT return z313r2 movlw 17 ;M movwf mADRTXT call mTEXT movlw 205 ;Hz movwf mADRTXT call mTEXT return z313r3 movlw 13 ;G movwf mADRTXT call mTEXT movlw 205 ;Hz movwf mADRTXT call mTEXT return z313r4 movlw 114 ;rpm movwf mADRTXT call mTEXT return zl311p1 bcf STATUS,Z ;jsem na zobrazeni Nastaveni A/B - Nasobeni/Deleni movlw 1 xorwf mROW,W btfsc STATUS,Z goto z312r1 bcf STATUS,Z movlw 2 xorwf mROW,W btfsc STATUS,Z goto z312r2 bcf STATUS,Z movlw 3 xorwf mROW,W btfsc STATUS,Z goto z312r3 bcf STATUS,Z movlw 4 xorwf mROW,W btfsc STATUS,Z goto z312r4 bcf STATUS,Z movlw 5 xorwf mROW,W btfsc STATUS,Z goto z312r5 bcf STATUS,Z movlw 6 xorwf mROW,W btfsc STATUS,Z goto z312r6 bcf STATUS,Z movlw 7 xorwf mROW,W btfsc STATUS,Z goto z312r7 bcf STATUS,Z movlw 8 xorwf mROW,W btfsc STATUS,Z goto z312r8 return ;chyba z312r1 movlw 160 ;1? movwf mADRTXT call mTEXT return z312r2 movlw 165 ;2? movwf mADRTXT call mTEXT return z312r3 movlw 170 ;4? movwf mADRTXT call mTEXT return z312r4 movlw 175 ;8? movwf mADRTXT call mTEXT return z312r5 movlw 180 ;16? movwf mADRTXT call mTEXT return z312r6 movlw 186 ;32? movwf mADRTXT call mTEXT return z312r7 movlw 192 ;64? movwf mADRTXT call mTEXT return z312r8 movlw 198 ;128? movwf mADRTXT call mTEXT return zl3_3 bcf STATUS,Z movlw 1 xorwf mROW,W btfsc STATUS,Z goto zl3p1 ;Setup - Ano? bcf STATUS,Z movlw 2 xorwf mROW,W btfsc STATUS,Z goto zl3p2 ;Setup - Ne? return zl3p1 movlw 0 ;Ano? movwf mADRTXT call mTEXT return zl3p2 movlw 7 ;Ne? movwf mADRTXT call mTEXT return ;**************************************************************************** kamdal bcf STATUS,Z movlw 1 xorwf mLEVEL,W btfsc STATUS,Z goto kdl1 bcf STATUS,Z movlw 2 xorwf mLEVEL,W btfsc STATUS,Z goto kdl2 bcf STATUS,Z movlw 3 xorwf mLEVEL,W btfsc STATUS,Z goto kdl3 return ;chyba ;**************************************************************************** kdl1 movf mROW,W ;zde si ulozim z jakeho radku L1 jsem odesel movwf mROW1 bcf STATUS,Z movlw 4 xorwf mROW,W btfsc STATUS,Z goto kdl1r4 kdl1r1 goto MENU2 ;nastavujeme A kdl1r4 call C_LCD ;Exit zpet do mereni call testtl goto MAIN ;**************************************************************************** kdl2 movf mROW,W movwf mROW2 bcf STATUS,Z ;tady testuji zda se nejedna o zobrazeni SETUPu movlw 3 ;vse ostatni je stejne tak neni treba testovat xorwf mROW1,W btfsc STATUS,Z goto kdl2_3 bcf STATUS,Z movlw 4 xorwf mROW,W btfsc STATUS,Z goto kdl21r6 goto MENU3 kdl21r6 call C_LCD ;Exit call testtl goto MENU1 kdl2_3 bcf STATUS,Z ;Jdu do Setupu movlw 4 xorwf mROW,W btfsc STATUS,Z goto kdl23r4 goto MENU3 kdl23r4 call C_LCD ;Exit call testtl goto MENU1 ;**************************************************************************** kdl3 bcf STATUS,Z ;tady testuji zda se nejedna o zobrazeni SETUPu movlw 3 ;nemusim testovat na urovni 2 staci na 1. xorwf mROW1,W btfsc STATUS,Z goto kl3_3 bcf STATUS,Z ;tady testuji zda se jedna o A movlw 1 xorwf mROW1,W btfsc STATUS,Z goto kl3_1 bcf STATUS,Z ;tady testuji zda se jedna o B movlw 2 xorwf mROW1,W btfsc STATUS,Z goto kl3_2 return ;**************************************************************************** kl3_1 bcf STATUS,Z ;nasobeni na A movlw 1 xorwf mROW2,W btfsc STATUS,Z goto kl311p1 bcf STATUS,Z ;deleni na A movlw 2 xorwf mROW2,W btfsc STATUS,Z goto kl312p1 bcf STATUS,Z ;Jdu zpracovat kHz atd.. movlw 3 xorwf mROW2,W btfsc STATUS,Z goto kl313p1 return kl313p1 decf mROW,W ;jsem na zpracovani kHz,MHz atd... movwf aJEDN goto MENU2 kl311p1 decf mROW,W ;jsem na Nastaveni A - Nasobeni movwf aNASO goto MENU2 kl312p1 decf mROW,W ;jsem na Nastaveni A - Deleni movwf aDELE goto MENU2 ;**************************************************************************** kl3_2 bcf STATUS,Z ;nasobeni na B movlw 1 xorwf mROW2,W btfsc STATUS,Z goto kl321p1 bcf STATUS,Z ;deleni na B movlw 2 xorwf mROW2,W btfsc STATUS,Z goto kl322p1 bcf STATUS,Z ;Jdu zpracovat kHz atd.. movlw 3 xorwf mROW2,W btfsc STATUS,Z goto kl323p1 return kl323p1 decf mROW,W ;jsem na zpracovani kHz,MHz atd... movwf bJEDN goto MENU2 kl321p1 decf mROW,W ;jsem na Nastaveni B - Nasobeni movwf bNASO goto MENU2 kl322p1 decf mROW,W ;jsem na Nastaveni B - Deleni movwf bDELE goto MENU2 ;**************************************************************************** kl3_3 bcf STATUS,Z movlw 1 xorwf mROW,W btfsc STATUS,Z goto kl3p1 ;Setup - Ano? bcf STATUS,Z movlw 2 xorwf mROW,W btfsc STATUS,Z goto kl3p2 ;Setup - Ne? return kl3p1 bcf STATUS,Z ;Ulozit? movlw 1 xorwf mROW2,W btfsc STATUS,Z goto kl331p1 bcf STATUS,Z ;Nacist? movlw 2 xorwf mROW2,W btfsc STATUS,Z goto kl331p2 bcf STATUS,Z ;Reset? movlw 3 xorwf mROW2,W btfsc STATUS,Z goto kl331p3 goto MENU2 kl331p1 call eesave1 goto MAIN kl331p2 call eeread1 goto MAIN kl331p3 goto start kl3p2 goto MENU2 ;Ne? ;**************************************************************************** eesave1 movlw 8 movwf POM movlw OFFRAM+56 movwf FSR eesn bcf STATUS,RP0 movf INDF,W bsf STATUS,RP0 movwf EEDATA bcf STATUS,RP0 movf POM,W bsf STATUS,RP0 movwf EEADR bsf EECON1,WREN movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR bcf EECON1,WREN btfsc EECON1,WR goto $-1 bcf STATUS,RP0 decf FSR,F decfsz POM,F goto eesn bcf STATUS,RP0 call SCONF return ;**************************************************************************** eeread1 movlw 8 movwf POM movlw OFFRAM+56 movwf FSR eern bcf STATUS,RP0 movf POM,W bsf STATUS,RP0 movwf EEADR bsf EECON1,RD movf EEDATA,W bcf STATUS,RP0 movwf INDF decf FSR,F decfsz POM,F goto eern call LCONF return ;******************************************************************* LCONF call C_LCD call LINE1 movlw 'N' call WRDATA movlw 'a' call WRDATA movlw 'c' call WRDATA movlw 'i' call WRDATA movlw 't' call WRDATA movlw 'a' call WRDATA movlw 'm' call WRDATA goto CONF ;******************************************************************* SCONF call C_LCD call LINE1 movlw 'U' call WRDATA movlw 'k' call WRDATA movlw 'l' call WRDATA movlw 'a' call WRDATA movlw 'd' call WRDATA movlw 'a' call WRDATA movlw 'm' call WRDATA ;******************************************************************* CONF call LINE2 movlw 'd' call WRDATA movlw 'a' call WRDATA movlw 't' call WRDATA movlw 'a' call WRDATA call CEK500m call CEK500m return ;**************************************************************************** MENU1 movlw 1 movwf mLEVEL movwf mROW movlw 4 movwf mMAXLEV menu1l call zobrtxt call testtl call mroll btfsc STATUS,Z call kamdal goto menu1l ;**************************************************************************** MENU2 movlw 2 movwf mLEVEL movlw 1 movwf mROW bcf STATUS,Z ;tady testuji zda se nejedna o zobrazeni SETUPu movlw 3 ;vse ostatni je stejne tak neni treba testovat xorwf mROW1,W btfsc STATUS,Z goto m2_3 movlw 4 movwf mMAXLEV goto menu2l m2_3 movlw 4 movwf mMAXLEV menu2l call zobrtxt call testtl call mroll btfsc STATUS,Z call kamdal goto menu2l ;**************************************************************************** MENU3 movlw 3 movwf mLEVEL movlw 1 movwf mROW bcf STATUS,Z ;tady testuji zda se nejedna o zobrazeni SETUPu movlw 3 ;vse ostatni je stejne tak neni treba testovat xorwf mROW1,W btfsc STATUS,Z goto m3_33 bcf STATUS,Z ;tady testuji zda se nejedna o zobrazeni Jednotky movlw 3 ;vse ostatni je stejne tak neni treba testovat ma to 8 voleb xorwf mROW2,W btfsc STATUS,Z goto m3_13 movlw 8 movwf mMAXLEV goto menu3l m3_13 movlw 4 ;V menu Jednotky jsou jen 4 volby movwf mMAXLEV goto menu3l m3_33 movlw 2 ;zase klika ve treti urovni SETUPu jsou vzdy jen 2 volby movwf mMAXLEV menu3l call zobrtxt call testtl call mroll btfsc STATUS,Z call kamdal goto menu3l ;**************************************************************************** settime movwf POM bcf STATUS,Z movlw 3 xorwf POM,W btfsc STATUS,Z goto setrpm normal movlw T1 ; zakladni cas movwf inR1 movlw T2 movwf inR2 movlw T3 movwf inR3 movlw T4 movwf inHelp return setrpm movlw rpmT1 ; hodnoty pro mereni otacek korekce na 0,9375 zakl.casu movwf inR1 movlw rpmT2 movwf inR2 movlw rpmT3 movwf inR3 movlw rpmT4 movwf inHelp return ;**************************************************************************** start clrf PORTB ;portb do 0 clrf PORTA ;porta do 0 movlw B'00000000' movwf INTCON ;GIE zakazano, vse dalsi take OFF movlw B'00000111' movwf CMCON ;komparatory off bsf STATUS,RP0 ;banka 1 clrf PIE1 ;zakaze preruseni od periferii movlw COUNTOFF movwf TRISB ;portb 7,6,5 vstupy ostatni vystupy movlw B'00010000' movwf TRISA ;porta cely vystup RA4 vstup clrf TMR0 ;vynuluju citac clrwdt ;vynuluju watchdog pred prepnutim movlw B'10100111' ;pripojen citac,delicka na 256 movwf OPTION_REG ;pull-ups odpojeny, RB0/INT sestupna bcf STATUS,RP0 ;banka 0 call INI_LCD call C_LCD call FW call CEK500m call CEK500m call CEK500m call CEK500m call eeread1 MAIN bcf MXA bcf STATUS,Z movf aJEDN,W call settime call cti movlw 0h movwf NejB bcf STATUS,Z movlw 3 xorwf aJEDN,W btfsc STATUS,Z goto mltrpmA goto NextA mltrpmA bcf STATUS,Z movlw 5 call shiftuj NextA bcf STATUS,Z movf aNASO,W call shiftuj bcf STATUS,Z movf aDELE,W call deshift call Konv ;prevede 4 byte na 10 dek.cisel call LINE1 movf aJEDN,W call zobrC ;******************************************************************* bsf MXA bcf STATUS,Z movf bJEDN,W call settime call cti movlw 0h movwf NejB bcf STATUS,Z movlw 3 xorwf bJEDN,W btfsc STATUS,Z goto mltrpmB goto NextB mltrpmB bcf STATUS,Z movlw 5 call shiftuj NextB bcf STATUS,Z movf bNASO,W call shiftuj bcf STATUS,Z movf bDELE,W call deshift call Konv ;prevede 4 byte na 10 dek.cisel call LINE2 movf bJEDN,W call zobrC ;******************************************************************* movlw 40 movwf POM zpettl btfss TLM call MENU1 btfss TLU call infoA btfss TLD call infoB call CEK15m decfsz POM,F goto zpettl goto MAIN ; start new cycle ;******************************************************************* infoA call clin2 call LINE2 movlw '*' call WRDATA movlw '0' addwf aNASO,W call WRDATA movlw ' ' call WRDATA movlw '/' call WRDATA movlw '0' addwf aDELE,W call WRDATA movlw ' ' call WRDATA movlw 'U' call WRDATA movlw '0' addwf aJEDN,W call WRDATA call CEK500m call CEK500m call CEK500m call CEK500m return ;******************************************************************* infoB call clin1 call LINE1 movlw '*' call WRDATA movlw '0' addwf bNASO,W call WRDATA movlw ' ' call WRDATA movlw '/' call WRDATA movlw '0' addwf bDELE,W call WRDATA movlw ' ' call WRDATA movlw 'U' call WRDATA movlw '0' addwf bJEDN,W call WRDATA call CEK500m call CEK500m call CEK500m call CEK500m return ;******************************************************************* FW call LINE1 movlw 'C' call WRDATA movlw 'i' call WRDATA movlw 't' call WRDATA movlw 'a' call WRDATA movlw 'c' call WRDATA movlw ' ' call WRDATA movlw ' ' call WRDATA movlw ' ' call WRDATA movlw ' ' call WRDATA movlw 'V' call WRDATA movlw 'R' call WRDATA movlw '-' call WRDATA movlw 's' call WRDATA movlw 'o' call WRDATA movlw 'f' call WRDATA movlw 't' call WRDATA call LINE2 movlw 'f' call WRDATA movlw 'w' call WRDATA movlw ':' call WRDATA movlw '0' call WRDATA movlw '3' call WRDATA movlw '0' call WRDATA movlw '3' call WRDATA movlw '1' call WRDATA movlw '6' call WRDATA return ;******************************************************************* mTEXT bcf STATUS,Z movf mADRTXT,W call lcd_getbyte xorlw 1 ;testujeme jestli je to radek 1 btfss STATUS,Z ;kdyz jo tak je Z=1 a preskocime nasledujici instrukci goto rad2 call LINE1 ;tady zpracujeme radek c.1 incf mADRTXT,F movf mADRTXT,W call lcd_getbyte addlw 0x80 call WRCMD hop1 incf mADRTXT,F movf mADRTXT,W call lcd_getbyte xorlw 255 btfsc STATUS,Z return movf mADRTXT,W call lcd_getbyte call WRDATA goto hop1 rad2 call LINE2 ;tady zpracujeme radek c.2 incf mADRTXT,F movf mADRTXT,W call lcd_getbyte addlw 0xC0 call WRCMD hop2 incf mADRTXT,F movf mADRTXT,W call lcd_getbyte xorlw 255 btfsc STATUS,Z return movf mADRTXT,W call lcd_getbyte call WRDATA goto hop2 ;******************************************************************* deshift btfsc STATUS,Z return movwf POM dshit1 bcf STATUS,C rrf NejB,F rrf HigB,F rrf MidB,F rrf LowB,F decfsz POM,F goto dshit1 return ;******************************************************************* shiftuj btfsc STATUS,Z return movwf POM shit1 bcf STATUS,C rlf LowB,F rlf MidB,F rlf HigB,F rlf NejB,F decfsz POM,F goto shit1 return ;******************************************************************* cti clrf TimerH clrf TMR0 movf inR1,W ; set initial counter values movwf R1 movf inR2,W movwf R2 movf inR3,W movwf R3 clrf INTCON ; global INT disable, TMR0 INT disable ; clear TMR0 overflow bite bsf STATUS,RP0 movlw COUNTON ;ted nastavime RB0 jako vstup a tim povolime citani movwf TRISB bcf STATUS,RP0 Cycle btfss INTCON,2 ; 1 Test for TMR0 overflow goto Nothing ; 3 incf TimerH,F ; 3 bcf INTCON,2 ; 4 goto Nxt ; 6 Nothing nop ; 4 nop ; 5 nop ; 6 Nxt decfsz R1,F ; 7 goto Cycle ; 9 movf inR1,W ; 9*T1 movwf R1 ; 9*T1+1 decfsz R2,F ; 9*T1+2 goto Cycle ; 9*T1+4 movf inR2,W ;(9*T1+4)*T2 movwf R2 ;(9*T1+4)*T2+1 decfsz R3,F ;(9*T1+4)*T2+2 goto Cycle ;(9*T1+4)*T2+4 movf inHelp,W ;((9*T1+4)*T2+4)*T3 movwf Help ;((9*T1+4)*T2+4)*T3+1 Cycle2 btfss INTCON,2 ; 1 goto Not2Do ; 3 incf TimerH,F ; 3 bcf INTCON,2 ; 4 goto Nx ; 6 Not2Do nop ; 4 nop ; 5 nop ; 6 Nx decfsz Help,F ; 7 goto Cycle2 ; 9 nop ; ((9*T1+4)*T2+4)*T3+1+9*T4+Z nop ; Z times fine tuning nops nop ; Z times fine tuning nops nop ; Z times fine tuning nops nop ; Z times fine tuning nops nop ; Z times fine tuning nops nop ; 1 nop ; 2 bcf GATE ; 3 RB0 = 0 nop ; 4 W -> PORTA ; ((9*T1+4)*T2+4)*T3+1+9*T4+Z+4 bsf STATUS,RP0 ; movlw COUNTOFF ; RB0 output movwf TRISB ; bcf STATUS,RP0 ; zastavujeme citani movf TMR0,W movwf MidB ; TMR0 -> MidB movf TimerH,W movwf HigB ; TimerH -> HigB clrf TEMP CountIt incf TEMP,F bsf GATE ; _| false impulz bcf GATE ; |_ bcf INTCON,2 movf TMR0,W ; actual TMR0 -> W bcf STATUS,Z subwf MidB,W btfsc STATUS,Z goto CountIt incf TEMP,F comf TEMP,F incf TEMP,F incf TEMP,W movwf LowB return ;************************************************************* zobrC movwf KANAL clrf Help movf Help,W addwf LED9,W movwf Help btfsc STATUS,Z goto Blank9 movlw '0' goto Cis9 Blank9 movlw ' ' Cis9 addwf LED9,W ;call WRDATA bcf STATUS,Z movlw 2 xorwf KANAL,W btfsc STATUS,Z incf Help,F movf Help,W addwf LED8,W movwf Help btfsc STATUS,Z goto Blank8 movlw '0' goto Cis8 Blank8 movlw ' ' Cis8 addwf LED8,W call WRDATA ;*********************************** bcf STATUS,Z movlw 2 xorwf KANAL,W btfsc STATUS,Z goto teckaG movlw ' ' call WRDATA goto teckaG1 teckaG movlw '.' call WRDATA ;*********************************** teckaG1 movf Help,W addwf LED7,W movwf Help btfsc STATUS,Z goto Blank7 movlw '0' goto Cis7 Blank7 movlw ' ' Cis7 addwf LED7,W call WRDATA movf Help,W addwf LED6,W movwf Help btfsc STATUS,Z goto Blank6 movlw '0' goto Cis6 Blank6 movlw ' ' Cis6 addwf LED6,W call WRDATA bcf STATUS,Z movlw 1 xorwf KANAL,W btfsc STATUS,Z incf Help,F movf Help,W addwf LED5,W movwf Help btfsc STATUS,Z goto Blank5 movlw '0' goto Cis5 Blank5 movlw ' ' Cis5 addwf LED5,W call WRDATA ;*********************************** bcf STATUS,Z movlw 1 xorwf KANAL,W btfsc STATUS,Z goto teckaM movlw ' ' call WRDATA goto teckaM1 teckaM movlw '.' call WRDATA ;*********************************** teckaM1 movf Help,W addwf LED4,W movwf Help btfsc STATUS,Z goto Blank4 movlw '0' goto Cis4 Blank4 movlw ' ' Cis4 addwf LED4,W call WRDATA movf Help,W addwf LED3,W movwf Help btfsc STATUS,Z goto Blank3 movlw '0' goto Cis3 Blank3 movlw ' ' Cis3 addwf LED3,W call WRDATA bcf STATUS,Z movlw 0 xorwf KANAL,W btfsc STATUS,Z incf Help,F movf Help,W addwf LED2,W movwf Help btfsc STATUS,Z goto Blank2 movlw '0' goto Cis2 Blank2 movlw ' ' Cis2 addwf LED2,W call WRDATA ;*********************************** bcf STATUS,Z movlw 0 xorwf KANAL,W btfsc STATUS,Z goto teckak movlw ' ' call WRDATA goto teckak1 teckak movlw '.' call WRDATA ;*********************************** teckak1 movf Help,W addwf LED1,W movwf Help btfsc STATUS,Z goto Blank1 movlw '0' goto Cis1 Blank1 movlw ' ' Cis1 addwf LED1,W call WRDATA movf Help,W addwf LED0,W movwf Help btfsc STATUS,Z goto Blank0 movlw '0' goto Cis0 Blank0 movlw ' ' Cis0 addwf LED0,W call WRDATA movlw '0' call WRDATA bcf STATUS,Z movlw 3 xorwf KANAL,W btfsc STATUS,Z goto rpm bcf STATUS,Z movlw 2 xorwf KANAL,W btfsc STATUS,Z goto GHz bcf STATUS,Z movlw 1 xorwf KANAL,W btfsc STATUS,Z goto MHz movlw 'k' call WRDATA goto Hz MHz movlw 'M' call WRDATA goto Hz GHz movlw 'G' call WRDATA Hz movlw 'H' call WRDATA movlw 'z' call WRDATA return rpm movlw 'r' call WRDATA movlw 'p' call WRDATA movlw 'm' call WRDATA return ;************************************************************************ ;------------------------------------------------------------------------ ; 4 byte substraction of the constant from the table which sets carry if ; result is negative ;------------------------------------------------------------------------ Subc24 clrf TEMP ; it will TEMPorary save C movf Index,W ; pointer to low byte of constant movwf HIndex ; W -> HIndex call DecTable ; W returned with low byte of constant bsf STATUS,C ; set C subwf LowB,F ; LowB - W -> LowB if underflow -> C=0 btfsc STATUS,C goto Step1 bsf STATUS,C movlw 1 subwf MidB,F ; decrement MidB if underflow -> C=0 btfsc STATUS,C goto Step1 bsf STATUS,C movlw 1 subwf HigB,F ; decrement HigB btfsc STATUS,C ; if underflow -> C=0 goto Step1 bsf STATUS,C ; set C movlw 1 subwf NejB,F ; decrement NejB btfsc STATUS,C ; if underflow -> C=0 goto Step1 bsf TEMP,C ; set C Step1 decf HIndex,F movf HIndex,W ; pointer to middle byte of const call DecTable bsf STATUS,C subwf MidB,F ; MidB - W -> MidB btfsc STATUS,C ; if underflow -> C=0 goto Step2 bsf STATUS,C movlw 1 subwf HigB,F ; decrement HigB btfsc STATUS,C ; if underflow -> C=0 goto Step2 bsf STATUS,C ; set C movlw 1 subwf NejB,F ; decrement NejB btfsc STATUS,C ; if underflow -> C=0 goto Step2 bsf TEMP,C ; set C Step2 decf HIndex,F movf HIndex,W ; pointer to middle byte of constatnt call DecTable bsf STATUS,C subwf HigB,F ; HigB - W -> HigB btfsc STATUS,C ; if underflow -> C=0 goto Step3 bsf STATUS,C movlw 1 subwf NejB,F ; decrement NejB btfsc STATUS,C ; if underflow -> C=0 goto Step3 bsf TEMP,C ; set C Step3 decf HIndex,F movf HIndex,W ; pointer to middle byte of constatnt call DecTable bsf STATUS,C subwf NejB,F ; NejB - W -> NejB btfsc STATUS,C ; if underflow -> C=0 goto ClearCF bsf STATUS,C goto SubEnd ClearCF rrf TEMP,C ; C -> STATUS SubEnd retlw 0 ; ------------------------------------------------------------------------ ; 3 byte addition of the constant from the table which sets carry if ; result overflows ; ------------------------------------------------------------------------ Addc24 clrf TEMP ; register for TEMPorary storage of C movf Index,W ; pointer to lower byte of const into W movwf HIndex ; save it into HIndex call DecTable ; W contains low byte of const bcf STATUS,C ; clear C addwf LowB,1 ; W + LowB -> LowB btfss STATUS,C ; test overflow goto Add2 bcf STATUS,C ; clear C movlw 1 addwf MidB,F ; increment MidB btfss STATUS,C goto Add2 bcf STATUS,C movlw 1 addwf HigB,F ; increment HigB btfss STATUS,C ; test overflow goto Add2 bsf STATUS,C ; store C movlw 1 addwf NejB,F ; increment NejB btfss STATUS,C ; test overflow goto Add2 bsf TEMP,C ; store C Add2 decf HIndex,F ; pointer to middle byte into W movf HIndex,W call DecTable bcf STATUS,C addwf MidB,1 ; W + MidB -> MidB btfss STATUS,C goto Add3 bcf STATUS,C ; clear C movlw 1 addwf HigB,1 ; increment HigB btfss STATUS,C goto Add3 bsf STATUS,C movlw 1 addwf NejB,F ; increment NejB btfss STATUS,C ; test overflow goto Add3 bsf TEMP,C ; store C Add3 decf HIndex,F ; pointer to higher byte into W movf HIndex,W call DecTable bsf STATUS,C addwf HigB,F ; W + HigB -> HigB, btfss STATUS,C goto Add4 bsf STATUS,C movlw 1 addwf NejB,F ; increment NejB btfss STATUS,C ; test overflow goto Add4 bsf TEMP,C ; store C Add4 decf HIndex,F ; pointer to higher byte into W movf HIndex,W call DecTable bsf STATUS,C addwf NejB,F ; W + NejB -> NejB, btfss STATUS,C goto ClarCF bsf STATUS,C goto AddEnd ClarCF rrf TEMP,C ; C -> STATUS AddEnd retlw 0 ;************************************************************* Konv movlw 9*4-1 ; pointer to dec. table movwf Index ; 9*4-1 -> Index movlw 9 ; maximum of substractions movwf Count ; 9 -> Count clrf Help movlw 10 movwf LEDIndex Divide call Subc24 ; substract untill result is negative, btfsc STATUS,C ; add last substracted number goto Add24 ; next digit incf Help,F decf Count,F btfss STATUS,Z goto Divide movlw 4 subwf Index,F goto Next Add24 call Addc24 movlw 4 subwf Index,F Next movlw 9 movwf Count movlw LED0 ; LED1 -> W addwf LEDIndex,W ; LED1 + LEDIndex -> W movwf TEMP decf TEMP,F ; LEDIndex+LED1-1 -> TEMP movf TEMP,W movwf FSR ; W -> FSR movf Help,W ; Help -> W clrf Help ; save result at LEDx movwf INDF ; W -> LED(6..1) decf LEDIndex,F movlw 1 addwf Index,W btfss STATUS,Z goto Divide movf LowB,W movwf LED0 ; the rest -> LED0 return ;************************************************************* clin1 call LINE1 goto clin clin2 call LINE2 clin movlw 16 movwf mPOM2 CISTY1 movlw ' ' call WRDATA decfsz mPOM2,F goto CISTY1 return ;------------------------------- LINE1 movlw 0x80 ; 1 radek, 0 znak displeje goto WRCMD ;------------------------------- LINE2 movlw 0xC0 ; 2 radek, 0 znak displeje goto WRCMD ;------------------------------- C_LCD movlw 0x01 ; smaz LCD a vrat se na pozici 0 goto WRCMD ;------------------------------- WRCMD bcf RS ; RS=0, zapis instrukci do LCD goto WR_LCD ;------------------------------- WRDATA bsf RS ; RS=1, zapis dat do LCD ; ------------------------ WR_LCD movwf ZNAK ; prepsat W do ZNAK !!! data v registru W !!! bsf E ; nastav Enable movf PORTA,W ; stav portu do W iorlw 0x0F ; zamaskuje dolni bity portu movwf TMP1 ;------------------------------- swapf ZNAK,W iorlw 0xF0 ; zamaskuje horni bity znaku andwf TMP1,W ; posle vyssi 4 bity movwf PORTA ; !!! data zapsana na PORTA 0-3 !!! bcf E ; zapise do LCD ;------------------------------- bsf E ; nastav Enable movf ZNAK,W iorlw 0xF0 ; zamaskuje horni bity znaku andwf TMP1,W ; posle nizsi 4 bity movwf PORTA ; !!! data zapsana na PORTA 0-3 !!! bcf E ; zapise do LCD ;------------------------------- btfsc RS goto CEK40 ; RS=1, zapis dat - cekej 40 us ; ------------------------ movlw 0x04 ; instrukce 1, 2 a 3 - cekej 1,64 ms subwf ZNAK,W btfss STATUS,C goto CEK1m6 ; C=0, instrukce CLEAR - cekej 1,64 ms goto CEK40 ; C=1, zapis dat - cekej 40 us ;************************************************************* INI_LCD call CEK15m ; 4-bitova inicializace displeje LCD ; call CEK15m bcf RS ; RS=0, zapis instrukci do LCD ; ------------------------ movlw 03h movwf PORTA bsf E bcf E ; zapise do LCD call CEK4m ; cekej 4 ms ; ------------------------ bsf E bcf E ; zapise do LCD call CEK100 ; cekej 100 us ; ------------------------ bsf E bcf E ; zapise do LCD call CEK1m6 ; cekej 1,6 ms ;------------------------------- movlw 02h movwf PORTA bsf E bcf E ; zapise do LCD call CEK1m6 ; cekej 1,6 ms ;------------------------------- movlw 28h ; 00101000 - pocet bitu, 2 radky, 5x7 znak call WRCMD movlw 0Ch ; 00001100 - display ON, kurzor OFF, blikani OFF call WRCMD movlw 01h ; 00000001 - smaze displej call WRCMD movlw 06h ; 00000110 - smer kurzoru, posunu displeje call WRCMD return ;************************************************************* ; casy pro frekvenci krystalu 10,00Mhz ; casy jsou spocitane od call CEKxxm do navratu na volani CEKxxm ; celkovy vypocet = 2+6+(2+(TMP0-1)*3+2)+3)*TMP1-1+2 ; zkraceny vypocet = 8+((TMP0-1)*3+7)*TMP1+1 ; mala smycka = (TMP2-1)*3+2 ;------------------------------- CEK500m movlw 10 ; TMP2 = 20 cekej 0.5 sekundy movwf TMP3 goto SMYCKA2 ;------------------------------- CEK100m movlw 0C8h ; cas = 50,014 ms movwf TMP0 movlw 0CFh movwf TMP1 goto SMYCKA ;------------------------------- CEK15m movlw 0FFh ; cas = 15,076 ms movwf TMP0 movlw 031h movwf TMP1 goto SMYCKA ;------------------------------- CEK4m movlw 040h ; cas = 4,002 ms movwf TMP0 movlw 033h movwf TMP1 goto SMYCKA ;------------------------------- CEK1m6 movlw 01Eh ; cas = 1,620 ms movwf TMP0 movlw 02Bh movwf TMP1 goto SMYCKA ;------------------------------- CEK100 movlw 009h ; cas = 102,8 mikrosekund movwf TMP0 movlw 008h movwf TMP1 goto SMYCKA ;------------------------------- CEK40 movlw 003h ; cas = 40 mikrosekund movwf TMP0 movlw 007h movwf TMP1 goto SMYCKA ;------------------------------- SMYCKA2 call CEK100m decfsz TMP3,F ; nejvetsi smycka goto SMYCKA2 retlw 00h ;------------------------------- SMYCKA movf TMP0,W movwf TMP2 SMYCKA1 decfsz TMP2,F ; mala smycka goto SMYCKA1 decfsz TMP1,F ; velka smycka goto SMYCKA retlw 00h ;************************************************************* ORG 2100h ; počáteční adresa EEPROM DE 0,0,0,0,0,0,0,0,0 ; uložení dat do EEPROM ;************************************************************* end