Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

LCD , PIC16F690 and CCS
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=9834
Страница 1 от 1

Автор:  zle [ Пон Яну 30, 2012 3:01 pm ]
Заглавие:  LCD , PIC16F690 and CCS

това е flex_lcd.c който ползвам. Намерих го някъде по форумите

// 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_C4
#define LCD_DB5 PIN_C5
#define LCD_DB6 PIN_C6
#define LCD_DB7 PIN_C7

#define LCD_E PIN_C0
#define LCD_RS PIN_C1
#define LCD_RW PIN_C2

// 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[i]);

// 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(c)
{
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

това е main който ползвам също някъде из форумите заедно с по - гориня код го открих

#include <16f690.h>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT
#use delay(clock = 4000000)

#include "flex_lcd.c"

//==========================
void main()
{
SET_TRIS_C(0x00);
lcd_init(); // Always call this first.
lcd_putc("\fHello World\n");
lcd_putc("\fLine Number2\n");
while(1);
}


Проблема е следния, когато пусна захранването за някакви милисекунди се показва надписа на горния ред, след което реда се запълва с черни квадрати. Долният ред въобще не се появява.

Автор:  michev [ Пон Яну 30, 2012 7:21 pm ]
Заглавие:  Re: LCD , PIC16F690 and CCS

При китайски дисплеи, инициализацията в 4бит режим се прави с 2 команди.
Едната е 0x20 за да заапе на 4бит режим, а другата е тая която я имаш в масива за инициализация (0x28).
Ако не пуснеш 0x20-то, то в повечето случаи единия ред на дисплея не захапва.

Автор:  zle [ Пон Яну 30, 2012 8:27 pm ]
Заглавие:  Re: LCD , PIC16F690 and CCS

Aха сега ще го погледна това. А някаква идея защо надписа се появява за някакви милисекунди след което изчезва?

Автор:  michev [ Пон Яну 30, 2012 8:31 pm ]
Заглавие:  Re: LCD , PIC16F690 and CCS

Най - вероятно по някакъв начин се презаписва.
Ако не е инициализиран дисплея правилно (т.е на 2 линии) ще работи на 1.. и какво се случва като пишеш на линия 2 - идея нямам, но е възможно този ефект който си постигнал да е точно от това.
Абе вместо да се чудиш толкоз време, да беше бутнал тая команда в масива и да беше пробвал.

Автор:  zle [ Пон Яну 30, 2012 9:06 pm ]
Заглавие:  Re: LCD , PIC16F690 and CCS

Пробвах, стана, Благодаря :)

Автор:  zle [ Вто Яну 31, 2012 1:17 am ]
Заглавие:  Re: LCD , PIC16F690 and CCS

Когато напиша "а" на дисплея се показва ' / а ако напиша "А" на дисплея показва B.
в таблицата с символите на дисплея тези символи се намират един над друг младшата част на думата определяща вида на символа върви през 0010 т.е. символите вървят през ред.

Автор:  michev [ Вто Яну 31, 2012 1:32 am ]
Заглавие:  Re: LCD , PIC16F690 and CCS

Учудвам се че въобще си успял да компилираш тоя код :)
Функция void lcd_putc(char c) иска символ а ти и подаваш стринг.. (lcd_putc("\fHello World\n"); )

А извикай я ей така например и да видим пак ли не вади правилни символи-
Код:
lcd_putc('A');
..
lcd_putc('C');

Автор:  zle [ Вто Яну 31, 2012 1:38 am ]
Заглавие:  Re: LCD , PIC16F690 and CCS

ами да lcd_putc('A'); и lcd_putc('а'); се получава @ и '

Автор:  michev [ Вто Яну 31, 2012 1:47 am ]
Заглавие:  Re: LCD , PIC16F690 and CCS

Провери си 4-те дата линии дали имат връзка от контролера до дисплея.
Ако трябва ги тествай 1 по 1 с ниско и високо ниво и мери.

Автор:  zle [ Вто Яну 31, 2012 2:02 am ]
Заглавие:  Re: LCD , PIC16F690 and CCS

...

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/