Devre şeması

Şimdi gerçek bir program yazalım.
/*======================================================
******************* PICPROJE DERGISI 2 ***********************
Proje Adı : dsPIC30F4011 ile Nokia 3310 LCD kontrolü
Yazan : Aykut ULUSAN (EEMKUTAY) (Elektronik Mühendisi)
=======================================================*/
#include "p30F3010.h" // 4011 kullanacağız
#include "ascii.h" // karakter hexlerini include edelim
_FOSC(CSW_FSCM_OFF & XT_PLL8); //10Mhz *8 = 80 MHz /4 = 20 MIPS
_FWDT(WDT_OFF); // WDT off
_FBORPOR(PBOR_OFF & PWRT_64 & MCLR_EN); // MCLR on, PWRT=64ms, PBOR off
_FGS(CODE_PROT_OFF); // kod koruması off
// clock ve data SPI portundan sağlanır, 40 pin DSpic30F4011
// SDI1 RF2 26 - Okuma yapılmadığı için kullanılmıyor
// SDO1 RF3 25 - Kullanılıyor
// SCK1 RF6 24 - Kullanılıyor
/*
Nokia GLCD dsPIC30F4011(40pin)
SCK RF6
SDA RF3
DC PORTD2
CS PORTD0
RST PORTD3
*/
#define GLCD_DC LATDbits.LATD2 // Data/Command select
#define GLCD_CS LATDbits.LATD0 // Chip Select
#define GLCD_RST LATDbits.LATD3 // Reset
#define D 1 // data gönderilecek
#define C 0 // komut gönderilecek
#define off 1 // Chip select on
#define on 0 // Chip select off yapıyoruz
void GLCD_INIT(void); // Glcd’yi hazırla
void PORT_SETUP(void); // portları hazırla
void GLCD_YAZ(unsigned int DA_TA,unsigned int D_C); // GLCD’ye yaz
void GLCD_CLEAR(void); // ekranı temizle
void GLCD_POZISYON(unsigned int sayfa, unsigned int sutun); // koordinata git
void GLCD_KARAKTER_YAZ(char c); // ekrana karakter yaz
void GLCD_YAZI_YAZ(const char *s); // ekrana string yaz
void DLY_MS(unsigned int ms); // 1ms - 65536ms delay sağlar
void DLY_US(unsigned int us); // 1-65535 us delay sağlar
void BIR_USN(void); // 1us lik delay
int
main (void){
PORT_SETUP();
GLCD_INIT();
GLCD_CLEAR(); // Ekranı temizle
GLCD_POZISYON(0,0); // 0. sayfa 0. sütuna git
GLCD_YAZI_YAZ("NOKIA 3310 LCD"); // NOKIA 3310 LCD yaz
GLCD_POZISYON(1,0); // 1. sayfa 0. sutuna git
GLCD_YAZI_YAZ("PICPROJE.COM"); // PICPROJE.COM yazar
GLCD_POZISYON(2,0);
GLCD_YAZI_YAZ("EEMKUTAY"); //
while(1);
}
void
PORT_SETUP(void){
ADPCFG=0xFFFF; // tüm portlar digital
PORTB=0;
PORTC=0;
PORTD=0;
PORTE=0; // SCK1 çıkış RE8
TRISB=0; // çıkış
TRISC=0;
TRISD=0;
TRISE=0;
TRISF=0xFFF4; // 0100 RF2=SDI(input) , RF3=SDO(çıkış)
// Aşağıdaki şekilde 4MIPS clock hızında ,Master,Data aktiften idle’a geçerken değişir, idle clock low
// state,aktif clock high state,8bit modunda,
// SS1 pini kullanılmıyor olacak şekilde ayarladık
SPI1CON=0x012F;
SPI1STAT=0x8000; // SPI port enable
}
void
GLCD_INIT(void){
DLY_MS(150); // beslemenin tam oturması için 150ms
GLCD_CS=off; // chip select off (reset, chip select'e bakmaz)
GLCD_DC=D; // Ram'i temizleyeceğimiz için data modu seçilir
DLY_MS(10); // Kararlılık için 10ms bekle
GLCD_RST=0; // resetle
DLY_MS(50); // 50ms bekle
GLCD_RST=1; // reset sonu,
DLY_MS(10);
GLCD_YAZ(0x21,C); // PD=0(Chip enable),V=0(Horizontel modu),H=1(extended instruction set)
GLCD_YAZ(0xC8,C); // Vop (6/8 Vlcd)
GLCD_YAZ(0x13,C); // 1/48 bias
GLCD_YAZ(0x20,C); // PD=0 (Chip enable), V=0 (Horizontel modu), H=0 (basic instruction set)
GLCD_YAZ(0x0C,C); // Normal Mode
// GLCD_YAZ(0x0D,C); // Görüntüyü invert et
}
void
GLCD_YAZ(unsigned int DA_TA,unsigned int D_C){
unsigned int temp; // overflow varsa temizleyeceğiz
if (D_C==D)
GLCD_DC = 1; // Data Mode
else
GLCD_DC = 0; // Komut Mode
GLCD_CS=on; // chip on
SPI1STATbits.SPIROV=0; // overflow varsa da yoksa da clear
temp=SPI1BUF; // Buffer'ı temizle,
SPI1BUF=DA_TA; // gönderilecek veriyi buffer'a at
while(SPI1STATbits.SPITBF
while ( !SPI1STATbits.SPIRBF);
GLCD_CS=off;
}
void
GLCD_CLEAR(void){
unsigned int x; // Counter olarak kullanacağız
GLCD_POZISYON(0,0); // 0.Sayfa ve 0.sutuna git
for(x=0;x<504;x++)
GLCD_YAZ(0x00,D); // Data yazılacak ama 0x00
}
// sayfa yerine 0-5, sutun yerine 0-83 arası sayı girilebilir
void
GLCD_POZISYON(unsigned int sayfa, unsigned int sutun){
GLCD_YAZ((0x40|(sayfa&0x07)),C); // sayfa'in ilk 3 bitini maskele ve 0x40 ile OR'la, C=Komut
GLCD_YAZ((0x80|(sutun&0x7F)),C); // Sutun için ilk 7 biti maskele 0x80 ile OR'la
}
void
GLCD_KARAKTER_YAZ(char c) { // c urada karakterdir ve 'c' şeklinde yazılır (a harfi için = 'A'yazılır)
unsigned int n; // Sadece bir counter(1 karekteri ekranda göstermek için 5 byte gerekli)
unsigned int ch; // Karakterin 5 byte'nın bulunduğu yeri belirler ve tutar
if ((c<32)||(c>126)) // Karekter değeri 48'den küçük veya 90'dan büyük ise
c=63; // c=63 yap. (bu şart sağlanıyorsa karekter sınırlarını aşmışız demektir) ? =63
ch = (c-32)*5; // C'den 32(20h yani ilk karakterin hex değeri) çıkart ve 5 ile çarp
// '$'=24H=36 36-32=4 4x5=20 ch=20 olur
for(n=5; n>0; n--) // ch'ı bir arttır ve gösterdiği hex'i Glcd'ye gönder
GLCD_YAZ((font[ch++]),D); // 5 kez bu işlem devam eder
GLCD_YAZ(0,D); // Her karakter arasında bir sütun boşluk bırakılır.
}
void GLCD_YAZI_YAZ(const char *s){
while(*s)
GLCD_KARAKTER_YAZ(*s++);
}
void
BIR_USN(void){ // 1 usn delay
asm("REPEAT #15"); // (15+1)x50ns=800 usn
asm("nop");
}
// 1 usn - 65 535 usn arasında (65,536ms)
void
DLY_US(unsigned int us){
unsigned int c;
for(c=0;c<=us;c++)
BIR_USN();
}
void
DLY_MS(unsigned int ms){
unsigned int c;
for(c=0;c<=ms;c++)
DLY_US(1000);
}
/*========================================================
ASC2 karakterler
ascii.h
=========================================================*/
const char font[ ] ={
0x0,0x0,0x0,0x0,0x0, // 32 -esp- 20
0x0,0x0,0x4F,0x0,0x0, // 33 - ! - 21
0x0,0x7,0x0,0x7,0x0, // 34 - " - 22
0x14,0x7F,0x14,0x7F,0x14, // 35 - # - 23
0x24,0x2A,0x7F,0x2A,0x12, // 36 - $ - 24
0x23,0x13,0x8,0x64,0x62, // 37 - % - 25
0x36,0x49,0x55,0x22,0x50, // 38 - & - 26
0x0,0x5,0x3,0x0,0x0, // 39 - ' - 27
0x1C,0x22,0x41,0x0,0x0, // 40 - ( - 28
0x0,0x0,0x41,0x22,0x1C, // 41 - ) - 29
0x14,0x8,0x3E,0x8,0x14, // 42 - * - 2A
0x8,0x8,0x3E,0x8,0x8, // 43 - + - 2B
0x0,0x50,0x30,0x0,0x0, // 44 - , - 2C
0x8,0x8,0x8,0x8,0x8, // 45 - - - 2D
0x0,0x60,0x60,0x0,0x0, // 46 - . - 2E
0x20,0x10,0x8,0x4,0x2, // 47 - / - 2F
0x3E,0x51,0x49,0x45,0x3E, // 48 - 0 - 30
0x0,0x42,0x7F,0x40,0x0, // 49 - 1 - 31
0x42,0x61,0x51,0x49,0x46, // 50 - 2 - 32
0x21,0x41,0x45,0x4B,0x31, // 51 - 3 - 33
0x18,0x14,0x12,0x7F,0x10, // 52 - 4 - 34
0x27,0x45,0x45,0x45,0x39, // 53 - 5 - 35
0x3C,0x4A,0x49,0x49,0x30, // 54 - 6 - 36
0x1,0x71,0x9,0x5,0x3, // 55 - 7 - 37
0x36,0x49,0x49,0x49,0x36, // 56 - 8 - 38
0x06,0x49,0x49,0x29,0x1E, // 57 - 9 - 39
0x0,0x36,0x36,0x0,0x0, // 58 - : - 3A
0x0,0x56,0x36,0x0,0x0, // 59 - ; - 3B
0x8,0x14,0x22,0x41,0x0, // 60 - < - 3C
0x14,0x14,0x14,0x14,0x14, // 61 - = - 3D
0x0,0x41,0x22,0x14,0x8, // 62 - > - 3E
0x2,0x1,0x51,0x9,0x6, // 63 - ? - 3F
0x32,0x49,0x79,0x41,0x3E, // 64 - @ - 40
0x7E,0x11,0x11,0x11,0x7E, // 65 - A - 41
0x7F,0x49,0x49,0x49,0x36, // 66 - B - 42
0x3E,0x41,0x41,0x41,0x22, // 67 - C - 43
0x7F,0x41,0x41,0x22,0x1C, // 68 - D - 44
0x7F,0x49,0x49,0x49,0x41, // 69 - E - 45
0x7F,0x9,0x9,0x9,0x1, // 70 - F - 46
0x3E,0x41,0x49,0x49,0x7A, // 71 - G - 47
0x7F,0x8,0x8,0x8,0x7F, // 72 - H - 48
0x0,0x41,0x7F,0x41,0x0, // 73 - I - 49
0x20,0x40,0x41,0x3F,0x1, // 74 - J - 4A
0x7F,0x8,0x14,0x22,0x41, // 75 - K - 4B
0x7F,0x40,0x40,0x40,0x40, // 76 - L - 4C
0x7F,0x2,0xC,0x2,0x7F, // 77 - M - 4D
0x7F,0x4,0x8,0x10,0x7F, // 78 - N - 4E
0x3E,0x41,0x41,0x41,0x3E, // 79 - O - 4F
0x7F,0x9,0x9,0x9,0x6, // 80 - P - 50
0x3E,0x41,0x51,0x21,0x5E, // 81 - Q - 51
0x7F,0x9,0x19,0x29,0x46, // 82 - R - 52
0x46,0x49,0x49,0x49,0x31, // 83 - S - 53
0x1,0x1,0x7F,0x1,0x1, // 84 - T - 54
0x3F,0x40,0x40,0x40,0x3F, // 85 - U - 55
0x1F,0x20,0x40,0x20,0x1F, // 86 - V - 56
0x3F,0x40,0x38,0x40,0x3F, // 87 - W - 57
0x63,0x14,0x8,0x14,0x63, // 88 - X - 58
0x7,0x8,0x70,0x8,0x7, // 89 - Y - 59
0x61,0x51,0x49,0x45,0x43, // 90 - Z - 5A
0x7F,0x41,0x41,0x0,0x0, // 91 - [ - 5B
0x2,0x4,0x8,0x10,0x20, // 92 - \ - 5C
0x0,0x0,0x41,0x41,0x7F, // 93 - ] - 5D
0x4,0x2,0x1,0x2,0x4, // 94 - ^ - 5E
0x40,0x40,0x40,0x40,0x40, // 95 - _ - 5F
0x0,0x1,0x2,0x4,0x0, // 96 - ` - 60
0x20,0x54,0x54,0x54,0x78, // 97 - a - 61
0x7F,0x48,0x44,0x44,0x38, // 98 - b - 62
0x38,0x44,0x44,0x44,0x20, // 99 - c - 63
0x38,0x44,0x44,0x48,0x7F, // 100 d - 64
0x38,0x54,0x54,0x54,0x18, // 101 e - 65
0x8,0x7E,0x9,0x1,0x2, // 102 f - 66
0xC,0x52,0x52,0x52,0x3E, // 103 g - 67
0x7F,0x8,0x4,0x4,0x78, // 104 h - 68
0x0,0x44,0x7D,0x40,0x0, // 105 i - 69
0x0,0x20,0x40,0x44,0x3D, // 106 j - 6A
0x7F,0x10,0x28,0x44,0x0, // 107 k - 6B
0x0,0x41,0x7F,0x40,0x0, // 108 l - 6C
0x7C,0x4,0x18,0x4,0x78, // 109 m - 6D
0x7C,0x8,0x4,0x4,0x78, // 110 n - 6E
0x38,0x44,0x44,0x44,0x38, // 111 o - 6F
0x7C,0x14,0x14,0x14,0x8, // 112 p - 70
0x8,0x14,0x14,0x18,0x7C, // 113 q - 71
0x7C,0x8,0x4,0x4,0x8, // 114 r - 72
0x48,0x54,0x54,0x54,0x20, // 115 s - 73
0x4,0x3F,0x44,0x40,0x20, // 116 t - 74
0x3C,0x40,0x40,0x20,0x7C, // 117 u - 75
0x1C,0x20,0x40,0x20,0x1C, // 118 v - 76
0x3C,0x40,0x30,0x40,0x3C, // 119 w - 77
0x44,0x28,0x10,0x28,0x44, // 120 x - 78
0xC,0x50,0x50,0x50,0x3C, // 121 y - 79
0x44,0x64,0x54,0x4C,0x44, // 122 z - 7A
0x8,0x36,0x41,0x0,0x0, // 123 { - 7B
0x0,0x0,0x7F,0x0,0x0, // 124 | - 7C
0x0,0x0,0x41,0x36,0x8, // 125 } - 7D
0x0,0x8,0x4,0x8,0x4 // 126 ~ - 7E
};
Uygulma görüntüleri
Aykut ULUSAN – Elektronik Mühendisi – IZMIR
Emeği geçen herkese teşekkürler.
Ülkemizde bu tarz konularda türkçe kaynak ve yönlendirici bilgi bulmak gerçekten zor.
Picproje ve dergi ekibine tekrar teşekkürler.
Düşüncelerinle destek olduğun için teşekkürler Murat, Sizlerin katkısıyla umarım insanlarımız ve ülkemiz için daha faydalı işler çıkartırız.
“Bir mum, diğer mumu tutuşturmakla ışığından birşey kaybetmez” (Mevlana)
Aykut ULUSAN(KUTAY)
Bir çok eletronik mühendisinin “ekmek yiyorum” diye vermediği bilgileri vermişsiniz çok teşekkürler.
Merhaba @22aykut,
Adaşız galiba, yorum için teşekkürler. İnsan paylaştıkça farkında olmadan daha çok kazanıyor.
Kutay