;**************************************************************************************************************** ; ; RX_GEN_MIX_NOHOP.ASM ; ; ; RECEPTOR GENERICO DE RF PARA CONTROLE REMOTOS (CHAVEIRINHOS) COM ; CI'S HT6P20B/HCS200/201/300/301. ; OBS: NO CASO DO HCS 200...301, SERÁ USADO A PARTE FIXA DA TRANSMISSÃO, ; SEM FAZER USO DO SISTEMA 'HOPPING CODE'(CÓDIGO 'ESPERADO') ; (NÃO TEM IMPORTANCIA O FABRICANTE, PORQUE NÃO USAREMOS 'HOPPING CODE'). ; MAX: 63 CONTROLE REMOTOS (MEMÓRIA 24C02) ; PARA DECODIFICAÇÃO UTILIZA UM ATMEL AT89C2051 DE 20 PINOS. ; ; AUTOR: CLAUDIO LÁRIOS INICIO: 11-08-2012 TERMINO:17-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. O LED 'LEARN'(PINO 7) PISCARÁ 1 ; VEZ, PARA INDICAR 'CODE APRENDIDO'. 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 TODOS OS CONTROLES DA MEMÓRIA: APERTAR BOTÃO 'LEARN' NA PLACA E ; MANTENHA PRESSIONADO POR MAIS DE 10 SEGUNDOS. O LED 'LEARN' (PINO 7) PISCARÁ ; 3 VEZES , INDICANDO O PLENO APAGAMENTO DE TODOS OS SENSORES DA MEMÓRIA. ; APÓS ISTO, CADA CONTROLE DEVERÁ SER 'REAPRENDIDO' NOVAMENTE PARA OPERAR. ; ; QUANTIDADE DE CONTROLES MAXIMA: 63 CONTROLES DIFERENTES. QUANDO ATINGIR ESTE LIMITE, ; NÃO ACEITARÁ NOVO APRENDIZADO, AVISANDO ESTA SITUAÇÃO POR DAR PISCADAS RAPIDAS POR 10 SEG ; NO LED 'LEARN'. NOVOS APRENDIZADOS SÓ OCORRERÁ COM O APAGAMENTO COMPLETO DA EEPROM E ; EM SEGUIDA, PODERÁ NOVAMENTE OCORRER O APRENDIZADO DOS CONTROLES. ; COM RESPEITO AO CI HT6P20B, ELE PERMITE O ENVIO DO ESTADO DE 2 BOTÕES APENAS. ; ; USE CRISTAL 12 MHZ ;********************************************************************************************* ; UTILIZA MEMÓRIA EEPROM I2C EXTERNA - MODELO 24C02 (OU 24C04 USANDO A METADE) ; NELA FICARAM ARMAZENADOS OS NÚMEROS SERIAIS DE CADA CONTROLE 'APRENDIDO'. ; PINAGENS P/ AT89C2051: ; PINO 1= RESET - LIGAR A MASSA 22K E CAPACITOR 1UF AO VCC ; PINO 2/8/9/11/18/19= NÃO USADOS ; PINO 3= ENTRADA DO SINAL A DECODIFICAR VIA RESISTOR DE 470 OHMS A 1K ; 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 10= GND ; PINO 12= SAIDA 'S0' 1=SINAL OK ; PINO 13= SAIDA 'S1' 1=SINAL OK ; PINO 14= SAIDA 'S2' 1=SINAL OK ; NÃO USADO PARA HT6P20B ; PINO 15= SAIDA 'S3' 1=SINAL OK ; NÃO USADO PARA HT6P20B ; PINO 16= SDA DA 24C04 (DADO) ; PINO 17= SCL DA 24C04 (CLOCK) ; PINO 20= VCC (+5V) ; ; USE XTAL 12MHZ ;***************************************************************************************** ; RAM 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) TEMP EQU 20H FLAGS DATA 21H ; USER FLAG REGISTER ADDRESS DATA 22H ; ADDRESS REGISTER RES3 EQU 23H ; REGISTRADORES DE RECEPÇÃO DE BITS TRANSMITIDOS RES2 EQU 24H RES1 EQU 25H RES0 EQU 26H DYTA EQU 2BH ;DADOS DE ENTRADA E SAIDA NO I2C MEMORY QB EQU 50H Z2 EQU 32H Z1 EQU 33H LC EQU 3BH HC EQU 3CH CONT EQU 3DH RES3A EQU 27H RES2A EQU 28H RES1A EQU 29H RES0A EQU 2AH TMP EQU 49H BOT EQU 2EH ;DEFINIÇÕES DA PORTAS E FLAGS ;=============================================================================== SDA EQU PORTB.4 ; LINHA DE DADOS DA 24C02 PINO 5(16) (P1.4) SCL EQU PORTB.5 ; LINHA DE CLOCK DA 24C02 PINO 6(17) (P1.5) 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 PREAMBULO FLAGX EQU FLAGS.6 ;RECEPÇÃO HT6P20B FLAGY EQU FLAGS.5 ;RECEPÇÃO HCS200...301 RFIN EQU P3.1 ;PINO 3 IN RF LRN EQU P3.2 ;PINO 6 IN LEARN BOTTON LED EQU P3.3 ;PINO 7 SAIDA LED 'LEARN' LED1 EQU P1.0 ;PINO 12- SAIDA DO LED2 LED2 EQU P1.1 ;PINO 13- SAIDA DO LED1 LED3 EQU P1.2 ;PINO 14- SAIDA DO LED2 LED4 EQU P1.3 ;PINO 15- SAIDA DO LED1 ;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 220D ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO PONTM EQU 0H ;ENDEREÇO DO PONTEIRO DA MEMÓRIA EEPROM EXT. LEDACESO EQU 25D ;TEMPO QUE LED'S DA SAIDA FICAM ACESOS APÓS UM TOQUE LIM_MAX EQU 0FBH ;LIMITE MAXIMO DA EEPROM PARA (255/4)-1= 63 CONTROLES MAX) ;------------------------------------------------------------------------------ ORG 00H AJMP RESETA ORG 30H RESETA: START: MOV PORTA,#0H ; PORTA ; RESET PORTA MOV PORTB,#0H ; PORTB ; RESET PORTB MOV FLAGS,#0H ; FLAGS; RESET FLAGS ;CONDIÇÃO DE PRIMEIRO USO DA MEMÓRIA (VIRGEM) MOV ADDRESS,#PONTM ACALL EEREAD1 CJNE A,#0FFH, SAD1 MOV DYTA,#0H ACALL EEWRITE1 SAD1: MOV Z2,#TGR ;CARGA DO TEMPO DO BOTÃO 'LEARN' APERTADO PARA APAGAR TODOS CONTROLES MOV Z1,#0H ;LIMPA REGISTRADORES INICIO: MOV QB,#QBYTE ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER MOV RES3,#0H ;APAGA REGISTRADORES DE RECEPÇÃO DE CÓDIGO MOV RES2,#0H MOV RES1,#0H MOV RES0,#0H L0: CLR FLAGH ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO MOV HC,#0H ;APAGA REGISTRADORES DE UNS E ZEROS MOV LC,#0H L1: SETB LRN ;LEVANTA PARA TESTE JB LRN,L1HS ;TESTA BOTÃO 'LEARN' APERTADO AJMP TAPAGAMENTO ;APERTADO, COMEÇA A CONTAR TEMPO MAX. DE APAGAMENTO L1HS: MOV Z2,#TGR ;RENOVA CARGA DO TEMPO PARA APAGAMENTO MOV Z1,#0H ;LIMPA REGISTRADORES L1H: LJMP SS5 TAPAGAMENTO: ;APAGAR TODOS OS CONTROLES DA MEMÓRIA DJNZ Z1,L1H ;QUANDO A CONTAGEM DESTE REGISTRADORES (Z1,Z2) CHEGAM AO FIM OCORRE O APAGAMENTO DJNZ Z2,L1H ACALL EEERASE ;ATINGIU TEMPO MAXIMO: APAGAR MEMÓRIA ACALL PTZERA ;POEM '00' NO PONTEIRO DA EEPROM SETB LED ;ACENDE LED (UMA PISCADA) MOV A,#10D ACALL DELAYM CLR LED ;APAGA LED MOV A,#10D ACALL DELAYM SETB LED ;ACENDE LED (UMA PISCADA) MOV A,#10D ACALL DELAYM CLR LED ;APAGA LED MOV A,#10D ACALL DELAYM SETB LED ;ACENDE LED (UMA PISCADA) MOV A,#10D ACALL DELAYM CLR LED ;APAGA LED MOV A,#10D ACALL DELAYM SETB LRN JNB LRN,$ ;AGUARDA SOLTAR BOTÃO 'LEARN' LJMP INICIO 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: ACAO: ;I SETB LRN ;LEVANTA PARA TESTE JB LRN,F55 ;BOTÃO ESTÁ APERTADO? NÃO SETB FLAGGR ;SIM F55: ACALL PPT CJNE A,#0H,MADDRESS ; É '0'? 0=NENHUM CONTROLE FOI GRAVADO LJMP APRENDER MADDRESS: MOV ADDRESS,DYTA ;CARREGA ULTIMO ENDEREÇO GRAVADO ACALL EEREAD1 CJNE A,RES3,PROXIMO ;COMPARA COM RES3 DEC ADDRESS ACALL EEREAD1 CJNE A,RES2,PROXIMO ;COMPARA COM RES2 DEC ADDRESS ACALL EEREAD1 CJNE A,RES1,PROXIMO ;COMPARA COM RES1 DEC ADDRESS ACALL EEREAD1 CJNE A,RES0,PROXIMO ;COMPARA COM RES0 AJMP ACIONAR ;ENCONTRADO CONTROLE NA MEMÓRIA PROXIMO: ;VAI PARA O PROXIMO ENDEREÇO DE MEMÓRIA .PROCURAR.... MOV A,ADDRESS ADD A,#3H CLR C SUBB A,#4D ;ACERTA DE 4 EM 4 A POSIÇÃO DE BUSCA NA MEMÓRIA MOV DYTA,A ;SALVA (ESTAVA EM TMP A INVES DE DYTA) JZ APRENDER AJMP MADDRESS ;VOLTA A BUSCA APRENDER: JB FLAGGR,F21A ;TESTA SE BOTÃO 'LEARN' FOI PRESSIONADO LJMP INICIO ;NÃO ESTÁ. F21A: ACALL PPT ;ESTÁ,ENTÃO PEGA PONTEIRO RETORNANDO EM 'DYTA' MOV ADDRESS,A ;CARREGA 'ADDRESS' MOV A,#LIM_MAX ;LIMITE MAXIMO DA EEPROM CLR C SUBB A,ADDRESS ;PEGA O ENDEREÇO APONTADO JNC FG31 ;=============================================================================================== ; AVISA QUE TODA A MEMÓRIA FOI OCUPADA E NÃO ACEITA MAIS CONTROLES. AVISA POR MEIO DE PISCADAS ; RAPIDAS, ESTA SITUAÇÃO. MOV A,#50D ; 50 PISCADAS RAPIDAS MOV R3,A PISC6: SETB LED ;LIGA LED MOV A,#3D ;TEMPO DE ATRASO ACALL DELAYM CLR LED ;DESLIGA MOV A,#3D ;TEMPO DE ATRASO ACALL DELAYM DJNZ R3,PISC6 JNB LRN,$ ;ESPERA SOLTAR BOTÃO LJMP RESETA ;================================================================================================== FG31: INC ADDRESS ;SOMA 1 MOV DYTA,RES0 ;CARREGA REGISTRO DE GRAVAÇÃO ACALL EEWRITE1 ;ROTINA DE ESCRITA NA EEPROM INC ADDRESS ;PROXIMA POSIÇÃO DE ESCRITA NA EEPROM MOV DYTA,RES1 ;CARREGA REGISTRO DE GRAVAÇÃO ACALL EEWRITE1 INC ADDRESS MOV DYTA,RES2 ;CARREGA REGISTRO DE GRAVAÇÃO ACALL EEWRITE1 INC ADDRESS MOV DYTA,RES3 ;CARREGA REGISTRO DE GRAVAÇÃO ACALL EEWRITE1 MOV DYTA,ADDRESS ;SALVA ULTIMA POSIÇÃO NO PONTEIRO MOV ADDRESS,#PONTM ACALL EEWRITE1 ;GRAVA NOVO ENDEREÇO DE PONTEIRO CLR FLAGGR SETB LRN ;LEVANTA PARA TESTE JNB LRN,$ ;ESPERA SOLTA BOTÃO 'LEARN' MOV A,#10D ;TEMPO DE ATRASO ACALL DELAYM ;============================================= ; UMA PISCADA NO LED 'LEARN' PARA AVISAR QUE APRENDIZADO FOI ACEITO SETB LED ;LIGA LED MOV A,#10D ;TEMPO DE ATRASO ACALL DELAYM CLR LED ;DESLIGA ACIONAR: JNB BOT.7,PY6 ;TESTA QUAIS BOTÕES FORAM ACIONADOS NA TRANSMISSÃO SETB LED3 ;ATIVA LED3 PY6: JNB BOT.6,PY5 SETB LED2 ;ATIVA LED2 PY5: JNB BOT.5,PY4 SETB LED1 ;ATIVA LED1 PY4: JNB BOT.4,PY3 SETB LED4 ;ATIVA LED4 PY3: ;================================================================= MOV A,#LEDACESO ACALL DELAYM ;TEMPO QUE SE MANTEM ACESOS CLR LED1 CLR LED2 CLR LED3 CLR LED4 MOV BOT,#0H LJMP INICIO ;****************************************************************** ; ; ROTINAS DE DELAY E OUTRAS ; ;****************************************************************** DELAYM: MOV R0,A XC: ACALL AGUARDE DJNZ R0,XC RET ;**************************************************** ;PEGA PONTEIRO NA EEPROM - ULTIMO ENDEREÇO PPT: MOV ADDRESS,#PONTM ACALL EEREAD1 ;LE PONTEIRO DA EEPROM 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 NOP NOP 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 DELAY_STOP: ;FIM DA LEITURA MOV R4,#20 VH1: MOV R3,#250 DJNZ R3,$ DJNZ R4,VH1 RET ;************************************************************************************************* ; APAGAMENTO DE TODA 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 ADDRESS,#PONTM ;CARREGA ENDEREÇO DO PONTEIRO DA EEPROM MOV DYTA,#0H ACALL EEWRITE1 RET ;******************************************************************* END