LCD em C CCS

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

LCD em C CCS

Mensagempor geraldomelo » 24 Out 2007 17:20

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 .
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP

Mensagempor ze » 24 Out 2007 17:27

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
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Doglao » 24 Out 2007 17:42

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
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Re: LCD em C CCS

Mensagempor ÁgioFelipe » 07 Mai 2013 11:57

Alguém conhece uma biblioteca para LCD em assembly?
ÁgioFelipe
Word
 
Mensagens: 626
Registrado em: 27 Out 2006 20:04

Re: LCD em C CCS

Mensagempor Andre_Cruz » 09 Mai 2013 12:40

Á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.
--
Ter palavra é tudo !
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x