Nokia 7110 LCD Kütüphanesi

Başlatan FxDev, 06 Temmuz 2009, 21:22:44

FxDev

Umarım işinize yarar...



7110.h
/*					www.FxDev.org
 * 				7110 LCD Kullanım Klavuzu
 * nokia_init(); ile LCD'nin ilk ayarlarını yap.
 * nokia_reset(); ile LCD'ye reset atılır.
 * nokia_clean_ddram(); ile LCD nin DDRAM'i silinir.
 * nokia_write_command(0x20); şeklinde komut gönderilir.
 * nokia_write_data(0x01); şeklinde data gönderilir.
 * nokia_write_byte(0xFE); ile bir byte'lık bilgi gönderilir.
 * nokia_gotoxy(2,3); ile lcd'de belirli bölgelere gidilebilir. Sınır: (0,0) dan (132,8) dir.
 * nokia_contrast(1); ile kontrast ayarı yapılır. (1: ters, 0 normal)
 * nokia_printchar("Deneme"); şeklinde yazı yazdırılır.
 * nokia_print(i+48); şeklinde sayı yazdırılır.
 *					www.FxDev.org 
*/

#define nok_res   RB0
#define nok_cs	  RB1
#define nok_dc	  RB2
#define nok_sdata RB3
#define nok_sclk  RB4

extern void nokia_init(void);
extern void nokia_reset(void);
extern void nokia_clean_ddram(void);
extern void nokia_write_command(char nokia_command);
extern void nokia_write_data(char nokia_data);
extern void nokia_write_byte(char bytefornokia);
extern void nokia_contrast(char nokia_contrast);
extern void nokia_gotoxy(char ynokia, char xnokia);
extern void nokia_printchar(const char *s);
extern void nokia_print(char charsel);


7110.c
#include <pic.h>
#include "delay.h"
#include "7110.h"

const unsigned char tablo1 [240] = {	
						0x00,0x00,0x00,0x00,0x00,	// 20 bosluk
						0x00,0x00,0x5f,0x00,0x00,	// 21 !
						0x00,0x07,0x00,0x07,0x00,	// 22 "
						0x14,0x7f,0x14,0x7f,0x14,	// 23 #
						0x24,0x2a,0x7f,0x2a,0x12,	// 24 $
						0x23,0x13,0x08,0x64,0x62,	// 25 %
						0x36,0x49,0x55,0x22,0x50,	// 26 &
						0x00,0x05,0x03,0x00,0x00,	// 27 '
						0x00,0x1c,0x22,0x41,0x00,	// 28 (
						0x00,0x41,0x22,0x1c,0x00,	// 29 )
						0x14,0x08,0x3e,0x08,0x14,	// 2a *
						0x08,0x08,0x3e,0x08,0x08,	// 2b +
						0x00,0x50,0x30,0x00,0x00,	// 2c ,
						0x08,0x08,0x08,0x08,0x08,	// 2d -
						0x00,0x60,0x60,0x00,0x00,	// 2e .
						0x20,0x10,0x08,0x04,0x02,	// 2f /
						0x3e,0x51,0x49,0x45,0x3e,	// 30 0
						0x00,0x42,0x7f,0x40,0x00,	// 31 1
						0x42,0x61,0x51,0x49,0x46,	// 32 2
						0x21,0x41,0x45,0x4b,0x31,	// 33 3
						0x18,0x14,0x12,0x7f,0x10,	// 34 4
						0x27,0x45,0x45,0x45,0x39,	// 35 5
						0x3c,0x4a,0x49,0x49,0x30,	// 36 6
						0x01,0x71,0x09,0x05,0x03,	// 37 7
						0x36,0x49,0x49,0x49,0x36,	// 38 8
						0x06,0x49,0x49,0x29,0x1e,	// 39 9
						0x00,0x36,0x36,0x00,0x00,	// 3a :
						0x00,0x56,0x36,0x00,0x00,	// 3b ;
						0x08,0x14,0x22,0x41,0x00,	// 3c <
						0x14,0x14,0x14,0x14,0x14,	// 3d =
						0x00,0x41,0x22,0x14,0x08,	// 3e >
						0x02,0x01,0x51,0x09,0x06,	// 3f ?
						0x32,0x49,0x79,0x41,0x3e,	// 40 @
						0x7e,0x11,0x11,0x11,0x7e,	// 41 A
						0x7f,0x49,0x49,0x49,0x36,	// 42 B
						0x3e,0x41,0x41,0x41,0x22,	// 43 C
						0x7f,0x41,0x41,0x22,0x1c,	// 44 D
						0x7f,0x49,0x49,0x49,0x41,	// 45 E
						0x7f,0x09,0x09,0x09,0x01,	// 46 F
						0x3e,0x41,0x49,0x49,0x7a,	// 47 G
						0x7f,0x08,0x08,0x08,0x7f,	// 48 H
						0x00,0x41,0x7f,0x41,0x00,	// 49 I
						0x20,0x40,0x41,0x3f,0x01,	// 4a J
						0x7f,0x08,0x14,0x22,0x41,	// 4b K
						0x7f,0x40,0x40,0x40,0x40,	// 4c L
						0x7f,0x02,0x0c,0x02,0x7f,	// 4d M
						0x7f,0x04,0x08,0x10,0x7f,	// 4e N
						0x3e,0x41,0x41,0x41,0x3e};	// 4f O

const unsigned char tablo2 [240] = {
                  		0x7f,0x09,0x09,0x09,0x06,	// 50 P
						0x3e,0x41,0x51,0x21,0x5e,	// 51 Q
						0x7f,0x09,0x19,0x29,0x46,	// 52 R
						0x46,0x49,0x49,0x49,0x31,	// 53 S
						0x01,0x01,0x7f,0x01,0x01,	// 54 T
						0x3f,0x40,0x40,0x40,0x3f,	// 55 U
						0x1f,0x20,0x40,0x20,0x1f,	// 56 V
						0x3f,0x40,0x38,0x40,0x3f,	// 57 W
						0x63,0x14,0x08,0x14,0x63,	// 58 X
						0x07,0x08,0x70,0x08,0x07,	// 59 Y
						0x61,0x51,0x49,0x45,0x43,	// 5a Z
						0x00,0x7f,0x41,0x41,0x00,	// 5b [
						0x02,0x04,0x08,0x10,0x20,	// 5c \\
						0x00,0x41,0x41,0x7f,0x00,	// 5d ñ
						0x04,0x02,0x01,0x02,0x04,	// 5e ^
						0x40,0x40,0x40,0x40,0x40,	// 5f _
						0x00,0x01,0x02,0x04,0x00,	// 60 `
						0x20,0x54,0x54,0x54,0x78,	// 61 a
						0x7f,0x48,0x44,0x44,0x38,	// 62 b
						0x38,0x44,0x44,0x44,0x20,	// 63 c
						0x38,0x44,0x44,0x48,0x7f,	// 64 d
						0x38,0x54,0x54,0x54,0x18,	// 65 e
						0x08,0x7e,0x09,0x01,0x02,	// 66 f
						0x0c,0x52,0x52,0x52,0x3e,	// 67 g
						0x7f,0x08,0x04,0x04,0x78,	// 68 h
						0x00,0x44,0x7d,0x40,0x00,	// 69 i
						0x20,0x40,0x44,0x3d,0x00,	// 6a j
						0x7f,0x10,0x28,0x44,0x00,	// 6b k
						0x00,0x41,0x7f,0x40,0x00,	// 6c l
						0x7c,0x04,0x18,0x04,0x78,	// 6d m
						0x7c,0x08,0x04,0x04,0x78,	// 6e n
						0x38,0x44,0x44,0x44,0x38,	// 6f o
						0x7c,0x14,0x14,0x14,0x08,	// 70 p
						0x08,0x14,0x14,0x18,0x7c,	// 71 q
						0x7c,0x08,0x04,0x04,0x08,	// 72 r
						0x48,0x54,0x54,0x54,0x20,	// 73 s
						0x04,0x3f,0x44,0x40,0x20,	// 74 t
						0x3c,0x40,0x40,0x20,0x7c,	// 75 u
						0x1c,0x20,0x40,0x20,0x1c,	// 76 v
						0x3c,0x40,0x30,0x40,0x3c,	// 77 w
						0x44,0x28,0x10,0x28,0x44,	// 78 x
						0x0c,0x50,0x50,0x50,0x3c,	// 79 y
						0x44,0x64,0x54,0x4c,0x44,	// 7a z
						0x00,0x08,0x36,0x41,0x00,	// 7b {
						0x00,0x00,0x7f,0x00,0x00,	// 7c |
						0x00,0x41,0x36,0x08,0x00,	// 7d }
						0x10,0x08,0x08,0x10,0x08,	// 7e ~
						0x78,0x46,0x41,0x46,0x78};	// 7f ¦

void nokia_init(void)
{
	nokia_reset();

	nokia_write_command(0xA6);	// LCD normal modda çalışıyor
	nokia_write_command(0xA3);	// LCD bias (1/9 0xA2 - 1/7 0xA3)
	nokia_write_command(0xA1);	// <ADC select> (0xA1 reverse lcd - 0xA0 select normal)
	nokia_write_command(0xC0);	// Ortak çıkış normal (0xC8 reverse)
	nokia_write_command(0x22);	// V5 resistor ratio
	nokia_write_command(0x81);	// Electronic volume modu
	nokia_write_command(0x2E);	// Güç değeri (Kontras--> 0x00 en açık <-> 0x3F en kapalı)
	nokia_write_command(0x2F);	// Güç kontrolü ayar değeri
	nokia_write_command(0xE3);	// nop
	nokia_write_command(0x40);	// Başlangıcı ayarla
	nokia_write_command(0xAF);	// LCD'yi aç
	nokia_write_command(0xA5);	// LCD'nin tüm noktalarını aç
	DelayMs(500);
	nokia_write_command(0xAE);	// LCD'yi kapa
	nokia_clean_ddram();		// DDRAM siliniyor
	nokia_write_command(0xAF);	// LCD'yi aç
	nokia_write_command(0xA4);	// LCD normal modda çalışıyor
}

void nokia_reset(void)
{
	nok_cs=1;			// Chip pasif
	DelayMs(10);
	nok_res=0;			//Başlangıçta res=0 olmak zoruna, aksi halde LCD'ye zarar gelebilir
	DelayMs(10);
	nok_res=1;
	DelayMs(100);
}

void nokia_clean_ddram(void)
{
	char page,x;
	for (page=0; page<9; page++)			// 9 sayfa var
	{
		nokia_write_command(0xB0 | page);	// Sayfa adresleri  1011 yyyy
		nokia_write_command(0x11);			// Sütun üst nibble 0001 xxxx
		nokia_write_command(0x02);			// Sütun alt nibble 0000 xxxx
		for (x=0; x<96; x++)				// 96 sütun var
			nokia_write_data(0x00);
	}
}

void nokia_write_command(char nokia_command)
{
	nok_dc = 0;		// Komut gönderimi için D/C=0;
	nok_cs = 0;		// Chip aktif
	nokia_write_byte(nokia_command);
	nok_cs = 1;		// Chip pasif
}

void nokia_write_data(char nokia_data)
{
	nok_dc = 1;		// Data gönderimi için D/C=1
	nok_cs = 0;		// Chip aktif
	nokia_write_byte(nokia_data);
	nok_cs = 1;		// Chip pasif
}

void nokia_write_byte(char bytefornokia)	// Seri veri gönderme rutini, datasheet'ten bire bir alıntı.
{
	char i;
	for(i=8;i>0;i--)
	{
		nok_sclk=0;
		DelayUs(2);
		if((bytefornokia & 0x80)==0)
			nok_sdata=0;
		else
			nok_sdata=1;
		nok_sclk=1;
		DelayUs(2);
   		bytefornokia = bytefornokia << 1;
   	}
}

void nokia_contrast(char nokia_contrast)
{
	if(nokia_contrast==1)
		nokia_write_command(0xA7);
	else 
		nokia_write_command(0xA6);
}

void nokia_gotoxy(char xnokia, char ynokia)	// İstenilen bölgeye ulaşma fonksiyonu
{
	nokia_write_command(0xB0 | ((ynokia%9)-1));	// Sayfa adresi belirleniyor 	 1011 yyyy
	nokia_write_command(0x10 | (xnokia+17 >>4 & 0x0F));		// Sütun üst nibble belirleniyor 0001 xxxx
	nokia_write_command(0x00 | (xnokia+17 & 0x0F));			// Sütun alt nibble belirleniyor 0000 xxxx
}

void nokia_printchar(const char *s)
{
	while(*s)
		nokia_print(*s++);
}

void nokia_print(char charsel) 			// ASCII tablosunu kullanarak yazı yazdırmaya yarayan fonksiyon
{
	char char_row,charpos,chardata;
	
	if (charsel<0x20) return;
	if (charsel>0x7f) return;

	for(char_row=0;char_row<5;char_row++)
	{
		if(charsel<0x50)		// Seçilen karekterin ASCII kodu 50h'tan ufaksa
		{
			charpos=(((charsel&0xff)-0x20)*5);
			chardata=tablo1[(charpos+char_row)];
		}
		if(charsel>0x4f)		// Seçilen karekterin ASCII kodu 50h'tan büyükse
		{
			charpos=(((charsel&0xff)-0x50)*5);
			chardata=tablo2[(charpos+char_row)];
		}

		nokia_write_data(chardata);	// Datayı gönder
	}
	nokia_write_data(0x00);			// Her zaman 1 bytelık son alan boş olacak
}

Digimensch

Bu güzel calisma icin tesekkürler.
Simdi elimizdeki bu 7110.h  ve 7110.c Dosyalarini Hi-Tide deki hangi Klosöre atmaliyiz?
Yoksa sadece Proje Klosörümüze koysak yetermi? Aynen Delay.h ve Delay.c  yöntemi gibi?

Digimensch

Tamam dostum yaptim hatta birde örnek yaptim calistirdim.
Gayet güzel bir calisma.Birde bu calismaya
void nokia_gotocentery(char ynokia);  
seklinde bir fonksiyon ekleyemezmiyiz ?
Yani Ekrana yazdirmak istedigim bir stringin sadece satir sayisini vereyim ve o string o satirda ekranin tam ortasina yazilsin.

Tesekkürler