;********************************************************************************************* ; BIG_GEN_MIX51E.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: 255 CONTROLE REMOTOS (MEMÓRIA 24C08) ; PARA DECODIFICAR UTILIZA UM ATMEL AT89C2051 DE 20 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 2 E 3 DO AT89C2051 SÃO AS SAIDAS QUE SERÁO USADAS PARA ACIONAR OUTROS DISPOSI ; TIVOS COMO RELES,LED,TRIAC,ETC, OU SEJA, A SUA APLICAÇÃO. APERTE O BOTÃO DA ESQ. DO CONTROLE ; QUE ACIONA O PINO 2, O BOTÃO DA DIREITA ACIONA O PINO 3 (APÓS APRENDER CONTROLE). ; PROJETO EXPERIMENTAL, SUJEITO A BUG'S EM USO. TESTADO SOMENTE EM PROTOBOARD. ; AUTOR: CLAUDIO LÁRIOS INICIO: 18-08-2012 TERMINO:18-08-2012 ; 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 6 DO AT89C2051 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: 255 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 (255 CONTROLES). ; USE LCD 2 X 16 PARA INDICAÇÃO VISUAL. ; USE CRISTAL 12 MHZ ;********************************************************************************************* ; UTILIZE EEPROM 24C08 ; PINAGENS: ; PINO 1= RESET - LIGAR A MASSA 22K E CAPACITOR 1UF AO VCC ; PINO 2= SAIDA 'S0' LED1 ; PINO 3= SAIDA 'S1' LED2 ; PINO 4/5= XTAL DE 12MHZ ; PINO 6= AO VCC VIA RESISTOR DE 10K E AO BOTÃO DE 'LEARN' A MASSA ; PINO 7= RESISTOR DE 470 OHMS AO LED DE 'LEARN' A MASSA. ; PINO 8= SDA DA 24C04 (DADO) + BOTÃO UP ; PINO 9= SCL DA 24C04 (CLOCK) + BOTÃO DOWN ; PINO 10= GND ; PINO 11= ENTRADA DO SINAL A DECODIFICAR VIA RESISTOR DE 470 OHMS A 1K ; PINO 12= ENTRADA INTERRUPTOR 'LENTO' A MASSA ; PINO 13= ENTRADA INTERRUPTOR 'RÁPIDO' A MASSA ; PINO 14= SAIDA E ; PINO 15= SAIDA RS ; PINO 16= SAIDA DB4 ; PINO 17= SAIDA DB5 ; PINO 18= SAIDA DB6 ; PINO 19= SAIDA DB7 ; PINO 20= VCC (+5V) ;***************************************************************************************** ; REGISTRADORES E REDEFINIÇÕES IND EQU R0 ; INDIRECT ADDRESS REGISTER RTCC EQU TH0 ; REAL TIME COUNTER CLOCK STATUS EQU PSW ; STATUS REGISTER PORTA EQU P3 ; PORT A DE P3,0 A P3,5 E 3.7 (INCOMPLETA) PORTB EQU P1 ; PORT B P1 DE P1,0 A P1,7 (COMPLETA) ; REGISTRADORES E CONTADORES ; ENDEREÇO 20H RESERVADO PARA MACROS PIC TEMP EQU 20H FLAGS EQU 21H ; USER FLAG REGISTER BOT EQU 22H TMP EQU 23H B1 EQU 24H ADDRESS EQU 25H ; ADDRESS REGISTER ADDRESS1 EQU 26H AUX EQU 27H DYTA EQU 28H ;DADOS DE ENTRADA E SAIDA NO I2C MEMORY QB EQU 29H Z3 EQU 2AH Z2 EQU 2BH Z1 EQU 2CH LC EQU 2DH HC EQU 2EH CONT EQU 2FH RES3A EQU 30H RES2A EQU 31H RES1A EQU 32H RES0A EQU 33H RES3 EQU 34H ; REGISTRADORES DE RECEPÇÃO DE BITS TRANSMITIDOS RES2 EQU 35H RES1 EQU 36H RES0 EQU 37H ; LC data 20H ;LOOPCOUNTER BR0 equ 38H ;RESULTADOS DA CONVERSÃO BR1 EQU 39H BR2 EQU 40H C1 EQU 41H ;VALOR DE ENTRADA ALTO C0 EQU 42H ;BAIXO ;DEFINIÇÕES DA PORTAS E FLAGS ;=============================================================================== SDA EQU P3.4 ; LINHA DE DADOS DA 24C02 PINO 8 SCL EQU P3.5 ; LINHA DE CLOCK DA 24C02 PINO 9 FLAGH EQU FLAGS.0 ;FLAG DE SITUAÇÃO FLAG1 EQU FLAGS.1 ;FLAG DE NOVA LEITURA FLAGGR EQU FLAGS.2 ;FLAG DE 'LEARN' APRENDER FLAGPA EQU FLAGS.3 ;FLAG DE PRE-AMBULO FLAGX EQU FLAGS.4 ;FLAG DE RECEPÇÃO OK HT6P FLAGY EQU FLAGS.5 ;FLAG RECEPÇÃO OK HCS RFIN EQU P3.7 ;PINO 11 IN RF LRN EQU P3.2 ;PINO 6 IN LEARN BOTTON LED EQU P3.3 ;PINO 7 SAIDA LED 'LEARN' LED1 EQU P3.0 ;PINO 2 - SAIDA DO LED2 LED2 EQU P3.1 ;PINO 3 - SAIDA DO LED1 DB7 EQU P1.7 ;PINO 19 - DISPLAYS DB6 EQU P1.6 ;PINO 18 - DISPLAY DB5 EQU P1.5 ;PINO 17 - DISPLAYS DB4 EQU P1.4 ;PINO 16 - DISPLAY RS EQU P1.3 ;PINO 15 - DISPLAY E EQU P1.2 ;PINO 14 - DISPLAY DOWN EQU P1.1 ;PINO 13 - BOTÃO 'RÁPIDO' N.1 UP EQU P1.0 ;PINO 12 - BOTÃO 'LENTO' N.2 LCD EQU P1 ;PORTA PARA ENVIO AO LCD ;VARIAVÉIS DE TEMPO E CARGA DE CONTADORES ;============================================================================== TMAX EQU 50D ;TEMPO MAXIMO DO SINAL LOW QBYTE EQU 28D ;QUANTIDADE DE BYTES A SER RECEBIDO (22 ADRESS+ 2 DADO + 4 ANTICODE) TGR EQU 200D ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO TAMG EQU 27H ;TEMPO MAXIMO EM TELA DE APAGAMENTO PONTM EQU 03FEH ;ENDEREÇO DO PONTEIRO DA MEMÓRIA EEPROM EXT. LEDACESO EQU 25D ;TEMPO QUE LED'S DA SAIDA FICAM ACESOS APÓS UM TOQUE LINHA1 EQU 080H ;LINHA1 LINHA2 EQU 0C0H ;LINHA2 LIMPA EQU 01H ;LIMPA TELA ;------------------------------------------------------------------------------ ORG 00H RESETA: START: MOV PORTA,#0H ;PORTA ; RESET PORTA MOV PORTB,#0H ;PORTB ; RESET PORTB MOV FLAGS,#0H ;FLAGS; RESET FLAGS MOV ADDRESS1,#0H ;PAGINA ZERO DA EEPROM ACALL LcdInit ;INICIALIZAÇÃO DO LCD ACALL fraseinit ;FRASE INICIAL ACALL RTSHOWR ;TEMPO DE APRESENTAÇÃO ACALL RLIMPA ;LIMPAR TELA ACALL 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 MOV ADDRESS,#LOW(PONTM) MOV ADDRESS1,#HIGH(PONTM) ACALL EEREAD1 CJNE A,#0FFH, INICIO MOV DYTA,#0H ACALL EEWRITE1 INC ADDRESS ACALL EEWRITE1 MOV Z2,#TGR ;CARGA DO TEMPO DO BOTÃO 'LEARN' APERTADO PARA ENTRAR NA 'FUNÇÃO DE APAGAMENTO' MOV Z1,#0H ;LIMPA REGISTRADORES INICIO: MOV RES3,#0H ;APAGA REGISTRADORES DE RECEPÇÃO DE CÓDIGO MOV RES2,#0H MOV RES1,#0H MOV RES0,#0H MOV QB,#QBYTE ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER L0: CLR FLAGH ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO MOV HC,#0H ;APAGA REGISTRADORES DE UNS E ZEROS MOV LC,#0H L1: SETB DOWN JB DOWN,PRT7 JNB DOWN,$ PRT7: SETB LRN ;LEVANTA PARA TESTE JB LRN,L1HZ ;TESTA BOTÃO 'LEARN' APERTADO AJMP TAPAGAMENTO ;APERTADO, COMEÇA A CONTAR TEMPO MAX. DE APAGAMENTO L1HZ: MOV Z2,#TGR ;CARGA DO TEMPO DO BOTÃO 'LEARN' MOV Z1,#0H ; L1H: LJMP SS5 TAPAGAMENTO: ;APAGAR TODOS OS CONTROLES DA MEMÓRIA DJNZ Z1,L1H ;QUANDO A CONTAGEM DESTE REGISTRADORES (Z1,Z2) CHEGAR AO FIM OCORRE 'MODO DE APAGAMENTO' DJNZ Z2,L1H ACALL RLIMPA ;LIMPA ACALL FRASEAPM ;FRASE :'REMOVER CONTROLE' ACALL RTSHOWR AJMP APAGA_ESCOLHA CANCEL: ACALL RLIMPA ;LIMPA DISPLAY E MUDA PARA LINHA 1 DO LCD ACALL FRASECANC ACALL RTSHOWR LJMP START APAGA_ESCOLHA: ACALL RLIMPA ACALL FRASEAP_UNICOTX ;MENSAGEM DE 'APAGAR UNICO TX?' ACALL RLINHA2 ACALL FRASE_DIG ;FRASE :'DIG:1=SIM 2=NAO' ACALL C_MAX AJMP VUT5B APAGAR_TODOSX: AJMP APAGAR_TODOS VUT5B: DJNZ Z1,VUT7Y DJNZ Z2,VUT7Y DJNZ Z3,VUT7Y AJMP START VUT7Y: SETB UP ;TESTA BOTÕES SETB DOWN JNB UP,APAGAR_TODOSX JB DOWN,VUT5B APAGAR_UM: ACALL RLIMPA ACALL FRASEAP_ETX ;MENSAGEM DE 'ESCOLHA N. DO TX' ACALL RTSHOWR ACALL RLIMPA ACALL FRASEUP_DOWN ;MENSAGEM 'DIG:L=E 1=^^ 2=^' ACALL RLINHA2 MOV ADDRESS1,#0H ;CONDIÇÃO INICIAL MOV ADDRESS,#1H ACALL C_MAX AJMP VFP5A ;MOSTRA SITUAÇÃO INICIAL VUT5C: DJNZ Z1,VUT7Z DJNZ Z2,VUT7Z DJNZ Z3,VUT7Z AJMP START VUT7Z: SETB UP ;TESTA BOTÕES SETB DOWN SETB LRN JNB LRN,APAGAR_NUM JNB UP,INC_NTX JB DOWN,VUT5C INC_NTX: MOV Z3,#TAMG ;EVITA SAIR POR TEMPO ENQUANTO ACERTANDO N. DO TX ACALL INC_ADDRESS MOV A,#1 CJNE A,ADDRESS1,VFP5A MOV A,#55H CJNE A,ADDRESS,VFP5A MOV ADDRESS1,#0H ;ZERA CONTAGEM MOV ADDRESS,#1H VFP5A: MOV C1,ADDRESS1 ;CARREGA REGISTRADOR DE CONVERSÃO MOV C0,ADDRESS ACALL HEX_DEC ;CHAMA ROTINA DE CONVERSÃO HEX PARA DECIMAL ACALL RLINHA2 ;MUDA PARA 2ºLINHA MOV A,BR1 LCALL conv_asc2 MOV A,R1 ACALL ED MOV A,BR0 LCALL conv_asc2 ACALL ED MOV A,R1 ACALL ED MOV A,#10H JB DOWN,SS4R ;DOWN =1 AJUSTE LENTO MOV A,#1H SS4R: ACALL DELAYM AJMP VUT5C ;=========================================== APAGAR_NUM: ;TEM QUE MULTIPLICAR 16 BITS POR 4 E COLOCAR EM ADDRESS1,ADDRESS MOV A,#4H MOV B,ADDRESS MUL AB MOV ADDRESS,A MOV B1,B ;SALVA B MOV A,#4H MOV B,ADDRESS1 MUL AB ADD A,B1 MOV ADDRESS1,A ;============================================================ ACALL DEC_ADDRESS ;APAGA 4 BYTES MOV DYTA,#0FFH ACALL EEWRITE1 ;APAGA ENDEREÇO APONTADO POR ADDRESS1,ADDRESS ACALL DEC_ADDRESS ACALL EEWRITE1 ACALL DEC_ADDRESS ACALL EEWRITE1 ACALL DEC_ADDRESS ACALL EEWRITE1 AJMP SAPAG ;SAI COM MENSAGEM DE 'APAGAMENTO OK' APAGAR_TODOS: ACALL RLIMPA ACALL FRASEAP_TODOS ;MENSAGEM DE 'APAGAR TODOS TX' ACALL RTSHOWUR ACALL C_MAX AJMP VUT5 CANCELX: AJMP CANCEL VUT5: DJNZ Z1,VUT7W DJNZ Z2,VUT7W DJNZ Z3,VUT7W AJMP START VUT7W: SETB UP ;TESTA BOTÕES SETB DOWN JNB UP,CANCELX JB DOWN,VUT5 ACALL RLINHA1 ACALL FRASECONFTODOS MOV A,#15H ACALL DELAYM ACALL C_MAX VUT6: DJNZ Z1,VUT7Q DJNZ Z2,VUT7Q DJNZ Z3,VUT7Q AJMP START C_MAX: MOV Z3,#TAMG MOV Z2,#0H ;CARGA DO TEMPO MAXIMO ANTES DE VOLTAR AO INICIO MOV Z1,#0H ;LIMPA REGISTRADORES RET VUT7Q: SETB UP ;TESTA BOTÕES SETB DOWN JNB UP,CANCELX JB DOWN,VUT6 ACALL RLIMPA ;LIMPA TELA ACALL FRASEAGUARDE ; MENSAGEM 'AGUARDE......' ACALL ER_ALL_EEPROM ;APAGAR TODOS TX DA MEMÓRIA ACALL PTZERA ;POEM '00' NO PONTEIRO DA EEPROM SAPAG: ACALL RLIMPA ;LIMPA TELA ACALL FRASEAPOK ;FRASE 'APAGAMENTO OK!!!' ACALL RTSHOWR SETB LRN JNB LRN,$ ;AGUARDA SOLTAR BOTÃO 'LEARN' LJMP START ;TLINHA1: ;MOV A,#LINHA1 ;ACALL EC ;RET ;TLINHA2: ;MOV A,#LINHA2 ;ACALL EC ;RET RECEIVE: ;INICIA ROTINA DE RECEPÇÃO DE SINAL DO HT6P20B/HCS200...301 ;========================================================== SS5: JNB FLAGH , L2 ;TESTA FLAG DE HUM RECEBIDO ;FLAG=0 VAI PARA L2 SETB RFIN ;LEVANTA PARA TESTE FLAG=1 JB FLAGPA,W47 JNB RFIN, MO ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF SIN=0 VAI PARA 'MO' AJMP L2 W47: JNB FLAGPA,W48 SETB RFIN JB RFIN,MO W48: L2: SETB RFIN ;LEVANTA PARA TESTE JNB RFIN, LA1 ;SIN=0 VAI INCREMENTAR LC EM 'LA1' JB FLAGPA,W45 ;SIN=1 VAI INCREMENTAR HC E SETAR FLAG SETB FLAGH ;SIN=1 W45: INC HC MOV A,HC JNZ LA2 DEC HC LJMP LA2 ;VAI PARA 'LA2' CONTAR TEMPO DE 50 MICRO SEGUNDOS LA1: JNB FLAGPA,W46 SETB FLAGH ;SIN=1 W46: INC LC ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF MOV A,LC JNZ LA2 DEC LC LA2: MOV R0,#12D ; 24D = 50 MICROSEG DELAY (ACERTA TEMPO ENTRE LEITURAS DA ENTRADA DE RF) DJNZ R0,$ LJMP L1 MO: ;OK LC>TMAX C=0 (VAI PARA O INICIO) CLR C ;TESTA SE NÃO PASSOU DO LIMITE MAXIMO DE TEMPO EM LOW NA ENTRADA DE RF MOV A,LC SUBB A,#TMAX JC NK MOV A,QB CJNE A,#17D,F23 ;SE A=17, ENTÃO É UM PREAMBULO DO HCS. SETB FLAGPA MOV QB,#63D ;SE SETADO, TRANSMISSÃO HCS SETB RFIN ;ESPERA RFIN FICAR =1 JNB RFIN,$ AJMP L0 F23: CLR FLAGPA MOV QB,#28D AJMP INICIO ;=============================================================================================== NK: ;OK C=1 SE LC>HC ;G SEG58: MOV A,HC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) CLR C SUBB A,LC MOV A,RES3 ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRC A MOV RES3,A MOV A,RES2 RRC A MOV RES2,A MOV A,RES1 RRC A MOV RES1,A MOV A,RES0 RRC A MOV RES0,A AJMP SEG44 XLO: AJMP L0 ;LE PROXIMO BIT ;------------------------------------- SEG44: ;H DJNZ QB,XLO ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO JB FLAGPA, SEG66 MOV QB,#4D ;DESPREZA OS 4 BITS DE 'ANTICODE' 1010 ACERTA: CLR C MOV A,RES3 ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRC A MOV RES3,A MOV A,RES2 RRC A MOV RES2,A MOV A,RES1 RRC A MOV RES1,A MOV A,RES0 RRC A MOV RES0,A ;RESULTADO FICA SOMENTE EM RES2 A RES0,DESPREZA RES3 DJNZ QB,ACERTA JB FLAG1,PULA1 MOV RES2A,RES2 ;SALVA A PRIMEIRA LEITURA PARA COMPARAÇÃO COM UMA SEGUNDA MOV RES1A,RES1 MOV RES0A,RES0 SETB FLAG1 ;SETA FLAG DE PRIMEIRA RECEPÇÃO MOV QB,#28D AJMP INICIO PULA1: CLR FLAG1 ;SEGUNDA RECEPÇÃO, COMPARA COM A PRIMEIRA MOV A, RES2 CJNE A,RES2A,ERROR MOV A,RES1 CJNE A,RES1A,ERROR MOV A,RES0 CJNE A,RES0A,ERROR ;ERRO DE RECEPÇAO SETB FLAGX ;OK - BOA RECEPÇÃO HT6P20B MOV QB,#28D AJMP ROT_HT6P SEG66: SETB FLAGY ;OK - BOAS RECEPÇÃO HCS CLR FLAG1 MOV QB,#28D CLR FLAGPA AJMP ROT_HCS ERROR: MOV RES3A,#0H MOV RES2A,#0H ; APAGA RESULTADOS DE COMPARAÇÃO MOV RES1A,#0H MOV RES0A,#0H SAI_ROT: CLR FLAGX CLR FLAGH MOV QB,#28D LJMP INICIO ROT_HCS: MOV A,RES3 ;SALVA NIBLE DOS BOTÕES ANL A,#0F0H MOV BOT,A MOV A,RES3 ANL A,#0FH MOV RES3,A ;APAGA BOTÕES AJMP ACAO ROT_HT6P: MOV RES3,#0H ;APAGA (SEM USO) MOV A,RES2 ;SALVA NIBLE DOS BOTÕES CLR C RRC A ;ACERTA POSIÇÃO CORRETA DE SAIDA ANL A,#01100000B MOV BOT,A ;SOMENTE 'LED1' E 'LED2' MOV A,RES2 ANL A,#0FH MOV RES2,A ;APAGA BOTÕES VAC: ;====================================================================== ;INICIA O TRATAMENTO DOS DADOS RECEBIDOS ;====================================================================== ACAO: ACALL RLIMPA ACALL FRASE_RECEBETX SGH2: ;I SETB LRN ;LEVANTA PARA TESTE JB LRN,F55 ;BOTÃO ESTÁ APERTADO? NÃO SETB FLAGGR ;SIM F55: ACALL PPT ;PEGA PAGINA/ENDEREÇO NO PONTEIRO CJNE A,#0H,MADDRESS ; É '0'? 0=NENHUM CONTROLE FOI GRAVADO MOV A,B ; ENDEREÇO DA PAGINA EM 'B' CJNE A,#0H,MADDRESS ;COMPARA TAMBÉM SE A PAGINA É '0' LJMP APRENDER MADDRESS: F27: MOV ADDRESS1,B ;CARREGA A PAGINA MOV ADDRESS,B1 ;CARREGA ULTIMO ENDEREÇO GRAVADO ACALL EEREAD1 CJNE A,RES3,PROXIMO ;COMPARA COM RES3 ACALL DEC_ADDRESS ;DECREMENTA ADDRESS/ADDRESS1 ACALL EEREAD1 CJNE A,RES2,PROXIMO ;COMPARA COM RES2 ACALL DEC_ADDRESS ;DECREMENTA ADDRESS/ADDRESS1 ACALL EEREAD1 CJNE A,RES1,PROXIMO ;COMPARA COM RES1 ACALL DEC_ADDRESS ;DECREMENTA ADDRESS/ADDRESS1 ACALL EEREAD1 CJNE A,RES0,PROXIMO ;COMPARA COM RES0 AJMP ACIONAR ;ENCONTRADO CONTROLE NA MEMÓRIA ;==================================================================== ; DECREMENTA ENDEREÇO DA EEPROM DEC_ADDRESS: DEC ADDRESS MOV A,#0FFH CJNE A,ADDRESS,SEG26 DEC ADDRESS1 SEG26: RET ;==================================================================== PROXIMO: MOV ADDRESS,B1 ;RECUPERA ADDRES/ADDRESS1 SEM TER SIDO ALTERADOS MOV ADDRESS1,B MOV A,ADDRESS CLR C SUBB A,#4H ;SUBTRAI 4 POSIÇÕES MOV ADDRESS,A JNC SFE MOV A,ADDRESS1 CLR C SUBB A,#1 MOV ADDRESS1,A JNC SFE AJMP APRENDER ;CONTROLE NÃO ENCONTRADO NA MEMÓRIA,VAI PARA 'APRENDER' SFE: MOV B1,ADDRESS MOV B,ADDRESS1 AJMP MADDRESS ;VAI PARA O PROXIMO ENDEREÇO DE MEMÓRIA .PROCURAR.... APRENDER: JB FLAGGR,F21A ;TESTA SE BOTÃO 'LEARN' FOI PRESSIONADO ACALL RLINHA2 ACALL FRASE_DESCONHECIDO MOV A,#1H ACALL DELAYM LJMP INICIO ;NÃO ESTÁ. F21A: ACALL PPT ;ESTÁ, PEGA PONTEIRO ;RETORNA EM 'W' E 'DYTA'O ENDEREÇO E EM 'B' A PAGINA MOV ADDRESS,A ;CARREGA 'ADDRESS' MOV ADDRESS1,B ;CARREGA A PAGINA CLR C ;LIMITE UTIL MAXIMO DE ENDEREÇO DE UMA PAGINA DA EEPROM SUBB A,#0F8H ;PEGA O ENDEREÇO APONTADO ;LIMITE MAXIMO DA EEPROM 3FC (3FD LIVRE,3FE /3FF =PONTEIRO) JC FG32 ;VERIFICA SE ESTÁ NA ULTIMA PAGINA (3) MOV A,B CJNE A,#03H, FG32 ;SE JUMP ,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'. MOV ADDRESS1,#0H ;ZERA ENDEREÇO DA EEPROM MOV ADDRESS,#0H VOE1: ACALL EEREAD1 CJNE A,#0FFH, SK1 ACALL INC_ADDRESS ACALL EEREAD1 CJNE A,#0FFH, SK2 ACALL INC_ADDRESS ACALL EEREAD1 CJNE A,#0FFH, SK3 ACALL INC_ADDRESS ACALL EEREAD1 CJNE A,#0FFH, SK4 AJMP END_LIVRE SK1: ACALL INC_ADDRESS SK2: ACALL INC_ADDRESS SK3: ACALL INC_ADDRESS SK4: ACALL INC_ADDRESS MOV A,ADDRESS ;CARREGA 'ADDRESS' CLR C ;LIMITE UTIL MAXIMO DE ENDEREÇO DE UMA PAGINA DA EEPROM SUBB A,#0FBH ;PEGA O ENDEREÇO APONTADO ;LIMITE MAXIMO DA EEPROM 3FC (3FD LIVRE,3FE /3FF =PONTEIRO) JC FG55 ;VERIFICA SE ESTÁ NA ULTIMA PAGINA (3) MOV A,ADDRESS1 ;COMPARA A PAGINA CJNE A,#03H, FG55 ;TESTA PROXIMO ENDEREÇO SE ESTÁ LIVRE AJMP MEM_CHEIA ;NÃO ENCONTRADO ENDEREÇO LIVRE; AVISA SITUAÇÃO MENSAGEM E NÃO ACEITA CONTROLES NOVOS FG55: AJMP VOE1 END_LIVRE: ACALL DEC_ADDRESS ACALL DEC_ADDRESS ACALL DEC_ADDRESS ;ACERTA ENDEREÇO PARA POSIÇÃO CORRETA ACALL W_RES3_0 ;ESCREVE RES2 A 0 NA EEPROM AJMP PUL_GR ;FINALIZA A GRAVAÇAO COM A MENSAGEM DE 'TX APRENDIDO'. MEM_CHEIA: ;============================================================================================== ; ENVIAR MENSAGEM NO DISPLAY DE 'MEMÓRIA CHEIA' MOV A,#LIMPA ACALL ENVCOM ACALL FRASELIMITE_MAX ACALL RTSHOW ;TEMPO DE APRESENTAÇÃO JNB LRN,$ ;ESPERA SOLTAR BOTÃO LJMP RESETA ;================================================================================================== ;INCREMENTA ENDEREÇOS DA EEPROM INC_ADDRESS: INC ADDRESS MOV A,ADDRESS JNZ SYE2 INC ADDRESS1 SYE2: RET ;====================================================================================================== FG32: MOV A,ADDRESS1 ;NO ENDEREÇO INICIAL '00' NÃO INCREMENTA PARA NÃO DEIXAR CASA VAZIA NA EEPROM JNZ FG34 MOV A,ADDRESS JZ FG33 FG34: ACALL INC_ADDRESS FG33: ACALL W_RES3_0 ;SALVA ENDEREÇO DO ULTIMO CONTROLE GRAVADO GRAVADO NA EEPROM MOV DYTA,ADDRESS1 ;SALVA PAGINA NO PONTEIRO PONTMH MOV B,ADDRESS ;SALVA ENDEREÇO DO PONTEIRO PONTML MOV ADDRESS1,#HIGH(PONTM) ;ENDEREÇA POSIÇÃO DO PONTEIRO MOV ADDRESS,#LOW(PONTM) ACALL EEWRITE1 MOV DYTA,B ;SALVA ULTIMA POSIÇÃO NO PONTEIRO INC ADDRESS ACALL EEWRITE1 ;GRAVA NOVO ENDEREÇO DE PONTEIRO ;================================================================= PUL_GR: CLR FLAGGR SETB LRN ;SETA PARA TESTE JNB LRN,$ ;ESPERA SOLTA BOTÃO 'LEARN' ACALL RLIMPA ;LIMPA TELA ACALL FRASETXAPRENDIDO ;FRASE 'OK! TX APRENDIDO' ACALL RTSHOWUR ;TEMPO DE APRESENTAÇÃO AJMP INICIO ;OK, FOI APRENDIDO O TX ACIONAR: ;======================================== ;MOSTRA O NUMERO DO CONTROLE ACIONADO MOV A,#0C7H ;CENTRALIZA O NUMERO DO CONTROLE RECEBIDO NO VISOR, NA 2ºLINHA ACALL EC MOV ADDRESS,B1 ;RECUPERA VALOR DA POSIÇÃO DE MEMÓRIA MOV ADDRESS1,B MOV R7,#4 V67A: CLR C MOV A,ADDRESS RLC A MOV ADDRESS,A MOV A,ADDRESS1 RLC A MOV ADDRESS1,A DJNZ R7,V67A MOV A,ADDRESS1 MOV B,#4 DIV AB MOV ADDRESS1,B MOV C1,A ;SALVA EM C1 2NIBLLES MOV R7,#4 V67B: CLR C MOV A,ADDRESS RLC A MOV ADDRESS,A MOV A,ADDRESS1 RLC A MOV ADDRESS1,A DJNZ R7,V67B MOV A,ADDRESS1 MOV B,#4 DIV AB SWAP A MOV C0,A ;SALVA EM C0 MOV R7,#4 V67C: CLR C MOV A,C1 RRC A MOV C1,A MOV A,C0 RRC A MOV C0,A DJNZ R7,V67C ;============================================================== ;ELIMINA CONTROLE ZERO MUDANDO PARA '1' INC C0 MOV A,C0 JNZ SDT1 INC C1 ;========================================================================= SDT1: ACALL HEX_DEC MOV A,BR1 LCALL conv_asc2 ;ACALL ED ;ULTIMO ZERO MOV A,R1 ACALL ED MOV A,BR0 LCALL conv_asc2 ACALL ED MOV A,R1 ACALL ED ;========================================================================== ;TESTA QUAIS BOTÕES FORAM ACIONADOS NA TRANSMISSÃO E ACIONA LEDS NA SAIDA JNB BOT.6,PY5 SETB LED2 ;ATIVA LED2 PY5: JNB BOT.5,PY4 SETB LED1 ;ATIVA LED1 PY4: MOV A,#LEDACESO ACALL DELAYM ;TEMPO QUE SE MANTEM ACESOS CLR LED1 CLR LED2 MOV BOT,#0H LJMP INICIO ;****************************************************************** ; ; ROTINAS DE DELAY E OUTRAS ; ;****************************************************************** W_RES3_0: ;ESCREVE RES3 ..0 NA EEPROM ;================================================================ MOV DYTA,RES0 ;CARREGA REGISTRO DE GRAVAÇÃO ACALL EEWRITE1 ;ROTINA DE ESCRITA NA EEPROM ACALL INC_ADDRESS ;PROXIMA POSIÇÃO DE ESCRITA NA EEPROM MOV DYTA,RES1 ;CARREGA REGISTRO DE GRAVAÇÃO ACALL EEWRITE1 ACALL INC_ADDRESS ;PROXIMA POSIÇÃO DE ESCRITA NA EEPROM MOV DYTA,RES2 ;CARREGA REGISTRO DE GRAVAÇÃO ACALL EEWRITE1 ACALL INC_ADDRESS ;PROXIMA POSIÇÃO DE ESCRITA NA EEPROM MOV DYTA,RES3 ;CARREGA REGISTRO DE GRAVAÇÃO ACALL EEWRITE1 RET ;=============================================================== DELAYM: MOV R0,A XC: ACALL AGUARDE DJNZ R0,XC RET ;**************************************************** ;PEGA PONTEIRO NA EEPROM - ULTIMO ENDEREÇO 'B'= PAGINA 'A'=ADDRESS PPT: MOV ADDRESS1,#HIGH(PONTM) ;PAGINA DO PONTEIRO MOV ADDRESS,#LOW(PONTM) ;ENDEREÇO DENTRO DA PAGINA ACALL EEREAD1 ;LE PONTEIRO DA EEPROM MOV B,A ;SALVA PAGINA INC ADDRESS ACALL EEREAD1 ; MOV B1,A ;SALVA EM B1 RET ;**************************************************** AGUARDE: ;ROTINA DE ATRASO ENTRE OPERAÇÕES DE EEPROM MOV R1,#64D CG2: MOV R2,#255D DJNZ R2,$ DJNZ R1,CG2 RET ;****************************************************** ;----------------------------------------------------------------------------- ; ; I2C ROTINAS PARA EEPROM 24C0X ; ;------------------------------------------------------------------------------- I2C_READ: ;reading 8 bits from i2c device MOV R7,#8 GFD: SETB SDA ;LEVANTA PARA LEITURA SETB SCL MOV C,SDA RLC A NOP CLR SCL DJNZ R7,GFD RET I2C_WRITE: ;writing 8 bits in to i2c device MOV R7,#8 WRITING: RLC A MOV SDA,C LCALL CLOCK DJNZ R7,WRITING RET I2C_START: ;start of i2c routine SETB SCL SETB SDA NOP CLR SDA NOP CLR SCL RET I2C_STOP: ;end of i2c routine CLR SDA SETB SCL NOP SETB SDA NOP CLR SCL RET CLOCK: ;synchronizing clock SETB SCL NOP CLR SCL RET ACK: ;acknowledge from transmitter or receiver SETB SDA SETB SCL JB SDA,$ CLR SCL RET NO_ACK: ;no acknowledge from transmitter or receiver SETB SDA NOP CLR SCL NOP JNB SDA,$ NOP SETB SCL RET ;***************************************************************** ; ROTINA DE ESCRITA NA EEPROM ;****************************************************************** EEWRITE1: ;COLOQUE ENDEREÇO EM 'ADDRESS' E DADO EM 'DYTA' EEPROM_WRITE: ;write in to eeprom LCALL I2C_START LCALL EEPROM_WRITE_ADDR LCALL ACK ;MOV A,#0 ;USE SOMENTE PARA ADDRESS DUPLO ;LCALL I2C_WRITE ;LCALL ACK MOV A,ADDRESS LCALL I2C_WRITE LCALL ACK MOV A,DYTA LCALL I2C_WRITE LCALL ACK LCALL I2C_STOP LCALL DELAY_STOP RET ;*********************************************************************** ; ROTINA DE LEITURA NA EEPROM ;*********************************************************************** EEREAD1: ;COLOQUE ENDEREÇO EM 'ADDRESS' E RECEBA O DADO EM 'DYTA'E 'A' EEPROM_READ: ;LENDO A EEPROM LCALL I2C_START LCALL EEPROM_WRITE_ADDR LCALL ACK ;MOV A,#0 ;SOMENTE PARA MEMORIAS COM ENDEREÇO DUPLO ;LCALL I2C_WRITE ;LCALL ACK MOV A,ADDRESS LCALL I2C_WRITE LCALL ACK LCALL I2C_START LCALL EEPROM_READ_ADDR LCALL ACK LCALL I2C_READ LCALL NO_ACK LCALL I2C_STOP MOV DYTA,A RET ;-------------------------------------------- ;EEPROM_READ_ADDR: ;A2,A1,A0 ZERAR ;MOV A,#10100001B ;LCALL I2C_WRITE ;RET ;EEPROM_WRITE_ADDR: ;A2,A1,A0 ZERAR ;MOV A,#10100000B ;LCALL I2C_WRITE ;RET EEPROM_READ_ADDR: ;ENDEREÇA PAGINA APONTADA POR ADDRESS1 E POSIÇÃO EM ADDRESS SETB C MOV A,ADDRESS1 ;DESLOCA ENDEREÇO DE ADDRESS PARA ESQ E COLOCA 1 (LEITURA) RLC A ADD A,#0A0H ;SOMA OS 10100000B LCALL I2C_WRITE RET EEPROM_WRITE_ADDR: ;ENDEREÇA PAGINA APONTADA POR ADDRESS1 E POSIÇÃO EM ADDRESS CLR C MOV A,ADDRESS1 ;DESLOCA ENDEREÇO DE ADDRESS PARA ESQ E COLOCA 0 (ESCRITA) RLC A ADD A,#0A0H ;SOMA OS 10100000B LCALL I2C_WRITE RET DELAY_STOP: ;FIM DA LEITURA MOV R4,#20 VH1: MOV R3,#250 DJNZ R3,$ DJNZ R4,VH1 RET ;************************************************************************************************* ; APAGAMENTO GERAL DE TODAS AS PAGINAS DA EEPROM OK- TESTADO ;================================================================================================== ER_ALL_EEPROM: MOV R1,#4D ; 4 PAGINAS DE 256 BYTES (24C08) MOV ADDRESS1,#0H ;PAGINA ZERO VAP1: ACALL EEERASE ;APAGA TODA 256 (1 PAG) NA EEPROM INC ADDRESS1 ;INCREMENTA A PAGINA DJNZ R1,VAP1 RET ;************************************************************************************************* ; 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) MOV R6,#32 ;32 PAGINAS DE 8 BYTES MOV R5,#8 ; 8 BYTES POR PAGINA MOV ADDRESS,#0H EET1: LCALL I2C_START LCALL EEPROM_WRITE_ADDR LCALL ACK MOV A,ADDRESS LCALL I2C_WRITE LCALL ACK EET2: MOV A,#0FFH LCALL I2C_WRITE LCALL ACK DJNZ R5,EET2 LCALL I2C_STOP ACALL DELAY_STOP ; TEMPO DE GRAVAÇÃO MOV A,#8 ADD A,ADDRESS MOV ADDRESS,A DJNZ R6,EET1 LCALL DELAY_STOP RET ;******************************************************************* PTZERA: MOV ADDRESS1,#HIGH(PONTM) ;PAGINA DO PONTEIRO MOV ADDRESS,#LOW(PONTM) ;CARREGA ENDEREÇO DO PONTEIRO DA EEPROM MOV DYTA,#0H ACALL EEWRITE1 INC ADDRESS ACALL EEWRITE1 RET ;******************************************************************* ;ROTINAS DE LCD fraseinit: mov r0,#16 mov dptr,#frase1 setb RS acall envfrase mov a,#0C0h ;linha 2 acall envcom mov r0,#16 mov dptr,#FRASE2 AJMP SAIF FRASEAPM: mov r0,#16 mov dptr,#frase3 ;'REMOVER CONTROLE' AJMP SAIF FRASELIMITE_MAX: mov r0,#16 mov dptr,#frase4 ;''LIM.MAX MEMORIA' AJMP SAIF FRASEAP_TODOS: mov r0,#16 mov dptr,#frase5 ;'APAGAR TODOS TX' SETB RS ACALL envfrase FRASE_DIG: ACALL RLINHA2 ;MUDA PARA LINHA 2 mov r0,#16 mov dptr,#frase6 ;'DIG: 1=SIM 2=NA0' AJMP SAIF FRASECANC: mov r0,#16 mov dptr,#frase7 ;''APAG. CANCELADO!' AJMP SAIF FRASEAPOK: mov r0,#16 mov dptr,#frase8 ;''APAGAMENTO OK!!!' AJMP SAIF FRASECONFTODOS: mov r0,#16 mov dptr,#frase9 ;'CONFIRME:TODOS!' AJMP SAIF FRASETXAPRENDIDO: mov r0,#16 mov dptr,#frase10 ;'OK!TX APRENDIDO!' AJMP SAIF FRASEAGUARDE: mov r0,#16 mov dptr,#frase11 ;'AGUARDE........!' AJMP SAIF FRASEAP_UNICOTX: mov r0,#16 mov dptr,#frase12 ;'APAGAR UNICO TX' AJMP SAIF FRASEAP_ETX: mov r0,#16 mov dptr,#frase13 ;'ESCOLHA N. TX' AJMP SAIF FRASEUP_DOWN: mov r0,#16 mov dptr,#frase14 ;'1=^R 2=^ L=E R=C' AJMP SAIF FRASE_RECEBETX: mov r0,#16 mov dptr,#frase15 ;'RECEBENDO TX N.:' AJMP SAIF FRASE_DESCONHECIDO: mov r0,#16 mov dptr,#frase16 ;'TX DESCONHECIDO!' AJMP SAIF FRASE_AGUARDANDO_TX: mov r0,#16 mov dptr,#frase17 ;'AGUARDANDO TX..!' AJMP SAIF SAIF: setb RS acall envfrase RET frase1: db 'BIG_GEN_MIX_51_E' FRASE2: db 'LARIOS.TECNOL.WS' FRASE3: DB 'REMOVER CONTROLE' FRASE4: DB 'LIM. MAX MEMORIA' FRASE5: DB 'APAGAR TODOS TX?' FRASE6: DB 'DIG: 1=SIM 2=NAO' FRASE7: DB 'APAG. CANCELADO!' FRASE8: DB 'APAGAMENTO OK!!!' FRASE9: DB 'CONFIRME: TODOS!' FRASE10: DB 'OK! TX APRENDIDO' FRASE11: DB 'AGUARDE ........' FRASE12: DB 'APAGAR UNICO TX?' FRASE13: DB 'ESCOLHA N. DO TX' FRASE14: DB '1=^R 2=^ L=E R=C' FRASE15: DB 'RECEBENDO TX N.:' FRASE16: DB 'TX DESCONHECIDO!' FRASE17: DB 'AGUARDANDO TX..!' ; rotina de inicialização do display LcdISeq: db 33H, 32H, 28H, 6H, 1H, 0FH, 0CH ;================================================= ; ROTINA DE INICIALIZAÇÃO DO LCD LcdInit: mov r0, #7 ; envia 7 bytes mov dptr, #LcdISeq clr RS ;comando ajmp envfrase ED: envdado: setb rs mov r0,#1h ajmp envbyte EC: envcom: clr rs mov r0,#1h ajmp envbyte envfrase: ; coloque em r0 a quantidade de bytes a enviar ;use diretiva db xxh,xxh. ..... ;coloque em dptr o endereço do byte(s) a enviar ;rs=0 comando, rs=1 caracteres; rw=0 escrita, rw=1 leitura ; use acall 'envfrase'. clr a movc a, @a+dptr ; obtem sequencia de bytes inc dptr ; coloque 1 em r0, ajuste rs=1, rw=0 e coloque em'a' ; o caracter a enviar. use acall 'envbyte' envbyte: mov r4, #2 ; envia 2 nibbles mov r5, a ; guarda o byte em r5 LcdLoop2: anl a, #0F0H ;mov LCD, a anl LCD, #00001111b ;apaga lcd4..lcd7 e rs orl LCD, a setb E ;habilita display a receber nop clr E mov r7, #10 ; reliza um pouco de atraso LcdILoop3: ; porque 'buzy' não pode ser lido ainda djnz r6, LcdILoop3 djnz r7, LcdILoop3 mov a, r5 ; pega o byte original em r5 swap a ; obtem o primeiro nibble djnz r4, LcdLoop2 ; envia o segundo nibble djnz r0, envfrase ; volta a envia os 7 bytes ret ;rotina de atraso em ms passado pelo 'a' delayms: mov R7,a volta3: mov R6,#2 volta2: mov R5,#250 volta1: djnz R5, volta1 djnz R6, volta2 djnz R7,volta3 ret ;=========================================================== ;MUDA PARA LINHA1 RLINHA1: MOV A,#LINHA1 SJMP XH10 ;MUDA PARA LINHA 2 RLINHA2: MOV A,#LINHA2 SJMP XH10 ;LIMPA A TELA RLIMPA: MOV A,#01H XH10: ACALL EC RET ;TEMPO DE APRESENTAÇÃO DA MENSAGEM NO VISOR DO LCD RTSHOW: MOV A,#65H SJMP XH9 RTSHOWUR: MOV A,#5H SJMP XH9 RTSHOWR: MOV A,#25H XH9: ACALL DELAYM RET ;======================================================================= ;************************************************************************** ; 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: MOV LC,#16 ;CARREGA 16 MOV BR0,#0 ;ZERA RESULTADOS MOV BR1,#0 MOV BR2,#0 VOLTA: MOV A, C0 ;DESLOCA PARA ESQUERDA C0,C1,RES0,1,2 CLR C RLC A MOV C0,A MOV A, C1 RLC A MOV C1,A MOV A, BR0 RLC A MOV BR0,A MOV A, BR1 RLC A MOV BR1,A MOV A, BR2 RLC A MOV BR2,A DJNZ LC ,SEG9 ;VERIFICA SE CHEGOU AO FIM DA CONVERSÃO RET ;FI DA CONVERSÃO SEG9: MOV A,#3H ADD A,BR2 ;SOMA 3 EM RES2 ANL A,#8H ; 2ELEV 3=8 CJNE A,#8H ,NSOMA3 ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOV A,#3H ; É=1 ENTAO SOMA 3 ADD A,BR2 MOV BR2,A NSOMA3: MOV A,#30H ADD A,BR2 ANL A,#80H CJNE A,#80H ,NSOMA3A ;É=0 ,ENTÃO NÃO SOMA 30h MOV A,#30H ; É=1 ENTAO SOMA 30h ADD A,BR2 MOV BR2,A NSOMA3A: MOV A,#3H ADD A,BR1 ANL A,#8H ; 2ELEV 3=8 CJNE A,#8H ,NSOMA3B ;É=0 ,ENTÃO NÃO SOMA 3 MOV A,#3H ; É=1 ENTAO SOMA 3 ADD A,BR1 MOV BR1,A NSOMA3B: MOV A,#30H ADD A,BR1 ANL A,#80H CJNE A,#80H ,NSOMA3C ;É=0 ,ENTÃO NÃO SOMA 30h MOV A,#30H ; É=1 ENTAO SOMA 30h ADD A,BR1 MOV BR1,A NSOMA3C: MOV A,#3H ADD A,BR0 ANL A,#8H ; 2ELEV 3=8 CJNE A,#8H ,NSOMA3D ;É=0 ,ENTÃO NÃO SOMA 3 MOV A,#3H ; É=1 ENTAO SOMA 3 ADD A,BR0 MOV BR0,A NSOMA3D: MOV A,#30H ADD A,BR0 ANL A,#80H CJNE A,#80H ,NSOMA3E ;É=0 ,ENTÃO NÃO SOMA 30h MOV A,#30H ; É=1 ENTAO SOMA 30h ADD A,BR0 MOV BR0,A NSOMA3E: LJMP VOLTA ;======================================================================== conv_asc2: ; converte 2 nibles hex em 2 nibles asc2 lsb=r1 msb=a MOV R0,A ANL A,#0FH ADD A,#0F6H JC LETRAS ADD A,#3AH AJMP SAIQ LETRAS: ADD A,#41H SAIQ: MOV R1,A MOV A,R0 SWAP A ANL A,#0FH ADD A,#0F6H JC LETRAS1 ADD A,#3AH AJMP SAIQ1 LETRAS1: ADD A,#41H SAIQ1: ret END