;************************************************************************************************************************ ; ; ; PROJETO HCS_PROG_V628 ; ; INÍCIO : 17/06/12 TERM.: 18/06/12 ; LÁRIOS.TECNOLOGIA.WS ; AUTOR: CLÁUDIO LÁRIOS ; PROCESSADOR: PIC 16F628A ; OBJETIVO: PROGRAMAR HCS 200...301 COM PIC 16F628A ,USANDO LCD E MAIS 4 BOTÕES PARA CONFIGURAÇÕES. ; VERSÃO TRADICIONAL DE LIGAÇÃO AO LCD COM 6 IO'S. ;___________________________________________________________________________________________________ ; #INCLUDE ; ARQUIVO PADRAO __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT ERRORLEVEL -302 ;suppress bank selection messages ; 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 ; PAGINACAO DE MEMORIA; #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;======================DEFINICAO DE BITS E FLAGS============================================== #DEFINE CH0 PORTB,0 ; BOTÃO 'MENU' PINO 6 #DEFINE CH1 PORTB,1 ; BOTÃO 'INC' PINO 7 #DEFINE CH2 PORTB,2 ; BOTÃO 'DEC' PINO 8 #DEFINE CH3 PORTB,3 ; BOTÃO 'GR' PINO 9 #DEFINE VCC PORTB,4 ;OUT SAIDA VCC PINO 10 #DEFINE PWM PORTB,5 ; OUT DADOS PINO 11 #DEFINE S2 PORTB,6 ; OUT CLOCK PINO 12 #DEFINE DAD0 PORTB,5 ; OUT DADOS PINO 11 #DEFINE CLK PORTB,6 ; OUT CLOCK PINO 12 ;LCD Control lines #DEFINE LCD_RS PORTA,1 ; RS PINO 18 #DEFINE LCD_E PORTA,0 ;Enable PINO 17 #DEFINE SF FLAGS,2 ; FLAG SUCESSO/FALHA ;LCD data line bus #DEFINE LCD_DB4 PORTA,2 ;LCD data line DB4 PINO 1 #DEFINE LCD_DB5 PORTA,3 ;LCD data line DB5 PINO 2 #DEFINE LCD_DB6 PORTA,6 ;LCD data line DB6 PINO 15 #DEFINE LCD_DB7 PORTA,7 ;LCD data line DB7 PINO 16 ; Variaveis #DEFINE NUM_WRD .12 ; NUMBER OF WORD TO PROGRAM INTO HCS ;TEMPOS PARA GERAÇÃO DE CLOCKS #DEFINE Tps .6 ;.4 PROGRAM MODE SETUP TIME 4mS (3,5mS min, 4,5 max) #DEFINE Tph1 .6 ;.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 .55 ;.40 PROGRAM CYCLE TIME 40mS (36mS min) ;*********************************************************************************************** ; CONSTANTES VDEL1 EQU .250; 250 VALOR INICIAIS PARA DELAY VDEL2 EQU .250 ; 250 IDEM VDEL3 EQU .1; 1 IDEM ;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 SYNCR EQU W4 SER EQU W6 SEED EQU W8 DISC EQU W10 CONFIG EQU W11 MOD EQU W5 DISCSER EQU W5H ;************************************************************************************************* ; 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,0X00 ;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,'V','6','2','8' ;'programmer name' 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 DT .74,.77,.80,.83 ;************************************************************************************************** TAB_T ANDLW .15 ADDWF PCL,F DT ':',' ','0','^',' ','1','>',' ','2','P',' ','3','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 DO PROGRAMA: ; ;================================================================================================= INICIO MOVLW .7 MOVWF CMCON BANK1 MOVLW B'10001111' ;PARA CHAVES E SAIDA PARA CI A PROGRAMAR MOVWF TRISB MOVLW .0 MOVWF TRISA ;PARA LCD MOVLW B'00000000' MOVWF OPTION_REG ;PULL UP'S ATIVO BANK0 CALL LcdDelay1 MAIN1 CALL LcdInit MOVLW 0X18 ;INICIO DA APRESENTAÇÃO DO APARELHO' MOVWF ADDRESS MOVLW .13 CALL LE_FRASE CALL LINE2 MOVLW 0X25 ;INICIO DA FRASE LINHA 2 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 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 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 ;.................................................................................. 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 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 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 .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 '1' CALL ED MOVLW '=' CALL ED MOVLW 'S' CALL ED MOVLW ' ' CALL ED MOVLW '3' CALL ED MOVLW '=' CALL ED MOVLW 'N' CALL ED R23 BTFSS CH3 GOTO SALVA_W BTFSC CH1 GOTO R23 CALL LOAD_SER_DISC 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 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 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 BTFSS CH1 GOTO DL34 GOTO RET1 ;********************************************************************************************* ;============================================================================================== GRAVAR 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' 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 CLRF PORTA CLRF PORTB 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 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 TRISB,5 ;AJUSTA DADO/PWM 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 BANK1 BCF TRISB,5 ;AJUSTA DADO/PWM PARA SAIDA BANK0 GOTO FIN77 ;----------------------------------------------------------------------------------------\par ; PIC16F628A DATA EEPROM WRITE ERROR; LED ON FOREVER\par EE_ERR goto $-1 FIN77 CLRF PORTA CLRF PORTB ; CLRF GPIO MOVLW .1 call DELAYW CALL LcdInit BTFSS SF GOTO FALHA1 ;FALHOU A GRAVAÇÃO MOVFW W5X ;RECUPERA MODELO MOVWF W5 MOVFW W5HX MOVWF W5H 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 W5H 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 SYNCR ;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 ; CALL ClearLcd 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 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 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' BANK0 MOVFW ADDRESS BANK1 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 MOVFW ADDRESS BANK1 MOVWF EEADR ;APONTA ENDEREÇO DE 'ADDRESS' BSF EECON1,RD ; MOVF EEDATA,W ; BANK0 ; RETURN ;================================================================================= ;Rotina de retardo, onde w=tempo em ms - clock=4MHz ;================================================================================= 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 PORTA bcf LCD_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 PORTA 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 LCD_RS GOTO XENV LINE2 MOVLW 0XC0 EC LcdSendCommand bcf LCD_RS XENV call LcdSendByte return LcdSendByte movwf tmpLcdRegister ;Send a byte to LCD by 4 bit data bus bcf LCD_DB4 bcf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 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 bcf LCD_DB4 bcf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 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 ;LcdPulse_E bsf LCD_E ;Enables LCD NOP NOP bcf LCD_E ;Disabled LCD return LcdPulse_E bsf LCD_E ;Enables LCD movlw 1 ;Wait 1ms call LcdDelay bcf LCD_E ;Disabled LCD movlw 1 ;Wait 1ms call LcdDelay return ;======================================================================================== END DISCIGUALSER 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 '1' CALL ED MOVLW '=' CALL ED MOVLW 'S' CALL ED MOVLW ' ' CALL ED MOVLW '3' CALL ED MOVLW '=' CALL ED MOVLW 'N' CALL ED R23 MOVLW IN CALL TRISIOX BTFSS CH3 GOTO SALVA_W BTFSC CH1 GOTO R23 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 OUTROSM MOVFW SER MOVWF CONFIG MOVFW CONFIG+1 ANDLW 0XF0 MOVFW SER+1 ANDLW 0X0F IORWF CONFIG+1,F GOTO SALVA_W