MCU Interface Selection
----------------------这里说下通过字模软件来提取库
---------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=0IIC_Wait_Ack(); Write_IIC_Byte(0x00); //write commandIIC_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#=0IIC_Wait_Ack(); Write_IIC_Byte(0x40); //write dataIIC_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 ONOLED_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 OFFOLED_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<y1; y++){OLED_Set_Pos(x0, y);for (x=x0; x<x1; x++){ OLED_WR_Byte(BMP[j++], OLED_DATA); }}
}
3----初始化
//初始化SSD1306
void OLED_Init(void)
{ OLED_WR_Byte(0xAE,OLED_CMD);//--display offOLED_WR_Byte(0x00,OLED_CMD);//---set low column addressOLED_WR_Byte(0x10,OLED_CMD);//---set high column addressOLED_WR_Byte(0x40,OLED_CMD);//--set start line address OLED_WR_Byte(0xB0,OLED_CMD);//--set page addressOLED_WR_Byte(0x81,OLED_CMD); // contract controlOLED_WR_Byte(0xFF,OLED_CMD);//--128 OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverseOLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 dutyOLED_WR_Byte(0xC8,OLED_CMD);//Com scan directionOLED_WR_Byte(0xD3,OLED_CMD);//-set display offsetOLED_WR_Byte(0x00,OLED_CMD);//OLED_WR_Byte(0xD5,OLED_CMD);//set osc divisionOLED_WR_Byte(0x80,OLED_CMD);//OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode offOLED_WR_Byte(0x05,OLED_CMD);//OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge PeriodOLED_WR_Byte(0xF1,OLED_CMD);//OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartionOLED_WR_Byte(0x12,OLED_CMD);//OLED_WR_Byte(0xDB,OLED_CMD);//set VcomhOLED_WR_Byte(0x30,OLED_CMD);//OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enableOLED_WR_Byte(0x14,OLED_CMD);//OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}
主函数: