OLED Problemim (SSD1305)

Başlatan Eren Eraslan, 30 Haziran 2015, 13:15:28

Eren Eraslan

Merhabalar

Winstar'ın WEX012864ELPP3N markalı OLED ekranını sürmeye çalışıyorum. Hazır kütüphane buldum + Driver Devresi çıkardım...Fakat belli başlı problemlerim oldu. Öncelikle ekrandan hiçbir şekilde tepki alamıyorum. Tamamen karanlık. Init edemiyorum belli ama Power On prosedürünü bile yapsam (AFh) değişim yok. Kodları PCB tasarımını ve Datasheetleri linkte paylaştım. Yardımcı olanlara teşekkür ederim şimdiden.

https://drive.google.com/file/d/0B2X7oCcVVWkUT2NCVTd1Y3RYVEU/view
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

baran123

#1
Koda baktımda paralelden gönderiyorsun sanırım.SPI kullanamaz mısın ?

mesaj birleştirme:: 30 Haziran 2015, 19:17:13

Birde initte çok fazla bekleme var. Datasheet mi böyle yazıyor ?

Eren Eraslan

evet paralelden gönderiyorum elimdeki pcb ona göre var hocam. Ya winstar'ın bana verdiği örnek kodu da paylaşayım. O init rutini de çalışmadı.

//=============================================================
//          WINSTAR Display Co.,Ltd
//    LCM     	   :WEG12864    (80-Series)
//    Contraller :SSD1305
//    Author     :Lisa lin 2010/11/24
//    history     :
//==============================================================
#include	<reg52.h>
#include 	<INTRINS.H>        // KEIL FUNCTION
#include	<stdio.h>          // define I/O functions

#define        MAX_COL		128
#define        MAX_ROW		64
#define        Data_BUS		P1
#define	   MPU				68//80
#define	   ADDR_MODE	2 //0:horizontal, 1:vertical, 2:page


sbit           LCM_CD			=P3^0;
#if (MPU ==80)
	sbit           LCM_RD              =P3^7;
	sbit           LCM_WR              =P3^0;
#endif
#if (MPU ==68)
	sbit           LCM_EN              =P3^4;
	sbit           LCM_RW              =P3^7;
#endif
sbit           LCM_CS				   =P3^1;
sbit           LCM_RST		           =P3^2;

sbit        STP = P2^0;
sbit        S_S = P2^1;


void Write_Cmd(unsigned char cmd);
void Write_Data(unsigned char dat);
void Read_Data(unsigned char *dat, unsigned char num);
void Initial_SSD1305(void);
void Home_Addr(void);
#if (ADDR_MODE==2)
	void Set_Addr(unsigned char page,unsigned char lCol,unsigned char hCol); //For Page  Addressing Mode
#else
	void Set_PageAddr(unsigned char star,unsigned char end); //For Horizontal/Vertical Addressing Mode
	void Set_ColAddr(unsigned char star,unsigned char end);//For Horizontal/Vertical Addressing Mode
#endif


void Full_on(void);
void Show_pic(unsigned char pic[][MAX_COL]);
void Read(unsigned char p,unsigned char lCol,unsigned char hCol,unsigned char num);
void Horizontal_scoll(unsigned char dir,unsigned char star,unsigned char end);
void Vertical_scroll(unsigned char top,unsigned char nRow);
void Set_V_scroll_area(unsigned char top,unsigned char nRow);
void VnH_scoll(unsigned char dir,unsigned char star,unsigned char end,unsigned char top,unsigned char nRow);
void delay_100us(unsigned char d);
void delay_ms(unsigned char d)	;
void delay_s(unsigned char d);
void main(void);


void Write_Cmd(unsigned char cmd)
{
	Data_BUS = 0xff;
	LCM_CS = 0;
	LCM_CD = 0;
	LCM_RW = 0;
	Data_BUS = cmd;
	LCM_EN = 1;
	LCM_EN = 0;
	LCM_CS = 1;
}

void Write_Data(unsigned char dat)
{
	Data_BUS = 0xff;
	LCM_CS = 0;
	LCM_CD = 1;
	LCM_RW = 0;
	Data_BUS = dat;
	LCM_EN = 1;
	LCM_EN = 0;
	LCM_CS = 1;
}

void Read_Data(unsigned char* dat, unsigned char num)
{
	unsigned char i=0;

	Data_BUS = 0xff;
	LCM_CS = 0;
	LCM_CD = 1;
	LCM_RW = 1;
	//dummy read
	LCM_EN = 1;
	_nop_();
	LCM_EN = 0;
	_nop_();

	//read data
	for (i =0;i<num;i++)
	{
		LCM_EN = 1;
		dat[i]= Data_BUS;
		LCM_EN = 0;
	}
	LCM_CS = 1;
}

unsigned char Read_One_Byte(void)
{
	unsigned char i=0,dat=0;

	Data_BUS = 0xff;
	LCM_CS = 0;
	LCM_CD = 1;
	LCM_RW = 1;
	//dummy read
	LCM_EN = 1;
	_nop_();
	LCM_EN = 0;
	_nop_();

	//read data
	LCM_EN = 1;
	dat= Data_BUS;
	LCM_EN = 0;

	LCM_CS = 1;

	return dat;
}

#if (ADDR_MODE==2)
void Set_Addr(unsigned char page,unsigned char lCol,unsigned char hCol)
{
	Write_Cmd(page);//Set Page Start Address
	Write_Cmd(lCol);//Set Lower Column Start Address
	Write_Cmd(hCol);//Set Higher Column Start Address
}
#else
void Set_PageAddr(unsigned char star,unsigned char end)
{
	Write_Cmd(star);
	Write_Cmd(end);
}

void Set_ColAddr(unsigned char star,unsigned char end)
{
	Write_Cmd(star);
	Write_Cmd(end);
}
#endif

void Home_Addr(void)
{
	#if (ADDR_MODE<2)
		Write_Cmd(0x22);//Set Page Address
		Set_PageAddr(0,7);
		Write_Cmd(0x21);//Set Column Address
		Set_ColAddr(0,127);
	#else
		Set_Addr(0xb0,0,0x10);
	#endif
}



void Show_pic(unsigned char pic[][MAX_COL])
{
	unsigned char i=0,j=0;

	Home_Addr();
	for (i = 0;i<MAX_ROW/8;i++)
	{
		#if (ADDR_MODE==2)
			Set_Addr(0xb0+i,0,0x10);
		#endif
		for (j = 0;j<MAX_COL;j++)
			Write_Data(pic[i][j]);
	}
	delay_s(1);
}

void Full_on(void)
{
	unsigned char  i=0,j=0;

	Home_Addr();
	for (i = 0;i<MAX_ROW/8;i++)
	{
		#if (ADDR_MODE==2)
			Set_Addr(0xb0+i,0,0x10);
		#endif
		for (j = 0;j<MAX_COL;j++)
			Write_Data(0xff);
	}
	delay_s(1);
}


/*void Read(unsigned char p,unsigned char lCol,unsigned char hCol,unsigned char num)
{
	unsigned char dat[100]={0}; //1 byte*100=100 bytes (8051需有至少100 bytes的RAM)

	Set_Addr(p,lCol,hCol);
	Read_Data(dat,num);
}*/

void Horizontal_scoll(unsigned char dir,unsigned char star,unsigned char end)
{
	Write_Cmd(dir); //Horizontal scroll=>0x26:Right Horizontal Scroll,0x27:Left Horizontal Scroll
	Write_Cmd(0x01);//Set number of column scroll offset =>0x01:horizontal scroll by 1 column
	Write_Cmd(star);//Define start page address =>0x00:page0
	Write_Cmd(0x00);//Set time interval =>0x00:6 frames
	Write_Cmd(end);//Define end page address =>0x07:page7
	Write_Cmd(0x2f);//Activate scroll
	delay_s(10);
	Write_Cmd(0x2e);//deactivate scroll
}

void Vertical_scroll(unsigned char top,unsigned char nRow)
{
	Write_Cmd(0xa3);//Set Vertical Scroll Area
	Write_Cmd(top);//Set No. of row in top fixed area
	Write_Cmd(nRow);//Set No. of row in scroll area =>0x40:64
	Write_Cmd(0x29); //Continuous Vertical and Horizontal Scroll Setup=>0x29:Vertical and Right Horizontal Scroll,0x2a:Vertical and Left Horizontal Scroll
	Write_Cmd(0x00);//Set number of column scroll offset =>0x00:no horizontal scroll
	Write_Cmd(0x00);//Define start page address =>0x00:page0
	Write_Cmd(0x00);//Set time interval =>0x00:6 frames
	Write_Cmd(0x00);//Define end page address =>0x00:page0
	Write_Cmd(0x01);//Vertical scrolling offset =>0x01:offset 1 row
	Write_Cmd(0x2f);//Activate scroll
	delay_s(10);
	Write_Cmd(0x2e);//deactivate scroll
}

void VnH_scoll(unsigned char dir,unsigned char star,unsigned char end,unsigned char top,unsigned char nRow)
{
	Write_Cmd(0xa3);//Set Vertical Scroll Area
	Write_Cmd(top);//Set No. of row in top fixed area
	Write_Cmd(nRow);//Set No. of row in scroll area =>0x40:64
	Write_Cmd(dir); //Continuous Vertical and Horizontal Scroll Setup=>0x29:Vertical and Right Horizontal Scroll,0x2a:Vertical and Left Horizontal Scroll
	Write_Cmd(0x01);//Set number of column scroll offset =>0x01:horizontal scroll by 1 column
	Write_Cmd(star);//Define start page address =>0x00:page0
	Write_Cmd(0x00);//Set time interval =>0x00:6 frames
	Write_Cmd(end);//Define end page address =>0x07:page7
	Write_Cmd(0x01);//Vertical scrolling offset =>0x01:offset 1 row
	Write_Cmd(0x2f);//Activate scroll
	delay_s(10);
	Write_Cmd(0x2e);//deactivate scroll
}

void Read_Modify_Write(unsigned char * dat)
{
	Write_Cmd(0xe0);//Enter Read Modify Write
	*dat = Read_One_Byte();
	Write_Cmd(0xee);//Exit Read Modify Write
}

//===================================
// stp_sc();
//==================================
void stp_sc(){
	while(S_S==1){
		if(S_S==0){
			break;
		}
		if(STP==1){
			break;
		}
	}
}

void delay_100us(unsigned char d)		//12MHz_us
{
	unsigned char  i=0,j=0;

	for(j=0;j<d;j++)
	{
		for(i=0;i<100;i++)
		{}
	}
}

void delay_ms(unsigned char d)		//12MHz_us
{
	unsigned char j=0;
	
	for(j=0;j<d;j++)
	{
		delay_100us(10);
	}
}

void delay_s(unsigned char d)		//12MHz_us
{
	unsigned char x=0,y=0,j=0;

	for(j=0;j<d;j++)
	{
		for(x=0;x<100;x++)
	    	{
	     		for(y=0;y<10;y++)
	      		{
				delay_ms(1);
	     		}
	    	}
	}
}

void Initial_SSD1305(void)
{
	Write_Cmd(0xae);//Set Display ON/OFF =>0xae:Display off
	
	Write_Cmd(0x20);//Set Memory Addressing Mode
	Write_Cmd(ADDR_MODE);
	Home_Addr();
	
	Write_Cmd(0x81);//Set contrast Control for BANK0
	Write_Cmd(0x80);
	
	Write_Cmd(0x40);//Set Display Start Line
	Write_Cmd(0xa0);//Set Segment Re-map =>0xa0:column addr. 0 is mapped to SEG0
	Write_Cmd(0xa4);//Entire Display On =>0xa4:resume to RAM content display
	Write_Cmd(0xa6);//Set Normal/Inverse Display =>0xa6:Normal,0xa7:inverse 
	
	Write_Cmd(0xa8);//Set Multiplex Ratio
	Write_Cmd(0x3f);//63

	Write_Cmd(0xad);//Master Configuration
	Write_Cmd(0x8e);

	Write_Cmd(0xc8);//Set COM Output Scan Direction =>0xc0:scan from COM0 to COM63, 0xc8:scan from COM63 to COM0

	Write_Cmd(0xd3);//Set Display Offset
	Write_Cmd(0x00);

	Write_Cmd(0xd5);//Set Display Clock Divid Ratio/Oscillator Frequency
	Write_Cmd(0x00);

	Write_Cmd(0xd8);//Set Area Color Mode ON/OFF & Low Power Display Mode
	Write_Cmd(0x05);//0x05:monochrome mode and low power display mode

	Write_Cmd(0xd9);//Set Pre-charge Period
	Write_Cmd(0xf1);

	Write_Cmd(0xda);//Set COM Pins Hardware Configuration
	Write_Cmd(0x12);

	Write_Cmd(0xdb);//Set Vcomh Deselect Level
	Write_Cmd(0x40);

	Write_Cmd(0x2e);//deactivate scroll
	
	Write_Cmd(0xaf);//Set Display ON/OFF =>0xaf:Display on
}

void main(void)
{
	unsigned char i=0,j=0,dat=0,tmp=0;
	
	Initial_SSD1305();
	
	while(1)
	{
		
		Full_on();
		delay_ms(10);
		stp_sc();

		Show_pic(picture1);
		delay_ms(10);
		stp_sc();

		Show_pic(picture2);
		delay_ms(10);
		stp_sc(); 

		Show_pic(picture5);
		delay_ms(10);
		stp_sc();

		Show_pic(picture3);
		delay_ms(10);
		stp_sc();

		Show_pic(picture4);
		delay_ms(10);
		stp_sc();
				   
	}
}
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan