;************************************************************************* ; ; CONTROL-TESTER_1.ASM ; ; RECEPTOR PARA HT6P20B COM VISUALIZAÇÃO DO ENDEREÇO E DADOS TRANSMITIDOS ; EM LCD. ; MICROCONTROLADOR : AT89C2051 ; ; AUTOR: CLÁUDIO LÁRIOS ; DATA DE INICIO: 29/07/12 ; ; USO: TESTE CONTROLES REMOTOS COM CI HT6P20B ; USE CRISTAL DE : 12MHZ ;************************************************************************* ; PINAGENS: ; PINO 20= VCC (+5V) ; PINO 10= GND ; PINO 11= RF IN ; PINO 4,5= XTAL 12 MHZ ; PINO 1= RESET (RESISTOR 22K A MASSA E CAPACITOR DE 10 MICROFARADS AO +VCC) ; PINO 19= DB7 ; PINO 18= DB6 ; PINO 17= DB5 ; PINO 16= DB4 ; PINO 15= RS ; PINO 14= E ;**************************************************************************** ; USER DEFINED REGISTER ; ENDEREÇO 20H RESERVADO PARA MACROS PIC FLAGS EQU 21H ; USER FLAG REGISTER LC EQU 22H CNT2 EQU 23H HC EQU 24H BR0 EQU 25H BR1 EQU 26H BR2 EQU 27H C0 EQU 28H C1 EQU 29H TMP EQU 2AH QB EQU 2BH CSR4A EQU 2CH CSR5A EQU 2DH CSR6A EQU 2EH CSR7A EQU 2FH CSR4 EQU 30H CSR5 EQU 31H CSR6 EQU 32H CSR7 EQU 33H ;DEFINIÇÕES DA PORTAS E FLAGS ;=============================================================================== RFIN EQU P3.7 ;PINO 11 - IN RF 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 LCD EQU P1 ;PORTA PARA ENVIO AO LCD ;****** FLAGS DEFINITIONS ************** FLAGX EQU FLAGS.6 ;RECEPÇÃO HT6P20B FLAGH EQU FLAGS.0 ;FLAG DE SITUAÇÃO FLAG1 EQU FLAGS.1 ;FLAG DE NOVA LEITURA TMAX EQU 50D ;TEMPO MAXIMO DO SINAL LOW LINHA1 EQU 80H LINHA2 EQU 0C0H ORG 00H RESETA: MOV P1,#0H ;CLRF PORTA ; RESET PORTA MOV P3,#0H ;CLRF PORTB ; RESET PORTB MOV FLAGS,#0H ;CLRF FLAGS; RESET FLAGS ACALL LcdInit ;INICIALIZAÇÃO DO LCD ACALL MENS_N MOV CSR7,#0H ; APAGA RESULTADOS DE COMPARAÇÃO MOV CSR6,#0H MOV CSR5,#0H MOV CSR4,#0H MOV CSR6A,#0H MOV CSR5A,#0H MOV CSR4A,#0H MOV HC,#0H ;APAGA REGISTRADORES DE UNS E ZEROS MOV LC,#0H MOV QB,#28D ;QUANTIDADE DE BITS A RECEBER MAIN: ACALL RECEIVE JB FLAGX,XROT_HT6P ; ROTINA DE TESTE DOS FLAGS FX(HT6P20B) E FY(HCS200..301) AJMP MAIN XROT_HT6P: AJMP ROT_HT6P MENS_N: MOV A,#LINHA1 ACALL EC MOV DPTR,#MSG1 ACALL ENV_MSG MOV A,#LINHA2 ACALL EC MOV DPTR,#MSG2 ACALL ENV_MSG ACALL RTSHOW ACALL RLIMPA MOV A,#LINHA1 ACALL EC MOV DPTR,#MSG1 ACALL ENV_MSG MOV A,#0C5H ACALL EC MOV DPTR,#MSG3 ACALL ENV_MSG RET ENV_MSG: MOV TMP,#0H MOV A,#0H BC2: MOVC A,@A+DPTR CJNE A,#0H,BC1 RET BC1: ACALL ED INC TMP MOV A,TMP AJMP BC2 RET MSG1: DB 'CONTROL-TESTER_1',0 MSG2: DB 'LARIOS.TECNOL.WS',0 MSG3: DB 'TX?...',0 ;=========================================================================== ;INICIA ROTINA DE RECEPÇÃO DE SINAL DO HT6P20B ;=========================================================================== RECEIVE: SS5: JNB FLAGH , L2 ;TESTA FLAG DE HUM RECEBIDO ;FLAG=0 VAI PARA L2 SETB RFIN ;LEVANTA PARA TESTE FLAG=1 JNB RFIN, MO ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF SIN=0 VAI PARA 'MO' ;SE SIN=1 VAI PARA 'L2' L2: SETB RFIN ;LEVANTA PARA TESTE JNB RFIN, LA1 ;SIN=0 VAI INCREMENTAR LC EM 'LA1' ;SIN=1 VAI INCREMENTAR HC E SETAR FLAG SETB FLAGH ;SIN=1 INC HC MOV A,HC JNZ LA2 DEC HC LJMP LA2 ;VAI PARA 'LA2' CONTAR TEMPO DE 50 MICRO SEGUNDOS ;--------------------------------------------------------- LA1: INC LC ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF MOV A,LC JNZ LA2 DEC LC LA2: MOV R0,#24D ; 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 QB,#28D INICIO: ;LC>TMAX (REJEITAR DADO - SEM TRANSMISSÃO ) MOV CSR7,#0H ; APAGA RESULTADOS DE COMPARAÇÃO MOV CSR6,#0H MOV CSR5,#0H MOV CSR4,#0H L0: CLR FLAGH MOV HC,#0H ;APAGA REGISTRADORES DE UNS E ZEROS MOV LC,#0H L1: RET NK: ;OK C=1 SE LC>HC MOV A,HC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) CLR C SUBB A,LC MOV A,CSR7 ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRC A MOV CSR7,A MOV A,CSR6 RRC A MOV CSR6,A MOV A,CSR5 RRC A MOV CSR5,A MOV A,CSR4 RRC A MOV CSR4,A AJMP SEG44 XLO: AJMP L0 ;LE PROXIMO BIT SEG44: DJNZ QB,XLO ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO MOV QB,#4D ;DESPREZA OS 4 BITS DE 'ANTICODE' 1010 ACERTA: CLR C MOV A,CSR7 ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRC A MOV CSR7,A MOV A,CSR6 RRC A MOV CSR6,A MOV A,CSR5 RRC A MOV CSR5,A MOV A,CSR4 RRC A MOV CSR4,A ;RESULTADO FICA SOMENTE EM RES2 A RES0,DESPREZA RES3 DJNZ QB,ACERTA JB FLAG1,PULA1 MOV CSR6A,CSR6 ;SALVA A PRIMEIRA LEITURA PARA COMPARAÇÃO COM UMA SEGUNDA MOV CSR5A,CSR5 MOV CSR4A,CSR4 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, CSR6 CJNE A,CSR6A,RESETAC MOV A,CSR5 CJNE A,CSR5A,RESETAC MOV A,CSR4 CJNE A,CSR4A,RESETAC ;ERRO DE RECEPÇAO SETB FLAGX ;OK - BOA RECEPÇÃO MOV QB,#28D AJMP INICIO RESETAC: MOV CSR6A,#0H ; APAGA RESULTADOS DE COMPARAÇÃO MOV CSR5A,#0H MOV CSR4A,#0H SAI_ROT: CLR FLAGX CLR FLAGH MOV QB,#28D LJMP INICIO ROT_HT6P: ;ATENÇÃO : CSR7...CSR4 SERÃO APAGADOS AO SAIR DA ROTINA 'RECEIVE' MOV A,#0C5H ACALL EC MOV A,CSR6A ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,CSR5A ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,CSR4A ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,#10H ACALL DELAYM CLR FLAGX AJMP MAIN ;================================================================================= ; SUB-ROTINAS ;================================================================================= ;************************************************************************** ; 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 ;========================================================== ;ROTINAS DE 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 inicialização do display LcdISeq: db 33H, 32H, 28H, 6H, 1H, 0FH, 0CH ;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 ;****************************************************************** DELAYM: MOV R0,A XC: ACALL AGUARDE DJNZ R0,XC RET AGUARDE: ;ROTINA DE ATRASO ENTRE OPERAÇÕES DE EEPROM MOV R1,#64D CG2: MOV R2,#255D DJNZ R2,$ DJNZ R1,CG2 RET ;=========================================================== ;MUDA PARA LINHA1 RLINHA1: MOV A,#LINHA1 ACALL EC RET ;MUDA PARA LINHA 2 RLINHA2: MOV A,#LINHA2 ACALL EC RET ;LIMPA A TELA RLIMPA: MOV A,#01H ACALL EC RET ;TEMPO DE APRESENTAÇÃO DA MENSAGEM NO VISOR DO LCD RTSHOW: MOV A,#65H ACALL DELAYM RET end