KS0108 STM32 Driver

Başlatan ErsinErce, 03 Ocak 2012, 08:47:33

ErsinErce

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

pcb

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 ?

picmaster61

bu driver main fonksiyonuyla nasıl çağırmamız gerekiyor.

CLR

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") ;




Knowledge and Experience are Power

ilhan_mkp

#4
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);
	
}
	
}



ilhan_mkp

#5
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ı

LukeSkywalker

#6
@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

HexfeT

#7
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.

LukeSkywalker

Verilen pinler ile bir deneyim bakalım. Ben de 2MHZ'e çekmiştim port hızlarını.

HexfeT

#9
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.  :)

LukeSkywalker

:)
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.

muhendisbey

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?
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

muhendisbey

#12
Ç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.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

muhendisbey

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.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.