Mükemmel durumda değil ama şu an kullandığım driver
ks0108.c
#include "ks0108.h"
#include "font.h"
#include "delay.h"
/* Global Variables */
volatile unsigned char x_ks0108, y_ks0108;
/* Functions */
void strobe_ks0108(void){
delay_us(1); /* Delay 1us */
KS0108_EN = 1; /* Strobe */
delay_us(1); /* Delay 1us */
KS0108_EN = 0; /* Strobe */
delay_us(1); /* Delay 1us */
}
void wait_busy_ks0108(void){
KS0108_PORT_DIR(KS0108_PORT_INPUT); /* Change Port Direction */
KS0108_DI = 0; /* Instruction Mode */
KS0108_RW = 1; /* Read Mode */
strobe_ks0108(); /* LCD Strobe */
while((KS0108_DATA&0x7F)==0x80); /* Chek Busy Flag */
KS0108_RW = 0; /* Write Mode */
KS0108_PORT_DIR(KS0108_PORT_OUTPUT); /* Change Port Direction */
}
void putcmd_ks0108(char ins){
wait_busy_ks0108(); /* Wait Until LCD not Busy */
KS0108_DI = 0; /* Instruction Mode */
KS0108_LDATA(ins); /* Load Instruction to Port */
strobe_ks0108(); /* LCD Strobe */
}
unsigned char getd_ks0108(void){
char data;
KS0108_PORT_DIR(KS0108_PORT_INPUT); /* Set Port Direction */
KS0108_DI = 1; /* Data Mode */
KS0108_RW = 1; /* Read Mode */
strobe_ks0108(); /* LCD Strobe */
data = KS0108_DATA; /* Read LCD Data */
KS0108_RW = 0; /* Write Mode */
KS0108_PORT_DIR(KS0108_PORT_OUTPUT); /* Set Port Direction */
return data;
}
void putd_ks0108(char data){
if(x_ks0108==0){
KS0108_L(); /* Select Chip */
putcmd_ks0108(KS0108_Y_ADRESS|(y_ks0108&0x7));
putcmd_ks0108(KS0108_X_ADRESS);
}else if(x_ks0108==64){
KS0108_R(); /* Select Chip */
putcmd_ks0108(KS0108_Y_ADRESS|(y_ks0108&0x7));
putcmd_ks0108(KS0108_X_ADRESS);
}
wait_busy_ks0108(); /* Wait Until LCD not Busy */
KS0108_DI = 1; /* Data Mode */
KS0108_LDATA(data); /* Load Data to Port */
strobe_ks0108(); /* LCD Strobe */
x_ks0108++;
if(x_ks0108>127{x_ks0108=0;y_ks0108++;}
if(y_ks0108>7){y_ks0108=0;}
}
void cls_ks0108(void){
unsigned int i;
x_ks0108 = 0;y_ks0108 = 0;
for(i=0;i<1024;i++)putd_ks0108(0x00);
x_ks0108 = 0;y_ks0108 = 0;
}
void init_ks0108(void){
KS0108_RST_DIR(KS0108_PIN_OUTPUT);
KS0108_RW_DIR(KS0108_PIN_OUTPUT);
KS0108_DI_DIR(KS0108_PIN_OUTPUT);
KS0108_EN_DIR(KS0108_PIN_OUTPUT);
KS0108_CS1_DIR(KS0108_PIN_OUTPUT);
KS0108_CS2_DIR(KS0108_PIN_OUTPUT);
KS0108_PORT_DIR(KS0108_PORT_OUTPUT); /* Set Port Direction */
KS0108_DI = 0; /* Instruction Mode */
KS0108_RW = 0; /* Write Mode */
KS0108_N(); /* Deselect Chips */
KS0108_LDATA(0x00); /* Load Data to Port */
KS0108_EN = 0;
KS0108_RST = 0;
delay_ms(2); /* Delay 2ms */
KS0108_RST = 1;
delay_ms(1); /* Delay 1ms */
KS0108_L(); /* Select Chip */
putcmd_ks0108(KS0108_DISPLAY_OFF);
putcmd_ks0108(KS0108_START_LINE);
putcmd_ks0108(KS0108_X_ADRESS);
putcmd_ks0108(KS0108_Y_ADRESS);
putcmd_ks0108(KS0108_DISPLAY_ON);
KS0108_R(); /* Select Chip */
putcmd_ks0108(KS0108_DISPLAY_OFF);
putcmd_ks0108(KS0108_START_LINE);
putcmd_ks0108(KS0108_X_ADRESS);
putcmd_ks0108(KS0108_Y_ADRESS);
putcmd_ks0108(KS0108_DISPLAY_ON);
cls_ks0108();
}
void gotoxy_ks0108(unsigned char x, unsigned char y){
x_ks0108 = x;
y_ks0108 = y;
if(x_ks0108<64){
KS0108_L(); /* Select Chip */
putcmd_ks0108(KS0108_Y_ADRESS|(y_ks0108&0x7));
putcmd_ks0108(KS0108_X_ADRESS|x_ks0108);
}else{
KS0108_R(); /* Select Chip */
putcmd_ks0108(KS0108_Y_ADRESS|(y_ks0108&0x7));
putcmd_ks0108(KS0108_X_ADRESS|(x_ks0108-64));
}
}
void putc_ks0108(char c){
int i;
switch(c){
case '\f':cls_ks0108();break;
case '\n':gotoxy_ks0108(0,y_ks0108++);break;
case '\r':gotoxy_ks0108(0,y_ks0108);break;
default:if(x_ks0108>122)gotoxy_ks0108(0,++y_ks0108);
for(i = 0; i < 5; i++)putd_ks0108(Font[(((c-0x20)*5) + i)]);
putd_ks0108(0x00);
break;
}
}
void puts_ks0108(char *s){
do{
putc_ks0108(*s);
}while(*++s);
}
ks0108.h
/*
128x64 KS0108 LCD Driver for STM32F4
*/
#include <stm32f4xx.h>
/* LCD Connection Descriptions */
#define KS0108_RST_PIN 0
#define KS0108_RST_PORT GPIOB_BASE
#define KS0108_RW_PIN 1
#define KS0108_RW_PORT GPIOB_BASE
#define KS0108_DI_PIN 2
#define KS0108_DI_PORT GPIOB_BASE
#define KS0108_EN_PIN 11
#define KS0108_EN_PORT GPIOB_BASE
#define KS0108_CS1_PIN 4
#define KS0108_CS1_PORT GPIOC_BASE
#define KS0108_CS2_PIN 5
#define KS0108_CS2_PORT GPIOC_BASE
#define KS0108_DT_PIN 8
#define KS0108_DT_PORT GPIOE_BASE
/* LCD Definitions */
#define KS0108_Y_ADRESS 0xB8 /* Swapped with X address for real coordinate system */
#define KS0108_X_ADRESS 0x40 /* Swapped with Y address for real coordinate system */
#define KS0108_START_LINE 0xC0
#define KS0108_DISPLAY_ON 0x3F
#define KS0108_DISPLAY_OFF 0x3E
/* Port Definitions */
#define KS0108_PIN_INPUT 0x00
#define KS0108_PIN_OUTPUT 0x01
#define KS0108_PORT_INPUT 0x00000000
#define KS0108_PORT_OUTPUT 0x00005555
#define KS0108_RST (*(volatile unsigned short*)( 0x42000000U | ((KS0108_RST_PORT+0x14) << 5) | ((KS0108_RST_PIN << 2)))) /* ODR */
#define KS0108_RW (*(volatile unsigned short*)( 0x42000000U | ((KS0108_RW_PORT+0x14) << 5) | ((KS0108_RW_PIN << 2)))) /* ODR */
#define KS0108_DI (*(volatile unsigned short*)( 0x42000000U | ((KS0108_DI_PORT+0x14) << 5) | ((KS0108_DI_PIN << 2)))) /* ODR */
#define KS0108_EN (*(volatile unsigned short*)( 0x42000000U | ((KS0108_EN_PORT+0x14) << 5) | ((KS0108_EN_PIN << 2)))) /* ODR */
#define KS0108_CS1 (*(volatile unsigned short*)( 0x42000000U | ((KS0108_CS1_PORT+0x14) << 5) | ((KS0108_CS1_PIN << 2)))) /* ODR */
#define KS0108_CS2 (*(volatile unsigned short*)( 0x42000000U | ((KS0108_CS2_PORT+0x14) << 5) | ((KS0108_CS2_PIN << 2)))) /* ODR */
#define KS0108_RST_DIR(x) ((*(volatile unsigned int*)KS0108_RST_PORT)=((*(volatile unsigned int*)KS0108_RST_PORT)&~(0x03U<<(KS0108_RST_PIN*2)))|(x<<(KS0108_RST_PIN*2))) /* MODER */
#define KS0108_RW_DIR(x) ((*(volatile unsigned int*)KS0108_RW_PORT)=((*(volatile unsigned int*)KS0108_RW_PORT)&~(0x03U<<(KS0108_RW_PIN*2)))|(x<<(KS0108_RW_PIN*2))) /* MODER */
#define KS0108_DI_DIR(x) ((*(volatile unsigned int*)KS0108_DI_PORT)=((*(volatile unsigned int*)KS0108_DI_PORT)&~(0x03U<<(KS0108_DI_PIN*2)))|(x<<(KS0108_DI_PIN*2))) /* MODER */
#define KS0108_EN_DIR(x) ((*(volatile unsigned int*)KS0108_EN_PORT)=((*(volatile unsigned int*)KS0108_EN_PORT)&~(0x03U<<(KS0108_EN_PIN*2)))|(x<<(KS0108_EN_PIN*2))) /* MODER */
#define KS0108_CS1_DIR(x) ((*(volatile unsigned int*)KS0108_CS1_PORT)=((*(volatile unsigned int*)KS0108_CS1_PORT)&~(0x03U<<(KS0108_CS1_PIN*2)))|(x<<(KS0108_CS1_PIN*2))) /* MODER */
#define KS0108_CS2_DIR(x) ((*(volatile unsigned int*)KS0108_CS2_PORT)=((*(volatile unsigned int*)KS0108_CS2_PORT)&~(0x03U<<(KS0108_CS2_PIN*2)))|(x<<(KS0108_CS2_PIN*2))) /* MODER */
#define KS0108_PORT_DIR(x) ((*(volatile unsigned int*)KS0108_DT_PORT)= \
((*(volatile unsigned int*)KS0108_DT_PORT)&~(0x0000FFFFU<<(KS0108_DT_PIN*2)))|(x<<(KS0108_DT_PIN*2))) /* MODER */
#define KS0108_L() (KS0108_CS1=0, KS0108_CS2=1)
#define KS0108_R() (KS0108_CS1=1, KS0108_CS2=0)
#define KS0108_N() (KS0108_CS1=0, KS0108_CS2=0)
#define KS0108_DATA ((unsigned char)(((*((volatile unsigned short*)KS0108_DT_PORT+0x10)&(0x00FFU<<KS0108_DT_PIN)))>>KS0108_DT_PIN)) /* IDR */
#define KS0108_LDATA(x) ((*(volatile unsigned short*)(KS0108_DT_PORT+0x14)) = \
((*(volatile unsigned short*)(KS0108_DT_PORT+0x14))&~(0x00FFU<<KS0108_DT_PIN))|(x<<KS0108_DT_PIN)) /* ODR */
/* Public Functions */
extern void init_ks0108(void);
extern void gotoxy_ks0108(unsigned char, unsigned char);
extern void putc_ks0108(char);
extern void puts_ks0108(char*);
extern void cls_ks0108(void);
delay.c
#include "delay.h"
void delay_ns(unsigned int d){ /* Not exact value, for 168 MHz @ Level3 Opt */
unsigned int i;
i=d/25;while(i)i--;
}
void delay_us(unsigned int d){ /* for 168 MHz @ Level3 Opt */
unsigned int i,j;
i=d;while(i){i--;j=55;while(j)j--;}
}
void delay_ms(unsigned int d){ /* for 168 MHz @ Level3 Opt */
unsigned int i;
i=d;while(i){i--;delay_us(998);}
}
delay.h
#include <stm32f4xx.h>
extern void delay_ns(unsigned int);
extern void delay_us(unsigned int);
extern void delay_ms(unsigned int);
font.h
/* 5x7 Font */
static const char Font[]= {
0x00, 0x00, 0x00, 0x00, 0x00,// (space)
0x00, 0x00, 0x5F, 0x00, 0x00,// !
0x00, 0x07, 0x00, 0x07, 0x00,// "
0x14, 0x7F, 0x14, 0x7F, 0x14,// #
0x24, 0x2A, 0x7F, 0x2A, 0x12,// $
0x23, 0x13, 0x08, 0x64, 0x62,// %
0x36, 0x49, 0x55, 0x22, 0x50,// &
0x00, 0x05, 0x03, 0x00, 0x00,// '
0x00, 0x1C, 0x22, 0x41, 0x00,// (
0x00, 0x41, 0x22, 0x1C, 0x00,// )
0x08, 0x2A, 0x1C, 0x2A, 0x08,// *
0x08, 0x08, 0x3E, 0x08, 0x08,// +
0x00, 0x50, 0x30, 0x00, 0x00,// ,
0x08, 0x08, 0x08, 0x08, 0x08,// -
0x00, 0x30, 0x30, 0x00, 0x00,// .
0x20, 0x10, 0x08, 0x04, 0x02,// /
0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
0x00, 0x42, 0x7F, 0x40, 0x00,// 1
0x42, 0x61, 0x51, 0x49, 0x46,// 2
0x21, 0x41, 0x45, 0x4B, 0x31,// 3
0x18, 0x14, 0x12, 0x7F, 0x10,// 4
0x27, 0x45, 0x45, 0x45, 0x39,// 5
0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
0x01, 0x71, 0x09, 0x05, 0x03,// 7
0x36, 0x49, 0x49, 0x49, 0x36,// 8
0x06, 0x49, 0x49, 0x29, 0x1E,// 9
0x00, 0x36, 0x36, 0x00, 0x00,// :
0x00, 0x56, 0x36, 0x00, 0x00,// ;
0x00, 0x08, 0x14, 0x22, 0x41,// <
0x14, 0x14, 0x14, 0x14, 0x14,// =
0x41, 0x22, 0x14, 0x08, 0x00,// >
0x02, 0x01, 0x51, 0x09, 0x06,// ?
0x32, 0x49, 0x79, 0x41, 0x3E,// @
0x7E, 0x11, 0x11, 0x11, 0x7E,// A
0x7F, 0x49, 0x49, 0x49, 0x36,// B
0x3E, 0x41, 0x41, 0x41, 0x22,// C
0x7F, 0x41, 0x41, 0x22, 0x1C,// D
0x7F, 0x49, 0x49, 0x49, 0x41,// E
0x7F, 0x09, 0x09, 0x01, 0x01,// F
0x3E, 0x41, 0x41, 0x51, 0x32,// G
0x7F, 0x08, 0x08, 0x08, 0x7F,// H
0x00, 0x41, 0x7F, 0x41, 0x00,// I
0x20, 0x40, 0x41, 0x3F, 0x01,// J
0x7F, 0x08, 0x14, 0x22, 0x41,// K
0x7F, 0x40, 0x40, 0x40, 0x40,// L
0x7F, 0x02, 0x04, 0x02, 0x7F,// M
0x7F, 0x04, 0x08, 0x10, 0x7F,// N
0x3E, 0x41, 0x41, 0x41, 0x3E,// O
0x7F, 0x09, 0x09, 0x09, 0x06,// P
0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
0x7F, 0x09, 0x19, 0x29, 0x46,// R
0x46, 0x49, 0x49, 0x49, 0x31,// S
0x01, 0x01, 0x7F, 0x01, 0x01,// T
0x3F, 0x40, 0x40, 0x40, 0x3F,// U
0x1F, 0x20, 0x40, 0x20, 0x1F,// V
0x7F, 0x20, 0x18, 0x20, 0x7F,// W
0x63, 0x14, 0x08, 0x14, 0x63,// X
0x03, 0x04, 0x78, 0x04, 0x03,// Y
0x61, 0x51, 0x49, 0x45, 0x43,// Z
0x00, 0x00, 0x7F, 0x41, 0x41,// [
0x02, 0x04, 0x08, 0x10, 0x20,// "\"
0x41, 0x41, 0x7F, 0x00, 0x00,// ]
0x04, 0x02, 0x01, 0x02, 0x04,// ^
0x40, 0x40, 0x40, 0x40, 0x40,// _
0x00, 0x01, 0x02, 0x04, 0x00,// `
0x20, 0x54, 0x54, 0x54, 0x78,// a
0x7F, 0x48, 0x44, 0x44, 0x38,// b
0x38, 0x44, 0x44, 0x44, 0x20,// c
0x38, 0x44, 0x44, 0x48, 0x7F,// d
0x38, 0x54, 0x54, 0x54, 0x18,// e
0x08, 0x7E, 0x09, 0x01, 0x02,// f
0x08, 0x14, 0x54, 0x54, 0x3C,// g
0x7F, 0x08, 0x04, 0x04, 0x78,// h
0x00, 0x44, 0x7D, 0x40, 0x00,// i
0x20, 0x40, 0x44, 0x3D, 0x00,// j
0x00, 0x7F, 0x10, 0x28, 0x44,// k
0x00, 0x41, 0x7F, 0x40, 0x00,// l
0x7C, 0x04, 0x18, 0x04, 0x78,// m
0x7C, 0x08, 0x04, 0x04, 0x78,// n
0x38, 0x44, 0x44, 0x44, 0x38,// o
0x7C, 0x14, 0x14, 0x14, 0x08,// p
0x08, 0x14, 0x14, 0x18, 0x7C,// q
0x7C, 0x08, 0x04, 0x04, 0x08,// r
0x48, 0x54, 0x54, 0x54, 0x20,// s
0x04, 0x3F, 0x44, 0x40, 0x20,// t
0x3C, 0x40, 0x40, 0x20, 0x7C,// u
0x1C, 0x20, 0x40, 0x20, 0x1C,// v
0x3C, 0x40, 0x30, 0x40, 0x3C,// w
0x44, 0x28, 0x10, 0x28, 0x44,// x
0x0C, 0x50, 0x50, 0x50, 0x3C,// y
0x44, 0x64, 0x54, 0x4C, 0x44,// z
0x00, 0x08, 0x36, 0x41, 0x00,// {
0x00, 0x00, 0x7F, 0x00, 0x00,// |
0x00, 0x41, 0x36, 0x08, 0x00,// }
0x08, 0x08, 0x2A, 0x1C, 0x08,// ->
0x08, 0x1C, 0x2A, 0x08, 0x08 // <-
};
26.01.2012 Güncellendi
Arkadaşlar , bu driver da lcd nin 8 bitlik DATA portu stm32f4 de hangi port a bağlanıyor ?
ekrana yazdırmak için printf("abc"); gibi komutla mı yapılıyor ?
bu driver main fonksiyonuyla nasıl çağırmamız gerekiyor.
Alıntı yapılan: pcb - 21 Ocak 2012, 13:56:39
Arkadaşlar , bu driver da lcd nin 8 bitlik DATA portu stm32f4 de hangi port a bağlanıyor ?
ekrana yazdırmak için printf("abc"); gibi komutla mı yapılıyor ?
gördüğüm kadarıyla yazayım
1) KS0108_DT_PORT yani GPIOE ile
2) yazma kısmını ise puts_ks0108 ile başlayanla yapıyırsun yani put string
Alıntı yapılan: picmaster61 - 22 Mayıs 2012, 00:15:12
bu driver main fonksiyonuyla nasıl çağırmamız gerekiyor.
Gpioe'de gerekli bağlantıları yaptıktan sonra
init_ks0108() ile LCD'yi init ediyorsun sonra yazmak istediğin alana gidiyorsun
gotoxy_ks0108(1,1); ile
puts_ks0108() ile yazıyorsun.
// aşağıdaki gibi
init_ks0108();
gotoxy_ks0108(1,1);
puts_ks0108("Merhaba") ;
hocam bu şekilde yazınca alttaki hata mesajını veriyor. tanımlanmamış sembol diyorda neden ?
GLCD.axf: Error: L6218E: Undefined symbol gotoxy_ks0108 (referred from main.o).
GLCD.axf: Error: L6218E: Undefined symbol init_ks0108 (referred from main.o).
GLCD.axf: Error: L6218E: Undefined symbol puts_ks0108 (referred from main.o).
deneme için yazdığım satırlar aşağıda delay kısmı çalışıyor ledi yaktı söndürdü ;D
main.c
#include "STM32F4xx.h"
#include "ks0108.h"
#include "font.h"
#include "delay.h"
void SystemInit()
{
unsigned int i;
for (i=0;i<0x00100000;i++); // OSC oturtma ve kurtarma rutini
RCC->CFGR |= 0x00009400; // AHB ve APB hizlarini max degerlere set edelim
RCC->CR |= 0x00010000; // HSE Xtal osc calismaya baslasin
while (!(RCC->CR & 0x00020000)); // Xtal osc stabil hale gelsin
RCC->PLLCFGR = 0x07402A04; // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim 168 Mhz
RCC->CR |= 0x01000000; // PLL calismaya baslasin (Rehber Sayfa 95)
while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
FLASH->ACR = 0x00000605; // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
RCC->CFGR |= 0x00000002; // Sistem Clk u PLL uzerinden besleyelim
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
RCC->AHB1ENR |= 0x0000000F; // GPIO A,B,C,D clock'u aktif edelim
GPIOD->MODER = 0x55550000; // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
GPIOD->OSPEEDR= 0xFFFFFFFF; // GPIOD nin tum cikislari en yuksek hizda kullanacagiz
}
int main()
{
while(1){
init_ks0108();
gotoxy_ks0108(1,1);
puts_ks0108("Merhaba") ;
GPIOD->ODR= 0x0000F000; // Ledler yansin
delay_ms(5000);
GPIOD->ODR= 0x00000000; // Ledler sonsun
delay_ms(5000);
}
}
bir önceki mesajımda yazdığım sorunu buldum ks0108.c içinde ilgili fonksiyonları eklemediğim içinmiş.
şimdi farklı bir noktada hata veriyor.
hatayı verdiği bölüm ks0108.c içindeki alltaki bölümün
if(x_ks0108>127{x_ks0108=0;y_ks0108++;}
if(y_ks0108>7){y_ks0108=0;}
satırlarına veriyor.
void putd_ks0108(char data){
if(x_ks0108==0){
KS0108_L(); /* Select Chip */
putcmd_ks0108(KS0108_Y_ADRESS|(y_ks0108&0x7));
putcmd_ks0108(KS0108_X_ADRESS);
}else if(x_ks0108==64){
KS0108_R(); /* Select Chip */
putcmd_ks0108(KS0108_Y_ADRESS|(y_ks0108&0x7));
putcmd_ks0108(KS0108_X_ADRESS);
}
wait_busy_ks0108(); /* Wait Until LCD not Busy */
KS0108_DI = 1; /* Data Mode */
KS0108_LDATA(data); /* Load Data to Port */
strobe_ks0108(); /* LCD Strobe */
x_ks0108++;
if(x_ks0108>127{x_ks0108=0;y_ks0108++;}
if(y_ks0108>7){y_ks0108=0;}
}
Build target 'Target 1'
compiling ks0108.c...
ks0108.c(62): error: #18: expected a ")"
ks0108.c(64): error: #127: expected a statement
Target not created
sorunu çözdüm
if(x_ks0108>127?{x_ks0108=0;y_ks0108++;}
? olan yerde parantez kapatılmamış keil bana şunu kapatta derleyeyim diyormuş :D
hatasız derledim ama gldc hala bom boş duruyor bir karakter bile yazmadı
@ilhanın dediği gibi parantez hatası var.
Ayrıca ben de herhangi bir yazı bastıramadım ekrana.
Acaba data portunun bağlantısında mı hata ediyoruz?
mesaj birleştirme:: 01 Şubat 2013, 12:46:12
Boşta kimse yok mu şunu bir denese?
Pin bağlantısı bu şekilde:
/* LCD Connection Descriptions */
#define KS0108_RST_PIN 11
#define KS0108_RST_PORT GPIOC_BASE
#define KS0108_RW_PIN 9
#define KS0108_RW_PORT GPIOC_BASE
#define KS0108_DI_PIN 8
#define KS0108_DI_PORT GPIOC_BASE
#define KS0108_EN_PIN 10
#define KS0108_EN_PORT GPIOC_BASE
#define KS0108_CS1_PIN 7
#define KS0108_CS1_PORT GPIOC_BASE
#define KS0108_CS2_PIN 6
#define KS0108_CS2_PORT GPIOC_BASE
#define KS0108_DT_PIN 0
#define KS0108_DT_PORT GPIOD_BASE
Kodu ben kullanıyorum. Parantez hatası var, doğru. Bağlantı portlarını orjinal hali ile kullanın. Orjinal hali ile çalıştığını gördükten sonra istediğiniz şekilde değişrin. Data portu GPIOE'nin yüksek değerli 8 biti olacak. (GPIOE_8->D0, GPIOE_9->D1.....GPIOE_15->D7)
Kullanılan portların konfigürasyonuna dikkat etmek lazım. Kodun kullandığı portları aktif hale getirmemiş olabilirsiniz mesela. Ben bu şekilde görüntü alamayınca port hızlarını 2Mhz'e çektim ve çalıştı.
Kodda gereken yerlerde gecikme verilmiş ama yüksek hız sorun çıkardığına göre gözden kaçan bir yer var sanırım.
Bir de sağ-sol ters çıkınca CS1 ve CS2'nin yerini değiştirdim.
Verilen pinler ile bir deneyim bakalım. Ben de 2MHZ'e çekmiştim port hızlarını.
Kit üzerinde voltajlar harici besleme kullanılabilmesi için izole etmek amacıyla diyottan geçirilmiş. Bu sebeple 5v ve 3.3v voltajları diyotların iletim gerilimi kadar düşüyor. MCU nun beslemesi diyottan sonra 3v oluyor.
KS108 5v ile çalışıyor. MCU portlarının voltaj seviyesi LCD için kritik bir değerle sınırlı olduğundan kod çalışmaya devam ettiği halde bazen LCD kapanıyor. Elinizdeki KS108'in algılama eşiği daha düşükse hiç çalışmayabilir.
Ben kiti harici olarak 3.3v, LCD'yi 5v ile besledim. MCU beslemesi 3.3v olunca doğal olarak portların "high" seviyeside yükseldiğinden LCD kararlı çalışmaya başladı.
Görüntü yok ise bir de LCD nin kontrast ayarı olayı var tabi ama artık onu herkesin bildiğini varsaymak lazım. :)
:)
Ben LCD'yi aynı kit ile MikroC kütüphanesinden çalıştırıyorum. Bu kütüphane çalışmadı aynı bağlantı şekli ile. Şimdi orjinal ayarlarını kullanacağım ersinercenin verdiği hali ile.
Biraz konu hortlatma gibi oldu ancak kütüphaneyi denedim LCD bomboş duruyor. Kontrast ayarı kısmı bile çalışmıyor. LCD reset mi atıyor acaba, beslemeleri STM32F4 den almıştım.
Kontrast pinini de 3V'a bağlamıştım (daha önce 16x2 lcd kullandığımda bu kontrast yeterli olmuştu)
Çalıştırabilen var mı? Ne gibi değişiklik yapmak gerekli?
Çalıştırdım :)
main fonksiyonunda biraz değişiklik yaptım.
#include "STM32F4xx.h"
#include "ks0108.h"
#include "font.h"
#include "delay.h"
void SystemInit()
{
unsigned int i;
for (i=0;i<0x00100000;i++); // OSC oturtma ve kurtarma rutini
RCC->CFGR |= 0x00009400; // AHB ve APB hizlarini max degerlere set edelim
RCC->CR |= 0x00010000; // HSE Xtal osc calismaya baslasin
while (!(RCC->CR & 0x00020000)); // Xtal osc stabil hale gelsin
RCC->PLLCFGR = 0x07402A04; // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim 168 Mhz
RCC->CR |= 0x01000000; // PLL calismaya baslasin (Rehber Sayfa 95)
while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
FLASH->ACR = 0x00000605; // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
RCC->CFGR |= 0x00000002; // Sistem Clk u PLL uzerinden besleyelim
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
RCC->AHB1ENR |= 0x0000000F; // GPIO A,B,C,D clock'u aktif edelim
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOEEN; //GPIO E'nin clock'unu aktif edelim
GPIOD->MODER = 0x55550000; // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
GPIOB->MODER = 0x55555555; // GPIOB tamamen cikis
GPIOE->MODER = 0x55555555; // GPIOE tamamen cikis
GPIOC->MODER = 0x55555555; // GPIOC tamamen cikis
GPIOD->OSPEEDR= 0x00000000; // GPIOD nin tum cikislari en fazla 2mhz. 0xFFFFFFFF en yuksek hiz icin
GPIOC->OSPEEDR= 0x00000000; // GPIOC nin tum cikislari en fazla 2mhz. 0xFFFFFFFF en yuksek hiz icin
GPIOB->OSPEEDR= 0x00000000; // GPIOB nin tum cikislari en fazla 2mhz. 0xFFFFFFFF en yuksek hiz icin
GPIOE->OSPEEDR= 0x00000000; // GPIOE nin tum cikislari en fazla 2mhz. 0xFFFFFFFF en yuksek hiz icin
}
int main()
{
while(1){
init_ks0108();
gotoxy_ks0108(1,1);
puts_ks0108("Merhaba") ;
GPIOD->ODR= 0x0000F000; // Ledler yansin
delay_ms(5000);
GPIOD->ODR= 0x00000000; // Ledler sonsun
delay_ms(5000);
}
}
Bu komutta ekranın saçma bir yerine yazıyor. Ekranın başında yazmak için ne yapmalıyım?
Daha büyük font kullanımı için ne yapmalıyım?
Resim basmak için ne yapmalıyım? Yani bir resmi çevirip kod haline getirdikten sonra?
Edit: LCD'nin CS pinleri tersmiş düzelttim.
Cevap verebilecek yok mu sorun hala güncel. Resim bastım bunda da pek sıkıntı yok. Sadece belirli bir koordinattan başlatarak ufak bir resim çizdiremiyorum. Ekran boyutunda olması gerekli.
Font yazılımı bilen var mı?
dot factory adında bir font programı buldum. Ancak denediğimde işe yaramadığını gördüm.
iki program daha var lakin onlar da proton için font üretiyor. Proton hakkında hiçbir şey bilmiyorum.