;*** Krmilnik LCD s PIC 16F876/16F876A - S53MV - 07.01.2008 *** ;*** Uporaba portov - takt 20MHz *** ;digitalni izhod RA0 - LCD E ;digitalni izhod RA1 - LCD D/I ;digitalni izhod RA2 - LCD R/W ;digitalni izhod RA3 - LCD /RESET ;digitalni izhod RA4 - LCD /CS2 ;digitalni izhod RA5 - LCD /CS1 ;digitalni izhodi RB0-7 - LCD D0-7 ;digitalni vhod RC5 - LCD D7 busy ;digitalni vhod RC7 - vhod RS-232 ;*** Uporaba RAMa *** ;20-27 VRSTA vrednosti 8 vrstic ;28 ZANKA, VRSTA skupina 8 vrstic ;29 ZANKA, VRSTA, STEVIL racunanje ;2A ZANKA, VRSTA, PIKICE, SKALA racunanje ;2B ZANKA, SKALA racunanje ;2C-6F PREKIN vmesni pomnilnik ;70,71 PREKIN resi W in STATUS ;72 PREKIN resi FSR ;73 PREKIN kazalec v pomnilnik ;74 PREKIN kuzapazi ;A8-BF STEVIL vmesni pomnilnik ;*** Zacetek programa *** LIST P=16F876 ORG 0 ZACETEK CALL INIPIC ;inicializacija PIC 16F876/16F876A CLRF 74 ;resetiraj kuzapazija GOTO ZANKA ;*** Prekinitve: RS-232 sprejem *** (70,71) ORG 4 PREKIN MOVWF 70 ;resi W SWAPF 3,0 ;resi STATUS MOVWF 71 MOVF 4,0 ;resi FSR MOVWF 72 CLRF 3 ;pobrisi stran pomnilnika IRP, RP1, RP0 MOVF 18,0 ;precitaj RCSTA ANDLW 6 ;preveri FERR in OERR BTFSS 3,2 BCF 18,4 ;RCSTA: CREN=0 MOVLW 44 ;obdelaj kazalec za obmocje 2C-6F SUBWF 73,0 BTFSC 3,0 CLRF 73 MOVF 73,0 ADDLW 2C MOVWF 4 COMF 1A,0 ;precitaj RCREG BTFSC 3,2 ;preveri oznako zacetka 0FF? GOTO PREKIN1 XORLW 0FF ;podatek v pomnilnik MOVWF 0 INCF 73,1 ;povecaj kazalec GOTO PREKIN2 PREKIN1 CLRF 74 ;resetiraj kuzapazi CLRF 73 ;resetiraj kazalec PREKIN2 BSF 18,4 ;RCSTA: CREN=1 MOVF 72,0 ;obnovi FSR MOVWF 4 SWAPF 71,0 ;obnovi STATUS MOVWF 3 SWAPF 70,1 ;obnovi W SWAPF 70,0 RETFIE ;*** Inicializacija PIC 16F876/16F876A *** INIPIC CLRF 5 ;zacetno stanje vrat CLRF 6 CLRF 7 BSF 3,5 ;postavi PAGE1 MOVLW 6 ;vsi RA0-5 digitalni MOVWF 1F MOVLW 0 ;izhodi RA0-5 MOVWF 5 MOVLW 0 ;izhodi RB0-7 MOVWF 6 MOVLW 0A0 ;vhoda RC5,7 izhodi RC0-4,6 MOVWF 7 BSF 18,2 ;TXSTA: BRGH=1 MOVLW 81 ;SPBRG=129=0x81 9600bps@20MHzCLK MOVWF 19 BSF 0C,5 ;PIE1: RCIE=1 BCF 3,5 ;postavi PAGE0 BSF 18,7 ;RCSTA: SPEN=1 BSF 18,4 ;RCSTA: CREN=1 BSF 0B,6 ;INTCON: PEIE=1 BSF 0B,7 ;INTCON: GIE=1 RETURN ;*** Vkljuci in inicializiraj LCD oba kontrolerja *** INILCD BSF 5,3 ;odpusti /RESET BSF 5,5 ;1=/CS1 BCF 5,4 ;0=/CS2 MOVLW 3F ;display ON CALL UKAZ MOVLW 0C0 ;display start line 0 CALL UKAZ BCF 5,5 ;0=/CS1 BSF 5,4 ;1=/CS2 MOVLW 3F ;display ON CALL UKAZ MOVLW 0C0 ;display start line 0 CALL UKAZ RETURN ;*** Preveri BUSY in poslji podatek iz W *** BAJT BCF 5,0 ;0=enable BSF 5,2 ;1=read BCF 5,1 ;0=instruction BSF 5,0 ;1=enable CLRF 6 ;nicle na D0-7 NOP BTFSC 7,5 ;preveri D7=BUSY GOTO BAJT BCF 5,0 ;0=enable MOVWF 6 ;W na D0-7 BCF 5,2 ;0=write BSF 5,1 ;1=data BSF 5,0 ;1=enable NOP NOP BCF 5,0 ;0=enable RETURN ;*** Preveri BUSY in poslji ukaz iz W *** UKAZ BCF 5,0 ;0=enable BSF 5,2 ;1=read BCF 5,1 ;0=instruction BSF 5,0 ;1=enable CLRF 6 ;nicle na D0-7 NOP BTFSC 7,5 ;preveri D7=BUSY GOTO UKAZ BCF 5,0 ;0=enable MOVWF 6 ;W na D0-7 BCF 5,2 ;0=write BSF 5,0 ;1=enable NOP NOP BCF 5,0 ;0=enable RETURN ;*** Kuzapazi za vhodne podatke *** (29,74,A0-DF) KUZA INCF 74,1 ;povecaj in preveri kuzapazi BTFSS 3,2 RETURN MOVLW 44 ;pobrisi pomnilnik 68 bajtov MOVWF 29 MOVLW 2C MOVWF 4 KUZA1 MOVLW 80 ;praznina in obraten zaslon 0x80=128 MOVWF 0 INCF 4,1 DECFSZ 29,1 GOTO KUZA1 RETURN ;*** Glavna zanka *** (28,29,2A,2B) ZANKA CALL INILCD ;vkljuci LCD oba kontrolerja CALL KUZA ;kuzapazi za vhodne podatke CALL STEVIL ;stevilski zapis visine v vmesnik MOVLW 7 ;zanka po 8 skupinah MOVWF 28 ZANKA1 CALL ZANKA2 DECF 28,1 BTFSS 28,7 GOTO ZANKA1 GOTO ZANKA ZANKA2 COMF 28,0 ;izracunaj kazalec v pomnilniku MOVWF 29 RLF 29,1 RLF 29,1 RLF 29,0 ANDLW 38 ADDLW 30 MOVWF 4 MOVF 0,0 ;prepisi 8 bajtov iz pomnilnika MOVWF 27 INCF 4,1 MOVF 0,0 MOVWF 26 INCF 4,1 MOVF 0,0 MOVWF 25 INCF 4,1 MOVF 0,0 MOVWF 24 INCF 4,1 MOVF 0,0 MOVWF 23 INCF 4,1 MOVF 0,0 MOVWF 22 INCF 4,1 MOVF 0,0 MOVWF 21 INCF 4,1 MOVF 0,0 MOVWF 20 CALL VRSTA ;izpisi skupino RETURN ;*** Vpisi skupino 8 vrstic *** (20-27,28,29,2A) VRSTA BCF 5,5 ;0=/CS1 prva polovica zaslona BSF 5,4 ;1=/CS2 CALL VRSTA1 BSF 5,5 ;1=/CS1 druga polovica zaslona BCF 5,4 ;0=/CS2 CALL VRSTA1 RETURN VRSTA1 MOVF 28,0 ;izberi skupino 8 vrstic ANDLW 7 IORLW 0B8 CALL UKAZ MOVLW 40 ;izberi prvi stolpec CALL UKAZ MOVLW 40 ;zanka 64 stoplcev MOVWF 29 VRSTA2 CLRF 2A DECF 20,1 ;izracun 8 vrstic BTFSS 20,7 BSF 2A,0 DECF 21,1 BTFSS 21,7 BSF 2A,1 DECF 22,1 BTFSS 22,7 BSF 2A,2 DECF 23,1 BTFSS 23,7 BSF 2A,3 DECF 24,1 BTFSS 24,7 BSF 2A,4 DECF 25,1 BTFSS 25,7 BSF 2A,5 DECF 26,1 BTFSS 26,7 BSF 2A,6 DECF 27,1 BTFSS 27,7 BSF 2A,7 CALL PIKICE ;pikice za skalo na zaslonu MOVF 2A,0 CALL BAJT ;LCD podatek = 8-bitni odsek DECFSZ 29,1 GOTO VRSTA2 RETURN ;*** Pikice za skalo na zaslonu *** (2A) PIKICE BTFSC 5,4 ;druga polovica zaslona? GOTO PIKICEP COMF 28,0 ;spodnja skupina vrstic? ANDLW 7 BTFSC 3,2 GOTO PIKICES MOVLW 10 ;zadnjih 16 stolpcev? SUBWF 29,0 BTFSC 3,0 GOTO PIKICEP GOTO SKALA PIKICES MOVLW 18 ;zadnjih 24 stolpcev? SUBWF 29,0 BTFSC 3,0 GOTO PIKICEP MOVLW 0C0 ;zapis za podlago MOVWF 4 MOVF 29,0 SUBWF 4,1 MOVF 0,0 XORWF 2A,1 RETURN PIKICEP DECF 29,0 ;vsak 16. stolpec pikic? ANDLW 0F BTFSS 3,2 RETURN COMF 28,0 ;stevilka skupine vrstic ANDLW 7 CALL PIKICE0 XORWF 2A,1 RETURN PIKICE0 ADDLW 0 BTFSS 3,2 GOTO PIKICE1 MOVLW 1 ;10ft(+12ft) RETURN PIKICE1 ADDLW 0FF BTFSS 3,2 GOTO PIKICE2 MOVLW 2 ;30ft(+12ft) RETURN PIKICE2 ADDLW 0FF BTFSS 3,2 GOTO PIKICE3 MOVLW 1 ;100ft(+12ft) RETURN PIKICE3 ADDLW 0FF BTFSS 3,2 GOTO PIKICE4 MOVLW 0 ;prazno RETURN PIKICE4 ADDLW 0FF BTFSS 3,2 GOTO PIKICE5 MOVLW 20 ;300ft RETURN PIKICE5 ADDLW 0FF BTFSS 3,2 GOTO PIKICE6 MOVLW 2 ;1000ft RETURN PIKICE6 ADDLW 0FF BTFSS 3,2 GOTO PIKICE7 MOVLW 0 ;prazno RETURN PIKICE7 MOVLW 20 ;3000ft RETURN ;*** Stevilska skala v zadnjih 16 stolpcih *** (2A,2B) SKALA COMF 28,0 ;stevilka skupine vrstic ANDLW 7 MOVWF 2B MOVF 29,0 ;stevilka stolpca DECF 2B,1 ;vrstica1 BTFSS 3,2 GOTO SKALA1 MOVWF 2B MOVLW 0 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 0F DECF 2B,1 BTFSC 3,2 MOVLW 8 DECF 2B,1 BTFSC 3,2 MOVLW 0F DECF 2B,1 DECF 2B,1 ;3 BTFSC 3,2 MOVLW 0F DECF 2B,1 BTFSC 3,2 MOVLW 0A DECF 2B,1 BTFSC 3,2 MOVLW 0A XORWF 2A,1 RETURN SKALA1 DECF 2B,1 ;vrstica2 BTFSS 3,2 GOTO SKALA2 MOVWF 2B MOVLW 0 DECF 2B,1 ;0+0 BTFSC 3,2 MOVLW 87 DECF 2B,1 BTFSC 3,2 MOVLW 84 DECF 2B,1 BTFSC 3,2 MOVLW 87 DECF 2B,1 DECF 2B,1 ;0+3 BTFSC 3,2 MOVLW 87 DECF 2B,1 BTFSC 3,2 MOVLW 84 DECF 2B,1 BTFSC 3,2 MOVLW 87 DECF 2B,1 DECF 2B,1 ;1 BTFSC 3,2 MOVLW 7 XORWF 2A,1 RETURN SKALA2 DECF 2B,1 ;vrstica3 BTFSS 3,2 GOTO SKALA3 MOVWF 2B MOVLW 0 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 0C0 DECF 2B,1 BTFSC 3,2 MOVLW 40 DECF 2B,1 BTFSC 3,2 MOVLW 0C0 DECF 2B,1 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 0C0 DECF 2B,1 BTFSC 3,2 MOVLW 40 DECF 2B,1 BTFSC 3,2 MOVLW 0C0 DECF 2B,1 DECF 2B,1 ;1 BTFSC 3,2 MOVLW 0C0 XORWF 2A,1 RETURN SKALA3 DECF 2B,1 ;vrstica4 BTFSS 3,2 GOTO SKALA4 MOVWF 2B MOVLW 0 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 0F8 DECF 2B,1 BTFSC 3,2 MOVLW 88 DECF 2B,1 BTFSC 3,2 MOVLW 0F8 DECF 2B,1 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 0F8 DECF 2B,1 BTFSC 3,2 MOVLW 88 DECF 2B,1 BTFSC 3,2 MOVLW 0F8 DECF 2B,1 DECF 2B,1 ;3 BTFSC 3,2 MOVLW 0F8 DECF 2B,1 BTFSC 3,2 MOVLW 0A8 DECF 2B,1 BTFSC 3,2 MOVLW 0A8 XORWF 2A,1 RETURN SKALA4 DECF 2B,1 ;vrstica5 BTFSS 3,2 GOTO SKALA5 MOVWF 2B MOVLW 0 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 0F DECF 2B,1 BTFSC 3,2 MOVLW 8 DECF 2B,1 BTFSC 3,2 MOVLW 0F DECF 2B,1 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 0F DECF 2B,1 BTFSC 3,2 MOVLW 8 DECF 2B,1 BTFSC 3,2 MOVLW 0F DECF 2B,1 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 0F DECF 2B,1 BTFSC 3,2 MOVLW 8 DECF 2B,1 BTFSC 3,2 MOVLW 0F DECF 2B,1 DECF 2B,1 ;1 BTFSC 3,2 MOVLW 0F XORWF 2A,1 RETURN SKALA5 DECF 2B,1 ;vrstica6 BTFSS 3,2 GOTO SKALA6 MOVWF 2B MOVLW 0 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 80 DECF 2B,1 BTFSC 3,2 MOVLW 80 DECF 2B,1 BTFSC 3,2 MOVLW 80 DECF 2B,1 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 80 DECF 2B,1 BTFSC 3,2 MOVLW 80 DECF 2B,1 BTFSC 3,2 MOVLW 80 DECF 2B,1 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 80 DECF 2B,1 BTFSC 3,2 MOVLW 80 DECF 2B,1 BTFSC 3,2 MOVLW 80 DECF 2B,1 DECF 2B,1 ;1 BTFSC 3,2 MOVLW 80 XORWF 2A,1 RETURN SKALA6 MOVWF 2B ;vrstica7 MOVLW 0 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 0F8 DECF 2B,1 BTFSC 3,2 MOVLW 88 DECF 2B,1 BTFSC 3,2 MOVLW 0F8 DECF 2B,1 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 0F8 DECF 2B,1 BTFSC 3,2 MOVLW 88 DECF 2B,1 BTFSC 3,2 MOVLW 0F8 DECF 2B,1 DECF 2B,1 ;0 BTFSC 3,2 MOVLW 0F8 DECF 2B,1 BTFSC 3,2 MOVLW 88 DECF 2B,1 BTFSC 3,2 MOVLW 0F8 DECF 2B,1 DECF 2B,1 ;3 BTFSC 3,2 MOVLW 0F8 DECF 2B,1 BTFSC 3,2 MOVLW 0A8 DECF 2B,1 BTFSC 3,2 MOVLW 0A8 XORWF 2A,1 RETURN ;*** Stevilski zapis visine v vmesnik *** (29,2C-2F,A8-BF) STEVIL MOVLW 0A8 ;zapis v vmesnik (A8-BF) MOVWF 4 MOVF 2C,0 CALL STEVILK MOVF 2D,0 CALL STEVILK MOVF 2E,0 CALL STEVILK MOVF 2F,0 CALL STEVILK RETURN STEVILK MOVWF 29 MOVLW 0 ;praznina do prejsnje stevilke CALL STEVILB MOVLW 2D SUBWF 29,1 BTFSS 3,2 GOTO STEVILP MOVLW 10 ;"-" 10 10 10 10 10 CALL STEVILB MOVLW 10 CALL STEVILB MOVLW 10 CALL STEVILB MOVLW 10 CALL STEVILB MOVLW 10 CALL STEVILB RETURN STEVILP DECF 29,1 BTFSS 3,2 GOTO STEVIL0 MOVLW 0 ;"." 00 C0 C0 C0 00 CALL STEVILB MOVLW 0C0 CALL STEVILB MOVLW 0C0 CALL STEVILB MOVLW 0C0 CALL STEVILB MOVLW 0 CALL STEVILB RETURN STEVIL0 MOVLW 2 SUBWF 29,1 BTFSS 3,2 GOTO STEVIL1 MOVLW 0FE ;"0" FE 82 82 82 FE CALL STEVILB MOVLW 82 CALL STEVILB MOVLW 82 CALL STEVILB MOVLW 82 CALL STEVILB MOVLW 0FE CALL STEVILB RETURN STEVIL1 DECF 29,1 BTFSS 3,2 GOTO STEVIL2 MOVLW 0 ;"1" 00 00 00 00 FE CALL STEVILB MOVLW 0 CALL STEVILB MOVLW 0 CALL STEVILB MOVLW 0 CALL STEVILB MOVLW 0FE CALL STEVILB RETURN STEVIL2 DECF 29,1 BTFSS 3,2 GOTO STEVIL3 MOVLW 0F2 ;"2" F2 92 92 92 9E CALL STEVILB MOVLW 92 CALL STEVILB MOVLW 92 CALL STEVILB MOVLW 92 CALL STEVILB MOVLW 9E CALL STEVILB RETURN STEVIL3 DECF 29,1 BTFSS 3,2 GOTO STEVIL4 MOVLW 92 ;"3" 92 92 92 92 FE CALL STEVILB MOVLW 92 CALL STEVILB MOVLW 92 CALL STEVILB MOVLW 92 CALL STEVILB MOVLW 0FE CALL STEVILB RETURN STEVIL4 DECF 29,1 BTFSS 3,2 GOTO STEVIL5 MOVLW 1E ;"4" 1E 10 10 10 FE CALL STEVILB MOVLW 10 CALL STEVILB MOVLW 10 CALL STEVILB MOVLW 10 CALL STEVILB MOVLW 0FE CALL STEVILB RETURN STEVIL5 DECF 29,1 BTFSS 3,2 GOTO STEVIL6 MOVLW 9E ;"5" 9E 92 92 92 F2 CALL STEVILB MOVLW 92 CALL STEVILB MOVLW 92 CALL STEVILB MOVLW 92 CALL STEVILB MOVLW 0F2 CALL STEVILB RETURN STEVIL6 DECF 29,1 BTFSS 3,2 GOTO STEVIL7 MOVLW 0FE ;"6" FE 90 90 90 F0 CALL STEVILB MOVLW 90 CALL STEVILB MOVLW 90 CALL STEVILB MOVLW 90 CALL STEVILB MOVLW 0F0 CALL STEVILB RETURN STEVIL7 DECF 29,1 BTFSS 3,2 GOTO STEVIL8 MOVLW 02 ;"7" 02 02 02 02 FE CALL STEVILB MOVLW 02 CALL STEVILB MOVLW 02 CALL STEVILB MOVLW 02 CALL STEVILB MOVLW 0FE CALL STEVILB RETURN STEVIL8 DECF 29,1 BTFSS 3,2 GOTO STEVIL9 MOVLW 0FE ;"8" FE 92 92 92 FE CALL STEVILB MOVLW 92 CALL STEVILB MOVLW 92 CALL STEVILB MOVLW 92 CALL STEVILB MOVLW 0FE CALL STEVILB RETURN STEVIL9 DECF 29,1 BTFSS 3,2 GOTO STEVILZ MOVLW 1E ;"9" 1E 12 12 12 FE CALL STEVILB MOVLW 12 CALL STEVILB MOVLW 12 CALL STEVILB MOVLW 12 CALL STEVILB MOVLW 0FE CALL STEVILB RETURN STEVILZ MOVLW 0 ;"praznina" 00 00 00 00 00 CALL STEVILB MOVLW 0 CALL STEVILB MOVLW 0 CALL STEVILB MOVLW 0 CALL STEVILB MOVLW 0 CALL STEVILB RETURN STEVILB MOVWF 0 ;bajt v vmesni pomnilnik INCF 4,1 ;povecaj kazalec (4) RETURN ;*** Nastavi konfiguracijo PICa 16F876/16F876A *** ORG 2007 ;naslov konfiguracijske besede DW 3972 ;3: 11=/CP=off ;9: 1=/DEBUG=off, 00=WRT10=off, 1=/CPD=off ;7: 0=LVP, 1=BODEN=on, 11=/CP=off ;2: 0=/PWRTE=on, 0=WDTE=off, 10=HSoscillator END ;*** Konec programa ***