me e conprado una entrenadora mas concretamente esta
http://www.primetec.pt/loja/catalogo/product_info.php?products_id=111lo que passa es que con los exemplos em asm que trae la lcd funciona perfectamente pero quando quiero trabajar em ccs no consigo que arranque e probado casi todos los exemplos que ai para lcd escritos em ccs e ningum me funciona a excepcion de este lo curioso es que la lcd se inicializa e se queda parpadeando el primero caracter pero esso se debe a esto printf ( LCD_PutChar, " 01/20/03 " ); si cambio esto 01/20/03 por otra cosa ya sea numeros o letras la lcd ya no inicializa alguien que tenga unas luzes de asm e me pueda ayudar a adaptar el codido em asm para poder preparar algun otro codigo em ccs
este codigo funciona pero solo inicializa la lcd #case
#include <16F628.H>
#fuses INTRC_IO, NOPROTECT, PUT, NOWDT, BROWNOUT, NOLVP, NOCPD
/* LCD STUFF */
#define LCD_D0 PIN_B4
#define LCD_D1 PIN_B5
#define LCD_D2 PIN_B6
#define LCD_D3 PIN_B7
#define LCD_EN PIN_A0
#define LCD_RS PIN_A1
#define FIRST_LINE 0x00
#define SECOND_LINE 0x40
#define CLEAR_DISP 0x01
#use delay ( clock=4000000 )
#use standard_io ( A )
#use standard_io ( B )
void LCD_Init ( void );
void LCD_SetPosition ( unsigned int cX );
void LCD_PutChar ( unsigned int cX );
void LCD_PutCmd ( unsigned int cX );
void LCD_PulseEnable ( void );
void LCD_SetData ( unsigned int cX );
/******************************************************************************/
void main ( void )
{
char cX;
// initilize screen
LCD_Init();
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( FIRST_LINE );
printf ( LCD_PutChar, "DARKROOM SYSTEM " );
LCD_SetPosition ( SECOND_LINE );
printf ( LCD_PutChar, " v1.1 " );
delay_ms ( 1000 );
LCD_SetPosition ( FIRST_LINE );
printf ( LCD_PutChar, " Jon Fick " );
LCD_SetPosition ( SECOND_LINE );
printf ( LCD_PutChar, " 01/20/03 " );
delay_ms ( 500 );
LCD_PutCmd ( CLEAR_DISP );
}
/******************************************************************************/
void LCD_Init ( void )
{
LCD_SetData ( 0x00 );
delay_ms ( 200 ); /* wait enough time after Vdd rise */
output_low ( LCD_RS );
LCD_SetData ( 0x03 ); /* init with specific nibbles to start 4-bit mode */
LCD_PulseEnable();
LCD_PulseEnable();
LCD_PulseEnable();
LCD_SetData ( 0x02 ); /* set 4-bit interface */
LCD_PulseEnable(); /* send dual nibbles hereafter, MSN first */
LCD_PutCmd ( 0x2C ); /* function set (all lines, 5x7 characters) */
LCD_PutCmd ( 0x0C ); /* display ON, cursor off, no blink */
LCD_PutCmd ( 0x01 ); /* clear display */
LCD_PutCmd ( 0x06 ); /* entry mode set, increment */
}
void LCD_SetPosition ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
LCD_SetData ( swap ( cX ) | 0x08 );
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
}
void LCD_PutChar ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
output_high ( LCD_RS );
LCD_SetData ( swap ( cX ) ); /* send high nibble */
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) ); /* send low nibble */
LCD_PulseEnable();
output_low ( LCD_RS );
}
void LCD_PutCmd ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
LCD_SetData ( swap ( cX ) ); /* send high nibble */
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) ); /* send low nibble */
LCD_PulseEnable();
}
void LCD_PulseEnable ( void )
{
output_high ( LCD_EN );
delay_us ( 10 );
output_low ( LCD_EN );
delay_ms ( 5 );
}
void LCD_SetData ( unsigned int cX )
{
output_bit ( LCD_D0, cX & 0x01 );
output_bit ( LCD_D1, cX & 0x02 );
output_bit ( LCD_D2, cX & 0x04 );
output_bit ( LCD_D3, cX & 0x08 );
}
este codigo em asm viene como exemplo com la entrenadora e funciona perfectamente :codigo :
list p=16f628A ;configura o tipo de CPU usado
radix hex ;pre-definicao do tipo de valores numericos usados
include "p16f628a.inc" ;inclui ficheiro das definicoes do PIC16F628A
__config _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_ON & _MCLRE_ON & _INTOSC_OSC_NOCLKOUT & _PWRTE_ON & _WDT_OFF
;---------------------------
temp equ 0x20 ;define endereco 0x20 com o nome de TEMP
;---------------------------
org 0x0000
goto principal ;salta para inicio do programa
tabela
addwf PCL, F ;tabela com frase para escrever no LCD
dt "", 0
principal
;configura toda a porta A como entrada/saida DIGITAL
movlw 0x07 ;carrega W como valor de 0x07
movwf CMCON ;move de W para CMCON
clrf PORTA ;desliga buffers de saida antes de configurar
clrf PORTB ;desliga buffers de saida antes de configurar
;
;configura portas A e B como entradas/saidas
bsf STATUS,5 ;activa bit 5 do registo STATUS, Banco 1
movlw 0x00 ;carrega W com 0x00
movwf TRISA ;move de W para TRISA
movlw 0x00 ;carrega W com 0x00
movwf TRISB ;move de W para TRISB
clrf OPTION_REG ;limpa registo OPTION
bcf STATUS, 5 ;desactiva bit 5 do registo STATUS, Banco 0
;
inicio
call setup ;inicializa e limpa LCD
call lcd101 ;posiciona cursor na 1a linha, 3a posicao
clrf temp ;limpa registo de contagem
repete
movf temp, w ;carrega registo Temp para W
call tabela ;chama tabela
iorlw 0
btfss STATUS, 2 ;testa se chegou ao fim da mesma
goto out ;envia byte para LCD
goto $ ;ciclo infinito, fica nesta posicao
out
call lcdout ;envia dados para o LCD
incf temp, f ;incrementa para nova posicao
goto repete ;salta para carregamento de Temp para W
;---------------------------
include "usar_lcd.asm" ;inclui ficheiro de uso e configuracao do LCD
;---------------------------
end
aqui el driver em asm :;*************************************************************
;
; Rotina de configuracao, e uso, de LCD com controlador
; HD44780 da Hitachi.
;
; Configurada para correr com oscilador de 4MHz.
; Definicoes incluidas no programa.
; Ambas as portas de dados e comandos podem ser definidas,
; bem como os bits de RS e E.
;
; Declarar registo de OPTION e INTCON.
; Dentro do banco 1, limpar o registo OPTION.
; O registo INTCON eh apenas usado pela rotina de LCD. Ignorar.
;
; Rotinas usadas pelo programa:
;
; * lcdout -> transfere para o LCD, o byte que se encontra
; no acumulador
;
; * setup -> configura o LCD, usando modo de 4-bits
;
; * del_lcd -> limpa o LCD, e retorna ao inicio
;
; * lcd101 -> posiciona cursor na 1a linha, 1a posicao
; Restantes rotinas sao iguais, apenas muda
; a linha e a posicao
;
;*************************************************************
;*************************************************************
; definicoes
;*************************************************************
e equ 1 ;linha E do LCD
rs equ 0 ;linha RS do LCD
porta_comando equ PORTA ;porta de comandos
porta_dados equ PORTB ;porta de dados
loopa equ 0x60
loopb equ 0x61
store equ 0x62
rsline equ 0x63
clkcnt equ 0x64
;*************************************************************
; rotinas de actualizacao do LCD
;*************************************************************
del_lcd movlw 0x01 ;limpa LCD e retorna ao inicio
goto lcdcmd
lcd208 movlw b"11000111" ;posiciona 2a linha, 8a posicao
goto lcdcmd
lcd204 movlw b"11001111" ;posiciona 2a linha, 4a posicao
goto lcdcmd
lcd202 movlw b"11000001" ;posiciona 2a linha, 2a posicao
goto lcdcmd
lcd201 movlw b"11000000" ;posiciona 2a linha, 1a posicao
goto lcdcmd
lcd104 movlw b"10000011" ;posiciona 1a linha, 4a posicao
goto lcdcmd
lcd101 movlw b"10000000" ;posiciona 1a linha, 1a posicao
lcdcmd bcf porta_comando, rs ;limpa pino RS - activa comandos do LCD
lcdout movwf store ;guarda dados em registo temporario
movlw d"10" ;atraso entre bytes enviados para o LCD
movwf loopa
delay decfsz loopa, f ;atraso
goto delay
call mandar ;manda 4bits altos
swapf store, f
call mandar ;manda 4bits baixos
bsf porta_comando, rs ;activa pino RS - activa dados para o LCD
return
mandar ;carrega e manda 4bits
movf store, w
andlw 0xf0 ;AND com 0xF0, 4bits altos da porta B
movwf porta_dados ;carrega o byte na porta B
bsf porta_comando, e
bcf porta_comando, e ;envia
return
;*************************************************************
; rotina de configuracao do LCD
;*************************************************************
setup call pausit ;rotina de atraso
clrf loopb ;limpa registo de loop
lcdset movf loopb, w ;carrega offset para o acumulador
call tablcd ;busca instrucao
call lcdcmd ;envia instrucao para o LCD
incf loopb, f ;incrementa loop
btfss loopb, 3 ;ultima instrucao enviada ??
goto lcdset ;nao
call pausit ;atraso
return ;fim da rotina de configuracao
;*************************************************************
; rotinas de atraso
;*************************************************************
pausit movlw d"60" ;configuracao de atraso
movwf clkcnt
bcf INTCON, 2 ;limpa flag de interrupcao
pause btfss INTCON, 2 ;temporizador chegou ao fim ??
goto pause ;nao
bcf INTCON, 2 ;sim
decfsz clkcnt, f ;decrementa loop, = 0 ??
goto pause ;nao
return ;sim, sai
;*************************************************************
; tabela para configuracao do LCD
;*************************************************************
tablcd addwf PCL,f ;adiciona offset ao Program Counter
retlw b"00110011" ;inicializa LCD - 1o byte
retlw b"00110011" ;2o byte (4x no total)
retlw b"00101100" ;configura para operacao 4-bit & 2 linhas
retlw b"00101100" ;configura para operacao 4-bit & 2 linhas
retlw b"00000110" ;incrementa endereco, a cada byte recebido
retlw b"00001100" ;display on, cursor off, pisca off
retlw b"00000001" ;limpa LCD
retlw b"00000010" ;volta a 1a posicao, cursor & ram a zero
;fim de tabela de configuracao