;====================================================================================== TITLE " L_PLEX " ; Rotinas para envio de dados/comandos em Lcd (LARIOSPLEX) ; by Claudio Lários 14-11-12 ; ATENÇÃO: Delays abaixo usam 4 Mhz no oscilador do Pic. ;Para os valores, altere as cargas dos delays para os tempos adequados. ;Reserve na Ram , os seguintes registradores: ; FLAGS ;flag para determinar se dado ou comando a enviar ; TEMP ;temporário ; DL0 ;contador de tempo ; DL1 ;idem ; TMP ;guarda dado/comando temporariamente para envio ;escolha as portas a serem usadas para o Lcd (3 portas) #DEFINE LCD_DB7 0h ;NÚMERO DA PORTA DE SAIDA PARA 'DB5' #DEFINE LCD_DB6 1h ;NÚMERO DA PORTA DE SAIDA PARA 'DB6' #DEFINE LCD_E 2h ;NÚMERO DA PORTA DE SAIDA PARA 'E' #DEFINE FLCD_RS FLAGS,0 ;FLAG DE COMANDO/DADO #DEFINE PORTX EQU GPIO ;PODE SER PORTA, PORTB,PORTC OU GPIO #DEFINE TRISX EQU TRISIO ;PODE SER TRISA, TRISB,TRISC OU TRISIO ;Nota: Se escolher PortA, então deverá usar o registrador Tris correspondente, ; ou seja : TrisA. Observe que o programa se encarrega de acertar as portas para ; daqui em diante, de forma automática. ; Cuidado com as 'funções adicionais' dos pinos que podem atrapalhar ; o funcionamento correto (ex. Comparadores,BConversores Anal/Dig,etc), bem como a ;'Palavra de Configuração'(ex. LVP acionado, Osc Xtal ao invés de RC nterno,etc). ; Esta rotina poderá ser acrescentado a seu programa ou fazer um 'include'(salvando ; no mesmo Diretório em forma de arquivo de texto). Use o esquema abaixo. ;No seu programa, após a inicialização geral, chame primeiro a rotina CALL LcdInit, ;após o que,poderá enviar caracteres para o Lcd como abaixo: ; Movlw 'A' ; Call ED ; aparecerá a letra'A' no Lcd ; para enviar comando use como abaixo: ; Movlw 0xC0 ; Call EC ;enviará comando para mostrar próximos caracteres na 2º linha ; para limpar a tela, use o abaixo: ; Call LcdClear ;apagando toda a tela ;=================================================================================== ; ; (MC) p0------------------------------------db7 (Lcd) ; | | ; r18k r470 ; | | ; | | ; | diodo ; | ^ ; | | ; ---------------------------db5 (Lcd) ; | ; | ; capacitor 100nf ; | ; | ; gnd ; ; ; ; (MC) p1------------------------------------db6 (Lcd) ; | | ; r18k r470 ; | | ; | | ; | diodo ; | ^ ; | | ; ---------------------------db4 (Lcd) ; | ; | ; capacitor 100nf ; | ; | ; gnd ; ; ; ; (MC) p2------------------------------------e (Lcd) ; | | ; r18k r470 ; | | ; | | ; | diodo ; | ^ ; | | ; ---------------------------rs (Lcd) ; | ; | ; capacitor 100nf ; | ; | ; gnd ; ; * Ligar também 'Vcc' (+5volts),'Gnd','Vo'(contraste da tela) ao gnd via resistor de 1k e 'RW' direto ao gnd. ;================================================================================================================ ;rotina de inicializaçãodo Lcd LcdInit ;acerta portas para 'saidas' nos pinos do Lcd 'automaticamente' bsf STATUS,RP0 ;bank1 bcf TRISX,LCD_E bcf TRISX,LCD_DB7 bcf TRISX,LCD_DB6 bcf STATUS,RP0 ;bank0 bcf PORTX,LCD_E ;Disabled LCD bcf PORTX,LCD_DB6 ;0011->48 bcf PORTX,LCD_DB7 movlw .30 ;Wait 30 ms call Delay_Ms ;envia 0x03 por 3 vezes e depois o 0x02 por 1 vez, para modo 4 bits bsf PORTX,LCD_DB6 ;0011 (carrega capacitores de db5 e db4) bsf PORTX,LCD_DB7 movlw .250 ;min=.150 (achado por tentativa e erro) call WAIT_uS bcf PORTX,LCD_DB6 ;0011 (aterra linha direta) bcf PORTX,LCD_DB7 bsf PORTX,LCD_E ;Enables LCD NOP bcf PORTX,LCD_E ;Disabled LCD nop bsf PORTX,LCD_E ;Enables LCD NOP bcf PORTX,LCD_E ;Disabled LCD nop bsf PORTX,LCD_E ;Enables LCD NOP bcf PORTX,LCD_E ;Disabled LCD ; Nota: Foi enviado por 3 vezes o valor 0011 para o LCD movlw .1 ;Wait 1ms call Delay_Ms bcf PORTX,LCD_DB6 ;0010 bsf PORTX,LCD_DB7 ;TORNA DB5 =1 POR TEMPO movlw .250 ;Wait 2 ms call WAIT_uS bcf PORTX,LCD_DB7 call Pulse_E ;Nota: foi enviado o valor 0010 para o LCD bcf PORTX,LCD_E ;Disabled LCD bcf PORTX,LCD_DB6 ;0011->48 bcf PORTX,LCD_DB7 movlw .1 call Delay_Ms movlw 28H ;Set 4 bit data bus length call EC movlw 06H ;Entry mode set, increment, no shift call EC ;abaixo são as opções do usuário para o LCD (descomente uma e comente todas as outras) ;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 ;rotina para limpar a tela do Lcd LcdClear movlw 01H ;clear display call EC movlw .2 ;Wait 2 ms call Delay_Ms clrwdt return ;=========================================================================== ;ROTINAS DE ENVIOS DE DADOS E COMANDOS ;envia dados ED bsf FLCD_RS ;seta flag para indicar 'dado' goto XENV ;=========================================================================== ;troca de linha do Lcd LINE2 movlw 0XC0 ;opção para linha2 ;=========================================================================== ;envia comandos EC bcf FLCD_RS ;reseta flag para indicar 'comando' XENV call E_Byte return ;=========================================================================== ;envia byte E_Byte clrwdt movwf TMP ;salva dado/comando a enviar ;acerta portas para 'saida' do Lcd bsf STATUS,RP0 ;bank1 bcf TRISX,LCD_E ;acerta pinos para saidas bcf TRISX,LCD_DB7 bcf TRISX,LCD_DB6 bcf STATUS,RP0 ;bank0 bcf PORTX,LCD_E bcf PORTX,LCD_DB7 bcf PORTX,LCD_DB6 ;DESCARREGA CAPACITORES movlw .1 ;AGUARDA 1 MS P/ DESCARGA COMPLETA QUANDO EM 'IN' call Delay_Ms btfsc TMP,4 bsf PORTX,LCD_DB6 btfsc TMP,5 bsf PORTX,LCD_DB7 btfsc FLCD_RS ;flag rs bsf PORTX,LCD_E ;Enables LCD movlw .250 ;tempo para carga dos capacitores -> min=.150 (achado por tentativa e erro) call WAIT_uS bcf PORTX,LCD_DB6 btfsc TMP,6 bsf PORTX,LCD_DB6 bcf PORTX,LCD_DB7 btfsc TMP,7 bsf PORTX,LCD_DB7 call Pulse_E ;envia um 1° nible ;--------------------------------------------------------------------- btfsc TMP,0 bsf PORTX,LCD_DB6 btfsc TMP,1 bsf PORTX,LCD_DB7 btfsc FLCD_RS ;flag rs bsf PORTX,LCD_E ;Enables LCD movlw .250 ;tempo para carga dos capacitores -> min=.150 (achado por tentativa e erro) call WAIT_uS bcf PORTX,LCD_DB6 btfsc TMP,2 bsf PORTX,LCD_DB6 bcf PORTX,LCD_DB7 btfsc TMP,3 bsf PORTX,LCD_DB7 call Pulse_E ;envia um 2° nible return ;================================================================================= ;pulso no pino 'E' do Lcd Pulse_E bsf PORTX,LCD_E ;Enables LCD clrwdt nop bcf PORTX,LCD_E ;Disabled LCD bcf PORTX,LCD_DB7 bcf PORTX,LCD_DB6 ;DESCARREGA CAPACITORES movlw .1 ;Wait 1ms call Delay_Ms return ;===================================================== ;rotina de 'n' milisegundos passado por 'w' Delay_Ms movwf DL1 call WAIT_500US call WAIT_500US decfsz DL1,f goto $-3 return ;===================================================== ;rotina de 500 microsegundos WAIT_500US movlw .164 WAIT_uS movwf DL0 decfsz DL0, F goto $-1 return ;=====================================================