Ir ao conteúdo
  • Cadastre-se

Biblioteca para lcd "flex_lcd" ccs


diego.maga

Posts recomendados

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

Link para o comentário
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;

}

}

Link para o comentário
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

Link para o comentário
Compartilhar em outros sites

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
}
}

Link para o comentário
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

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...