我就自己的经验来进行说明
要看清自己使用的OLED屏的分辨率大小,并不能直接复制别人的初始化参数,一般手册上会有初始化参数的,就根据手册上来,IIC用到的几个简单的函数
[mw_shl_code=c,true]//??????IIC
void IIC_Init(void)
{
RCC->APB2ENR|=1<<2;//?????????èIO PORTC?±??
GPIOA->CRH&=0XFFF00FFF;//PC11/12 ???ì????
GPIOA->CRH|=0X00033000;
GPIOA->ODR|=3<<11; //PC11,12 ??????
}
//?ú?úIIC????????
void IIC_Start(void)
{
SDA_OUT(); //sda??????
IIC_SDA=1;
IIC_SCL=1;
// delay_us(4);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
// delay_us(4);
IIC_SCL=0;//??×?I2C×?????×?±?·????ò????????
}
//?ú?úIIC????????
void IIC_Stop(void)
{
SDA_OUT();//sda??????
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
// delay_us(4);
IIC_SCL=1;
IIC_SDA=1;//·???I2C×????á??????
// delay_us(4);
}
//????????????????
//·???????1???????????§°?
// 0??????????????
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA?è????????
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//?±??????0
return 0;
}
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//?????±??????????????
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(2); //??TEA5767?????????±????±?????
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
IIC_Wait_Ack();
} [/mw_shl_code]
SSD1306的IIC数据写入函数
[mw_shl_code=c,true]void SSD1306_init()
{
IIC_Init();
RCC->APB2ENR|=1<<2; //????PORTA?±??
GPIOA->CRH&=0X0FFFFFFF;
GPIOA->CRH|=0X30000000;
GPIOA->ODR|=1<<15;
RES=0;
delay_ms(1000);
RES=1;
OLED_WriteCmd(0xAE); /*display off*/
OLED_WriteCmd(0x00); /*set lower column address*/
OLED_WriteCmd(0x12); /*set higher column address*/
OLED_WriteCmd(0x00); /*set display start line*/
OLED_WriteCmd(0xB0); /*set page address*/
OLED_WriteCmd(0x81); /*contract control*/
OLED_WriteCmd(0x1f); /*128*/
OLED_WriteCmd(0xA1); /*set segment remap*/
OLED_WriteCmd(0xA6); /*normal / reverse*/
OLED_WriteCmd(0xA8); /*multiplex ratio*/
OLED_WriteCmd(0x1F); /*duty = 1/32*/
OLED_WriteCmd(0xC8); /*Com scan direction*/
OLED_WriteCmd(0xD3); /*set display offset*/
OLED_WriteCmd(0x00);
OLED_WriteCmd(0xD5); /*set osc division*/
OLED_WriteCmd(0x80);
OLED_WriteCmd(0xD9); /*set pre-charge period*/
OLED_WriteCmd(0x1f);
OLED_WriteCmd(0xDA); /*set COM pins*/
OLED_WriteCmd(0x12);
OLED_WriteCmd(0xdb); /*set vcomh*/
OLED_WriteCmd(0x40);
OLED_WriteCmd(0x8d); /*set charge pump enable*/
OLED_WriteCmd(0x14);
OLED_WriteCmd(0xAF); /*display ON*/
}[/mw_shl_code]
[mw_shl_code=c,true]u8 OLED_WriteCmd(u8 Cmd)
{
IIC_Start();
IIC_Send_Byte(0x78);
IIC_Send_Byte(0x00);
IIC_Send_Byte(Cmd);
IIC_Stop();
return 0;
}
u8 OLED_WriteData(u8 Data)
{
IIC_Start();
IIC_Send_Byte(0x78);
IIC_Send_Byte(0x40);
IIC_Send_Byte(Data);
IIC_Stop();
return 0;
}[/mw_shl_code]
[mw_shl_code=c,true]
[mw_shl_code=c,true]void OLED_SetXY(u8 x,u8 y)
{
OLED_WriteCmd(0xb0+y);//??
OLED_WriteCmd(((0xf0&x)>>4)|0x10);//??????
OLED_WriteCmd((0x0f&x)|0x01);//??????
}[/mw_shl_code]
[mw_shl_code=c,true]void OLED_Fill(unsigned char bmp_dat)
{
unsigned char y,x;
for(y=0;y<4;y++)
{
OLED_WriteCmd(0xb0+y);
OLED_WriteCmd(0x01);
OLED_WriteCmd(0x10);
for(x=0;x<127;x++)
OLED_WriteData(bmp_dat);
}
} [/mw_shl_code]
[/mw_shl_code]
是不是很简单,但是在实际测试的时候,出现了一个问题就是能点亮,但是就是不按照自己的要求显示,最后发现是硬件上,在RST引脚需要用一个电容与GND连接
|