Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
diego.maga

Biblioteca para lcd "flex_lcd" ccs

Recommended Posts

Galera preciso de um socorro, eu tinha no meu pc uma biblioteca chamada flex_lcd, do compilador ccs onde os pinos Rbs do pic estavam ligadas no lcd, porém meu pc deu pau e perdi tudo, agora necessito dessa biblioteca ou algo parecido, alguem, tem alguma coisa ai para me ajudar.

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta é a biblioteca padrão com algumas pequenas alterações do módulo lcd da CCS. Veja se consegue com ela recuperar o que você precissa.

//==============================================================================

//===========================Módulo do Display LCD==============================

//==============================================================================

struct lcd_pin_map {

BOOLEAN unused;

BOOLEAN rs;

BOOLEAN rw;

BOOLEAN enable;

int data : 4;

} lcd;

#if defined(__PCH__)

#if defined use_portd_lcd

#byte lcd = 0xF83

#else

#byte lcd = 0xF81

#endif

#else

#if defined use_portd_lcd

#byte lcd = 8

#else

#byte lcd = 6

#endif

#endif

#if defined use_portb_lcd

#define set_tris_lcd(x) set_tris_d(x)

#else

#define set_tris_lcd(x) set_tris_b(x)

#endif

#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines

#define lcd_line_two 0x40

BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0};

struct lcd_pin_map const LCD_READ = {0,0,0,0,15};

BYTE lcd_read_byte() {

BYTE low,high;

set_tris_lcd(LCD_READ);

lcd.rw = 1;

delay_cycles(1);

lcd.enable = 1;

delay_cycles(1);

high = lcd.data;

lcd.enable = 0;

delay_cycles(1);

lcd.enable = 1;

delay_us(1);

low = lcd.data;

lcd.enable = 0;

set_tris_lcd(LCD_WRITE);

return( (high<<4) | low);

}

void lcd_send_nibble( BYTE n ) {

lcd.data = n;

delay_cycles(1);

lcd.enable = 1;

delay_us(2);

lcd.enable = 0;

}

void lcd_send_byte( BYTE address, BYTE n ) {

int cont = 200;

lcd.rs = 0;

while ( bit_test(lcd_read_byte(),7) )

{

delay_us(50);

cont --;

if (!cont) break;

}

lcd.rs = address;

delay_cycles(1);

lcd.rw = 0;

delay_cycles(1);

lcd.enable = 0;

lcd_send_nibble(n >> 4);

lcd_send_nibble(n & 0xf);

}

void lcd_init() {

BYTE i;

set_tris_lcd(LCD_WRITE);

lcd.rs = 0;

lcd.rw = 0;

lcd.enable = 0;

delay_ms(15);

for(i=1;i<=3;++i) {

lcd_send_nibble(3);

delay_ms(5);

}

lcd_send_nibble(2);

for(i=0;i<=3;++i)

lcd_send_byte(0,LCD_INIT_STRING);

}

void lcd_gotoxy( BYTE x, BYTE y) {

BYTE address;

if(y!=1)

address=lcd_line_two;

else

address=0;

address+=x-1;

lcd_send_byte(0,0x80|address);

}

void lcd_putc( char c) {

switch © {

case '\f' : lcd_send_byte(0,1);

delay_ms(2);

break;

case '\n' : lcd_gotoxy(1,2); break;

//case '\b' : lcd_send_byte(0,0x10); break;

default : lcd_send_byte(1,c); break;

}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Estou com uma duvida em qual port eu vou ligar o LCD? Gostaria de ligar no portD do pic 16f877a

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    titio google amigo!!

    http://www.ccsinfo.com/forum/viewtopic.php?t=24661&postdays=0&postorder=asc&highlight=exexpio&start=0

    // flex_lcd.c

    // These pins are for the Microchip PicDem2-Plus board,

    // which is what I used to test the driver. Change these

    // pins to fit your own board.

    #define LCD_DB4 PIN_D0

    #define LCD_DB5 PIN_D1

    #define LCD_DB6 PIN_D2

    #define LCD_DB7 PIN_D3

    #define LCD_E PIN_A1

    #define LCD_RS PIN_A3

    #define LCD_RW PIN_A2

    // If you only want a 6-pin interface to your LCD, then

    // connect the R/W pin on the LCD to ground, and comment

    // out the following line.

    #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)

    {

    // Note: !! converts an integer expression

    // to a boolean (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);

    }

    //-----------------------------------

    // This sub-routine is only called by lcd_read_byte().

    // It's not a stand-alone routine. For example, the

    // R/W signal is set high by lcd_read_byte() before

    // this routine is called.

    #ifdef USE_LCD_RW

    int8 lcd_read_nibble(void)

    {

    int8 retval;

    // Create bit variables so that we can easily set

    // individual bits in the retval variable.

    #bit retval_0 = retval.0

    #bit retval_1 = retval.1

    #bit retval_2 = retval.2

    #bit retval_3 = retval.3

    retval = 0;

    output_high(LCD_E);

    delay_cycles(1);

    retval_0 = input(LCD_DB4);

    retval_1 = input(LCD_DB5);

    retval_2 = input(LCD_DB6);

    retval_3 = input(LCD_DB7);

    output_low(LCD_E);

    return(retval);

    }

    #endif

    //---------------------------------------

    // Read a byte from the LCD and return it.

    #ifdef USE_LCD_RW

    int8 lcd_read_byte(void)

    {

    int8 low;

    int8 high;

    output_high(LCD_RW);

    delay_cycles(1);

    high = lcd_read_nibble();

    low = lcd_read_nibble();

    return( (high<<4) | low);

    }

    #endif

    //----------------------------------------

    // Send a byte to the LCD.

    void lcd_send_byte(int8 address, int8 n)

    {

    output_low(LCD_RS);

    #ifdef USE_LCD_RW

    while(bit_test(lcd_read_byte(),7)) ;

    #else

    delay_us(60);

    #endif

    if(address)

    output_high(LCD_RS);

    else

    output_low(LCD_RS);

    delay_cycles(1);

    #ifdef USE_LCD_RW

    output_low(LCD_RW);

    delay_cycles(1);

    #endif

    output_low(LCD_E);

    lcd_send_nibble(n >> 4);

    lcd_send_nibble(n & 0xf);

    }

    //----------------------------

    void lcd_init(void)

    {

    int8 i;

    output_low(LCD_RS);

    #ifdef USE_LCD_RW

    output_low(LCD_RW);

    #endif

    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);

    // If the R/W signal is not used, then

    // the busy bit can't be polled. One of

    // the init commands takes longer than

    // the hard-coded delay of 60 us, so in

    // that case, lets just do a 5 ms delay

    // after all four of them.

    #ifndef USE_LCD_RW

    delay_ms(5);

    #endif

    }

    }

    //----------------------------

    void lcd_gotoxy(int8 x, int8 y)

    {

    int8 address;

    if(y != 1)

    address = lcd_line_two;

    else

    address=0;

    address += x-1;

    lcd_send_byte(0, 0x80 | address);

    }

    //-----------------------------

    void lcd_putc(char c)

    {

    switch©

    {

    case '\f':

    lcd_send_byte(0,1);

    delay_ms(2);

    break;

    case '\n':

    lcd_gotoxy(1,2);

    break;

    case '\b':

    lcd_send_byte(0,0x10);

    break;

    default:

    lcd_send_byte(1,c);

    break;

    }

    }

    //------------------------------

    #ifdef USE_LCD_RW

    char lcd_getc(int8 x, int8 y)

    {

    char value;

    lcd_gotoxy(x,y);

    // Wait until busy flag is low.

    while(bit_test(lcd_read_byte(),7));

    output_high(LCD_RS);

    value = lcd_read_byte();

    output_low(lcd_RS);

    return(value);

    }

    #endif

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • obrigado, MAS NÃO resolveu o meu problema

    Editado por diego.maga

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Esse codigo q o amigo Edu postou é o correto sim.

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • agora consegui fazer funcionar, obrigado

    Editado por diego.maga

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Para o 16F877A você pode usar o lcd.c normal. Só não vai conseguir usar portas diferentes para o LCD. Ficará limitado ao PortD.

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • attachment.php?attachmentid=77556&d=1288228847porém estou utilizando a biblioteca LCD420.C do ccs, resolveu o meu problema ,porém o proteus esta dando um sinal de "alerta", alguem sabe o que é isso?Caso eu fosse montar esse circuito na pratica , os fusiveis que eu declareis estão corretos.

    post-779635-13884957505888_thumb.gif

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Posta o código por favor....

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Gostaria de saber se funciona na pratica este codigo,pois fiz no proteus e funcionou, porém na pratica não , não sei o que pode ser.

    #include <16F877a.h>
    #FUSES NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
    #use delay(clock=4000000)
    #include <LCD420.C>


    void main()
    {
    lcd_init(); //Inicializa o LCD
    delay_ms(100);

    for(;
    {
    lcd_gotoxy(1,1); lcd_putc("Temperatura"); //Mensagem inical ao ligar display
    }
    }

    Editado por Bcpetronzio
    Inserir Tags CODE

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Seu código está um pouco errado. você esqueceu de declarar o #fuse do cristal. Como você está usando um de 4Mhz, declare como sendo XT.

    Alterei aqui. Inclusive mudei o lcd para lcd.c.

    #include <16F877A.h>
    #FUSES NOWDT                     //Sem Watch dog, evitando reset#FUSES XT                        //Crystal de oscilação igual a 4mhz#FUSES PUT                       //Tempo de início do PIC#FUSES NOPROTECT                 //Codigo sem proteção de leitura, software livre!#FUSES NODEBUG                   //No Debug mode for ICD#FUSES NOLVP                     //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#FUSES NOCPD                     //No EE protection#use delay(clock=4000000)
    #include <LCD.C>
    void main(){lcd_init(); //Inicializa o LCDdelay_ms(100);
       for(;   {     lcd_gotoxy(1,1); lcd_putc("Temperatura"); //Mensagem inical ao ligar display   }} 

    você monta o circuito assim:

    // As defined in the following structure the pin connection is as follows://     D0  enable//     D1  rs//     D2  rw//     D4  D4//     D5  D5//     D6  D6//     D7  D7////   LCD pins D0-D3 are not used and PIC D3 is not used.

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Ok vou gravar o circuito hoje a noite na faculdade e logo vejo se vai dar certo, por enquanto obrigado.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • No proteus funcionou perfeitamente porém na pratica não funcionou, vou comprar os componentes novamente e montar de novo ai eu digo se funcionou ou não.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Sim! colega diego.maga, se na simulação funcionou!, é grande as chances do circuito funcionar!...., Tem que ter um pouco de paciência!...

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    exato!. Poste o circuito aí p q posamos dar uma olhada..

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×