;********************************************************************************************* ; BIG_GEN_MIX_PIC_E.ASM ; ; ; RECEPTOR GENERICO DE RF PARA CONTROLE REMOTOS (CHAVEIRINHOS) COM CI HT6P20B/HCS200...301 ; OBS: VERSÃO MISTA, QUE 'APRENDE' A FAMÍLIA HCS ( NÃO USA 'HOPPING CODE', ACEITANDO DE ; QUALQUER FABRICANTE) E TAMBÉM O CI HT6P20B (CÓDIGO FIXO). ; MAX: 254 CONTROLE REMOTOS (MEMÓRIA 24C08) ; PARA DECODIFICAR UTILIZA UM PIC 16F628A DE 18 PINOS. ; ESTA VERSÃO PERMITE O APAGAMENTO INDIVIDUAL DE CONTROLES, MEDIANTE A VISUALIZAÇÃO ; EM DISPLAY LCD, DO NÚMERO DO CONTROLE QUE SE DESEJA APAGAR. ; OBJETIVO: AJUDAR HOBYSTAS A TER UMA BASE PARA SEUS PRÓPRIOS PROJETOS COM CONTROLES REMOTOS. ; USO: OS PINOS 6 E 7 DO PIC16F628A SÃO AS SAIDAS QUE SERÁO USADAS PARA ACIONAR OUTROS DISPOSI ; TIVOS COMO RELES,LED,TRIAC,ETC, OU SEJA, A SUA APLICAÇÃO. ; PROJETO DIDÁTICO EXPERIMENTAL, SUJEITO A BUG'S EM USO. TESTADO SOMENTE EM PROTOBOARD. ; AUTOR: CLAUDIO LÁRIOS INICIO: 26-12-2012 TERMINO:30-12-2012 ; OBS. ADAPTAÇÃO DO PROJETO BIG_GEN COM AT89C2051 PARA PIC16F628A ; MATERIAL DIDÁTICO APENAS. ; BLOG 'LARIOS.TECNOLOGIA.WS' ; (LIBERADO PARA USO NÃO COMERCIAL) ;********************************************************************************************* ; ; GRAVAR CONTROLE: APERTE UM BOTÃO DO CONTROLE E MANTENHA APERTADO. ; APERTE TAMBÉM O BOTÃO 'LEARN' NA PLACA (PINO DO PIC16F628A A MASSA)E ; SOLTE-O EM MENOS DE 1 SEGUNDOS. APARECERÁ A MENSAGEM ' TX APRENDIDO' PARA INDICAR ; APRENDIZADO DO CONTROLE (CHAVEIRINHO).TAMBÉM,NA LINHA 2 DO LCD, IRÁ APARECER O NUMERO DO ; CONTROLE. REPITA ISTO COM OS OUTROS CONTROLES QUE FOR UTILIZAR, UM POR VEZ. ESTA VERSÃO ; 'ZERA' AS INFORMAÇÕES DOS BOTÕES APERTADOS, DE MANEIRA QUE, PROGRAMANDO APENAS QUALQUER UM ; DOS BOTÕES, OS OUTROS SERÃO AUTOMATICAMENTE ACEITOS. ; O OBJETIVO DISTO É POUPAR MEMÓRIA PARA PODERMOS GRAVAR MAIS CONTROLES NA EEPROM. ; ; APAGAR CONTROLES: NESTA VERSÃO, PODEMOS OPTAR POR APAGAR TODA A MEMÓRIA OU APAGAR DE FORMA ; INDIVIDUAL CADA CONTROLE. APERTE BOTÃO 'LEARN' POR MAIS DE 10 SEG., APÓS O QUE APARECERÁ A ; MENSAGEM: 'REMOVER CONTROLES' E EM SEGUIDA A MENSAGEM 'APAGAR UNICO TX? DIG: 1=SIM 2=NÃO'. ; CASO SEJE UM UNICO CONTROLE A APAGAR, APERTE BOTÃO '1'. SE APERTAR BOTÃO '2'(NÃO) IRÁ PARA ; A TELA DE APAGAMENTO DE TODA A MEMÓRIA. ; APÓS APERTAR BOTÃO '1'(SIM) IRÁ MOSTRAR A MENSAGEM 'ESCOLHA N. TX' OU SEJA , ESCOLHA O NUMERO ; DO TRANSMISSOR A APAGAR. LOGO A TELA IRÁ MOSTRA A MENSAGEM 'DIG: L=E 1=^^ 2=^' OU SEJA, DIGITE ; 'LEARN' PARA APROVAR O APAGAMENTO DO CONTROLE ALISTADO NA LINHA 2 DO LCD. ; DIGITE 1 PARA ALTERAR DE FORMA RÁPIDA O VALOR DO CONTROLE A APAGAR . ; DIGITE 2 ,IGUALMENTE AO ANTERIOR, SOMENTE DE FORMA LENTA, PARA FACILITAR A ESCOLHA. ; AO APERTAR 1 OU 2 VEREMOS O VALOR DA LINHA2 DO LCD INCREMENTAR DE '1 A 340' . ; APÓS ESCOLHERMOS O VALOR DESEJADO, BASTA APERTAR O BOTÃO 'LEARN' QUE OCORRERÁ O APAGAMENTO ; E O LCD MOSTRARÁ A MENSAGEM 'APAGAMENTO OK'. ; CASO DESEJE CANCELAR QUALQUER OPERAÇÃO, APERTE 'RESET'. ; CASO TENHAMOS ESCOLHIDO ANTERIORMENTE BOTÃO 2 (NÃO) LEVARÁ A MENSAGEM: ; 'APAGAR TODOS TX? DIG: 1=SIM 2=NÃO' ; AO DIGITAR BOTÃO 1 (SIM), UM A MENSAGEM DE CONFIRMAÇÃO APARECERÁ. DIGITE BOTÃO 1 (SIM) PARA ; FINALIZAR O APAGAMENTO GERAL. EM SEGUIDA , APARECERÁ A MENSAGEM 'AGUARDE....' E LOGO EM SEGUIDA ; A MENSAGEM 'APAGAMENTO OK'. SE APÓS A MENSAGEM 'APAGAR TODOS TX?' TECLA BOTÃO 2(NÃO), APARECERÁ ; A MENSAGEM 'AP. CANCELADO' OU SEJA, A OPERAÇÃO DE APAGAMENTO FOI CANCELADA, E RETORNA AO INICIO ; DO PROGRAMA. ; GERENCIAR CONTROLES (POR EX. VISANDO APLICAÇÃO EM PORTÃO AUTOMÁTICO): ; O NUMERO DE CADA CHAVEIRINHO (TX) DEVERÁ SER CADASTRADO NUMA LISTA RELACIONANDO-O A UM USUÁRIO. ; VEJA O EXEMPLO ABAIXO: ; CONTROLE 78,79,80 = APTO 33A SR. OSVALDO. ; COM ESTE GERENCIAMENTO, É POSSIVEL SABER QUAL O NUMERO DE UM CONTROLE QUE FOI PERDIDO, POR ; PERGUNTAR PELOS NUMEROS DOS QUE ESTÃO COM A PESSOA. ; TAMBÉM PODERÁ SER ACIONADOS UM CONTROLE POR VEZ E ANOTAR O NUMERO DE CADA (POIS APARECERÁ NO ; LCD APÓS O ACIONAMENTO). EX: APTO 15 PERDEU UM CONTROLE, DE 3 , MAS NÃO SABE QUAL. ; PEGUE OS DOIS RESTANTES. ; ACIONE UM POR VEZ E ANOTE SEU NUMERO. VEJA A LISTA: NELA CONSTA O NUMERO DOS 3 CONTROLES DO ; APTO 15. EXCLUA OS 2 QUE VOCE TEM EM MÃOS. O QUE SOBROU FOI O QUE SE PERDEU. ENTRE COM ESTE ; NUMERO E APAGUE DA MEMÓRIA, POR SEGURANÇA. ; OBS. SEM UM BOM GERENCIAMENTO, NÃO ADIANTA TER RECURSO DE APAGAMENTO INDIVIDUAL DE CONTROLES, ; SE NÃO SOUBERMOS QUAL DELES APAGAR!!!! AÍ, SÓ RESTARÁ APAGAR TUDO E REGRAVAR UM POR UM !!! ; ; QUANTIDADE DE CONTROLES MAXIMA: 254 CONTROLES DIFERENTES. QUANDO ATINGIR ; ESTE LIMITE, NÃO ACEITARÁ NOVO APRENDIZADO, AVISANDO ESTA SITUAÇÃO POR MENSAGEM NO LCD ; (LCD MOSTRARÁ A MENSAGEM : 'LIM. MAX MEMORIA'). ; NOVOS APRENDIZADOS SÓ OCORRERÃO COM O APAGAMENTO COMPLETO DA EEPROM E EM SEGUIDA, PODERÁ ; NOVAMENTE OCORRER O APRENDIZADO DOS CONTROLES. ; OBS; SE ALGUM CONTROLE FOI APAGADO, O PROGRAMA IRÁ PROCURAR POSIÇÕES VAGAS PARA USAR ATÉ O ; LIMITE TOTAL DA EEPROM 24C08 (254 CONTROLES). ; USE LCD 2 X 16 PARA INDICAÇÃO VISUAL. ; UTILIZE EEPROM 24C08 ;********************************************************************************************* ; LIGAÇÕES NOS PINOS DO PIC 16F628A: ; PINO 1= NÃO USADO ; PINO 2= ENTRADA INTERRUPTOR 'RÁPIDO' A MASSA ; PINO 3= ENTRADA DO SINAL A DECODIFICAR VIA RESISTOR DE 470 OHMS ; PINO 4= RESET ; PINO 5= GND ; PINO 6= SAIDA 'S1' LED2 ; PINO 7= SAIDA 'S0' LED1 ; PINO 8= SAIDA E ; PINO 9= SAIDA RS ; PINO 10= SAIDA DB4 ; PINO 11= SAIDA DB5 ; PINO 12= SAIDA DB6 ; PINO 13= SAIDA DB7 ; PINO 14= VCC (+5V) ; PINO 15= ENTRADA INTERRUPTOR 'LENTO' A MASSA ; PINO 16= AO VCC VIA RESISTOR DE 10K E AO BOTÃO DE 'LEARN' A MASSA ; PINO 17= SDA DA 24C04 (DADO) ; PINO 18= SCL DA 24C04 (CLOCK) ;***************************************************************************************** LIST P=16f628A , R=DEC INCLUDE "P16F628A.INC" ERRORLEVEL -302 ;===================================================================================================== ;PALAVRA DE CONFIGURAÇÃO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF & _LVP_OFF & _MCLRE_ON ;===================================================================================================== ;BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;==================================================================================================== ;EQUATES VLINHA1 EQU 80H VLINHA2 EQU 0C0H T_APRESENTAÇÃO EQU .5 ;TEMPO DE APRESENTAÇÃO DA FRASE NO LCD ;------------------------------------------------------------------------------ ;MACROS LIMPA MACRO ;LIMPA TELQA DO LCD CALL LcdClear MOVLW .7 ;AJUSTAR 5 MSEG CALL DELAY ENDM LINHA1 MACRO ;TROCA PARA LINHA 1 DO LCD CALL LINE1 MOVLW .7 ;AJUSTAR 5 MSEG CALL DELAY ENDM LINHA2 MACRO ;TROCA PARA LINHA 2 DO LCD CALL LINE2 MOVLW .7 ;AJUSTAR 5 MSEG CALL DELAY ENDM ;======================================================================================================= ;DEFINIÇÕES DE RAM CBLOCK 0X20 TEMP,FLAGS,BOT,TMP,B0,B1,ADDRESS,ADDRESS1,AUX,DYTA,QB,Z3,Z2,Z1,LC,HC,CONT,RES3A,RES2A,RES1A,RES0A RES3,RES2,RES1,RES0,BR0,BR1,BR2,C0,C1,R0,R1,R2,R3,R4,R5,R6,R7,TR,PAG ENDC ;DEFINIÇÕES DA PORTAS ;=============================================================================== #DEFINE SDA PORTA,0 ; LINHA DE DADOS DA 24C02 (5) PINO 17 #DEFINE SCL PORTA,1 ; LINHA DE CLOCK DA 24C02 (6) PINO 18 #DEFINE RFIN PORTA,4 ;PINO 3 IN RF #DEFINE LRN PORTA,7 ;PINO 16 IN LEARN BOTTON #DEFINE LED1 PORTB,1 ;PINO 7 - SAIDA DO LED2 #DEFINE LED2 PORTB,0 ;PINO 6 - SAIDA DO LED1 #DEFINE LCD_DB7 PORTB,7 ;PINO 13 - DISPLAYS #DEFINE LCD_DB6 PORTB,6 ;PINO 12 - DISPLAY #DEFINE LCD_DB5 PORTB,5 ;PINO 11 - DISPLAYS #DEFINE LCD_DB4 PORTB,4 ;PINO 10 - DISPLAY #DEFINE LCD_RS PORTB,3 ;PINO 9 - DISPLAY #DEFINE LCD_E PORTB,2 ;PINO 8 - DISPLAY #DEFINE DOWN PORTA,3 ;PINO 2 - BOTÃO 'RÁPIDO' N.1 #DEFINE UP PORTA,6 ;PINO 15 - BOTÃO 'LENTO' N.2 ;================================================================================== ;FLAGS #DEFINE FLAGH FLAGS,0 ;FLAG DE SITUAÇÃO #DEFINE FLAG1 FLAGS,1 ;FLAG DE NOVA LEITURA #DEFINE FLAGGR FLAGS,2 ;FLAG DE 'LEARN' APRENDER #DEFINE FLAGPA FLAGS,3 ;FLAG DE PRE-AMBULO #DEFINE FLAGX FLAGS,4 ;FLAG DE RECEPÇÃO OK HT6P #DEFINE FLAGY FLAGS,5 ;FLAG RECEPÇÃO OK HCS ;VARIAVÉIS DE TEMPO E CARGA DE CONTADORES ;============================================================================== TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW QBYTE EQU .28 ;QUANTIDADE DE BYTES A SER RECEBIDO (22 ADRESS+ 2 DADO + 4 ANTICODE) TGR EQU .200 ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO TAMG EQU 0X27 ;TEMPO MAXIMO EM TELA DE APAGAMENTO PONTM EQU 0X03FE ;ENDEREÇO DO PONTEIRO DA MEMÓRIA EEPROM EXT. LEDACESO EQU .2 ;TEMPO QUE LED'S DA SAIDA FICAM ACESOS APÓS UM TOQUE ;ENDEREÇO INICIAL DE RESET DO MICROCONTROLADOR ;------------------------------------------------------------------------------ ORG 0X00 GOTO START ;=============================================================== ;ROTINA DE ENVIO DE FRASE PARA O LCD (PAGINA 0 E 1) ENV_LCD MOVWF AUX MOVFW PAG MOVWF PCLATH MOVFW AUX RT1 CALL PEGA_M ADDLW .0 BTFSC STATUS,Z RETURN CALL ED INCF AUX,F MOVFW AUX GOTO RT1 PEGA_M MOVWF PCL FRASE1: dt "BIG_GEN_PIC628_E",0 FRASE2: dt "LARIOS.TECNOL.WS",0 FRASE3: dt "REMOVER CONTROLE",0 FRASE4: dt "LIM. MAX MEMORIA",0 FRASE5: dt "APAGAR TODOS TX?",0 FRASE6: dt "DIG: 1=SIM 2=NAO",0 FRASE7: dt "APAG. CANCELADO!",0 FRASE8: dt "APAGAMENTO OK!!!",0 FRASE9: dt "CONFIRME: TODOS!",0 FRASE10: dt "OK! TX APRENDIDO",0 FRASE11: dt "AGUARDE ........",0 FRASE12: dt "APAGAR UNICO TX?",0 FRASE13: dt "ESCOLHA N. DO TX",0 FRASE14: dt "1=^R 2=^ L=E R=C",0 ORG 0X100 ;COLOCA DENTRO DE UMA UNICA PAGINA FRASE15: dt "RECEBENDO TX N.:",0 FRASE16: dt "TX DESCONHECIDO!",0 FRASE17: dt "AGUARDANDO TX..!",0 ;============================================================================= RESETA: START: MOVLW .7 MOVWF CMCON ;DESLIGA COMPARADORES ANALÓGICOS ;DEFINE ENTRADAS E SAIDAS BANK1 MOVLW B'11111100' ;SAIDA SOMENTE RA0,RA1 MOVWF TRISA MOVLW .0 MOVWF TRISB ;TUDO SAIDA BANK0 CLRF PORTA ;PORTA ; RESET PORTA CLRF PORTB ;PORTB ; RESET PORTB CLRF FLAGS ;FLAGS; RESET FLAGS CLRF PAG ;ZERA ESCOLHA DE PAGINA DO PCLATH CLRF ADDRESS1 ;PAGINA ZERO DA EEPROM CALL LCDINIT ;INICIALIZAÇÃO DO LCD CALL FRASEINIT ;FRASE INICIAL MOVLW .5 ;TEMPO DE APRESENTAÇÃO CALL DELAYW LIMPA ;LIMPAR TELA MOVLW .1 MOVWF PAG CALL FRASE_AGUARDANDO_TX ;MENSAGEM 'AGUARDANDO TX..!' ;ZERAR CONTEUDO DE PONTM E PONTM+1 SE FOR 'FF' ;CONDIÇÃO DE PRIMEIRO USO DA MEMÓRIA APENAS MOVLW LOW(PONTM) MOVWF ADDRESS MOVLW HIGH(PONTM) MOVWF ADDRESS1 CALL EEREAD1 XORLW 0XFF BTFSS STATUS,Z GOTO SJ4 CLRF DYTA CALL EEWRITE1 INCF ADDRESS,F CLRF DYTA CALL EEWRITE1 SJ4: MOVLW TGR MOVWF Z2 ;CARGA DO TEMPO DO BOTÃO 'LEARN' APERTADO PARA ENTRAR NA 'FUNÇÃO DE APAGAMENTO' CLRF Z1 INICIO: CLRF RES3 ;APAGA REGISTRADORES DE RECEPÇÃO DE CÓDIGO CLRF RES2 CLRF RES1 CLRF RES0 MOVLW QBYTE MOVWF QB ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER L0: BCF FLAGH ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO CLRF HC ;APAGA REGISTRADORES DE UNS E ZEROS CLRF LC L1: BTFSC DOWN GOTO PRT7 BTFSS DOWN GOTO $-1 PRT7: BTFSC LRN GOTO L1HZ ;TESTA BOTÃO 'LEARN' APERTADO GOTO TAPAGAMENTO ;APERTADO, COMEÇA A CONTAR TEMPO MAX. DE APAGAMENTO L1HZ: MOVLW TGR MOVWF Z2 ;CARGA DO TEMPO DO BOTÃO 'LEARN' CLRF Z1 ; L1H: GOTO SS5 TAPAGAMENTO: ;APAGAR TODOS OS CONTROLES DA MEMÓRIA DECFSZ Z1,F GOTO L1H DECFSZ Z2,F GOTO L1H ;QUANDO A CONTAGEM DESTE REGISTRADORES (Z1,Z2) CHEGAR AO FIM OCORRE 'MODO DE APAGAMENTO' LIMPA ;LIMPA CLRF PAG CALL FRASEAPM ;FRASE :'REMOVER CONTROLE' MOVLW T_APRESENTAÇÃO CALL DELAYW GOTO APAGA_ESCOLHA CANCEL: LIMPA ;LIMPA DISPLAY E MUDA PARA LINHA 1 DO LCD CLRF PAG CALL FRASECANC MOVLW T_APRESENTAÇÃO CALL DELAYW GOTO START APAGA_ESCOLHA: LIMPA CLRF PAG CALL FRASEAP_UNICOTX ;MENSAGEM DE 'APAGAR UNICO TX?' LINHA2 CLRF PAG CALL FRASE_DIG ;FRASE :'DIG:1=SIM 2=NAO' CALL C_MAX GOTO VUT5B APAGAR_TODOSX: GOTO APAGAR_TODOS VUT5B: DECFSZ Z1,F GOTO VUT7Y DECFSZ Z2,F GOTO VUT7Y DECFSZ Z3,F GOTO VUT7Y GOTO START VUT7Y: ;TESTA BOTÕES BTFSS UP GOTO APAGAR_TODOSX BTFSC DOWN GOTO VUT5B APAGAR_UM: LIMPA CLRF PAG CALL FRASEAP_ETX ;MENSAGEM DE 'ESCOLHA N. DO TX' MOVLW T_APRESENTAÇÃO CALL DELAYW LIMPA CLRF PAG CALL FRASEUP_DOWN ;MENSAGEM 'DIG:L=E 1=^^ 2=^' LINHA2 CLRF ADDRESS1 ;CONDIÇÃO INICIAL MOVLW .1 MOVWF ADDRESS CALL C_MAX GOTO VFP5A ;MOSTRA SITUAÇÃO INICIAL VUT5C: DECFSZ Z1,F GOTO VUT7Z DECFSZ Z2,F GOTO VUT7Z DECFSZ Z3,F GOTO VUT7Z GOTO START VUT7Z: ;TESTA BOTÕES BTFSS LRN GOTO APAGAR_NUM BTFSS UP GOTO INC_NTX BTFSC DOWN GOTO VUT5C INC_NTX: MOVLW TAMG MOVWF Z3 ;EVITA SAIR POR TEMPO ENQUANTO ACERTANDO N. DO TX CALL INC_ADDRESS MOVLW .0 ;ESTAVA .1 XORWF ADDRESS1,W BTFSS STATUS,Z GOTO VFP5A MOVLW 0XFF ;ESTAVA 0X55 XORWF ADDRESS,W BTFSS STATUS,Z GOTO VFP5A CLRF ADDRESS1 ;ZERA CONTAGEM MOVLW .1 MOVWF ADDRESS VFP5A: MOVFW ADDRESS1 ;CARREGA REGISTRADOR DE CONVERSÃO MOVWF C1 MOVFW ADDRESS MOVWF C0 CALL HEX_DEC ;CHAMA ROTINA DE CONVERSÃO HEX PARA DECIMAL LINHA2 ;MUDA PARA 2ºLINHA MOVFW BR1 CALL conv_asc2 MOVFW R1 CALL ED MOVFW BR0 CALL conv_asc2 CALL ED MOVFW R1 CALL ED MOVLW 0X02 BTFSC DOWN ;DOWN =1 AJUSTE LENTO GOTO SS4R MOVLW .60 CALL DELAY ;DELAY MENOR GOTO VUT5C SS4R: CALL DELAYW GOTO VUT5C ;=========================================== APAGAR_NUM: ;TEM QUE MULTIPLICAR 16 BITS POR 4 E COLOCAR EM ADDRESS1,ADDRESS BCF STATUS,C RLF ADDRESS,F RLF ADDRESS1,F BCF STATUS,C RLF ADDRESS,F RLF ADDRESS1,F CALL DEC_ADDRESS ;APAGA 4 BYTES MOVLW 0XFF MOVWF DYTA CALL EEWRITE1 ;APAGA ENDEREÇO APONTADO POR ADDRESS1,ADDRESS CALL DEC_ADDRESS CALL EEWRITE1 CALL DEC_ADDRESS CALL EEWRITE1 CALL DEC_ADDRESS CALL EEWRITE1 GOTO SAPAG ;SAI COM MENSAGEM DE 'APAGAMENTO OK' APAGAR_TODOS: LIMPA CLRF PAG CALL FRASEAP_TODOS ;MENSAGEM DE 'APAGAR TODOS TX' CALL FRASE_DIG MOVLW T_APRESENTAÇÃO CALL DELAYW CALL C_MAX GOTO VUT5 CANCELX: GOTO CANCEL VUT5: DECFSZ Z1,F GOTO VUT7W DECFSZ Z2,F GOTO VUT7W DECFSZ Z3,F GOTO VUT7W GOTO START VUT7W: ;TESTA BOTÕES BTFSS UP GOTO CANCELX BTFSC DOWN GOTO VUT5 LINHA1 CLRF PAG CALL FRASECONFTODOS MOVLW 0X15 CALL DELAYW CALL C_MAX VUT6: DECFSZ Z1,F GOTO VUT7Q DECFSZ Z2,F GOTO VUT7Q DECFSZ Z3,F GOTO VUT7Q GOTO START C_MAX: MOVLW TAMG MOVWF Z3 CLRF Z2 ;CARGA DO TEMPO MAXIMO ANTES DE VOLTAR AO INICIO CLRF Z1 ;LIMPA REGISTRADORES RETURN VUT7Q: ;TESTA BOTÕES BTFSS UP GOTO CANCELX BTFSC DOWN GOTO VUT6 LIMPA ;LIMPA TELA CLRF PAG CALL FRASEAGUARDE ; MENSAGEM 'AGUARDE......' CALL ER_ALL_EEPROM ;APAGAR TODOS TX DA MEMÓRIA CALL PTZERA ;POEM '00' NO PONTEIRO DA EEPROM SAPAG: LIMPA ;LIMPA TELA CLRF PAG CALL FRASEAPOK ;FRASE 'APAGAMENTO OK!!!' MOVLW T_APRESENTAÇÃO CALL DELAYW BTFSS LRN ;AGUARDA SOLTAR BOTÃO 'LEARN' GOTO $-1 GOTO START RECEIVE: ;INICIA ROTINA DE RECEPÇÃO DE SINAL DO HT6P20B/HCS200...301 ;========================================================== SS5: BTFSS FLAGH ;TESTA FLAG DE HUM RECEBIDO ;FLAG=0 VAI PARA L2 GOTO L2 BTFSC FLAGPA GOTO W47 BTFSS RFIN GOTO M0 ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF SIN=0 VAI PARA 'MO' GOTO L2 W47: BTFSS FLAGPA GOTO W48 BTFSC RFIN GOTO M0 W48: L2: BTFSS RFIN GOTO LA1 ;SIN=0 VAI INCREMENTAR LC EM 'LA1' BTFSC FLAGPA GOTO W45 ;SIN=1 VAI INCREMENTAR HC E SETAR FLAG BSF FLAGH ;SIN=1 W45: INCFSZ HC,F GOTO LA2 DECF HC,F GOTO LA2 ;VAI PARA 'LA2' CONTAR TEMPO DE 50 MICRO SEGUNDOS LA1: BTFSS FLAGPA GOTO W46 BSF FLAGH ;SIN=1 W46: INCFSZ LC,F ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF GOTO LA2 DECF LC,F LA2: MOVLW .12 MOVWF R0 ; 24D = 50 MICROSEG DELAY (ACERTA TEMPO ENTRE LEITURAS DA ENTRADA DE RF) DECFSZ R0,F GOTO $-1 GOTO L1 M0: ;OK LC>TMAX C=0 (VAI PARA O INICIO) MOVFW LC ;C=0 (-) ENTÃO = LC>TMAX SUBLW TMAX BTFSC STATUS,C ;TESTA SE NÃO PASSOU DO LIMITE MAXIMO DE TEMPO EM LOW NA ENTRADA DE RF GOTO NK MOVFW QB XORLW .17 BTFSS STATUS,Z ;SE A=17, ENTÃO É UM PREAMBULO DO HCS. GOTO F23 ;#17 BSF FLAGPA ;=17 MOVLW .63 ;SE SETADO, TRANSMISSÃO HCS MOVWF QB BTFSS RFIN GOTO $-1 GOTO L0 F23: BCF FLAGPA MOVLW .28 MOVWF QB GOTO INICIO ;=============================================================================================== NK: ;OK C=1 SE LC>HC ;G SEG58: MOVFW HC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) SUBWF LC,W RRF RES3,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF RES2,F RRF RES1,F RRF RES0,F GOTO SEG44 ;XLO: ; GOTO L0 ;LE PROXIMO BIT ;------------------------------------- SEG44: ;H DECFSZ QB,F ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO GOTO L0 BTFSC FLAGPA GOTO SEG66 MOVLW .4 MOVWF QB ;DESPREZA OS 4 BITS DE 'ANTICODE' 1010 ACERTA: BCF STATUS,C RRF RES3,F RRF RES2,F RRF RES1,F RRF RES0,F ;RESULTADO FICA SOMENTE EM RES2 A RES0,DESPREZA RES3 DECFSZ QB,F GOTO ACERTA BTFSC FLAG1 GOTO PULA1 MOVFW RES2 ;SALVA RESULTADOS DA PRIMEIRA RECEPÇÃO MOVWF RES2A MOVFW RES1 MOVWF RES1A MOVFW RES0 MOVWF RES0A BSF FLAG1 ;SETA FLAG DE PRIMEIRA RECEPÇÃO RECEBIDA MOVLW .28 MOVWF QB GOTO INICIO PULA1: BCF FLAG1 ;SEGUNDA RECEPÇÃO, COMPARA COM A PRIMEIRA MOVFW RES2 XORWF RES2A,W BTFSS STATUS,Z GOTO RESETAC MOVFW RES1 XORWF RES1A,W BTFSS STATUS,Z GOTO RESETAC MOVFW RES0 XORWF RES0A,W BTFSS STATUS,Z GOTO RESETAC ;ERRO DE RECEPÇÁO BSF FLAGX ;OK - BOA RECEPÇÃO HT6P20B MOVLW .28 MOVWF QB GOTO ROT_HT6P SEG66: BSF FLAGY ;OK - BOAS RECEPÇÃO HCS BCF FLAG1 MOVLW .28 MOVWF QB BCF FLAGPA GOTO ROT_HCS RESETAC: CLRF RES3A ; APAGA RESULTADOS DE COMPARAÇÃO CLRF RES2A CLRF RES1A CLRF RES0A SAI_ROT: BCF FLAGX BCF FLAGH MOVLW .28 MOVWF QB GOTO INICIO ROT_HCS: MOVFW RES3 ;SALVA NIBLE DOS BOTÕES ANDLW 0XF0 MOVWF BOT MOVFW RES3 ;SALVA NIBLE DOS BOTÕES ANDLW 0X0F MOVWF RES3 ;APAGA BOTÕES GOTO ACAO ROT_HT6P: CLRF RES3 ;APAGA (SEM USO) BCF STATUS,C ;SALVA NIBLE DOS BOTÕES RRF RES2,W ANDLW B'01100000' ;ACERTA POSIÇÃO CORRETA DE SAIDA MOVWF BOT ;SOMENTE 'LED1' E 'LED2' MOVFW RES2 ANDLW 0X0F MOVWF RES2 ;APAGA BOTÕES VAC: ;====================================================================== ;INICIA O TRATAMENTO DOS DADOS RECEBIDOS ;====================================================================== ACAO: LIMPA MOVLW .1 MOVWF PAG CALL FRASE_RECEBETX SGH2: ;I BTFSC LRN ;BOTÃO ESTÁ APERTADO? GOTO F55 ; NÃO BSF FLAGGR ;SIM F55: CALL PPT ;PEGA PAGINA/ENDEREÇO NO PONTEIRO SUBLW .0 BTFSS STATUS,Z GOTO MADDRESS ; É '0'? 0=NENHUM CONTROLE FOI GRAVADO MOVFW B0 ; ENDEREÇO DA PAGINA EM 'B' SUBLW .0 BTFSS STATUS,Z GOTO MADDRESS ;COMPARA TAMBÉM SE A PAGINA É '0' GOTO APRENDER MADDRESS: F27: MOVFW B0 MOVWF ADDRESS1 ;CARREGA A PAGINA MOVFW B1 MOVWF ADDRESS ;CARREGA ULTIMO ENDEREÇO GRAVADO CALL EEREAD1 XORWF RES3,W ;COMPARA COM RES3 BTFSS STATUS,Z GOTO PROXIMO CALL DEC_ADDRESS ;DECREMENTA ADDRESS/ADDRESS1 CALL EEREAD1 XORWF RES2,W ;COMPARA COM RES2 BTFSS STATUS,Z GOTO PROXIMO CALL DEC_ADDRESS ;DECREMENTA ADDRESS/ADDRESS1 CALL EEREAD1 XORWF RES1,W ;COMPARA COM RES1 BTFSS STATUS,Z GOTO PROXIMO CALL DEC_ADDRESS ;DECREMENTA ADDRESS/ADDRESS1 CALL EEREAD1 XORWF RES0,W ;COMPARA COM RES0 BTFSS STATUS,Z GOTO PROXIMO GOTO ACIONAR ;ENCONTRADO CONTROLE NA MEMÓRIA ;==================================================================== ; DECREMENTA ENDEREÇO DA EEPROM DEC_ADDRESS: DECF ADDRESS,F MOVFW ADDRESS XORLW 0XFF BTFSS STATUS,Z GOTO SEG26 DECF ADDRESS1,F SEG26: RETURN ;==================================================================== PROXIMO: MOVFW B1 MOVWF ADDRESS ;RECUPERA ADDRES/ADDRESS1 SEM TER SIDO ALTERADOS MOVFW B0 MOVWF ADDRESS1 MOVLW .4 SUBWF ADDRESS,F ;SUBTRAI 4 POSIÇÕES BTFSC STATUS,C GOTO SFE ; MOVLW .1 SUBWF ADDRESS1,F BTFSC STATUS,C GOTO SFE GOTO APRENDER ;CONTROLE NÃO ENCONTRADO NA MEMÓRIA,VAI PARA 'APRENDER' SFE: MOVFW ADDRESS MOVWF B1 MOVFW ADDRESS1 MOVWF B0 GOTO MADDRESS ;VAI PARA O PROXIMO ENDEREÇO DE MEMÓRIA .PROCURAR.... APRENDER: BTFSC FLAGGR ;TESTA SE BOTÃO 'LEARN' FOI PRESSIONADO GOTO F21A LINHA2 MOVLW .1 MOVWF PAG CALL FRASE_DESCONHECIDO MOVLW .1 CALL DELAYW GOTO INICIO ;NÃO ESTÁ. F21A: CALL PPT ;ESTÁ, PEGA PONTEIRO ;RETORNA EM 'W' E 'DYTA'O ENDEREÇO E EM 'B' A PAGINA MOVWF ADDRESS ;CARREGA 'ADDRESS' MOVFW B0 MOVWF ADDRESS1 ;CARREGA A PAGINA MOVLW 0XF8 ;LIMITE UTIL MAXIMO DE ENDEREÇO DE UMA PAGINA DA EEPROM SUBWF ADDRESS,W BTFSS STATUS,C GOTO FG32 MOVFW B0 XORLW .3 ;VERIFICA SE ESTÁ NA ULTIMA PAGINA (3) BTFSS STATUS,Z GOTO FG32 ;NÃO ESTÁ ;ESTÁ; TENTA ACHAR ENDEREÇOS APAGADOS LIVRES ;============================================================================================= ; MAQUINA DE PESQUISA DE ENDEREÇOS APAGADOS E REUSA-LOS APÓS MEMÓRIA 'CHEIA'. CLRF ADDRESS1 ;ZERA ENDEREÇO DA EEPROM CLRF ADDRESS VOE1: CALL EEREAD1 XORLW 0XFF BTFSS STATUS,Z GOTO SK1 CALL INC_ADDRESS CALL EEREAD1 XORLW 0XFF BTFSS STATUS,Z GOTO SK2 CALL INC_ADDRESS CALL EEREAD1 XORLW 0XFF BTFSS STATUS,Z GOTO SK3 CALL INC_ADDRESS CALL EEREAD1 XORLW 0XFF BTFSS STATUS,Z GOTO SK4 GOTO END_LIVRE SK1: CALL INC_ADDRESS SK2: CALL INC_ADDRESS SK3: CALL INC_ADDRESS SK4: CALL INC_ADDRESS MOVLW 0XFB ;CARREGA 'ADDRESS' SUBWF ADDRESS,W ;PEGA O ENDEREÇO APONTADO ;LIMITE MAXIMO DA EEPROM 3FC (3FD LIVRE,3FE /3FF =PONTEIRO) BTFSS STATUS,C GOTO FG55 MOVLW .3 ;VERIFICA SE ESTÁ NA ULTIMA PAGINA (3) SUBWF ADDRESS1,W ;COMPARA A PAGINA BTFSS STATUS,C GOTO FG55 ;TESTA PROXIMO ENDEREÇO SE ESTÁ LIVRE GOTO MEM_CHEIA ;NÃO ENCONTRADO ENDEREÇO LIVRE; AVISA SITUAÇÃO MENSAGEM E NÃO ACEITA CONTROLES NOVOS FG55: GOTO VOE1 END_LIVRE: CALL DEC_ADDRESS CALL DEC_ADDRESS CALL DEC_ADDRESS ;ACERTA ENDEREÇO PARA POSIÇÃO CORRETA CALL W_RES3_0 ;ESCREVE RES2 A 0 NA EEPROM GOTO PUL_GR ;FINALIZA A GRAVAÇAO COM A MENSAGEM DE 'TX APRENDIDO'. MEM_CHEIA: ;============================================================================================== ; ENVIAR MENSAGEM NO DISPLAY DE 'MEMÓRIA CHEIA' LIMPA CLRF PAG CALL FRASELIMITE_MAX MOVLW T_APRESENTAÇÃO ;TEMPO DE APRESENTAÇÃO CALL DELAYW BTFSS LRN ;ESPERA SOLTAR BOTÃO GOTO $-1 GOTO RESETA ;================================================================================================== ;INCREMENTA ENDEREÇOS DA EEPROM INC_ADDRESS: INCFSZ ADDRESS,F GOTO SYE2 INCF ADDRESS1,F SYE2: RETURN ;====================================================================================================== FG32: MOVFW ADDRESS1 ;NO ENDEREÇO INICIAL '00' NÃO INCREMENTA PARA NÃO DEIXAR CASA VAZIA NA EEPROM XORLW .0 BTFSS STATUS,Z GOTO FG34 MOVFW ADDRESS XORLW .0 BTFSC STATUS,Z GOTO FG33 FG34: CALL INC_ADDRESS FG33: CALL W_RES3_0 ;SALVA ENDEREÇO DO ULTIMO CONTROLE GRAVADO GRAVADO NA EEPROM MOVFW ADDRESS1 MOVWF DYTA ;SALVA PAGINA NO PONTEIRO PONTMH MOVFW ADDRESS MOVWF B0 ;SALVA ENDEREÇO DO PONTEIRO PONTML MOVLW HIGH(PONTM) ;ENDEREÇA POSIÇÃO DO PONTEIRO MOVWF ADDRESS1 ;ENDEREÇA POSIÇÃO DO PONTEIRO MOVLW LOW(PONTM) MOVWF ADDRESS CALL EEWRITE1 MOVFW B0 MOVWF DYTA ;SALVA ULTIMA POSIÇÃO NO PONTEIRO INCF ADDRESS,F CALL EEWRITE1 ;GRAVA NOVO ENDEREÇO DE PONTEIRO ;================================================================= PUL_GR: BCF FLAGGR BTFSS LRN ;ESPERA SOLTA BOTÃO 'LEARN' GOTO $-1 LIMPA ;LIMPA TELA CLRF PAG CALL FRASETXAPRENDIDO ;FRASE 'OK! TX APRENDIDO' MOVLW T_APRESENTAÇÃO CALL DELAYW ;TEMPO DE APRESENTAÇÃO GOTO INICIO ;OK, FOI APRENDIDO O TX ACIONAR: ;======================================== ;MOSTRA O NUMERO DO CONTROLE ACIONADO MOVLW 0XC7 ;CENTRALIZA O NUMERO DO CONTROLE RECEBIDO NO VISOR, NA 2ºLINHA CALL EC MOVFW B1 MOVWF ADDRESS ;RECUPERA VALOR DA POSIÇÃO DE MEMÓRIA MOVFW B0 MOVWF ADDRESS1 ;SOMO 4 MOVLW .4 ADDWF ADDRESS,F BTFSS STATUS,C GOTO SLE1 INCF ADDRESS1,F ;DIVIDE POR 4 SLE1 ;---------------------------------- BCF STATUS,C ;/2 RRF ADDRESS1,F RRF ADDRESS,F BCF STATUS,C ;/4 RRF ADDRESS1,F RRF ADDRESS,F MOVFW ADDRESS1 MOVWF C1 MOVFW ADDRESS MOVWF C0 SDT1: CALL HEX_DEC MOVFW BR1 CALL conv_asc2 ;CALL ED ;ULTIMO ZERO MOVFW R1 CALL ED MOVFW BR0 CALL conv_asc2 CALL ED MOVFW R1 CALL ED ;========================================================================== ;TESTA QUAIS BOTÕES FORAM ACIONADOS NA TRANSMISSÃO E ACIONA LEDS NA SAIDA BTFSS BOT,6 GOTO PY5 BSF LED2 PY5 BTFSS BOT,5 GOTO PY4 BSF LED1 PY4 MOVLW LEDACESO ;TEMPO QUE SE MANTEM ACESOS CALL DELAYW BCF LED1 ;DESLIGA DEPOIS DO TEMPO BCF LED2 CLRF BOT GOTO INICIO ;****************************************************************** ; ; ROTINAS DE DELAY E OUTRAS ; ;****************************************************************** W_RES3_0: ;ESCREVE RES3 ..0 NA EEPROM ;================================================================ MOVFW RES0 MOVWF DYTA ;CARREGA REGISTRO DE GRAVAÇÃO CALL EEWRITE1 ;ROTINA DE ESCRITA NA EEPROM CALL INC_ADDRESS ;PROXIMA POSIÇÃO DE ESCRITA NA EEPROM MOVFW RES1 MOVWF DYTA ;CARREGA REGISTRO DE GRAVAÇÃO CALL EEWRITE1 CALL INC_ADDRESS ;PROXIMA POSIÇÃO DE ESCRITA NA EEPROM MOVFW RES2 MOVWF DYTA ;CARREGA REGISTRO DE GRAVAÇÃO CALL EEWRITE1 CALL INC_ADDRESS ;PROXIMA POSIÇÃO DE ESCRITA NA EEPROM MOVFW RES3 MOVWF DYTA ;CARREGA REGISTRO DE GRAVAÇÃO CALL EEWRITE1 RETURN ;=============================================================== ;DELAYM: ;; MOV R0,A ;XC: ; ACALL AGUARDE ; DJNZ R0,XC ; RET ;**************************************************** ;PEGA PONTEIRO NA EEPROM - ULTIMO ENDEREÇO 'B'= PAGINA 'A'=ADDRESS PPT: MOVLW HIGH(PONTM) ;PAGINA DO PONTEIRO MOVWF ADDRESS1 MOVLW LOW(PONTM) ;PAGINA DO PONTEIRO MOVWF ADDRESS ;ENDEREÇO DENTRO DA PAGINA CALL EEREAD1 ;LE PONTEIRO DA EEPROM MOVWF B0 ;SALVA PAGINA INCF ADDRESS,F CALL EEREAD1 ; MOVWF B1 ;SALVA EM B1 RETURN ;**************************************************** AGUARDE: ;ROTINA DE ATRASO ENTRE OPERAÇÕES DE EEPROM DELAY_STOP: MOVLW .15 ;AJUSTAR 10 MSEG CALL DELAY RETURN ;****************************************************** ;----------------------------------------------------------------------------- ; ; I2C ROTINAS PARA EEPROM 24C0X ; ;------------------------------------------------------------------------------- I2C_READ: ;reading 8 bits from i2c device MOVLW .8 MOVWF R7 GFD: BANK1 BSF TRISA,0 ;SDA= ENTRADA BANK0 BSF SCL BCF STATUS,C BTFSC SDA BSF STATUS,C RLF TEMP,F BCF SCL DECFSZ R7,F GOTO GFD MOVFW TEMP ;RETORNA EM 'W' OS 8 BITS LIDOS BANK1 BCF TRISA,0 ;SDA = SAIDA BANK0 RETURN I2C_WRITE: ;writing 8 bits in to i2c device MOVWF TEMP ;SALVA O DADO A ESCREVER MOVLW .8 MOVWF R7 WRITING: RLF TEMP,F BCF SDA BTFSC STATUS,C BSF SDA CALL CLOCK DECFSZ R7,F GOTO WRITING RETURN I2C_START: ;start of i2c routine BSF SCL BSF SDA NOP BCF SDA NOP BCF SCL RETURN I2C_STOP: ;end of i2c routine BCF SDA BSF SCL NOP BSF SDA NOP BCF SCL RETURN CLOCK: ;synchronizing clock BSF SCL NOP NOP NOP BCF SCL RETURN ACK: ;acknowledge from transmitter or receiver BSF SCL BANK1 BSF TRISA,0 ;ENTRADA BANK0 BTFSC SDA GOTO $-1 BCF SCL BANK1 BCF TRISA,0 ;SAIDA BANK0 RETURN NO_ACK: ;no acknowledge from transmitter or receiver BCF SCL BANK1 BSF TRISA,0 ;ENTRADA BANK0 BTFSS SDA GOTO $-1 BSF SCL BANK1 BCF TRISA,0 ;saida BANK0 RETURN ;***************************************************************** ; ROTINA DE ESCRITA NA EEPROM ;****************************************************************** EEWRITE1: ;COLOQUE ENDEREÇO EM 'ADDRESS','ADDRESS1' E DADO EM 'DYTA' EEPROM_WRITE: ;write in to eeprom CALL I2C_START CALL EEPROM_WRITE_ADDR CALL ACK ;MOV A,#0 ;USE SOMENTE PARA ADDRESS DUPLO ;LCALL I2C_WRITE ;LCALL ACK MOVFW ADDRESS CALL I2C_WRITE CALL ACK MOVFW DYTA CALL I2C_WRITE CALL ACK CALL I2C_STOP CALL DELAY_STOP RETURN ;*********************************************************************** ; ROTINA DE LEITURA NA EEPROM ;*********************************************************************** EEREAD1: ;COLOQUE ENDEREÇO EM 'ADDRESS' E RECEBA O DADO EM 'DYTA'E 'A' EEPROM_READ: ;LENDO A EEPROM CALL I2C_START CALL EEPROM_WRITE_ADDR CALL ACK ; MOVLW .0 ;SOMENTE PARA MEMORIAS COM ENDEREÇO DUPLO ; CALL I2C_WRITE ; CALL ACK MOVFW ADDRESS CALL I2C_WRITE CALL ACK CALL I2C_START CALL EEPROM_READ_ADDR CALL ACK CALL I2C_READ CALL NO_ACK CALL I2C_STOP MOVWF DYTA RETURN ;-------------------------------------------- ;EEPROM_READ_ADDR: ;A2,A1,A0 ZERAR ;MOVLW B'10100001' ;CALL I2C_WRITE ;RETURN ;EEPROM_WRITE_ADDR: ;A2,A1,A0 ZERAR ;MOVLW B'10100000' ;CALL I2C_WRITE ;RETURN EEPROM_READ_ADDR: ;ENDEREÇA PAGINA APONTADA POR ADDRESS1 E POSIÇÃO EM ADDRESS BSF STATUS,C RLF ADDRESS1,W ;DESLOCA ENDEREÇO DE ADDRESS PARA ESQ E COLOCA 1 (LEITURA) ADDLW 0XA0 ;SOMA OS 10100000B CALL I2C_WRITE RETURN EEPROM_WRITE_ADDR: ;ENDEREÇA PAGINA APONTADA POR ADDRESS1 E POSIÇÃO EM ADDRESS BCF STATUS,C RLF ADDRESS1,W ADDLW 0XA0 ;SOMA OS 10100000B CALL I2C_WRITE RETURN ;************************************************************************************************* ; APAGAMENTO GERAL DE TODAS AS PAGINAS DA EEPROM ;================================================================================================== ER_ALL_EEPROM: MOVLW .4 MOVWF R1 ; 4 PAGINAS DE 256 BYTES (24C08) CLRF ADDRESS1 ;PAGINA ZERO VAP1: CALL EEERASE ;APAGA TODA 256 (1 PAG) NA EEPROM INCF ADDRESS1,F ;INCREMENTA A PAGINA DECFSZ R1,F GOTO VAP1 RETURN ;************************************************************************************************* ; APAGAMENTO DE TODA UMA PAGINA DA EEPROM ;------------------------------------------------------------- EEERASE: ;APAGA TODAS AS POSIÇÕES DE MEMÓRIA SELECIONADA EM A0 (1=PAGINA HIGH/0=PAG LOW) MOVLW .32 MOVWF R6 ;32 PAGINAS DE 8 BYTES MOVLW .8 ; 8 BYTES POR PAGINA MOVWF R5 CLRF ADDRESS EET1: CALL I2C_START CALL EEPROM_WRITE_ADDR CALL ACK MOVFW ADDRESS CALL I2C_WRITE CALL ACK EET2: MOVLW 0XFF CALL I2C_WRITE CALL ACK DECFSZ R5,F GOTO EET2 CALL I2C_STOP CALL DELAY_STOP ; TEMPO DE GRAVAÇÃO MOVLW .8 ADDWF ADDRESS,F DECFSZ R6,F GOTO EET1 CALL DELAY_STOP RETURN ;******************************************************************* PTZERA: MOVLW HIGH(PONTM) ;PAGINA DO PONTEIRO MOVWF ADDRESS1 MOVLW LOW(PONTM) ;CARREGA ENDEREÇO DO PONTEIRO DA EEPROM MOVWF ADDRESS CLRF DYTA CALL EEWRITE1 INCF ADDRESS,F CALL EEWRITE1 RETURN ;======================================================================= ;************************************************************************** ; ROTINA PARA CONVERSÃO DE 16 BITS PARA 5 BCD (3BYTES) ; ; ; EX: C0=FF ; C1=FF ; SERÁ APÓS CONVERSÃO : ; RES2=06 , RES1=55 ,RES0=35 (OBS. VALOR MÁXIMO 65535) ;*************************************************************************** ; RESERVAR ESTES REGISTRADORES NA MEMÓRIA ( SRAM) ; LC data 20H ;LOOPCOUNTER ; BR0 data 21H ;RESULTADOS DA CONVERSÃO ; BR1 data 22H ; BR2 data 23H ; C1 data 24H ;VALOR DE ENTRADA ALTO ; C0 data 25H ;BAIXO HEX_DEC: MOVLW .16 MOVWF LC ;CARREGA 16 CLRF BR0 ;ZERA RESULTADOS CLRF BR1 CLRF BR2 VOLTA: BCF STATUS,C RLF C0,F ;DESLOCA PARA ESQUERDA C0,C1,BR0,1,2 RLF C1,F RLF BR0,F RLF BR1,F RLF BR2,F DECFSZ LC,F ;VERIFICA SE CHEGOU AO FIM DA CONVERSÃO GOTO SEG9 RETURN ;FI DA CONVERSÃO SEG9: MOVLW .3 ADDWF BR2,W ;SOMA 3 EM RES2 ANDLW .8 ; 2ELEV 3=8 XORLW .8 BTFSS STATUS,Z GOTO NSOMA3 ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOVLW .3 ADDWF BR2,F ; É=1 ENTAO SOMA 3 NSOMA3: MOVLW 0X30 ADDWF BR2,W ANDLW 0X80 XORLW 0X80 BTFSS STATUS,Z GOTO NSOMA3A ;É=0 ,ENTÃO NÃO SOMA 30h MOVLW 0X30 ; É=1 ENTAO SOMA 30h ADDWF BR2,F NSOMA3A: MOVLW .3 ADDWF BR1,W ;SOMA 3 EM RES2 ANDLW .8 ; 2ELEV 3=8 XORLW .8 BTFSS STATUS,Z GOTO NSOMA3B ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOVLW .3 ADDWF BR1,F ; É=1 ENTAO SOMA 3 NSOMA3B: MOVLW 0X30 ADDWF BR1,W ANDLW 0X80 XORLW 0X80 BTFSS STATUS,Z GOTO NSOMA3C ;É=0 ,ENTÃO NÃO SOMA 30h MOVLW 0X30 ; É=1 ENTAO SOMA 30h ADDWF BR1,F NSOMA3C: MOVLW .3 ADDWF BR0,W ;SOMA 3 EM RES2 ANDLW .8 ; 2ELEV 3=8 XORLW .8 BTFSS STATUS,Z GOTO NSOMA3D ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOVLW .3 ADDWF BR0,F ; É=1 ENTAO SOMA 3 NSOMA3D: MOVLW 0X30 ADDWF BR0,W ANDLW 0X80 XORLW 0X80 BTFSS STATUS,Z GOTO NSOMA3E ;É=0 ,ENTÃO NÃO SOMA 30h MOVLW 0X30 ; É=1 ENTAO SOMA 30h ADDWF BR0,F NSOMA3E: GOTO VOLTA ;======================================================================== ;OK CONV_ASC2: conv_asc2: ; converte 2 nibles hex em 2 nibles asc2 lsb=r1 msb=a MOVWF R0 ANDLW 0X0F ADDLW 0XF6 BTFSC STATUS,C GOTO LETRAS ADDLW 0X3A GOTO SAIQ LETRAS: ADDLW 0X41 SAIQ: MOVWF R1 SWAPF R0,F MOVFW R0 ANDLW 0X0F ADDLW 0XF6 BTFSC STATUS,C GOTO LETRAS1 ADDLW 0X3A GOTO SAIQ1 LETRAS1: ADDLW 0X41 SAIQ1: RETURN ;================================================================================= ; SUB-ROTINAS PIC ;================================================================================= ;******************************************************************* ;ENVIANDO FRASES PARA O LCD FRASEINIT MOVLW FRASE1 CALL ENV_LCD CALL LINE2 MOVLW FRASE2 CALL ENV_LCD RETURN FRASEAPM: MOVLW FRASE3 CALL ENV_LCD ;'REMOVER CONTROLE' RETURN FRASELIMITE_MAX: MOVLW FRASE4 CALL ENV_LCD ;''LIM.MAX MEMORIA' RETURN FRASEAP_TODOS: MOVLW FRASE5 CALL ENV_LCD;'APAGAR TODOS TX' RETURN FRASE_DIG: LINHA2 ;MUDA PARA LINHA 2 MOVLW FRASE6 CALL ENV_LCD;'DIG: 1=SIM 2=NA0' RETURN FRASECANC: MOVLW FRASE7 CALL ENV_LCD ;''APAG. CANCELADO!' RETURN FRASEAPOK: MOVLW FRASE8 CALL ENV_LCD ;''APAGAMENTO OK!!!' RETURN FRASECONFTODOS: MOVLW FRASE9 CALL ENV_LCD ;'CONFIRME:TODOS!' RETURN FRASETXAPRENDIDO: MOVLW FRASE10 CALL ENV_LCD ;'OK!TX APRENDIDO!' RETURN FRASEAGUARDE: MOVLW FRASE11 CALL ENV_LCD ;'AGUARDE........!' RETURN FRASEAP_UNICOTX: MOVLW FRASE12 CALL ENV_LCD ;'APAGAR UNICO TX' RETURN FRASEAP_ETX: MOVLW FRASE13 CALL ENV_LCD;'ESCOLHA N. TX' RETURN FRASEUP_DOWN: MOVLW FRASE14 CALL ENV_LCD ;'1=^R 2=^ L=E R=C' RETURN FRASE_RECEBETX: MOVLW LOW(FRASE15) CALL ENV_LCD ;'RECEBENDO TX N.:' RETURN FRASE_DESCONHECIDO: MOVLW LOW(FRASE16) CALL ENV_LCD ;'TX DESCONHECIDO!' RETURN FRASE_AGUARDANDO_TX: MOVLW LOW(FRASE17) CALL ENV_LCD ;'AGUARDANDO TX..!' 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 LcdInit movlw .30 ;Wait 30 ms call LcdDelay bcf LCD_RS ;Set LCD command mode bsf LCD_DB4 ;0011->48 bsf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 call LcdPulse_E ;sequência de reset call LcdPulse_E call LcdPulse_E bcf LCD_DB4 bcf LCD_DB6 bcf LCD_DB7 bsf LCD_DB5 call LcdPulse_E movlw 28H ;Set 4 bit data bus length call EC movlw 06H ;Entry mode set, increment, no shift call EC ; 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 EC LcdClear movlw 01H ;clear display call EC movlw .2 ;Wait 2 ms call LcdDelay return BIN_ASC_ED ;ROTINA DE BINARIO PARA HEX 0-F COM ENVIO PARA LCD ANDLW 0X0F ;LIMITA 0-F ADDLW 0XF6 ;SOMA 0XF6 BTFSC STATUS,C ;TESTA CARRY ADDLW 0X07 ;C=1 ,ENTÃO SOMA + 7 ADDLW 0X3A ;SOMA 0X3A ;ENVIA PARA O LCD E RETORNA PARA O PONTO DE CHAMADA ED LcdSendData bsf LCD_RS GOTO XENV LINE1 MOVLW 0X80 GOTO EC LINE2 MOVLW 0XC0 EC LcdSendCommand bcf LCD_RS XENV LcdSendByte movwf TR ;Send a byte to LCD by 4 bit data bus bcf LCD_DB4 bcf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 btfsc TR,4 bsf LCD_DB4 btfsc TR,5 bsf LCD_DB5 btfsc TR,6 bsf LCD_DB6 btfsc TR,7 bsf LCD_DB7 call LcdPulse_E bcf LCD_DB4 bcf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 btfsc TR,0 bsf LCD_DB4 btfsc TR,1 bsf LCD_DB5 btfsc TR,2 bsf LCD_DB6 btfsc TR,3 bsf LCD_DB7 call LcdPulse_E return ;LcdPulse_E ;CONFORME SEU LCD bsf LCD_E ;Enables LCD GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 bcf LCD_E ;Disabled LCD return LcdPulse_E bsf LCD_E ;Enables LCD movlw 1 ;Wait 1ms call LcdDelay bcf LCD_E ;Disabled LCD return END