reklam1

reklam1

15 Aralık 2011 Perşembe

3 hattan bağlanabilen 2x16 LCD sürücüsü

3 hattan bağlanabilen GLCD (KS0108) sürücüsü yazmıştık. Şimdi de yine 3 hattan bağlanabilen 2x16 LCD sürücüsü yazalım.
12F675, 12F509, 12F683 gibi 8 bacaklı, ucuz, PIC leri kullanabilmek için epey uğraşmak gerekiyor. İki adet besleme bacağını çıkarırsak geriye kalıyor 6 bacak. Bunlardan ikisi osilatör (neyse ki internal osc 8Mhz ayarlanabiliyor ve accuracy mükemmel). Birisi interrupt girişi derken size kalan portlarla neyi kontrol edeceksin, hangi ekranı süreceksin. Basit işler için çok iyi bir seçenek olan bu PIC lerle yapılan işlerde genellikle port sıkıntısı yüzünden ekran kullanılmıyor. Bir iki led'le işler halledilmeye çalışılıyor. Oysa, GLCD için yaptığımız donanım hilesini burada da yapabiliriz. Bir adet 74HC164 ile 3 hattan sürebiliriz. Bu entegre, 8-bit Serial-in, parallel out shift register. Devreyi kurunca çok komik duruyor. (Mikrokontroller, 74HC164 ten daha küçük).
İşte devrenin nasıl kurulacağının şeması;
Burada da sürücü programı (Türkçe desteği -bonus-, ancak X karakterini derece simgesi için kullandım, X olarak kullanacaksanız, düzeltin) ;

#ifndef LCD_E
#define LCD_E PIN_E0
#define LCD_CK PIN_E1
#define LCD_DAT PIN_E2
#endif

boolean turkce;

//========================================
int RS_bit;
#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, int rs_bit)
{

int x;
if(RS_bit==1)
nibble=nibble|0x10;

for(x=0;x<5;x++){
output_bit(LCD_DAT,shift_right(&nibble,1,0));
delay_cycles(1);
output_low(LCD_CK);
delay_us(1);
output_high(LCD_CK);}

output_high(LCD_E);
delay_us(2);
output_low(LCD_E);
}

//----------------------------------------
void lcd_send_byte(int8 address, int8 n)
{
//output_low(LCD_RS);
RS_bit=0;
delay_us(100);


if(address)
//output_high(LCD_RS);
RS_bit=1;
else
//output_low(LCD_RS);
RS_bit=0;

delay_cycles(1);


output_low(LCD_E);

lcd_send_nibble(n >> 4,RS_bit);
lcd_send_nibble(n & 0xf,RS_bit);
}

//----------------------------
void lcd_init(void)
{
int8 i;

//output_low(LCD_RS);
RS_bit=0;

output_low(LCD_E);

delay_ms(20);

for(i=0 ;i < 3; i++)
{
lcd_send_nibble(0x03,RS_bit);
delay_ms(5);
}

lcd_send_nibble(0x02,RS_bit);

for(i=0; i < sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);

delay_ms(5);

}

}

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

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) {
if (turkce) {
if (c=='Ç') c=0;
if (c=='Ğ') c=1;
if (c=='İ') c=2;
if (c=='Ö') c=3;
if (c=='Ş') c=4;
if (c=='Ü') c=5;
if (c=='I') c=6;
if (c=='X') c=7;
}
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\i' : lcd_gotoxy(1,1); break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}

void lcd_setcursor_visible(short visible, short blink) {
lcd_send_byte(0, 0xC|(visible<<1)|blink);
}

void lcd_turkceb() {

// Ç

lcd_send_byte(0,0x40); lcd_send_byte(1,14);
lcd_send_byte(0,0x41); lcd_send_byte(1,17);
lcd_send_byte(0,0x42); lcd_send_byte(1,16);
lcd_send_byte(0,0x43); lcd_send_byte(1,16);
lcd_send_byte(0,0x44); lcd_send_byte(1,16);
lcd_send_byte(0,0x45); lcd_send_byte(1,21);
lcd_send_byte(0,0x46); lcd_send_byte(1,14);
lcd_send_byte(0,0x47); lcd_send_byte(1,4);

// Ğ
lcd_send_byte(0,0x48); lcd_send_byte(1,14);
lcd_send_byte(0,0x49); lcd_send_byte(1,0);
lcd_send_byte(0,0x4A); lcd_send_byte(1,15);
lcd_send_byte(0,0x4B); lcd_send_byte(1,16);
lcd_send_byte(0,0x4C); lcd_send_byte(1,19);
lcd_send_byte(0,0x4D); lcd_send_byte(1,17);
lcd_send_byte(0,0x4E); lcd_send_byte(1,15);
lcd_send_byte(0,0x4F); lcd_send_byte(1,0);

// İ
lcd_send_byte(0,0x50); lcd_send_byte(1,4);
lcd_send_byte(0,0x51); lcd_send_byte(1,0);
lcd_send_byte(0,0x52); lcd_send_byte(1,4);
lcd_send_byte(0,0x53); lcd_send_byte(1,4);
lcd_send_byte(0,0x54); lcd_send_byte(1,4);
lcd_send_byte(0,0x55); lcd_send_byte(1,4);
lcd_send_byte(0,0x56); lcd_send_byte(1,4);
lcd_send_byte(0,0x57); lcd_send_byte(1,0);

// Ö
lcd_send_byte(0,0x58); lcd_send_byte(1,10);
lcd_send_byte(0,0x59); lcd_send_byte(1,0);
lcd_send_byte(0,0x5A); lcd_send_byte(1,14);
lcd_send_byte(0,0x5B); lcd_send_byte(1,17);
lcd_send_byte(0,0x5C); lcd_send_byte(1,17);
lcd_send_byte(0,0x5D); lcd_send_byte(1,17);
lcd_send_byte(0,0x5E); lcd_send_byte(1,14);
lcd_send_byte(0,0x5F); lcd_send_byte(1,0);

// Ş
lcd_send_byte(0,0x60); lcd_send_byte(1,14);
lcd_send_byte(0,0x61); lcd_send_byte(1,17);
lcd_send_byte(0,0x62); lcd_send_byte(1,16);
lcd_send_byte(0,0x63); lcd_send_byte(1,14);
lcd_send_byte(0,0x64); lcd_send_byte(1,1);
lcd_send_byte(0,0x65); lcd_send_byte(1,21);
lcd_send_byte(0,0x66); lcd_send_byte(1,14);
lcd_send_byte(0,0x67); lcd_send_byte(1,4);

// Ü
lcd_send_byte(0,0x68); lcd_send_byte(1,10);
lcd_send_byte(0,0x69); lcd_send_byte(1,0);
lcd_send_byte(0,0x6A); lcd_send_byte(1,17);
lcd_send_byte(0,0x6B); lcd_send_byte(1,17);
lcd_send_byte(0,0x6C); lcd_send_byte(1,17);
lcd_send_byte(0,0x6D); lcd_send_byte(1,17);
lcd_send_byte(0,0x6E); lcd_send_byte(1,14);
lcd_send_byte(0,0x6F); lcd_send_byte(1,0);

// I
lcd_send_byte(0,0x70); lcd_send_byte(1,4);
lcd_send_byte(0,0x71); lcd_send_byte(1,4);
lcd_send_byte(0,0x72); lcd_send_byte(1,4);
lcd_send_byte(0,0x73); lcd_send_byte(1,4);
lcd_send_byte(0,0x74); lcd_send_byte(1,4);
lcd_send_byte(0,0x75); lcd_send_byte(1,4);
lcd_send_byte(0,0x76); lcd_send_byte(1,4);
lcd_send_byte(0,0x77); lcd_send_byte(1,0);

// X
lcd_send_byte(0,0x78); lcd_send_byte(1,2);
lcd_send_byte(0,0x79); lcd_send_byte(1,5);
lcd_send_byte(0,0x7A); lcd_send_byte(1,2);
lcd_send_byte(0,0x7B); lcd_send_byte(1,0);
lcd_send_byte(0,0x7C); lcd_send_byte(1,0);
lcd_send_byte(0,0x7D); lcd_send_byte(1,0);
lcd_send_byte(0,0x7E); lcd_send_byte(1,0);
lcd_send_byte(0,0x7F); lcd_send_byte(1,0);

delay_ms(5);
turkce=TRUE;
}

Dikkat edilmesi gereken tek nokta, sistem enerjilendikten sonra biraz gecikme koyun daha sonra lcd_init yapın.

Hiç yorum yok :

Yorum Gönder

reklam4

reklam4