;************************************************************************* ; ; LCD.MONITOR.ASM ; ; USANDO LCD PARA MONITORAR CHAVES ON/OFF ; MICROCONTROLADOR : PIC16F628A ; ; AUTOR: CLÁUDIO LÁRIOS ; DATA DE INICIO: 17/12/12 ; OBJETIVO: EXEMPLO PRÁTICO DE COMO USAR UM LCD PARA MONITORAR CONDIÇOES DE ; CHAVES (ON/OFF APENAS) ; OS INTERRUPTORES PODEM SER SUBSTITUIDOS POR OPTO ACOPLADORES PARA OBTER ; ESTADOS DE TENSÃO (ENERGIZADOS= ON /NÃO ENERGIZADOS =OFF) DE EQUIPAMENTOS ; CONFORME SUGESTÃO ANEXA. ; ; FUNCIONAMENTO: AO LIGAR APARECERÁ 'LCD_MONITOR' E EM SEGUIDA, CADA LINHA ; MOSTRARÁ UMA FUNÇÃO E SEU ESTADO ON OU OFF (EX. CHAVE1 ON) ; APERTANDO O BOTÃO B1, ENTRARÁ EM MODO DE PULSO, SENDO QUE A CADA PULSO ; EM B1 INCREMENTARÁ A VISUALIZAÇÃO DAS CHAVES MONITORADAS NO LCD. ; APÓS 10 SEGUNDOS EM MODO ESTÁTICO, O SISTEMA VOLTARÁ A APRESENTAR DE FORMA ; SEQUENCIAL, TODOS OS BOTÕES MONITORADOS. ;************************************************************************* LIST P=16f628A , R=DEC INCLUDE "P16F628A.INC" ;-------------------------- ERRORLEVEL -302 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF & _LVP_OFF ;_INTRC_OSC_NOCLKOUT ;_XT_OSC ; USER DEFINED REGISTER ; ENDEREÇO 20H RESERVADO PARA MACROS PIC TEMP EQU 20H FLAGS EQU 21H ; USER FLAG REGISTER TMP EQU 22H R0 EQU 23H CONT EQU 24H ; LOOP COUNTERS R2 EQU 25H R1 EQU 26H CONT1 EQU 27H CONT2 EQU 28H CNT2 EQU 29H TR EQU 2AH C2 EQU 2BH C1 EQU 2CH C0 EQU 2DH AUX EQU 2EH AUX1 EQU 2FH LC EQU 30H LC1 EQU 31H PORTB_SALVO EQU 32H NUM EQU 33H ; CIRCULAR BUFFER REGISTER ;DEFINIÇÕES DA PORTAS E FLAGS ;=============================================================================== #DEFINE LCD_DB7 PORTA,7 ;PINO 13 - DISPLAYS #DEFINE LCD_DB6 PORTA,6 ;PINO 12 - DISPLAY #DEFINE LCD_DB5 PORTA,3 ;PINO 2 - DISPLAYS #DEFINE LCD_DB4 PORTA,2 ;PINO 1 - DISPLAY #DEFINE LCD_RS PORTA,1 ;PINO 18 - DISPLAY #DEFINE LCD_E PORTA,0 ;PINO 17 - DISPLAY #DEFINE B1 PORTA,4 ;PINO 3 - DISPLAY ;BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ; VLINHA1 EQU 80H VLINHA2 EQU 0C0H TEMPO_MAX_PULSADO EQU 10 * 0X02 ;TEMPO MAXIMO DE UMA APRESENTAÇAO EM MODO PULSADO ;ATÉ COMEÇAR MUDAR AUTOMATICAMENTE ;(PRIMEIRO NÚMERO EM SEGUNDOS) C_NUM EQU 2 * 0X7D ;TEMPO DE APRESENTAÇÃO 2SEG.(PRIMEIRO NÚMERO EM SEGUNDOS MAX=2) ;------------------------------------------------------------------------------ LIMPA MACRO CALL LcdClear ENDM LINHA1 MACRO CALL LINE1 ENDM LINHA2 MACRO CALL LINE2 ENDM ;------------------------------------------------------------------------------ ORG 00H AQ GOTO RESETA ENV_LCD MOVWF AUX1 RT1 CALL PEGA_M ADDLW .0 BTFSC STATUS,Z RETURN CALL ED INCF AUX1,F MOVFW AUX1 GOTO RT1 PEGA_M MOVWF PCL MSG_ON: DT " ON ",0 ;PODERIA SER "LIG " MSG_OFF: DT " OFF",0 ;PODERIA SER "DESL" MSG1: DT "CHAVE 1 =",0 ; ALTERE A VONTADE, MAS RESPEITE A QUANTIDADE DE BITS MSG2: DT "CHAVE 2 =",0 ; EX. BOMBA 1, ALARME 3, CHAVE 5 MSG3: DT "CHAVE 3 =",0 MSG4: DT "CHAVE 4 =",0 MSG5: DT "CHAVE 5 =",0 MSG6: DT "CHAVE 6 =",0 MSG7: DT "CHAVE 7 =",0 MSG8: DT "CHAVE 8 =",0 MSG_NOME: DT " LCD_MONITOR ",0 ;NOME DO APARELHO RESETA: MOVLW .7 MOVWF CMCON ;DESLIGA COMPARADORES BANK1 MOVLW 0X00 MOVWF OPTION_REG ;LIGA PULL UP DO PORT B MOVLW B'00010000' MOVWF TRISA MOVLW B'11111111' MOVWF TRISB BANK0 CLRF PORTA ; RESET PORTA CLRF PORTB ; RESET PORTB CLRF FLAGS ; RESET FLAGS CALL LcdInit ;INICIALIZAÇÃO DO LCD MOVLW MSG_NOME ;MOSTRA O 'NOME DO APARELHO' CALL ENV_LCD MOVLW .5 CALL DELAYW LIMPA MAIN: ;====================================================================== ;TESTA BOTÃO B1 MODO ALTERNANTE OU FIXO COM INCREMENTO MANUAL BTFSC B1 GOTO SEG1 LD1 MOVLW 0X0B MOVWF R2 CLRF R1 V1 BTFSC B1 GOTO LD1 DECFSZ R1,F GOTO V1 DECFSZ R2,F GOTO V1 GOTO MODO_PULSADO ;====================================================================== SEG1 MOVLW C_NUM MOVWF NUM SG1 MOVFW PORTB MOVWF PORTB_SALVO LIMPA CALL S_MSG12 N91 MOVFW PORTB_SALVO XORWF PORTB,W ;TESTA POR MUDANÇAS NAS CHAVES BTFSS STATUS,Z GOTO SG1 ;HOUVE MUDANÇA NAS CHAVES CALL DBC DECFSZ NUM,F GOTO N91 ;LIMPA ;====================================================================== ;TESTA BOTÃO B1 MODO ALTERNANTE OU FIXO COM INCREMENTO MANUAL BTFSC B1 GOTO SEG2 ; B1 NÃO FOI APERTADO LD2 MOVLW 0X08 MOVWF R2 CLRF R1 V2 BTFSC B1 GOTO LD2 DECFSZ R1,F GOTO V2 DECFSZ R2,F GOTO V2 GOTO MODO_PULSADO ;====================================================================== SEG2 MOVLW C_NUM MOVWF NUM SG2 MOVFW PORTB MOVWF PORTB_SALVO LIMPA CALL S_MSG34 N92 MOVFW PORTB_SALVO XORWF PORTB,W BTFSS STATUS,Z GOTO SG2 CALL DBC DECFSZ NUM,F GOTO N92 ; LIMPA ;====================================================================== ;TESTA BOTÃO B1 MODO ALTERNANTE OU FIXO COM INCREMENTO MANUAL BTFSC B1 GOTO SEG3 LD3 MOVLW 0X08 MOVWF R2 CLRF R1 V3 BTFSC B1 GOTO LD3 DECFSZ R1,F GOTO V3 DECFSZ R2,F GOTO V3 GOTO MODO_PULSADO SEG3 MOVLW C_NUM MOVWF NUM SG3 MOVFW PORTB MOVWF PORTB_SALVO LIMPA CALL S_MSG56 N93 MOVFW PORTB_SALVO XORWF PORTB,W BTFSS STATUS,Z GOTO SG3 CALL DBC DECFSZ NUM,F GOTO N93 ; LIMPA ;====================================================================== ;TESTA BOTÃO B1 MODO ALTERNANTE OU FIXO COM INCREMENTO MANUAL BTFSC B1 GOTO SEG4 LD4 MOVLW 0X08 MOVWF R2 CLRF R1 V4 BTFSC B1 GOTO LD4 DECFSZ R1,F GOTO V4 DECFSZ R2,F GOTO V4 GOTO MODO_PULSADO SEG4 MOVLW C_NUM MOVWF NUM SG4 MOVFW PORTB MOVWF PORTB_SALVO LIMPA CALL S_MSG78 N94 MOVFW PORTB_SALVO XORWF PORTB,W BTFSS STATUS,Z GOTO SG4 CALL DBC DECFSZ NUM,F GOTO N94 LIMPA GOTO MAIN MODO_PULSADO CALL CARGA_TIME X134 MOVFW PORTB MOVWF PORTB_SALVO LIMPA CALL S_MSG12 BTFSS B1 GOTO $ - 1 CALL DBC BTFSS B1 GOTO $ - 4 X34 MOVFW PORTB_SALVO XORWF PORTB,W BTFSS STATUS,Z GOTO X134 BTFSS B1 GOTO PROX1 DECFSZ CONT,F GOTO X34 DECFSZ CONT1,F GOTO X34 DECFSZ CONT2,F GOTO X34 LIMPA GOTO MAIN PROX1 CALL CARGA_TIME X135 MOVFW PORTB MOVWF PORTB_SALVO LIMPA CALL S_MSG34 CALL DBC BTFSS B1 GOTO $ - 1 CALL DBC BTFSS B1 GOTO $ - 4 X35 MOVFW PORTB_SALVO XORWF PORTB,W BTFSS STATUS,Z GOTO X135 BTFSS B1 GOTO PROX2 DECFSZ CONT,F GOTO X35 DECFSZ CONT1,F GOTO X35 DECFSZ CONT2,F GOTO X35 LIMPA GOTO MAIN PROX2 CALL CARGA_TIME X136 MOVFW PORTB MOVWF PORTB_SALVO LIMPA CALL S_MSG56 CALL DBC BTFSS B1 GOTO $ - 1 CALL DBC BTFSS B1 GOTO $ - 4 X36 MOVFW PORTB_SALVO XORWF PORTB,W BTFSS STATUS,Z GOTO X136 BTFSS B1 GOTO PROX3 DECFSZ CONT,F GOTO X36 DECFSZ CONT1,F GOTO X36 DECFSZ CONT2,F GOTO X36 LIMPA GOTO MAIN PROX3 CALL CARGA_TIME X137 MOVFW PORTB MOVWF PORTB_SALVO LIMPA CALL S_MSG78 CALL DBC BTFSS B1 GOTO $ - 1 CALL DBC BTFSS B1 GOTO $ - 4 X37 MOVFW PORTB_SALVO XORWF PORTB,W BTFSS STATUS,Z GOTO X137 BTFSS B1 GOTO PROX4 DECFSZ CONT,F GOTO X37 DECFSZ CONT1,F GOTO X37 DECFSZ CONT2,F GOTO X37 LIMPA GOTO MAIN PROX4 LIMPA CALL DBC GOTO MODO_PULSADO DBC MOVLW 0XFF MOVWF C0 MOVLW 0X08 MOVWF C1 X78 DECFSZ C0,F GOTO X78 DECFSZ C1,F GOTO X78 RETURN CARGA_TIME MOVLW TEMPO_MAX_PULSADO MOVWF CONT2 CLRF CONT1 CLRF CONT RETURN S_MSG12 MOVLW MSG1 CALL ENV_LCD MOVLW MSG_ON BTFSC PORTB,0 MOVLW MSG_OFF CALL ENV_LCD LINHA2 MOVLW MSG2 CALL ENV_LCD MOVLW MSG_ON BTFSC PORTB,1 MOVLW MSG_OFF CALL ENV_LCD RETURN S_MSG34 MOVLW MSG3 CALL ENV_LCD MOVLW MSG_ON BTFSC PORTB,2 MOVLW MSG_OFF CALL ENV_LCD LINHA2 MOVLW MSG4 CALL ENV_LCD MOVLW MSG_ON BTFSC PORTB,3 MOVLW MSG_OFF CALL ENV_LCD RETURN S_MSG56 MOVLW MSG5 CALL ENV_LCD MOVLW MSG_ON BTFSC PORTB,4 MOVLW MSG_OFF CALL ENV_LCD LINHA2 MOVLW MSG6 CALL ENV_LCD MOVLW MSG_ON BTFSC PORTB,5 MOVLW MSG_OFF CALL ENV_LCD RETURN S_MSG78 MOVLW MSG7 CALL ENV_LCD MOVLW MSG_ON BTFSC PORTB,6 MOVLW MSG_OFF CALL ENV_LCD LINHA2 MOVLW MSG8 CALL ENV_LCD MOVLW MSG_ON BTFSC PORTB,7 MOVLW MSG_OFF CALL ENV_LCD RETURN ;================================================================================= ; SUB-ROTINAS ;================================================================================= ;================================================================================= ;Rotina de retardo, onde w=tempo em ms - clock=4MHz ;================================================================================= DELAY2 MOVLW .20 DELAYW MOVWF TEMP VJ1 call LcdDelay1 DECFSZ TEMP,F GOTO VJ1 DELAY1 LcdDelay1 MOVLW .255 ;DELAY PARA VISUALIZAÇAO DELAY LcdDelay goto $+1 movwf LC+1 ;duas variáveis em uma LcdDelayLoop decfsz LC+0,F ;dec. o prim. cont. goto LcdDelayLoop decfsz LC+1,F ;dec. o seg. cont. goto LcdDelayLoop return DEBOUNCE WAIT_16MSEC movlw .16 WAIT_WMSEC movwf LC+1 WAITSET movlw .250 movwf LC WAITLOOP decfsz LC,F goto WAITLOOP decfsz LC+1,F goto WAITSET return ;===================================================== WAIT_uS movwf LC WAIT_uS_A decfsz LC, F goto WAIT_uS_A return ;================================================================================= ;Rotinas de controle do LCD ;================================================================================= LcdInit movlw .30 ;Wait 30 ms call LcdDelay 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 bsf LCD_E ;Enables LCD NOP NOP NOP NOP bcf LCD_E ;Disabled LCD return LcdPulse_E bsf LCD_E ;Enables LCD movlw 1 ;Wait 1ms call LcdDelay bcf LCD_E ;Disabled LCD movlw 1 ;Wait 1ms call LcdDelay return end