;********************************************************************************************************************** ; ; ; PROJETO HCS_PROG_TINY ; INICIO : 08/05/12 TERM.17/05/2012 ; AUTOR: CLÁUDIO LÁRIOS ; PROCESSADOR: PIC 12F629 ; OBJETIVO: PROGRAMAR HCS COM PIC 12F629 ,USAR LCD E MAIS BOTÕES PARA ALTERAR DADOS. ; USE RESISTOR DE 3K3 NO PINO 2 AO +VCC ; NOVA FORMA DE CONECTAR LCD USANDO APENAS 5 PINOS (4 DB4 ...7) E 'E' JUNTO COM 'RS' VIA RC ; (O TEMPO DE 'E'= 1 MAIOR IRA CARREGAR O CAPACITOR ,ELEVANDO RS A 1) ;___________________________________________________________________________________________________ ; #INCLUDE ; ARQUIVO PADRAO __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT ERRORLEVEL -302 ;suppress bank selection messages ; PAGINACAO DE MEMORIA; #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ; VARIAVEIS CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA TEMP,TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6,TMP_CNT, CONT,CONT1,LC,LC1,FLAGS,DYTA,WRD_HI,WRD_LO tmpLcdRegister,tmpLcdRegister1,DRAM,AUX,ADDRESS,CNT,P_LCD,P_WORD,W5X,W5HX,P_COL,P_T,TXNUM W0,W0H,W1,W1H,W2,W2H,W3,W3H ;KEY W4,W4H ;SYNC W5,W5H ;RES (USADO P/ MODELO W5 E DISC=SER EM W5H) W6,W6H,W7,W7H ;SER W8,W8H,W9,W9H ;SEED W10,W10H ;DISC W11,W11H ;CONFIG ENDC ;======================DEFINICAO DE BITS E FLAGS============================================== #DEFINE CH0 GPIO,5 ; BOTÃO 'MENU' PINO 2 #DEFINE CH1 GPIO,1 ; BOTÃO 'INC' PINO 6 #DEFINE CH2 GPIO,2 ; BOTÃO 'DEC' PINO 5 #DEFINE CH3 GPIO,0 ; BOTÃO 'GR' PINO 7 #DEFINE VCC GPIO,4 ;OUT SAIDA VCC PINO 3 #DEFINE PWM GPIO,5 ; IN/OUT DADOS PINO 2 #DEFINE S2 GPIO,2 ; OUT CLOCK PINO 5 #DEFINE DAD0 GPIO,5 ; IN/OUT DADOS PINO 2 #DEFINE CLK GPIO,2 ; OUT CLOCK PINO 5 ;LCD Control lines #DEFINE FLCD_RS FLAGS,0 ; FLAG RS comando/dado ;#DEFINE FLCD_RW FLAGS,1 ; FLAG RW leitura/escrita #DEFINE LCD_E GPIO,4 ;Enable + RESISTOR COM CAPACITOR AO 'RS' #DEFINE SF FLAGS,2 ; FLAG SUCESSO/FALHA ;LCD data line bus #DEFINE LCD_DB4 GPIO,0 ;LCD data line DB4 #DEFINE LCD_DB5 GPIO,1 ;LCD data line DB5 #DEFINE LCD_DB6 GPIO,2 ;LCD data line DB5 #DEFINE LCD_DB7 GPIO,5 ;LCD data line DB5 #DEFINE NUM_WRD .12 ; NUMBER OF WORD TO PROGRAM INTO HCS ;*********************************************************************************************** ; CONSTANTES VDEL1 EQU .250; 250 VALOR INICIAIS PARA DELAY VDEL2 EQU .250 ; 250 IDEM VDEL3 EQU .1; 1 IDEM IN EQU B'100111' ; NÃO USAR 4° BIT EXCLUSIVO PARA SAIDA OUT EQU 0X00 OUT_PROG EQU B'001011' ;SAIDAS PARA PROGRAMAÇÃO IN5 EQU B'101011' ;LEITURA EM GPIO,5 ;LCD COMANDOS: CURSOR_FIXO EQU 0X0E ;CURSOR DE BARRA CURSOR_OFF EQU 0X0C ;DESLIGA CURSOR CURSOR_ALT EQU 0X0F ;ESCOLHE CURSOR ALTERADO (QUADRADO PISCANTE + BARRA FIXA) CURSOR_L EQU 0X10 ;DESLOCA CURSOR PARA ESQUERDA CURSOR_R EQU 0X14 ;DESLOCA CURSOR PARA DIREITA CURSOR_H EQU 0X02 ;CURSOR RETORNA A 1ºPOSIÇÃO CURSOR_P EQU 0X0D ;CURSOR PISCANTE (QUADRADO) CURSOR_L_NEWC EQU 0X04 ;SENTIDO DE DESLOCAMENTO DO CURSO COM ENTRADA DE NOVO CARACTER =ESQUERDA CURSOR_R_NEWC EQU 0X06 ;SENTIDO DE DESLOCAMENTO DO CURSO COM ENTRADA DE NOVO CARACTER =DIREITA CURSOR_MENSH EQU 0X02 ;CURSOR + MENSAGEM RETORNAM PARA PRIMEIRA POSIÇÃO CLEAR EQU 0X01 ;LIMPA DISPLAY LINHA1 EQU 0X80 ;ESCREVE NA LINHA SUPERIOR LINHA2 EQU 0XC0 ;ESCREVE NA LINHA INFERIOR MENS_L EQU 0X18 ;DESLOCA MENSAGEM PARA ESQUERDA SEM ENTRADA DE NOVO CARACTER MENS_R EQU 0X1C ;DESLOCA MENSAGEM PARA DIREITA SEM ENTRADA DE NOVO CARACTER MENS_L_NEW EQU 0X07 ;DESLOCA MENSAGEM PARA ESQUERDA COM ENTRADA DE NOVO CARACTER MENS_R_NEW EQU 0X05 ;DESLOCA MENSAGEM PARA DIREITA COM ENTRADA DE NOVO CARACTER QKEY EQU 0X10 ;16 CARACTERES PARA A 'KEY' DE 8 BYTES (4X16) QSYNC EQU 0X04 ;04 CARACTERES PARA A 'KEY' DE 2 BYTES (1X16) QSER EQU 0X08 ;08 CARACTERES PARA A 'KEY' DE 4 BYTES (2X16) QSEED EQU 0X08 ;08 CARACTERES PARA A 'KEY' DE 4 BYTES (2X16) QDISC EQU 0X04 ;04 CARACTERES PARA A 'KEY' DE 2 BYTES (1X16) QCONFIG EQU 0X04 ;04 CARACTERES PARA A 'KEY' DE 2 BYTES (1X16) KEY EQU W0 SYNC EQU W4 SER EQU W6 SEED EQU W8 DISC EQU W10 CONFIG EQU W11 MOD EQU W5 DISCSER EQU W5H ;TEMPOS PARA GERAÇÃO DE CLOCKS #DEFINE Tps .5 ;.4 PROGRAM MODE SETUP TIME 4mS (3,5mS min, 4,5 max) #DEFINE Tph1 .5 ;.4 HOLD TIME 1 4mS (3,5mS min) #DEFINE Tph2 .19 ; HOLD TIME 2 62uS (50uS min) #DEFINE Tpbw .4 ;.3 BULK WRITE TIME 3mS (2,2mS min) #DEFINE Tclkh .10 ; CLOCK HIGH TIME 35uS (25uS min) #DEFINE Tclkl .10 ; CLOCK LOW TIME 35uS (25uS min) #DEFINE Twc .50 ;.40 PROGRAM CYCLE TIME 40mS (36mS min) ;************************************************************************************************* ; VETOR E2PROM ORG H'2100' DE 0X01,0X23,0X45,0X67,0X89,0XAB,0XCD,0XEF ;KEY W0 A W3 AD=.0 DE 0X00,0X00 ;SYNC W4 AD=.8 DE 0X00,0X01 ;RES = MOD E SINC=SER W5 AD=.10 DE 0X00,0X00,0X00,0X00 ;SER W6 A W7 AD=.12 DE 0X00,0X00,0X00,0X00 ;SEED W8 A W9 AD=.16 DE 0X00,0X00 ;DISC OU RES W10 AD=.20 DE 0X00, 0X30 ;CONFIG W11 AD=.22 DE 0X48,0X43,0X53,0X5F,0X50,0X52,0X4F,0X47,0X5F,0X54,0X49,0X4E,0X59 ; AD=.24 DE 0X4C,0X41,0X52,0X49,0X4F,0X53,0X2E,0X54,0X45,0X43,0X4E,0X4F,0X4C,0X2E,0X57,0X53 ; AD= .37 DE 'K','E','Y';'K','E','Y' AD=.53 DE 'S','Y','N','C' ;SYNC AD=.56 DE 'D','I','S','C','=' ; DISC= AD=.60 DE 'S','E','R' ; SER AD=.65 DE 'S','E','E','C','F','G' ;SEED AD=.68 CONFIG AD=.71 DE '2','0','0','2','0','1','3','0','0','3','0','1' ;'200 AD=.74, 201 AD=.77, 300 AD=.80, 301 AD=.83' DE 'F','A','L','H','A' ;'FALHA' AD=.86 DE 'S','U','C','E','S','S','O' ;'SUCESSO' AD=.91 DE 'M','O','D','E','L','O' ; 'MODELO' AD=98 DE 'D','I','G',':',' ','0','=','M',' ','1','=','A',' ','2','=','G' ;'DIG: 0=M 1=A 2=G' ;AD=104 DE '3','=','V' ; 3=V ;................................................................................................. ; VETOR DE RESET ORG 0X00 GOTO INICIO ;................................................................................................ ; ORG 0X04 RETFIE ;************************************************************************************************** ; TABELA: TAB_MOD OK ; OBJETIVO: RETORNAR ENDEREÇO NA MEMÓRIA EEPROM DOS CARACTERES '200,201,300,301' ;************************************************************************************************** TAB_MOD ANDLW .3 ADDWF PCL,F RETLW .74 ;200 NA EEPROM RETLW .77 ;201 NA EEPROM RETLW .80 ;300 NA EEPROM RETLW .83 ;301 NA EEPROM ;************************************************************************************************** ;************************************************************************************************** TAB_T ANDLW .15 ADDWF PCL,F RETLW 0X3A; ':' RETLW 0X20 ;ESPAÇO RETLW 0X30 ;'0' RETLW 0X5E ;'^' RETLW 0X20 ;ESPAÇO RETLW 0X31 ;'1' RETLW 0X3E ;'>' RETLW 0X20 ;ESPAÇO RETLW 0X32 ;'2' RETLW 0X50 ;'P' RETLW 0X20 ;ESPAÇO RETLW 0X33 ;'3' RETLW 0X56 ;'V' ;************************************************************************************************** TAB_PROX ADDWF PCL,F GOTO SYNC_LE GOTO SER_LE GOTO SEED_LE GOTO DISC_LE GOTO CONFIG_LE GOTO DISCIGUALSER GOTO MAIN1 INICIO MOVLW .7 MOVWF CMCON MOVLW OUT CALL TRISIOX BANK1 MOVLW B'100111' MOVWF WPU ;PULL UP'S ATIVO MOVLW B'10000000' MOVWF OPTION_REG ;PULL UP'S ATIVO BANK0 CALL LcdDelay1 MAIN1 CALL LcdInit MOVLW 0X18 ;INICIO DA FRAS 'HCS_PROG_TINY' MOVWF ADDRESS MOVLW .13 CALL LE_FRASE CALL LINE2 MOVLW 0X25 ;INICIO DA FRAS 'LARIOS.TEC.WS' MOVWF ADDRESS MOVLW .16 CALL LE_FRASE ;INFERIOR MOVLW .10 CALL DELAYW CALL LINE2 MOVLW .104 ;INICIO DA FRAS 'DIG; 0=M 1=A 2=G' MOVWF ADDRESS MOVLW .16 CALL LE_FRASE ;INFERIOR ; CALL LcdClear CARGA_W CALL LE_12WE2PROM ;CARREGA W0 A W11A ;********************************************************************************** ; ROTINA: MAIN OK ; OBJETIVO: ROTINA PRINCIPAL DE TESTES DAS CHAVES DE FUNÇÕES DO APARELHO ;********************************************************************************** MAIN MOVLW IN ;GPIO = ENTRADA CALL TRISIOX BTFSS CH0 ;TESTA 'AJUSTES' GOTO MODELO ;FUNÇÃO'ALTERAR MODELO A GRAVAR' BTFSS CH1 ;TESTA 'AJUSTES' GOTO AJUSTAR ;FUNÇÃO'ALTERAR DADOS A GRAVAR' BTFSS CH2 GOTO GRAVAR ;FUNÇÃO 'GRAVAR' GOTO MAIN ;********************************************************************************** ; ROTINA: MODELO OK ; OBJETIVO: VER/ALTERAR O MODELO A SER GRAVADO ; ;********************************************************************************** ;mostra/altera modelo do aparelho a programar MODELO CALL LcdClear MOVLW .98 ;LOCAL NA EEPROM DE 'MODELO' MOVWF ADDRESS MOVLW .6 CALL LE_FRASE V98 MOVLW 0X8D ;POSICIONA CURSOR NAS 3 ULTIMAS CASAS DA 1º LINHA CALL SHOW_MODELO ;APRESENTA MODELO COFORME VALOR DE 'W5' ;................................................................................. CALL LINE2 ; 15 INSTRUÇÕES = 43 LINHAS MOVLW .104 ;INICIO DA FRAS 'DIG: ' MOVWF ADDRESS MOVLW .5 CALL LE_FRASE ;INFERIOR MOVLW .112 ;INICIO DA FRAS ' 1=A ' MOVWF ADDRESS MOVLW .4 CALL LE_FRASE ;INFERIOR MOVLW 0XCD CALL EC MOVLW .120 ;INICIO DA FRAS ' 3=V' MOVWF ADDRESS MOVLW .3 CALL LE_FRASE ;INFERIOR ;.................................................................................. MOVLW IN CALL TRISIOX V99 BTFSS CH1 GOTO F1 BTFSC CH3 GOTO V99 MOVLW .10 ;ENDEREÇO DE W5 NA EEPROM MOVWF ADDRESS MOVFW W5 ;ESCREVE W5 ALTERADO NA EEPROM CALL WPROM ;ESCREVE BTFSS CH3 GOTO $-1 GOTO MAIN1 F1 INCF W5,W ANDLW .3 MOVWF W5 BTFSS CH1 GOTO $-1 GOTO V98 ;******************************************************************************************* ;******************************************************************************************* ; ROTINA: AJUSTAR ; OBJETIVO: VER / AJUSTAR VALORES DAS 'WORDS' A SEREM GRAVADAS NO CHIP ESCOLHIDO ;******************************************************************************************* AJUSTAR MOVLW 0XFF MOVWF P_T CALL LcdClear MOVLW .53 ;LOCAL NA EEPROM DE 'KEY' MOVWF ADDRESS MOVLW .3 CALL LE_FRASE CLRF ADDRESS ;INICIO DA TABELA MOVLW .13 ;QUANTIDADE DE DADOS A PEGAR CALL LE_TAB MOVLW LINHA2 CALL EC CALL AD_KEY ;PREPARA PONTEIROS CALL LE_WORD CALL DELAY1 CLRF P_COL MOVLW 0XC0 ;POSICIONA NO INICIO DA 2º LINHA NO PRIMEIRO CARACTER CALL EC MOVFW P_WORD MOVWF FSR ;REAPONTA PARA INICIO KEY KV64 MOVLW IN CALL TRISIOX BTFSS CH0 CALL INCREMENTA_NIBLE BTFSS CH1 CALL DESLOCA_NIBLE BTFSS CH2 GOTO PROX1 BTFSS CH3 GOTO SALVA_W GOTO KV64 ;============================================================================================== ; ALTERAR SYNC PROX1 CALL LcdClear INCF P_T,F MOVFW P_T GOTO TAB_PROX SYNC_LE MOVLW .56 ;LOCAL NA EEPROM DE 'SYNC' MOVWF ADDRESS MOVLW .3 CALL LE_FRASE CLRF ADDRESS ;INICIO DA TABELA MOVLW .13 ;QUANTIDADE DE DADOS A PEGAR CALL LE_TAB MOVLW LINHA2 CALL EC CALL AD_SYNC ;PREPARA PONTEIROS CALL LE_WORD CALL DELAY1 CLRF P_COL MOVLW 0XC0 ;POSICIONA NO INICIO DA 2º LINHA NO PRIMEIRO CARACTER CALL EC MOVFW P_WORD MOVWF FSR ;REAPONTA PARA INICIO SYNC GOTO KV64 SER_LE MOVLW .65 ;LOCAL NA EEPROM DE 'SER' MOVWF ADDRESS MOVLW .3 CALL LE_FRASE CLRF ADDRESS ;INICIO DA TABELA MOVLW .13 ;QUANTIDADE DE DADOS A PEGAR CALL LE_TAB MOVLW LINHA2 CALL EC CALL AD_SER ;PREPARA PONTEIROS CALL LE_WORD CALL DELAY1 CLRF P_COL MOVLW 0XC0 ;POSICIONA NO INICIO DA 2º LINHA NO PRIMEIRO CARACTER CALL EC MOVFW P_WORD MOVWF FSR ;REAPONTA PARA INICIO SER GOTO KV64 SEED_LE MOVLW .68 ;LOCAL NA EEPROM DE 'SEED' MOVWF ADDRESS MOVLW .3 CALL LE_FRASE CLRF ADDRESS ;INICIO DA TABELA MOVLW .13 ;QUANTIDADE DE DADOS A PEGAR CALL LE_TAB MOVLW LINHA2 CALL EC CALL AD_SEED ;PREPARA PONTEIROS CALL LE_WORD CALL DELAY1 CLRF P_COL MOVLW 0XC0 ;POSICIONA NO INICIO DA 2º LINHA NO PRIMEIRO CARACTER CALL EC MOVFW P_WORD MOVWF FSR ;REAPONTA PARA INICIO SEED GOTO KV64 DISC_LE MOVLW .60 ;LOCAL NA EEPROM DE 'SEED' MOVWF ADDRESS MOVLW .3 CALL LE_FRASE CLRF ADDRESS ;INICIO DA TABELA MOVLW .13 ;QUANTIDADE DE DADOS A PEGAR CALL LE_TAB MOVLW LINHA2 CALL EC CALL AD_DISC ;PREPARA PONTEIROS CALL LE_WORD CALL DELAY1 CLRF P_COL MOVLW 0XC0 ;POSICIONA NO INICIO DA 2º LINHA NO PRIMEIRO CARACTER CALL EC MOVFW P_WORD MOVWF FSR ;REAPONTA PARA INICIO DISC GOTO KV64 CONFIG_LE MOVLW .71 ;LOCAL NA EEPROM DE 'SEED' MOVWF ADDRESS MOVLW .3 CALL LE_FRASE CLRF ADDRESS ;INICIO DA TABELA MOVLW .13 ;QUANTIDADE DE DADOS A PEGAR CALL LE_TAB MOVLW LINHA2 CALL EC CALL AD_CONFIG ;PREPARA PONTEIROS CALL LE_WORD CALL DELAY1 CLRF P_COL MOVLW 0XC0 ;POSICIONA NO INICIO DA 2º LINHA NO PRIMEIRO CARACTER CALL EC MOVFW P_WORD MOVWF FSR ;REAPONTA PARA INICIO CONFIG GOTO KV64 DISCIGUALSER MOVLW 'D' CALL ED MOVLW 'E' CALL ED MOVLW 'S' CALL ED MOVLW 'E' CALL ED MOVLW 'J' CALL ED MOVLW 'A' CALL ED MOVLW ' ' CALL ED MOVLW .60 ;LOCAL NA EEPROM DE 'DISC=SER' MOVWF ADDRESS MOVLW .5 CALL LE_FRASE MOVLW .65 ;LOCAL NA EEPROM DE 'DISC=SER' MOVWF ADDRESS MOVLW .3 CALL LE_FRASE MOVLW '?' CALL ED MOVLW 0XC0 CALL EC MOVLW '1' CALL ED MOVLW '=' CALL ED MOVLW 'S' CALL ED MOVLW 'I' CALL ED MOVLW 'M' CALL ED MOVLW 0XCB CALL EC MOVLW '3' CALL ED MOVLW '=' CALL ED MOVLW 'N' CALL ED MOVLW 'A' CALL ED MOVLW 'O' CALL ED R23 MOVLW IN CALL TRISIOX BTFSS CH3 GOTO SALVA_Z BTFSC CH1 GOTO R23 MOVLW .1 ;DISC = SER MOVWF W5H CALL LOAD_SER_DISC CALL LcdClear MOVLW 'D' CALL ED MOVLW 'I' CALL ED MOVLW 'S' CALL ED MOVLW 'C' CALL ED MOVLW ' ' CALL ED MOVLW '=' CALL ED MOVLW ' ' CALL ED MOVLW 'S' CALL ED MOVLW 'E' CALL ED MOVLW 'R' CALL ED GOTO PSALVA_W SALVA_Z MOVLW .0 MOVWF W5H CALL LcdClear MOVLW 'D' CALL ED MOVLW 'I' CALL ED MOVLW 'S' CALL ED MOVLW 'C' CALL ED MOVLW ' ' CALL ED MOVLW 'D' CALL ED MOVLW 'I' CALL ED MOVLW 'F' CALL ED MOVLW ' ' CALL ED MOVLW 'S' CALL ED MOVLW 'E' CALL ED MOVLW 'R' CALL ED PSALVA_W MOVLW 0XC0 CALL EC MOVLW .98 ;LOCAL NA EEPROM DE 'MODELO' MOVWF ADDRESS MOVLW .6 CALL LE_FRASE MOVLW 0XCD ;POSICIONA CURSOR NAS 3 ULTIMAS CASAS DA 1º LINHA CALL SHOW_MODELO ;APRESENTA MODELO COFORME VALOR DE 'W5' MOVLW .15 CALL DELAYW GOTO SALVA_W LOAD_SER_DISC MOVFW SER MOVWF DISC MOVFW SER+1 ANDLW 0X0F MOVWF DISC+1 MOVLW .10 MOVWF ADDRESS CALL RPROM ADDLW 0XFF BTFSS STATUS,Z GOTO OUTROSM ; GOTO SALVA_W RETURN OUTROSM MOVFW SER MOVWF CONFIG MOVFW CONFIG+1 ANDLW 0XF0 MOVFW SER+1 ANDLW 0X0F IORWF CONFIG+1,F RETURN ;********************************************************************************************* ; ROTINA DE INCREMENTO DE NIBLE INCREMENTA_NIBLE INC34 MOVFW INDF MOVWF TEMP2 BTFSS P_COL,0 SWAPF TEMP2,F MOVFW TEMP2 ADDLW .1 ANDLW 0X0F ;LIMITA A NIBLE LOW MOVWF TEMP3 MOVFW TEMP2 ANDLW 0XF0 IORWF TEMP3,W MOVWF TEMP2 CALL BIN_ASC ;CONVERTE PARA ASCII CALL ED BTFSS P_COL,0 SWAPF TEMP2,F MOVFW TEMP2 MOVWF INDF MOVFW P_COL ADDLW 0XC0 ;2º LINHA CALL EC MOVLW .2 CALL DELAYW MOVLW IN CALL TRISIOX BTFSS CH0 GOTO INC34 RET1 MOVLW .30 ;DELAY DEBOUCE CALL DELAY RETURN ;********************************************************************************************* ; ROTINA DE DESLOCAMENTO DE NIBLE A SER ALTERADO PARA DIREITA DESLOCA_NIBLE DL34 INCF P_COL,F BTFSS P_COL,0 INCF FSR,F ; SE P_COL,0 = 0 INCREMENTA TAMBEM FSR MOVFW P_COL XORWF P_LCD,W ;COMPARA COM NUMERO MAX. DE CARACTERES DA LINHA BTFSS STATUS,Z GOTO VB12 MOVFW P_WORD ; MOVLW KEY ;VOLTA AO INICIO DA LINHA (NO PRIMEIRO CARACTER) DA WORD SELECIONADA MOVWF FSR CLRF P_COL VB12 MOVFW P_COL ADDLW 0XC0 ;LINHA 2 CALL EC CALL DELAY1 MOVLW IN CALL TRISIOX BTFSS CH1 GOTO DL34 GOTO RET1 ;********************************************************************************************* ;============================================================================================== GRAVAR ; CALL LE_12WE2PROM CALL LcdClear MOVLW 'G' CALL ED MOVLW 'R' CALL ED MOVLW 'A' CALL ED MOVLW 'V' CALL ED MOVLW 'A' CALL ED MOVLW 'N' CALL ED MOVLW 'D' CALL ED MOVLW 'O' CALL ED MOVLW ' ' CALL ED MOVLW 'H' CALL ED MOVLW 'C' CALL ED MOVLW 'S' CALL ED MOVLW 0X8D ;POSICIONA CURSOR NAS 3 ULTIMAS CASAS DA 1º LINHA CALL SHOW_MODELO ;APRESENTA MODELO COFORME VALOR DE 'W5' MOVLW .10 MOVWF ADDRESS CALL RPROM ADDLW 0XFF BTFSC STATUS,Z GOTO SEGUE57 CLRF W10 CLRF W10H ;APAGA 'DISC' (SOMENTE 201;OUTROS = RESERVADO) SEGUE57 MOVFW W5 MOVWF W5X MOVFW W5H MOVWF W5HX CLRF W5 CLRF W5H ;APAGA AS 'RES' COM MODELO E DISC=SER (FINAL DESTA ROTINA IR P/ 'CARGA_W' PARA CARGA DE TAIS MOVLW .5 CALL DELAYW MOVLW 0X08 ;DESLIGA DISPLAY (08 OU 0A) CALL EC MOVLW OUT_PROG CALL TRISIOX ;ACERTA IN/OUTS PARA PROGRAMAÇÃO CLRF GPIO BSF VCC ;LIGA ALIMENTAÇÃO MOVLW .3 CALL DELAYW ;AGUARDA FIRMAR ALIMENTAÇÃO MIN. 16MS ;ROTINA DE GRAVAR AQUI M_PROGRAMMING M_PROG_INIT M_PROG_SETUP bsf CLK ; DATA=0, CLK=1 movlw Tps ; WAIT Program mode Setup Time (Tps) call WAIT_WMSEC bsf DAD0 ; DATA=1, CLK=1 movlw Tph1 ; WAIT Program Hold Time 1 (Tph1) call WAIT_WMSEC bcf DAD0 ; DATA=0, CLK=1\par movlw Tph2 ; WAIT Program Hold Time 2 (Tph2) call WAIT_uS M_PROG_BULK_ER bcf CLK ; DATA=0, CLK=0\par movlw Tpbw ; WAIT Program Bulk Write Time (Tpbw) call WAIT_WMSEC ;--------------- ; CLOCK INTO HCS THE WORDS TO BE PROGRAMMED clrf TMP_CNT ; NUMBER OF WORD TRASMITTED movlw W0 ; SET INDIRECT PONTER TO INIT EE MAP movwf FSR M_NEW_WORD call PREPARE_WRD ;--------------- ; OUTPUT WORD ROTATE\par clrf TXNUM ; NUMBER OF BIT TRASMITTED FOR EACH WORD M_TX_BIT bsf CLK ; CLK=1 clrc rrf WRD_HI, F ; ROTATE BIT TO OUTPUT rrf WRD_LO, F ; into CARRY FLAG skpnc goto M_PROG_DHI nop M_PROG_DLO bcf DAD0 ; DATA=0 goto M_PROG_BIT M_PROG_DHI bsf DAD0 ; DATA=1 M_PROG_BIT movlw Tclkh call WAIT_uS ; DELAY bcf CLK ; CLK=0 movlw Tclkl call WAIT_uS ; DELAY ;--------------- M_PROG_CHK_WORD incf TXNUM, F ; INCREMENT NUMBER OF BIT TRASMITTED movlw .16 ; CHECK IF END OF WORD TRASMITTED (16 BITS) xorwf TXNUM, W skpz goto M_TX_BIT ; TRASMIT NEXT BIT ;--------------- ; END OUTPUT WORD M_END_WORD bcf DAD0 ; DATA=0 movlw .10 ;endereço de 'modelo' na eeprom movwf ADDRESS call RPROM addlw 0xff btfss STATUS,Z goto outmod bsf CLK ;se 201 ;COMENTADO PARA TESTE movlw Twc ; WAIT FOR WORD Write Cycle Time (Twc) call WAIT_WMSEC BANK1 bsf TRISIO,5 ;DAD0 SERÁ LIDO BANK0 movlw 0xff movwf TEMP1 movwf TEMP2 TIME_OUT decfsz TEMP1,f goto XTIME_OUT decfsz TEMP2,F goto XTIME_OUT goto PROG_ERR ;FALHA OU APARELHO NÃO É 201 XTIME_OUT btfss DAD0 goto TIME_OUT bcf CLK nop movlw .35 ; tp hold 100 us call WAIT_uS ;DELAY BANK1 bcf TRISIO,5 BANK0 goto M_CECHK_PRG_END outmod movlw Twc ; WAIT FOR WORD Write Cycle Time (Twc) call WAIT_WMSEC ;---------------\par M_CECHK_PRG_END incf TMP_CNT, F ; INCREMENT NUMBER OF WORD PROGRAMMED movlw NUM_WRD ; CHECK NUMBER OF WORD TRASMITTED xorwf TMP_CNT, W skpz goto M_NEW_WORD ; PROGRAM NEW WORD goto M_VERIFY PREPARE_WRD movf INDF, W movwf WRD_LO incf FSR, F movf INDF, W movwf WRD_HI incf FSR, F return ;---------------------------------------------------------------------------------------- ; ROTINA DE VERIFICAÇÃO ;---------------------------------------------------------------------------------------- M_VERIFY BANK1 BSF TRISIO,5 ;AJUSTA PARA SER ENTRADA BANK0 movlw W0 ; SET INDIRECT POINTER TO INIT EE MAP\par movwf FSR clrf TMP_CNT ; NUMBER OF WORDS RECIVED\par clrf TXNUM ; NUMBER OF BIT RECEIVED FOR EACH WORD\par ;---------------\par M_VER_BITIN clrc ; RECIVE DATA BIT FROM HCS FOR VERIFY\par btfsc DAD0 ; TEST and ROTATE RECEIVED BIT INTO WORD BUFFER\par setc rrf WRD_HI, F rrf WRD_LO, F incf TXNUM, F movlw .16 xorwf TXNUM, W ; TEST IF RECEIVED A COMPLETE WORD\par skpz goto M_VER_CLKHI ;---------------\par M_VERIFY_WORD movf WRD_LO, W ; 16th BIT RECIVED (WORD) -> VERIFY WORD\par xorwf INDF, W skpz goto PROG_ERR ; WORD LOW VERIFY ERROR\par incf FSR, F movf WRD_HI, W xorwf INDF, W skpz goto PROG_ERR ; WORD HIGH VERIFY ERROR\par incf FSR, F incf TMP_CNT, F movlw NUM_WRD xorwf TMP_CNT, W ; TEST IF RECEIVED ALL THE WORDS PROGRAMMED\par skpnz goto PROG_SUCCESS ; ALL 12 WORDS VERIFIED WITH SUCCESS\par clrf TXNUM ;---------------\par M_VER_CLKHI bsf CLK ; CLK=1\par movlw Tclkh ; WAIT TIME CLOCK HIGH\par call WAIT_uS M_VER_CLKLO bcf CLK ; CLK=0\par movlw Tclkl ; WAIT TIME CLOCK LOW\par call WAIT_uS goto M_VER_BITIN ;----------------------------------------------------------------------------------------\par PROG_SUCCESS bsf SF ; INDICA SUCESSO goto PROG_END ;----------------------------------------------------------------------------------------\par ; HCS PROGRAMMING ERROR ; WAIT FOR BUTTON PRESS PROG_ERR bcf SF PROG_END GOTO FIN77 ;----------------------------------------------------------------------------------------\par ; PIC16F628A DATA EEPROM WRITE ERROR; LED ON FOREVER\par EE_ERR goto $-1 FIN77 CLRF GPIO MOVLW .1 call DELAYW MOVLW OUT CALL TRISIOX CALL LcdInit BTFSS SF GOTO FALHA1 ;FALHOU A GRAVAÇÃO MOVFW W5X ;RECUPERA MODELO MOVWF W5 MOVLW .91 ;LOCAL NA EEPROM DE 'SUCESSO' MOVWF ADDRESS MOVLW .7 CALL LE_FRASE MOVLW .15 CALL DELAYW INCFSZ W6,F ;INCREMENTA SERIAL NUMBER GOTO SALVA_WX INCFSZ W6H,F GOTO SALVA_WX INCFSZ W7,F GOTO SALVA_WX INCF W7H,F GOTO SALVA_WX SALVA_WX MOVLW .11 MOVWF ADDRESS CALL RPROM ADDLW 0XFF BTFSS STATUS,Z GOTO SALVA_W ;NÃO SALVA SER EM DISC CALL LOAD_SER_DISC ; SALVA SER EM DISC GOTO SALVA_W ;********************************************************************************************* ; ROTINA: SALVA_W OK ; OBJETIVO:SALVAR AS WORDS APÓS ALTERAÇÃO DE DADOS NA EEPROM ;********************************************************************************************* SALVA_W MOVLW .24 MOVWF CONT MOVLW W0 MOVWF FSR MOVLW 0X00 ;PEGA ENDEREÇO DE KEY0 (W0) MOVWF ADDRESS SAL4 MOVFW INDF CALL WPROM INCF ADDRESS,F INCF FSR,F DECFSZ CONT,F GOTO SAL4 GOTO MAIN1 ;*********************************************************************************************** FALHA1 MOVLW .86 ;LOCAL NA EEPROM DE 'SUCESSO' MOVWF ADDRESS MOVLW .5 CALL LE_FRASE TV MOVLW .15 CALL DELAYW GOTO MAIN1 ;FIM DA GRAVAÇÃO ;******************************************************************************************** ;=============================================================================================== ; ENDEREÇOS DE CARGA PARA LEITURA NA RAM DAS PALAVRAS W0 A W11H PARA LCD AD_KEY MOVLW KEY ;PEGA ENDEREÇO INICIAL DE 'KEY0' MOVWF P_WORD MOVLW QKEY ;16 CARACTERES NA KEY MOVWF P_LCD RETURN AD_SYNC MOVLW SYNC ;PEGA ENDEREÇO INICIAL DE 'SYNC' MOVWF P_WORD MOVLW QSYNC ;4 CARACTERES NA SYNC MOVWF P_LCD RETURN AD_SER MOVLW SER ;PEGA ENDEREÇO INICIAL DE 'SER' MOVWF P_WORD MOVLW QSER ;8 CARACTERES NA SER MOVWF P_LCD RETURN AD_SEED MOVLW SEED ;PEGA ENDEREÇO INICIAL DE 'SEED' MOVWF P_WORD MOVLW QSEED ;8 CARACTERES NA SER MOVWF P_LCD RETURN AD_DISC MOVLW DISC ;PEGA ENDEREÇO INICIAL DE 'DISC' MOVWF P_WORD MOVLW QDISC ;4 CARACTERES NA SER MOVWF P_LCD RETURN AD_CONFIG MOVLW CONFIG ;PEGA ENDEREÇO INICIAL DE 'CONFIG' MOVWF P_WORD MOVLW QCONFIG ;8 CARACTERES NA SER MOVWF P_LCD RETURN ;=========================================================================================== ok ; AJUSTE FSR=WORD INICIAL E P_LCD = QUANTIDADE DE CARACTERES A SER MOSTRADO DA RAM (W0..W11H,ETC) ; LE_WORD MOVFW P_LCD MOVWF TEMP1 ;QUANTIDADE DE CARACTERES (1 NIBLLE) MOVFW P_WORD MOVWF FSR ; ENDEREÇO INICIAL DA WORD A SER LIDA V2A MOVFW INDF ;PEGA VALOR PELO END.FSR MOVWF TEMP BTFSS TEMP1,0 ;PAR= PULA NIBLE LOW SWAPF TEMP,F ;IMPAR= SWAPF NIBLE HIGH DO DADO MOVFW TEMP CALL BIN_ASC CALL LcdSendData ;ENVIA PARA LCD MOVLW .10 CALL LcdDelay BTFSC TEMP1,0 INCF FSR,F DECFSZ TEMP1,F GOTO V2A RETURN ;********************************************************************************* ; MOSTRA O MODELO (200..301) NO LCD NA POSIÇÃO DADA EM 'W' SHOW_MODELO CALL EC MOVFW W5 CALL TAB_MOD MOVWF ADDRESS MOVLW .3 ;QUANTIDADE DE CARACTERES A LER CALL LE_FRASE RETURN ;******************************************************************************** LE_FRASE ;ACERTAR PONTEIRO ADDRESS COM INICIO E QUANTIDADE DE BYTES EM 'W' MOVWF TEMP1 V37 CALL RPROM CALL LcdSendData INCF ADDRESS,F DECFSZ TEMP1,F GOTO V37 RETURN ;******************************************************************************** LE_TAB ; W= NUMERO DE BYTES A LER / ADDRESS = POSIÇÃO NA TABELA A SER LIDO MOVWF TEMP1 MOVFW ADDRESS LEV1 CALL TAB_T CALL ED INCF ADDRESS,F MOVFW ADDRESS DECFSZ TEMP1,F GOTO LEV1 RETURN ;******************************************************************************** LE_12WE2PROM CLRF ADDRESS MOVLW W0 MOVWF FSR MOVLW .24 ;12X16 OU 24X8 MOVWF CONT V4B CALL RPROM ;LE E COLOCA EM 'W' MOVWF INDF INCF ADDRESS,F INCF FSR,F DECFSZ CONT,F GOTO V4B MOVLW .11 MOVWF ADDRESS CALL RPROM ADDLW 0XFF BTFSC STATUS,Z CALL LOAD_SER_DISC ; SALVA SER EM DISC RETURN ;******************************************************************************** GRAVA_12WE2PROM CLRF ADDRESS MOVLW W0 MOVWF FSR MOVLW .24 ;12X16 OU 24X8 MOVWF CONT V9B MOVFW INDF CALL WPROM ;LE E COLOCA EM 'W' INCF ADDRESS,F INCF FSR,F DECFSZ CONT,F GOTO V9B RETURN ;================================================================================ TRISIOX BANK1 ;TROCA DE BANCO MOVWF TRISIO ;ENTRADA OU SAIDA BANK0 RETURN ;=============================================================================== BIN_ASC ANDLW 0X0F ;LIMITA 0-F ADDLW 0XF6 BTFSC STATUS,C ADDLW 0X07 ADDLW 0X3A RETURN ;================================================================================== WPROM ;ESCREVE NA E2PROM DADO=W /ENDEREÇO=ADDRESS BANK1 MOVWF EEDATA ;CARREGA DADO DE 'W' MOVFW ADDRESS MOVWF EEADR ;APONTA ENDEREÇO DE 'ADDRESS' BCF INTCON,GIE BSF EECON1,WREN MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR BCF EECON1,WREN BTFSC EECON1,WR GOTO $ - 1 BANK0 RETURN RPROM ;SUB-ROTINA DE LEITURA DE E2PROM W=DADO /ADDRESS=ENDEREÇO BANK1 MOVFW ADDRESS MOVWF EEADR ;APONTA ENDEREÇO DE 'ADDRESS' BSF EECON1,RD ; MOVF EEDATA,W ; BANK0 ; RETURN ;================================================================================= ;Rotina de retardo, onde w=tempo em ms - clock=20MHz ;================================================================================= DELAY2 MOVLW .20 DELAYW MOVWF TEMP VJ1 call LcdDelay1 DECFSZ TEMP,F GOTO VJ1 DELAY1 LcdDelay1 MOVLW .255 ;DELAY PARA VISUALIZAÇAO DELAY LcdDelay goto $+1 movwf LC+1 ;duas variáveis em uma LcdDelayLoop decfsz LC+0,F ;dec. o prim. cont. goto LcdDelayLoop decfsz LC+1,F ;dec. o seg. cont. goto LcdDelayLoop return DEBOUNCE WAIT_16MSEC movlw .16 WAIT_WMSEC movwf LC+1 WAITSET movlw .250 movwf LC WAITLOOP decfsz LC,F goto WAITLOOP decfsz LC+1,F goto WAITSET return ;===================================================== WAIT_uS movwf LC WAIT_uS_A decfsz LC, F goto WAIT_uS_A return ;================================================================================= ;Rotinas de controle do LCD ;================================================================================= LcdInit movlw .30 ;Wait 30 ms call LcdDelay CLRF GPIO bcf FLCD_RS ;Set LCD command mode bsf LCD_DB4 ;0011->48 bsf LCD_DB5 call LcdPulse_E ;sequência de reset call LcdPulse_E call LcdPulse_E CLRF GPIO bsf LCD_DB5 call LcdPulse_E movlw 28H ;Set 4 bit data bus length call LcdSendCommand movlw 06H ;Entry mode set, increment, no shift call LcdSendCommand ; movlw 0DH ;Display ON, Cursor ON, Blink ON ; movlw 0FH ;Display ON, Cursor ALTERADO ON, Blink ON movlw 0EH ;Display ON, Cursor ON, Blink OFF ; movlw 0CH ;Display ON, Cursor OFF, Blink OFF call LcdSendCommand LcdClear movlw 01H ;clear display call LcdSendCommand movlw .2 ;Wait 2 ms call LcdDelay return ED LcdSendData bsf FLCD_RS GOTO XENV LINE2 MOVLW 0XC0 EC LcdSendCommand bcf FLCD_RS XENV call LcdSendByte return LcdSendByte movwf tmpLcdRegister ;Send a byte to LCD by 4 bit data bus movlw OUT call TRISIOX CLRF GPIO ;APAGA SAIDAS DB7 A DB4 btfsc tmpLcdRegister,4 bsf LCD_DB4 btfsc tmpLcdRegister,5 bsf LCD_DB5 btfsc tmpLcdRegister,6 bsf LCD_DB6 btfsc tmpLcdRegister,7 bsf LCD_DB7 call LcdPulse_E CLRF GPIO ;APAGA SAIDAS DB7 A DB4 btfsc tmpLcdRegister,0 bsf LCD_DB4 btfsc tmpLcdRegister,1 bsf LCD_DB5 btfsc tmpLcdRegister,2 bsf LCD_DB6 btfsc tmpLcdRegister,3 bsf LCD_DB7 call LcdPulse_E return ;------------------------------------------------------------------------------------------- ;EIS A ROTINA 'LARIOS' DE CONEXÃO 'E' JUNTO COM 'RS' VIA RC. LcdPulse_E MOVLW .250 ;min=.150 (achado por tentativa e erro P/ R=10K E CAP=100nF) bsf LCD_E ;Enables LCD BTFSC FLCD_RS ;flag rs CALL WAIT_uS NOP NOP bcf LCD_E ;Disabled LCD movlw .1 ;Wait 1ms call LcdDelay return ;======================================================================================== END