LCD em C CCS

Enviado:
24 Out 2007 17:20
por geraldomelo
Ola Pessoal , estou tentando fazer funcionar o lcd , em c ccs .. usando as bibliotecas do próprio CCs , e/ou as do Fábio .. parece que são as mesmas ... como eu gostaria de começar simplesmente controlando um LCD , mas em um pic16F628a , não tem nenhum exemplo (que eu achei) que me mostre como fazer isso .. estava olhando o código da biblioteca , e como eu não vou ler nenhum dado do LCD , não precisaria usar o pino R/W ... parece que ele está desabilitado (não sei ,alguém poderia explicar) .. Agora , que mudanças eu tenho que fazer na biblioteca , para ligar o lcd , nos respectivos pinos do Pic16F628a , por exemplo no portB ... Ah , outra coisa , não achei em nenhum lugar , depois , os comandos , e as descrições de cada um , para controlar o LCD ...
Obrigado a todos pessoal
ps : procurei esse tópico aqui , mas não achei nada bem específico como esse , somente tratando da escrita e controle do LDC em C CCS ... esse tópico poderá virar uma boa referencia para os novatos (que nem eu hehe)
Abraços
Geraldo .

Enviado:
24 Out 2007 17:27
por ze
geraldo, o tópico abaixo não lhe ajudou? que pena!! sua V.I.D.A. não foi salva. Bem, não se pode ganhar todas...
http://asm51.eng.br/phpBB/viewtopic.php ... highlight=
para escrever sem ler status, basta colocar o pino rw em 0. mas tem que dar 1 delay. Mas aguarde que lhe passo + informações...(hoje não dá + tempo)
abraço

Enviado:
24 Out 2007 17:42
por Doglao
Ola!
eu uso este driver que funciona direitinho eh o mesmo do flex_lcd se voce for usar somente 4 bits de comunicacao que recomendo fica mais facil de usar as definicoes no comeco estao dizendo que pinos do microcontrolador usar, mas voce pode mudar ao seu gosto.
antes de usar qualquer comando de display voce tem que chamar a funcao lcd_init();
- Código: Selecionar todos
#define LCD_DB4 PIN_B4 // NIBLE de dados
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#define LCD_RS PIN_B2
#define LCD_E PIN_B3
//#define USE_LCD_RW 1
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line
int8 const LCD_INIT_STRING[4] =
{
0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
0xc, // Display on
1, // Clear display
6 // Increment cursor
};
void lcd_send_nibble(int8 nibble){
// Obs: !! converte uma exprecao inteira
// para uma booleana (1 or 0).
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble & 8));
delay_cycles(1);
output_high(LCD_E);
delay_us(2);
output_low(LCD_E);
delay_us(2);//teste
}
// Envia um byte para o LCD.
void lcd_send_byte(int8 address, int8 n){
output_low(LCD_RS);
delay_us(60);
if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);
delay_cycles(1);
output_low(LCD_E);
lcd_send_nibble(n >> 4);
delay_us(2); //teste
lcd_send_nibble(n & 0xf);
}
void lcd_init(void){
int8 i;
output_low(LCD_RS);
output_low(LCD_E);
delay_ms(15);
for(i=0 ;i < 3; i++){
lcd_send_nibble(0x03);
delay_ms(5);
}
lcd_send_nibble(0x02);
for(i=0; i < sizeof(LCD_INIT_STRING); i++){
lcd_send_byte(0, LCD_INIT_STRING[i]);
}
delay_ms(15);
}
// Posicoes válidas:
// de x=1 a x=16 y
// de y=1 a y=2
void lcd_gotoxy(int8 x, int8 y){
int8 address;
if(x > 0 && y > 0){
if(y > 1)
address = lcd_line_two;
else
address=0;
address += x-1;
lcd_send_byte(0, 0x80 | address); // Manda cursor a la posición
}
}
void lcd_putc(char c){
if(c>'\0'){
switch(c){
case '\f':
lcd_send_byte(0,1);
lcd_send_byte(0,2);
delay_ms(2);
break;
case '\n':
lcd_gotoxy(1,2);
delay_ms(2);
break;
case '\b':
lcd_send_byte(0,0x10);
delay_ms(2);
break;
case '\t':
lcd_send_byte(0,0x14);
delay_ms(2);
break;
default:
lcd_send_byte(1,c);
delay_ms(2);
break;
}
}
}
void lcd_put_string(char *string){
//put string, inicia na posicao atucal do cursor
//assume que a estring na exceda a ram mostradada do lcd
char index=0;
while(string[index]!=0){
lcd_putc(string[index++]);
}
}
void lcd_put_string_xy(char *string, char x, char y){
//assume that string not excides from lcd displayed RAM
lcd_gotoxy(x,y);
lcd_put_string(string);
}
void lcd_setcursor(short visible, short blink) {
lcd_send_byte(0, 0xC|(visible<<1)|blink);
}
/*
' LCD
' Command Operation
' *********** *****************************************
' $FE, 1 Clear display
' $FE, 2 Return home
' $FE, $0C Cursor off
' $FE, $0E Underline cursor on
' $FE, $0F Blinking cursor on
' $FE, $10 Move cursor left one position
' $FE, $14 Move cursor right one position
' $FE, $80 Move cursor to beginning of first line
' $FE, $C0 Move cursor to beginning of second line
' *********** ***************************************** */
Agora para usar ele eh soh no seu programa voce declarar algumas funcoes que vao mostrar oque voce quer escrever assim:
- Código: Selecionar todos
void texto1(){
char Text1[]="\ftexto aqui\ntambem aqui";
disable_interrupts(GLOBAL);
lcd_put_string(Text1);//texto1, chama funcao para escrita
enable_interrupts(GLOBAL);
}
void texto2(){
char Text2[]="\foutro texto\ncontinua";
disable_interrupts(GLOBAL);
lcd_put_string(Text2);//texto2,
enable_interrupts(GLOBAL);
}
entao eh soh chamar a funcao com a as frases que voce criou como explicado acima assim:
- Código: Selecionar todos
texto1();//mostra mensagem do texto1
texto2()://mostra mensagem do texto2
e para ecrever numeros inteiros declare uma funcao assim:
- Código: Selecionar todos
void num_xy(int x, int y, int valor){
disable_interrupts(GLOBAL);
lcd_gotoxy(x,y);//posiciona cursor
printf(lcd_putc, "%u ", valor);
enable_interrupts(GLOBAL);
}
depois eh soh chamar assim esta funcao:
- Código: Selecionar todos
num_xy(9,2,valor_inteiro);//9 e 2 sao coordenadas x e y do display de 16x2
tem mais funcoes que aos poucos vai descobrindo.
abcs
Re: LCD em C CCS

Enviado:
07 Mai 2013 11:57
por ÁgioFelipe
Alguém conhece uma biblioteca para LCD em assembly?
Re: LCD em C CCS

Enviado:
09 Mai 2013 12:40
por Andre_Cruz
ÁgioFelipe,
Já usei o código usado nos exemplos do livro Conectando o Pic
http://editoraerica.com.br/detalhes.asp?cod=7376 em downloads tem os códigos dos exemplos do livro.