第十四章:0.96寸OLED12864显示屏

MCU Interface Selection

----------------------这里说下通过字模软件来提取库

第十四章:0.96寸OLED12864显示屏_第1张图片

第十四章:0.96寸OLED12864显示屏_第2张图片

第十四章:0.96寸OLED12864显示屏_第3张图片

第十四章:0.96寸OLED12864显示屏_第4张图片

第十四章:0.96寸OLED12864显示屏_第5张图片

第十四章:0.96寸OLED12864显示屏_第6张图片

第十四章:0.96寸OLED12864显示屏_第7张图片

第十四章:0.96寸OLED12864显示屏_第8张图片

 

                        ---------6800

                        ---------8080

                        ---------4线制的SPI

                        ----------3线制的SPI

                       -----------IIC接口

/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{
	OLED_SCL=1;
	OLED_SDIN=1;
	OLED_SDIN=0;
	OLED_SCL=0;
}

/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
	OLED_SCL=1;
	OLED_SDIN=0;
	OLED_SDIN=1;
	
}

/**********************************************
// IIC Write byte
**********************************************/

void Write_IIC_Byte(unsigned char IIC_Byte)
{
	unsigned char i;
	unsigned char m,da;

	da=IIC_Byte;
	OLED_SCL=0;

	for(i=0;i<8;i++)		
	{
		m=da;
		m=m&0x80;
		if(m==0x80)
		{
            OLED_SDIN=1;
        }
		else 
            OLED_SDIN=0;
			da=da<<1;

		    OLED_SCL=1;
		    OLED_SCL=0;
	}
}


void IIC_Wait_Ack()
{
	//  GPIOB->CRH &= 0XFFF0FFFF;	//设置PB12为上拉输入模式
	//  GPIOB->CRH |= 0x00080000;
    //	OLED_SDA = 1;
    //	delay_us(1);
	//  OLED_SCL = 1;
	//  delay_us(50000);
    /*	while(1)
	    {
		    if(!OLED_SDA)				//判断是否接收到OLED 应答信号
		    {
			    //GPIOB->CRH &= 0XFFF0FFFF;	//设置PB12为通用推免输出模式
			    //GPIOB->CRH |= 0x00030000;
			    return;
		    }
	    }
    */
	    OLED_SCLK_Set() ;
	    OLED_SCLK_Clr();
    }

1--应用层

/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
    IIC_Start();
    Write_IIC_Byte(0x78);            //Slave address,SA0=0
	IIC_Wait_Ack();	
    Write_IIC_Byte(0x00);			 //write command
	IIC_Wait_Ack();	
    Write_IIC_Byte(IIC_Command); 
	IIC_Wait_Ack();	
    IIC_Stop();
}

/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
    IIC_Start();
    Write_IIC_Byte(0x78);			//D/C#=0; R/W#=0
	IIC_Wait_Ack();	
    Write_IIC_Byte(0x40);			//write data
	IIC_Wait_Ack();	
    Write_IIC_Byte(IIC_Data);
	IIC_Wait_Ack();	
    IIC_Stop();
}


/***********************************************
/***********************************************
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
	if(cmd)
	{

          Write_IIC_Data(dat);
   
	}
	else 
    {
           Write_IIC_Command(dat);
		
	}

}

2---上层

#define OLED_CMD  0			// 写命令

//坐标设置
void OLED_Set_Pos(unsigned char x, unsigned char y) 
{ 	
	OLED_WR_Byte(0xb0+y, OLED_CMD);
	OLED_WR_Byte(((x&0xf0)>>4)|0x10, OLED_CMD);
	OLED_WR_Byte((x&0x0f), OLED_CMD); 
}


//开启OLED显示    
void OLED_Display_On(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
	OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
	OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
}


//关闭OLED显示     
void OLED_Display_Off(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
	OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
	OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
}	

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!	  
void OLED_Clear(void)  
{  
	u8 i,n;		    
	for(i=0;i<8;i++)  
	{  
		OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
		OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
		OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
		for(n=0;n<128;n++)
			OLED_WR_Byte(0,OLED_DATA); 
	} //更新显示
}


//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!	  
void OLED_Clear(void)  
{  
	u8 i,n;		    
	for(i=0;i<8;i++)  
	{  
		OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
		OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
		OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
		for(n=0;n<128;n++)
			OLED_WR_Byte(0,OLED_DATA); 
	} //更新显示
} 


//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示				 
//size:选择字体 16/12 
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
{      	
	unsigned char c = 0, i = 0;
		
	c = chr - ' ';		//得到偏移后的值			
	if (x > Max_Column-1)
	{
		x = 0;
		y = y + 2;
	}
	if (Char_Size == 16)
	{
		OLED_Set_Pos(x, y);	
		for(i=0; i<8; i++)
			OLED_WR_Byte(F8X16[c*16+i], OLED_DATA);
		OLED_Set_Pos(x, y + 1);
		for(i=0; i<8; i++)
			OLED_WR_Byte(F8X16[c*16+i+8], OLED_DATA);
	}
	else 
	{	
		OLED_Set_Pos(x, y);
		for(i=0; i<6; i++)
			OLED_WR_Byte(F6x8[c][i], OLED_DATA);	
	}
}

//显示一个字符号串
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{
	unsigned char j=0;
	while (chr[j]!='\0')
	{		OLED_ShowChar(x,y,chr[j],Char_Size);
			x+=8;
		if(x>120){x=0;y+=2;}
			j++;
	}
}


//显示汉字
void OLED_ShowCHinese(u8 x, u8 y, u8 no)
{      			    
	u8 t, adder = 0;

	OLED_Set_Pos(x, y);	
    for(t=0;t<16;t++)
	{
		OLED_WR_Byte(Hzk[no][t], OLED_DATA);
		adder += 1;
	}	

	OLED_Set_Pos(x, y+1);	
    for(t=0; t<16; t++)
	{	
		OLED_WR_Byte(Hzk[no][t+16], OLED_DATA);
		adder += 1;
	}					
}


/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
void OLED_DrawBMP(u8 x0, u8 y0, u8 x1, u8 y1, u8 BMP[])
{ 	
	unsigned int j = 0;
	unsigned char x, y;
  
	for (y=y0; y

3----初始化

//初始化SSD1306					    
void OLED_Init(void)
{ 	
	OLED_WR_Byte(0xAE,OLED_CMD);//--display off
	OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
	OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
	OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
	OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
	OLED_WR_Byte(0x81,OLED_CMD); // contract control
	OLED_WR_Byte(0xFF,OLED_CMD);//--128   
	OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap 
	OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
	OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
	OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
	OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
	OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
	OLED_WR_Byte(0x00,OLED_CMD);//
	
	OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
	OLED_WR_Byte(0x80,OLED_CMD);//
	
	OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
	OLED_WR_Byte(0x05,OLED_CMD);//
	
	OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
	OLED_WR_Byte(0xF1,OLED_CMD);//
	
	OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
	OLED_WR_Byte(0x12,OLED_CMD);//
	
	OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
	OLED_WR_Byte(0x30,OLED_CMD);//
	
	OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
	OLED_WR_Byte(0x14,OLED_CMD);//
	
	OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}  

主函数:

第十四章:0.96寸OLED12864显示屏_第9张图片

你可能感兴趣的:(第十四章:0.96寸OLED12864显示屏)