;*** Letalski ATC transponder mode E+A+C - S53MV - 15.07.2006 *** ;*** Uporaba vrat PICa 16F84 *** ;prozenje/vklop oddajnika PTT=RA0 ;izhod impulzov /PULSE=RA1 ;vhod LOGADCcomp=RA2 ;I2C vodilo: SCL=RA3, SDA+DATA=RA4 - krmiljenje LCD+TSA5512 ;INT=RB0 ;BACKPLANE=RB1 ;STROBE=RB2 ;LOGADCrc+CLOCK=RB3 ;tipka DESNO=RB4 ;tipka DOL=RB5 ;tipka GOR=RB6 ;tipka LEVO=RB7 ;*** Uporaba RAMa *** ;0C LCDBIT, IZVOR, GRAY, TXI2C, RXI2C, PRIKAZ, LOGADC ;0D LCDDAT, CAKAJ, GRAY, TXI2C, RXI2C, PRIKAZ ;0E LCDDAT oscilator za BACKPLANE in utripanje stevilk ;0F TIPKE spomin prejsnjega stanja ;10,11,12,13 LCDDAT, IDENT, TXPIKE, PLLTST vsebina zaslona ;14,15 CODDAJ, GRAY koda odgovora C ;16 LOGADC lihi stevec meritev ;17 AODDAJ, CODDAJ, PLLTST stevec omejitve oddaje ;18 INIPIC, PREKIN, NAPAKA stevec cakanja ;1E INIPIC, TXPIKE zastavica oddaje na LCDju ;1F INIPIC, IDENT casovnik in zastavica ;20 RWMEM zastavica vpisa/branja EEPROMa ;21,22,23,24 AODDAJ, RMEM, WMEM, MEJE koda odgovora A ;25 RMEM, WMEM, MEJE stikalo 0=Stby/1=C/2=A/3=E ;26,27,28 RMEM, WMEM, MEJE tristevilcni FL ;*** Zacetek programa, tocno 4 ukazi, sledi PREKIN *** LIST P=16F84 ORG 0 CLRF 20 ;pobrisi zastavico beri/vpisi EEPROM CALL RMEM ;zacetne vrednosti spremenljivk CALL INIPIC ;inicializacija vrat PICa GOTO GLAVNI ;*** Prekinitveni program (takt 22MHz) *** (18) ORG 4 PREKIN NOP ;zakasnitev P1-P2: 11 ukazov, Timpulza=1us NOP ;1 NOP ;2 NOP ;3 NOP ;4 NOP ;5 NOP ;6 NOP ;7 NOP ;8 NOP ;9 NOP ;10 BTFSC 6,0 ;preveri "sidelobe suppression" impulz P2 pri 2us GOTO NAPAKA BSF 18,3 ;zakasnitev P2-P3A: 2+(3*10)-1=31 ukazov BSF 18,1 PREKIN1 DECFSZ 18,1 GOTO PREKIN1 BTFSC 6,0 ;preveri "mode A interrogation" impulz P3 pri 8us GOTO AODDAJ BSF 18,4 ;zakasnitev P3A-P3C: 5+(3*22)-1=70 ukazov BSF 18,2 BSF 18,1 NOP NOP PREKIN2 DECFSZ 18,1 GOTO PREKIN2 BTFSC 6,0 ;preveri "mode C interrogation" impulz P3 pri 21us GOTO CODDAJ BSF 18,5 ;cudno? zakasnitev 17.4us: 1+(3*32)-1=96 ukazov PREKIN3 DECFSZ 18,1 GOTO PREKIN3 BCF 0B,1 ;RESET INTF RETFIE ;*** Mrtvi cas cakanja 35us po napacnem vprasanju (takt 22MHz) *** (18) NAPAKA BSF 18,6 ;zakasnitev 34.8us: 1+(3*64)-1=192 ukazov NAPAKA1 DECFSZ 18,1 GOTO NAPAKA1 BCF 0B,1 ;RESET INTF RETFIE ;*** Oddaja odgovora "mode A" (takt 22MHz) *** (17,21,22,23,24,1E,1F) AODDAJ BSF 5,0 ;vklop oddajnika in zakasnitev cca 3us NOP ;1 NOP ;2 NOP ;3 NOP ;zacetni impulz F1 - 0us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 23,0 ;impulz C1 - 1.45us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 21,0 ;impulz A1 - 2.9us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 23,1 ;impulz C2 - 4.35us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 21,1 ;impulz A2 - 5.8us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 23,2 ;impulz C4 - 7.25us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 21,2 ;impulz A4 - 8.7us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP NOP ;impulz X - 10.15us NOP NOP NOP NOP NOP NOP NOP BTFSC 22,0 ;impulz B1 - 11.6us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 24,0 ;impulz D1 - 13.05us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 22,1 ;impulz B2 - 14.5us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 24,1 ;impulz D2 - 15.95us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 22,2 ;impulz B4 - 17.4us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 24,2 ;impulz D4 - 18.85us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP NOP ;zakljucni impulz F2 - 20.3us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BSF 1E,7 ;zastavica oddaje na LCDju - 21.75us BSF 1E,6 BSF 1E,5 BSF 1E,4 BSF 1E,3 BSF 1E,2 BCF 1E,1 BCF 1E,0 NOP ;23.2us NOP NOP NOP NOP NOP NOP NOP BTFSC 1F,7 ;impulz SPI - 24.65us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP NOP BCF 5,0 ;izklop oddajnika - 26.1us BCF 0B,1 ;RESET INTF DECFSZ 17,1 ;stevec omejitve oddaje RETFIE RETURN ;*** Oddaja odgovora "mode C" (takt 22MHz) *** (14,15,17,1E,1F) CODDAJ BSF 5,0 ;vklop oddajnika in zakasnitev cca 3us NOP ;1 NOP ;2 NOP ;3 NOP ;zacetni impulz F1 - 0us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 15,2 ;15 bit 2: impulz C1 - 1.45us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 14,5 ;14 bit 5: impulz A1 - 2.9us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 15,1 ;15 bit 1: impulz C2 - 4.35us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 14,4 ;14 bit 4: impulz A2 - 5.8us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 15,0 ;15 bit 0: impulz C4 - 7.25us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 14,3 ;14 bit 3: impulz A4 - 8.7us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP NOP ;impulz X - 10.15us NOP NOP NOP NOP NOP NOP NOP BTFSC 14,2 ;14 bit 2: impulz B1 - 11.6us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP NOP ;impulz D1 - 13.05us NOP NOP NOP NOP NOP NOP NOP BTFSC 14,1 ;14 bit 1: impulz B2 - 14.5us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 14,7 ;14 bit 7: impulz D2 - 15.95us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 14,0 ;14 bit 0: impulz B4 - 17.4us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BTFSC 14,6 ;14 bit 6: impulz D4 - 18.85us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP NOP ;zakljucni impulz F2 - 20.3us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP BSF 1E,7 ;zastavica oddaje na LCDju - 21.75us BSF 1E,6 BSF 1E,5 BSF 1E,4 BSF 1E,3 BSF 1E,2 BCF 1E,1 BCF 1E,0 NOP ;23.2us NOP NOP NOP NOP NOP NOP NOP BTFSC 1F,7 ;impulz SPI - 24.65us BCF 5,1 NOP NOP BSF 5,1 NOP NOP NOP NOP BCF 5,0 ;izklop oddajnika - 26.1us BCF 0B,1 ;RESET INTF DECFSZ 17,1 ;stevec omejitve oddaje RETFIE RETURN ;*** Inicializacija vrat PICa in casovnikov *** (18,1E,1F) INIPIC CLRF 0B ;izkljuci prekinitve CLRF 18 ;resetiraj stevec cakanja MOVLW 18 ;zacetno stanje vrat A MOVWF 5 MOVLW 0 ;zacetno stanje vrat B MOVWF 6 BSF 3,5 ;postavi PAGE1 MOVLW 4 ;port A: izhoda RA0-1, vhod RA2, izhoda RA3-4 MOVWF 5 ;vpisi TRISA MOVLW 0F1 ;port B: vhod RB0, izhodi RB1-3, vhodi RB4-7 MOVWF 6 ;vpisi TRISB MOVLW 40 ;OPTION: /RBPU, INTEDG MOVWF 1 BCF 3,5 ;postavi PAGE0 CLRF 1E ;pobrisi TXPIKE CLRF 1F ;pobrisi IDENT RETURN ;*** Precitaj kodo iz EEPROMa *** (21,22,23,24,25,26,27,28) RMEM MOVLW 21 ;kazalec v RAMu MOVWF 4 CLRF 9 ;kazalec v EEPROMu CALL RMEM1 CALL RMEM1 CALL RMEM1 CALL RMEM1 CALL RMEM1 CALL RMEM1 CALL RMEM1 CALL RMEM1 MOVLW 20 ;kazalec v RAMu MOVWF 4 RETURN RMEM1 BSF 3,5 ;postavi PAGE1 - precitaj bajt in povecaj stevca BSF 8,0 ;EECON1 RD BCF 3,5 ;postavi PAGE0 MOVF 8,0 MOVWF 0 INCF 4,1 ;povecaj stevca INCF 9,1 RETURN ;*** Vpisi kodo v EEPROM *** (21,22,23,24,25,26,27,28) WMEM MOVLW 21 ;kazalec v RAMu MOVWF 4 CLRF 9 ;kazalec v EEPROMu CALL WMEM1 CALL WMEM1 CALL WMEM1 CALL WMEM1 CALL WMEM1 CALL WMEM1 CALL WMEM1 CALL WMEM1 MOVLW 20 ;kazalec v RAMu MOVWF 4 RETURN WMEM1 BSF 3,5 ;postavi PAGE1 - primerjaj vsebino EEPROMa BSF 8,0 ;EECON1 RD BCF 3,5 ;postavi PAGE0 MOVF 8,0 SUBWF 0,0 BTFSC 3,2 GOTO WMEM3 MOVF 0,0 ;razlika - vpisi novo vsebino v EEPROM MOVWF 8 BSF 3,5 ;postavi PAGE1 BCF 8,3 ;EECON1 WRERR reset BSF 8,2 ;EECON1 WREN set MOVLW 55 MOVWF 9 ;EECON2 55 MOVLW 0AA MOVWF 9 ;EECON2 0AA BSF 8,1 ;EECON1 WR WMEM2 BTFSS 8,4 ;EECON1 EEIF test GOTO WMEM2 BCF 8,4 ;EECON1 EEIF reset BCF 8,2 ;EECON1 WREN reset BCF 3,5 ;postavi PAGE0 WMEM3 INCF 4,1 ;povecaj stevca INCF 9,1 RETURN ;*** Beri/vpisi EEPROM *** (20) RWMEM MOVF 20,1 ;zastavica postavljena? BTFSC 3,2 RETURN BCF 0B,7 ;prepreci prekinitve BTFSC 20,7 ;beri EEPROM? CALL RMEM BTFSS 20,7 ;vpisi EEPROM? CALL WMEM BSF 0B,7 ;omogoci prekinitve CLRF 20 ;pobrisi zastavico RETURN ;*** Glavna zanka programa *** GLAVNI CALL RWMEM ;beri/vpisi EEPROM CALL PLLINI ;inicializacija PLLja CALL MEJE ;preveri meje spremenljivk CALL GRAY ;pretvori FL v Gray-evo kodo CALL PRIKAZ ;priprava podatkov prikaza CALL TXPIKE ;zastavica oddaje na LCDju CALL IDENT ;IDENT casovnik in utripanje CALL PLLTST ;preveri stanje PLLja CALL LCDDAT ;poslji podatke v pomikalni register CALL LOGADC ;logaritemski ADC za FL v mode C + cakanje 10ms! CALL TIPKE ;izvedi ukaz s tipk GOTO GLAVNI ;*** Logaritemski A/D pretvornik za pretvorbo pritiska v FL *** (0C,16, 26, 27, 28) LOGADC BSF 6,3 ;pocakaj 10ms, da se napolni kondenzator CALL CAKAJ DECF 16,1 ;preveri stevec pretvorb? BTFSS 3,2 GOTO LOGADC3 MOVLW 65 ;liha konstanta 101 MOVWF 16 BTFSC 25,1 ;preveri LOGADC vkljucen v mode C? GOTO LOGADC3 MOVF 0B,0 ;prepreci prekinitve med LOG A/D pretvorbo!!! MOVWF 0C MOVLW 0 MOVWF 0B BCF 6,3 ;zacetek pretvorbe, praznjenja kondenzatorja CLRF 26 ;postavi stevec FL na niclo (000=-10FL) CLRF 27 CLRF 28 LOGADC1 BTFSC 5,2 ;preveri izhod komparatorja? GOTO LOGADC2 INCF 28,1 ;steje enice MOVLW 0A ;prenos na desetice SUBWF 28,0 BTFSC 3,0 INCF 27,1 BTFSC 3,0 CLRF 28 MOVLW 0A ;prenos na stotice SUBWF 27,0 BTFSC 3,0 INCF 26,1 BTFSC 3,0 CLRF 27 MOVLW 0A ;preveri stotice >1000? SUBWF 26,0 BTFSS 3,0 GOTO LOGADC1 LOGADC2 MOVF 0C,0 ;ponovno omogoci prekinitve, ce so bile vkljucene? ANDLW 90 MOVWF 0B LOGADC3 BCF 6,3 ;CLOCK=0 RETURN ;*** Postavi modulo in inicializiraj TSA5512 *** PLLINI CALL ZACI2C ;poslji ukaz TSA5512 MOVLW 0C2 CALL TXI2C MOVLW 44 ;postavi gornji bajt frekvence CALL TXI2C MOVLW 20 ;postavi spodnji bajt frekvence CALL TXI2C MOVLW 8E ;inicializacija TSA5512 CALL TXI2C MOVLW 0 ;porti TSA5512 CALL TXI2C RETURN ;*** Preveri stanje TSA5512 *** (10,11,12,17) PLLTST MOVLW 18 ;povecaj stevec omejitve oddaje za 24=$18 ADDWF 17,0 BTFSC 3,0 MOVLW 0FF MOVWF 17 CALL ZACI2C ;precitaj podatke iz TSA5512 MOVLW 0C3 CALL TXI2C CALL RXI2C XORLW 40 ;preveri POR in FL? ANDLW 0C0 BTFSS 3,2 GOTO PLLTST1 MOVF 25,0 ;preveri stikalo ni 0? BTFSC 3,2 GOTO PLLTST2 MOVLW 90 ;vkljuci prekinitve GIE in INTE MOVWF 0B RETURN PLLTST1 BSF 12,0 ;tri pikice na LCDju pri napaki PLLja BSF 11,0 PLLTST2 BSF 10,0 ;ena (prva) pikica na LCDju pri Stby MOVLW 0 ;izkljuci prekinitve v slucaju napake MOVWF 0B BCF 5,0 ;izklop oddajnika in impulzov BSF 5,1 RETURN ;*** Zacetek komunikacije na I2C vodilu *** ZACI2C BSF 5,4 CALL ZZZI2C BSF 5,3 CALL ZZZI2C BCF 5,4 CALL ZZZI2C BCF 5,3 CALL ZZZI2C RETURN ;*** Zaviranje zaspanega I2C vodila *** ZZZI2C MOVLW 10 ZZZI2C1 ADDLW 0FF BTFSS 3,2 GOTO ZZZI2C1 RETURN ;*** Oddaja bajta iz W na I2C vodilu *** (0C,0D) TXI2C MOVWF 0C MOVLW 8 MOVWF 0D TXI2C1 BSF 5,4 ;oddaja enega bita podatkov RLF 0C,1 BTFSS 3,0 BCF 5,4 CALL ZZZI2C BSF 5,3 ;oddaja taktnega impulza CALL ZZZI2C BCF 5,3 CALL ZZZI2C DECFSZ 0D,1 ;zanka po 8 podatkovnih bitih GOTO TXI2C1 CALL KONI2C RETURN ;*** Sprejem bajta na I2C vodilu v W *** (0C,0D) RXI2C MOVLW 8 MOVWF 0D RXI2C1 BSF 5,4 ;sprejem enega bita podatkov CALL ZZZI2C MOVLW 18 IORWF 5,1 CALL ZZZI2C RLF 0C,1 BCF 0C,0 BTFSC 5,4 BSF 0C,0 BCF 5,3 CALL ZZZI2C DECFSZ 0D,1 ;zanka po 8 podatkovnih bitih GOTO RXI2C1 CALL KONI2C MOVF 0C,0 RETURN ;*** Konec bajta na I2C vodilu *** KONI2C BSF 5,4 CALL ZZZI2C MOVLW 18 IORWF 5,1 CALL ZZZI2C BCF 5,3 CALL ZZZI2C RETURN ;*** Zastavica oddaje na LCDju *** (13,1E) TXPIKE BTFSS 1E,7 RETURN BSF 13,0 ;dvopicje na LCD INCF 1E,1 RETURN ;*** IDENT casovnik in utripanje *** (10,11,12,13,1F) IDENT BTFSS 1F,7 ;IDENT? RETURN MOVLW 1 ;utripanje vseh stevilk LCDja brez pikic BTFSS 0E,4 MOVLW 0FF BTFSS 0E,5 MOVLW 0FF ANDWF 10,1 ANDWF 11,1 ANDWF 12,1 ANDWF 13,1 MOVF 0E,0 ;BACKPLANE takt/16 ANDLW 0F BTFSC 3,2 INCF 1F,1 RETURN ;*** Prikaz kode (21,22,23,24) ali FL (25,26,27,28) *** (4,0C,0D,10,11,12,13) PRIKAZ MOVLW 0DB ;prikaz kode ali ALTstikala+FL? ADDWF 4,0 BTFSC 3,0 GOTO PRIKAZ1 MOVF 21,0 ;prva stevilka kode CALL LCDDEK MOVWF 10 MOVF 22,0 ;druga stevilka kode CALL LCDDEK MOVWF 11 MOVF 23,0 ;tretja stevilka kode CALL LCDDEK MOVWF 12 MOVF 24,0 ;cetrta stevilka kode CALL LCDDEK MOVWF 13 MOVLW 21 ;naslov prvega znaka - prva stevilka kode GOTO PRIKAZ6 PRIKAZ1 MOVF 25,0 ;prikazi stikalo Stby/C/A/E MOVWF 0C MOVLW 0 ;stikalo Stby DECF 0C,1 BTFSC 3,2 MOVLW 6C ;stikalo C DECF 0C,1 BTFSC 3,2 MOVLW 0FA ;stikalo A DECF 0C,1 BTFSC 3,2 MOVLW 0EC ;stikalo E MOVWF 10 MOVF 26,0 ;odstej -10 od desetic FL za prikaz na LCDju MOVWF 0C MOVF 27,0 MOVWF 0D DECF 0D,1 BTFSS 0D,7 ;prenos na stotice FL? GOTO PRIKAZ2 DECF 0C,1 MOVLW 0A ADDWF 0D,1 PRIKAZ2 BTFSC 0C,7 ;preveri negativen FL? GOTO PRIKAZ3 MOVF 0C,0 ;stotice pozitivni FL CALL LCDDEK MOVWF 11 MOVF 0D,0 ;desetice pozitivini FL CALL LCDDEK MOVWF 12 MOVF 28,0 ;enice stevilka pozitivni FL CALL LCDDEK MOVWF 13 GOTO PRIKAZ5 PRIKAZ3 MOVLW 80 ;minus za negativni FL MOVWF 11 MOVLW 1 MOVWF 0D MOVF 28,0 BTFSC 3,2 ;posebnost FL=-10? GOTO PRIKAZ4 SUBLW 0A CLRF 0D PRIKAZ4 CALL LCDDEK ;enice negativni FL MOVWF 13 MOVF 0D,0 CALL LCDDEK ;desetice negativni FL MOVWF 12 PRIKAZ5 MOVLW 25 ;naslov prvega znaka - stikala PRIKAZ6 BTFSS 0E,4 ;utripanje znaka, ki se ga nastavlja gor/dol? RETURN SUBWF 4,0 ;prvi znak? BTFSC 3,2 CLRF 10 ADDLW 0FF ;drugi znak? BTFSC 3,2 CLRF 11 ADDLW 0FF ;tretji znak? BTFSC 3,2 CLRF 12 ADDLW 0FF ;cetrti znak? BTFSC 3,2 CLRF 13 RETURN ;*** Preveri meje kazalca in kode *** (21,22,23,24,25,26,27,28) MEJE MOVLW 0E0 ;spodnja meja kazalca ADDWF 4,1 BTFSS 3,0 CLRF 4 SUBWF 4,1 MOVLW 0D8 ;gornja meja kazalca (mode C ne nastavlja FL) BTFSS 25,1 MOVLW 0DB ADDWF 4,1 BTFSC 3,0 CLRF 4 SUBWF 4,1 MOVLW 7 ;meje prve stevilke kode ANDWF 21,1 MOVLW 7 ;meje druge stevilke kode ANDWF 22,1 MOVLW 7 ;meje tretje stevilke kode ANDWF 23,1 MOVLW 7 ;meje cetrte stevilke kode ANDWF 24,1 BTFSS 28,7 ;spodnja meja tretje (zadnje) stevilke FL (100ft) GOTO MEJE1 MOVLW 9 MOVWF 28 DECF 27,1 ;prenos: znizaj drugo stevilko MEJE1 MOVLW 0A ;gornja meja tretje (zadnje) stevilke FL (100ft) SUBWF 28,0 BTFSS 3,0 GOTO MEJE2 CLRF 28 INCF 27,1 ;prenos: zvisaj drugo stevilko MEJE2 BTFSS 27,7 ;spodnja meja druge stevilke FL (1kft) GOTO MEJE3 MOVLW 9 MOVWF 27 DECF 26,1 ;prenos: znizaj prvo stevilko MEJE3 MOVLW 0A ;gornja meja druge stevilke FL (1kft) SUBWF 27,0 BTFSS 3,0 GOTO MEJE4 CLRF 27 INCF 26,1 ;prenos: zvisaj prvo stevilko MEJE4 BTFSS 26,7 ;spodnja meja prve stevilke FL (10kft) GOTO MEJE5 CLRF 26 ;postavi FL 000 CLRF 27 CLRF 28 MEJE5 MOVLW 0A ;gornja meja prve stevilke FL (10kft) SUBWF 26,0 BTFSS 3,0 GOTO MEJE6 MOVLW 9 ;postavi FL 999 MOVWF 26 MOVWF 27 MOVWF 28 MEJE6 BTFSC 25,7 ;spodnja meja stikala 0 CLRF 25 MOVLW 0FC ;gornja meja stikala 3 ADDWF 25,0 BTFSS 3,0 GOTO MEJE7 MOVLW 3 MOVWF 25 MEJE7 RETURN ;*** Precitaj in izvedi ukaz s tipk *** (0F) TIPKE COMF 6,0 ;precitaj RB4-7 ANDLW 0F0 XORLW 90 ;IDENT za LEVO+DESNO? BTFSS 3,2 GOTO TIPKE5 MOVLW 0A0 MOVWF 1F TIPKE5 COMF 6,0 ;precitaj RB4-7 ANDLW 0F0 MOVF 0F,1 ;prejsnje stanje vse tipke odpuscene? MOVWF 0F BTFSS 3,2 RETURN BTFSS 0F,5 ;Ukaz DOL? GOTO TIPKE1 DECF 0,1 RETURN TIPKE1 BTFSS 0F,6 ;Ukaz GOR? GOTO TIPKE2 INCF 0,1 RETURN TIPKE2 BTFSS 0F,4 ;Ukaz DESNO? GOTO TIPKE3 INCF 4,1 RETURN TIPKE3 BTFSS 0F,7 ;Ukaz LEVO? RETURN DECF 4,1 RETURN ;*** Pretvori stevilko v 7-segmentni zapis *** (0C) LCDDEK MOVWF 0C INCF 0C,1 MOVLW 7E ;stevilka 0 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 12 ;stevilka 1 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0BC ;stevilka 2 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0B6 ;stevilka 3 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0D2 ;stevilka 4 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0E6 ;stevilka 5 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0EE ;stevilka 6 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 32 ;stevilka 7 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0FE ;stevilka 8 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0F6 ;stevilka 9 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0A4 ;crtice za napako RETURN ;*** Postavi podatke (10,11,12,13) v LCD pomikalni register *** (0D,0E) LCDDAT MOVF 13,0 ;(13) v pomikalni register MOVWF 0D BTFSS 0E,0 COMF 0D,1 CALL LCDBIT MOVF 12,0 ;(12) v pomikalni register MOVWF 0D BTFSS 0E,0 COMF 0D,1 CALL LCDBIT MOVF 11,0 ;(11) v pomikalni register MOVWF 0D BTFSS 0E,0 COMF 0D,1 CALL LCDBIT MOVF 10,0 ;(10) v pomikalni register MOVWF 0D BTFSS 0E,0 COMF 0D,1 CALL LCDBIT INCF 0E,1 ;obrni fazo za BACKPLANE=RB0 BCF 6,1 BTFSC 0E,0 BSF 6,1 BSF 6,2 ;impulz STROBE=RB1 NOP BCF 6,2 RETURN ;*** Poslji bajt (0D) v LCD pomikalni register *** (0C) LCDBIT MOVLW 8 ;zanka po 8 bitih MOVWF 0C LCDBIT1 BSF 5,4 ;postavi enico DATA=RA4 RLF 0D,1 ;zavrti register BTFSS 3,0 BCF 5,4 ;postavi niclo DATA=RA4 NOP BSF 6,3 ;taktni impulz CLOCK=RB3 NOP BCF 6,3 DECFSZ 0C,1 ;stevec zanke po 8 bitih GOTO LCDBIT1 RETURN ;*** Dvojna zanka cakanja 10ms *** (0D) CAKAJ MOVLW 88 MOVWF 0D CAKAJ1 CALL CAKAJ2 DECF 0D,1 BTFSS 3,2 GOTO CAKAJ1 RETURN CAKAJ2 MOVLW 4B CAKAJ3 ADDLW 0FF BTFSS 3,2 GOTO CAKAJ3 RETURN ;*** Pretvori FL v Gray-evo kodo *** (0C,0D,14,15) GRAY BTFSC 25,0 ;ALT stikalo A ali E/C? GOTO GRAY1 CLRF 14 ;ALT stikalo A - pobrisi vse podatke CLRF 15 RETURN GRAY1 MOVF 26,0 ;izracunaj FL/5 (An,Bn,Dn) v 0C MOVWF 0C BCF 3,0 ;pomnozi prvo stevilko FL z 10 RLF 0C,1 RLF 0C,1 ADDWF 0C,1 RLF 0C,1 MOVF 27,0 ;pristej drugo stevilko FL ADDWF 0C,1 RLF 0C,1 ;pomnozi vsoto z 2 MOVLW 2 ;tretja stevilka+2 v 0D (zamik -200ft) ADDWF 28,0 MOVWF 0D MOVLW 0A ;prenos tretje stevilke >9? SUBWF 0D,0 BTFSS 3,0 GOTO GRAY2 MOVWF 0D ;tretja stevilka -10 INCF 0C,1 ;pristej prenos +2 v 0C INCF 0C,1 GRAY2 MOVLW 5 ;preveri tretja stevilka >=5? SUBWF 0D,0 BTFSS 3,0 GOTO GRAY3 MOVF 0D,0 ;obrni tretjo stevilko v 0D SUBLW 9 MOVWF 0D INCF 0C,1 ;pristej prenos +1 v 0C GRAY3 MOVLW 2 ;popravi vsebino 0D za okrnjeni Gray(5) BTFSC 0D,2 ADDWF 0D,1 INCF 0D,1 MOVLW 3 ;Gray pretvorba 0D bita 1-0 BTFSC 0D,2 XORWF 0D,1 MOVLW 1 ;Gray pretvorba 0D bit 0 BTFSC 0D,1 XORWF 0D,1 MOVLW 7F ;Gray pretvorba 0C biti 6-0 BTFSC 0C,7 XORWF 0C,1 MOVLW 3F ;Gray pretvorba 0C biti 5-0 BTFSC 0C,6 XORWF 0C,1 MOVLW 1F ;Gray pretvorba 0C biti 4-0 BTFSC 0C,5 XORWF 0C,1 MOVLW 0F ;Gray pretvorba 0C biti 3-0 BTFSC 0C,4 XORWF 0C,1 MOVLW 7 ;Gray pretvorba 0C biti 2-0 BTFSC 0C,3 XORWF 0C,1 MOVLW 3 ;Gray pretvorba 0C bita 1-0 BTFSC 0C,2 XORWF 0C,1 MOVLW 1 ;Gray pretvorba 0C bit 0 BTFSC 0C,1 XORWF 0C,1 MOVF 0C,0 ;postavi impulze v 14,15 MOVWF 14 MOVF 0D,0 MOVWF 15 RETURN ;*** Nastavi konfiguracijo PICa 16F84 *** ORG 2007 ;naslov konfiguracijske besede DW 1A ;CP=OFF, PWRTE=OFF, WDT=OFF, OSC=HS ;*** Nastavi zacetne vrednosti EEPROMa *** ORG 2100 DW 7 ;koda 7777 DW 7 DW 7 DW 7 DW 2 ;ALT A DW 0 ;FL 010 DW 2 DW 0 END ;*** Konec programa ***