;*********************************** ; Chiave con 8870 senza interrupt ; riceve max 8 codici compreso A-B-C-D-E-F ; se corretti accende/spegne relè RA0 ; legge codice da eeprom ; scrive nuovo codice su eeprom ; se portb,1 = 0 memorizza codice in arrivo ; ; IT9DPX - FRANCO 17 mar 2013 ;*********************************** PROCESSOR 16F84 RADIX DEC INCLUDE "P16F84.INC" ERRORLEVEL -302 ERRORLEVEL -305 ORG 2100H ;scrive su eeprom dati DE 1,2,3,4,5,6,7,8,5 DE .66,.89,.32,.73,.84 DE .57,.68,.80,.88 __CONFIG 3FF1H #define RS PORTA,3 #define EN PORTA,2 ORG 20H SALV_W RES 1 SALV_ST RES 1 RITARDO RES 2 DATI_RX RES 8 NUM_CODICI RES 1 CONT_UGUALI RES 1 PAUSA RES 2 REGTEMP RES 1 DATO_RX RES 1 DATI_LCD RES 1 FLAG RES 1 DATI_MEM RES 8 ORG 00H GOTO VIA TABELLA CLRF PCLATH ANDLW .15 ADDWF PCL,F RETLW "D" RETLW "1" RETLW "2" RETLW "3" RETLW "4" RETLW "5" RETLW "6" RETLW "7" RETLW "8" RETLW "9" RETLW "0" RETLW "E" RETLW "F" RETLW "A" RETLW "B" RETLW "C" ;--------------- VIA BSF STATUS,RP0 MOVLW 01000000B ; rn0 salita MOVWF OPTION_REG MOVLW 11010000B MOVWF TRISB MOVLW 00000000B MOVWF TRISA BCF STATUS,RP0 CLRF PORTA CLRF PORTB CALL LEGGI CALL INIZIAL CALL CANC_MEM CLRF INTCON CLRF FLAG ;------------------ CLRF PAUSA CLRF PAUSA+1 ;------------------ ATTESA CALL ASPETTA BTFSS PORTB,0 GOTO ATTESA CALL LEGGI_DTMF ATTESA_2 BTFSC PORTB,0 GOTO ATTESA_2 BSF FLAG,1 ;inizia conteggio GOTO ATTESA ;------------------- ASPETTA ; 1 sec. circa BTFSS FLAG,1 RETURN DECFSZ PAUSA+1 RETURN DECFSZ PAUSA RETURN CLRF PAUSA CLRF PAUSA+1 BCF FLAG,1 ;termina conteggio ;------------------------ CALL STAMPA CALL SONO_UGUALI ;? BTFSS PORTB,6 ; OPPURE 7 CALL MEMORIZZA ;nuovo codice CALL CANC_MEM RETURN ; ATTESA ;.................. ATTENDI ; 1,5 ms. circa MOVLW .2 MOVWF RITARDO CLRF RITARDO+1 ATTENDI_2 DECFSZ RITARDO+1 GOTO ATTENDI_2 DECFSZ RITARDO GOTO ATTENDI_2 RETURN ;------------------------ LEGGI_DTMF CLRF DATO_RX BTFSC PORTB,1 BSF DATO_RX,3 BTFSC PORTB,2 BSF DATO_RX,2 BTFSC PORTB,3 BSF DATO_RX,1 BTFSC PORTB,4 BSF DATO_RX,0 MOVFW DATO_RX MOVWF INDF ; salvataggio INCF FSR ; indicizzato MOVFW FSR ; termine XORLW 2CH ; memoria BTFSS STATUS,Z RETURN FINE_MEMORIA MOVLW DATI_RX ; salvataggio MOVWF FSR ; indicizzato RETURN SONO_UGUALI ; controllo se uguali MOVLW .88 XORWF 45H,W CALL SIMILE CLRF CONT_UGUALI MOVFW DATI_MEM+0 XORWF DATI_RX+0,W CALL SI_NO MOVLW .80 XORWF 44H,W CALL SIMILE MOVFW DATI_MEM+1 XORWF DATI_RX+1,W CALL SI_NO MOVLW .68 XORWF 43H,W CALL SIMILE MOVFW DATI_MEM+2 XORWF DATI_RX+2,W CALL SI_NO MOVLW .57 XORWF 42H,W CALL SIMILE MOVFW DATI_MEM+3 XORWF DATI_RX+3,W CALL SI_NO MOVLW .84 XORWF 41H,W CALL SIMILE MOVFW DATI_MEM+4 XORWF DATI_RX+4,W CALL SI_NO MOVLW .73 XORWF 40H,W CALL SIMILE MOVFW DATI_MEM+5 XORWF DATI_RX+5,W CALL SI_NO MOVFW DATI_MEM+6 XORWF DATI_RX+6,W CALL SI_NO MOVFW DATI_MEM+7 XORWF DATI_RX+7,W CALL SI_NO RETURN SI_NO BTFSC STATUS,Z GOTO UGUALI CLRF CONT_UGUALI ;diversi RETURN UGUALI INCF CONT_UGUALI MOVFW CONT_UGUALI XORWF NUM_CODICI,W BTFSC STATUS,Z GOTO CODICE_OK RETURN CODICE_OK MOVLW 1 XORWF PORTA,F RETURN ;--------------------- ;......legge eeprom... LEGGI CLRF EEADR MOVLW DATI_MEM MOVWF FSR RIP_LETT CALL LEGMEM MOVWF INDF INCF FSR MOVFW EEADR XORLW .18 BTFSS STATUS,Z GOTO RIP_LETT MOVFW 0X3C MOVWF NUM_CODICI RETURN LEGMEM BSF STATUS,RP0 BSF EECON1,RD NOP BCF STATUS,RP0 MOVF EEDATA,W INCF EEADR RETURN ;---------------------- ;.....scrive eeprom 0-9........ MEMORIZZA bcf STATUS,RP0 clrf EEADR movfw DATI_RX+0 call SAVMEM movfw DATI_RX+1 call SAVMEM movfw DATI_RX+2 call SAVMEM movfw DATI_RX+3 call SAVMEM movfw DATI_RX+4 call SAVMEM movfw DATI_RX+5 call SAVMEM movfw DATI_RX+6 call SAVMEM movfw DATI_RX+7 call SAVMEM MOVLW DATI_RX SUBWF DATI_LCD,W ;n° codici ricevuti call SAVMEM CALL LEGGI return SAVMEM movwf EEDATA BSF STATUS,RP0 BSF EECON1,2 movlw 55H movwf EECON2 movlw 0AAH movwf EECON2 BSF EECON1,1 LPW2 ; Attendi fine btfsc EECON1,1 ; scrittura goto LPW2 BCF EECON1,4 ; Clear fine BCF EECON1,2 ; scrittura BCF STATUS,RP0 ; Pagina 0 incf EEADR return ;------------------------- ;.....inizializza lcd ... ;...portb 0-1-2-3 INIZIAL BCF RS movlw .30 ;Wait 30 ms call msDelay MOVLW H'F0' ANDWF PORTB,F ;spengo 4 bits bassi MOVLW 03H ;Set LCD command mode IORWF PORTB,F ;invio dato bsf EN ;Enables LCD movlw .5 ;Wait 5 ms call msDelay bcf EN ;Disables LCD movlw .1 ;Wait 1ms call msDelay CALL CARICA CALL CARICA MOVLW H'F0' ANDWF PORTB,F ;spengo 4 bits bassi MOVLW 02H ;Set LCD command mode IORWF PORTB,F ;invio dato CALL CARICA movlw 28H ;Set 4 bit TX, 2 RIGHE call TXCMD movlw 06H ;Entry mode set, increment, no shift call TXCMD movlw 0FH ;Display ON, Curson ON, Blink ON call TXCMD movlw 01H ;Clear display call TXCMD movlw .2 ;Wait 2 ms call msDelay ;............................ MOVLW H'C8' ;DD RAM 18° CIFRA CALL TXCMD MOVLW .73 call TXDATO MOVLW .84 call TXDATO MOVLW .57 call TXDATO MOVLW .68 call TXDATO MOVLW .80 call TXDATO MOVLW .88 call TXDATO CALL STAI GOTO DECOD_ON ;.............................. TXNUM ADDLW 30H TXDATO bsf RS goto TXBYTE TXCMD bcf RS TXBYTE movwf REGTEMP ;Salva dati MOVLW H'F0' ANDWF PORTB,F ;spengo 4 bits bassi SWAPF REGTEMP,W ;inverto nibble ANDLW H'0F' ;spengo 4 bits alti IORWF PORTB,F ;invio dato CALL CARICA MOVLW H'F0' ANDWF PORTB,F ;spengo 4 bits bassi MOVFW REGTEMP ;carico dato ANDLW H'0F' ;spengo 4 bits alti IORWF PORTB,F CARICA bsf EN ;Enables LCD movlw .1 ;Wait 1ms call msDelay bcf EN ;Disables LCD movlw .1 ;Wait 1ms call msDelay return ;------------------------ msDelay movwf RITARDO+1 clrf RITARDO+0 RITLOOP nop decfsz RITARDO+0,F goto RITLOOP nop decfsz RITARDO+1,F goto RITLOOP return ;----------------------------- STAI movlw .250 ;Wait 250 ms call msDelay movlw .250 ;Wait 250 ms call msDelay RETURN ;----------------------------- STAMPA BCF PORTB,5 ;8870 OFF BSF STATUS,RP0 MOVLW 11010000B MOVWF TRISB ;prepara per stampa BCF STATUS,RP0 ;.... cancella 1° riga ..... MOVLW H'80' ;1°riga 1°cifra CALL TXCMD MOVLW " " call TXDATO MOVLW " " call TXDATO MOVLW " " call TXDATO MOVLW " " call TXDATO MOVLW " " call TXDATO MOVLW " " call TXDATO MOVLW " " call TXDATO MOVLW " " call TXDATO ;------------------- MOVLW H'80' ;1°riga 1°cifra CALL TXCMD MOVFW FSR XORLW DATI_RX BTFSC STATUS,Z CALL AGGIORNA ;fsr = dati_rx MOVFW FSR MOVWF DATI_LCD MOVLW DATI_RX ; salvataggio MOVWF FSR ; indicizzato ANCORA_DATI MOVFW INDF CALL TABELLA CALL TXDATO INCF FSR MOVFW DATI_LCD ; fine memoria XORWF FSR,W ; fine memoria ? BTFSS STATUS,Z GOTO ANCORA_DATI DECOD_ON BSF STATUS,RP0 MOVLW 11011111B MOVWF TRISB ;prepara per decodifica BCF STATUS,RP0 BSF PORTB,5 ;8870 ON MOVLW DATI_RX ; salvataggio MOVWF FSR ; indicizzato RETURN ;------------------------- AGGIORNA MOVLW 2CH ; salvataggio MOVWF FSR ; indicizzato RETURN ;------------------------- CANC_MEM MOVLW DATI_RX ; salvataggio MOVWF FSR ; indicizzato RIPETI CLRF INDF ; salvataggio INCF FSR ; indicizzato MOVFW FSR ; termine XORLW 2CH ; memoria BTFSS STATUS,Z GOTO RIPETI MOVLW DATI_RX ; salvataggio MOVWF FSR ; indicizzato RETURN ;--------------- SIMILE BTFSS STATUS,Z GOTO ATTESA RETURN ;------------------- END