; ;**************************************************************** ;Programa LCD1.ASM - Márcio Soares ;13/09/2001 ;controle de display Hitachi 2 linhas 16 colunas com PIC ; ;clock de 4MHz ou 8MHz - rotina de tempo afetada ; ;ultima alteração em 26/06/2003 ;**************************************************************** list p=16F84 ;listagem radix dec ;padrao->valores decimal se nao informado outro include ;inclue arquivo __CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC ;configura bits ; ;************************************************************** ;variaveis ;************************************************************** ; picram equ 0x0c picres equ 0x00 picint equ 0x04 LCD_CNTL equ PORTA ;port de controle para display LCD_DATA equ PORTB ;port de dados para o display E equ 1 ;controles do display RS equ 3 ;porta A RW equ 2 org picram CHAR res 1 ;variavel para caracter TEMP res 1 ;variavel de uso geral T1 res 1 T2 res 1 AUX1 res 1 ;variavel para controle de coluna AUX2 res 1 ;variavel para controle de linha AUX3 res 1 ;variavel para controle de caracter ; ; ;************************************************************** ;define memoria de programa e vetor de reset ;************************************************************** ; org picres ;reset goto inicio ;desvia do endereço 0x04 - interrupção ; ; ;************************************************************** ;endereço e rotina de interrupção ;************************************************************** ; org picint ;toda interrupção aponta para este endereço retfie ;retorno de interrupção ; ;************************************************************** ;inicio do programa ;************************************************************** inicio: movlw 0x00 ;ajuste para os bits INTCON movwf INTCON bsf STATUS,RP0 ;seleciona banco 1 para options e tris movlw 0x01 ;ajusta os bits em A como saida movwf TRISA movlw 0x00 ;ajusta os bits em B como saida movwf TRISB bcf STATUS,RP0 ;volta ao banco 0... (padrão do reset) bcf LCD_CNTL,E bcf LCD_CNTL,RW bcf LCD_CNTL,RS ; ;*************************************************************** ;rotina principal ;*************************************************************** ; principal: call tp2 ;aguarda display inicializar call DISPLAY_INIT ;inicializa display call DISPLAY_MSG ;envia mensagem movlw 0x10 movwf TEMP loop: call tempo decfsz TEMP,1 goto loop zera: movlw 0x10 ;16 colunas movwf AUX1 ;conta numero de colunas movlw 0x02 ;2 linhas movwf AUX2 ;conta numero de linhas movlw 0x40 ;caracter A-1 movwf AUX3 ;caracter a escrever movlw 0x01 call SEND_CMD ;apaga display escreve: incf AUX3,1 ;incrementa caracter movf AUX3,0 ;insere caracter a enviar call SEND_CHAR call tempo decfsz AUX1,1 goto escreve movlw 0x10 ;recupera 16 colunas movwf AUX1 movlw 0xC0 ;muda de linha call SEND_CMD decfsz AUX2,1 goto escreve movlw 0x02 ;recupera 2 linhas movwf AUX2 goto zera parada: goto parada ; ;******************************************************************* ; Subrotinas do display ;******************************************************************* ;******************************************************************* ; Inicializa o display ; caracter 5x7, 2 linhas, cursor ligado, mensagem fixa ;******************************************************************* ; DISPLAY_INIT: MOVLW 0x038 ; Comando para interface 8-bits call SEND_CMD MOVLW 0x00E ; liga display CALL SEND_CMD ; MOVLW 0x006 ; incrementa display CALL SEND_CMD ; MOVLW 0x001 ; apaga display CALL SEND_CMD ; retlw 0x00 ; volta ; ;*************************************************************** ;envia mensagem para display ;*************************************************************** ; DISPLAY_MSG: movlw 'O' call SEND_CHAR movlw 'l' call SEND_CHAR movlw 'a' call SEND_CHAR movlw ' ' call SEND_CHAR movlw 'M' call SEND_CHAR movlw 'u' call SEND_CHAR movlw 'n' call SEND_CHAR movlw 'd' call SEND_CHAR movlw 'o' call SEND_CHAR movlw 0xC0 ;muda de linha call SEND_CMD ;envia comando movlw 'H' call SEND_CHAR movlw 'e' call SEND_CHAR movlw 'l' call SEND_CHAR movlw 'l' call SEND_CHAR movlw 'o' call SEND_CHAR movlw ' ' call SEND_CHAR movlw 'W' call SEND_CHAR movlw 'o' call SEND_CHAR movlw 'r' call SEND_CHAR movlw 'l' call SEND_CHAR movlw 'd' call SEND_CHAR retlw 0x00 ;***************************************************************** ;* SEND_CHAR - envia caracter que esta no registro W para o LCD * ;* Esta rotina envia todo caracter pelo port * ;* O dado eh trasmitido pelo PORTB<7:0> pins * ;***************************************************************** ; SEND_CHAR: MOVWF CHAR ; caracter em W CALL BUSY_CHECK ; espere ate que o display esteje pronto BCF LCD_CNTL, RW ; seta o LCD em modelo leitura BSF LCD_CNTL, RS ; seta o LCD em modo dados BSF LCD_CNTL, E ; inverte E para o LCD MOVF CHAR, w MOVWF LCD_DATA ; envie o dado para o LCD BCF LCD_CNTL, E retlw 0x00 ; ; ; ;************************************************************** ;* SEND_CND - envia comando contido no registro W para LCD * ;* esta rotina insere o dados completo no PORT * ;* o dado eh transmitido pelo pinos do PORT<7:0> * ;************************************************************** SEND_CMD: MOVWF CHAR ; Comando a enviar em W CALL BUSY_CHECK ; aguarde ate que o display esteje pronto BCF LCD_CNTL, RW ; seta o LCD em modo leitura BCF LCD_CNTL, RS ; seta o LCD em modo comando BSF LCD_CNTL, E ; inverte E para LCD MOVF CHAR, w MOVWF LCD_DATA ; envie o dado para o LCD BCF LCD_CNTL, E retlw 0x00 ; ; ;************************************************************** ;* Esta rotina checa o busy flag, retorna quando livre * ;* Afeta: * ;* TEMP - retorna com endereco busy * ;************************************************************** ; BUSY_CHECK: BSF STATUS,RP0 ; Seleciona registro da pagina 1 MOVLW 0xFF ; Seta port B para entrada MOVWF TRISB BCF STATUS, RP0 ; Seleciona Registro da pagina 0 BCF LCD_CNTL, RS ; Seta LCD para modo comando BSF LCD_CNTL, RW ; Setup para ler busy flag BSF LCD_CNTL, E ; Seta E high MOVF LCD_DATA, w ; le o busy flag, endereco DDram BCF LCD_CNTL, E ; Seta E low andlw 0x80 btfss STATUS, Z goto BUSY_CHECK lcdnobusy: BCF LCD_CNTL, RW BSF STATUS, RP0 ; Seleciona registro pagina 1 MOVLW 0x00 ; seta novamente port B como saida MOVWF TRISB ; Seta port_D para saida BCF STATUS, RP0 ; Seleciona registro pagina 0 retlw 0x00 tp2: ;rotina para uso com cristal de 8MHz call tempo call tempo retlw 0x00 tempo: movlw 0xFF ;carrega W com 255 movwf T1 ;carrega T1 com W car_1: movlw 0xFF ;carrega W com 255 movwf T2 ;carrega T2 com 255 dec_1: decfsz T2,1 ;decrementa T2 goto dec_1 ;255 x T1 vezes decfsz T1,1 ;decrementa T1 goto car_1 ;volta a carregar T2 retlw 0x00 end