#define IIC_SDA GPIO_Pin_5
#define IIC_SCL GPIO_Pin_7
#define READ_SDA GPIO_ReadInputDataBit(GPIOA,IIC_SDA)
#define IIC_SDA_Set GPIO_SetBits(GPIOA,GPIO_Pin_5)
#define IIC_SDA_Reset GPIO_ResetBits(GPIOA,GPIO_Pin_5)
#define IIC_SCL_Set GPIO_SetBits(GPIOA,GPIO_Pin_7)
#define IIC_SCL_Reset GPIO_ResetBits(GPIOA,GPIO_Pin_7)
#include "Oled.h"
void IIC_Init()
{
GPIO_InitTypeDef GPIO_Initx;
GPIO_Initx.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Initx.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Initx.GPIO_Pin=IIC_SDA|IIC_SCL;
GPIO_Init(GPIOA,&GPIO_Initx);
}
void SDA_Out()
{
GPIO_InitTypeDef GPIO_Initx;
GPIO_Initx.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Initx.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Initx.GPIO_Pin=IIC_SDA;
GPIO_Init(GPIOA,&GPIO_Initx);
}
void SDA_In()
{
GPIO_InitTypeDef GPIO_Initx;
GPIO_Initx.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Initx.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Initx.GPIO_Pin=IIC_SDA;
GPIO_Init(GPIOA,&GPIO_Initx);
}
void IIC_Start()
{
SDA_Out();
IIC_SCL_Set;
IIC_SDA_Set;
Delay_us(2);
IIC_SDA_Reset;
Delay_us(2);
IIC_SCL_Reset;
Delay_us(2);
} //Æeê¼DÅoÅ
void IIC_Stop()
{
SDA_Out();
IIC_SCL_Set;
IIC_SDA_Reset;
Delay_us(2);
IIC_SDA_Set;
Delay_us(2);
} //í£Ö1DÅoÅ
u8 IIC_Wait_Ask(void)
{
int count=0;
SDA_In();
IIC_SCL_Set;
Delay_us(2);
while(READ_SDA)
{
count++;
if(count>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL_Reset;
Delay_us(2);
return 0;
} //ó|′eDÅoÅ
void IIC_WriteByte(uint8_t data)
{
int i;
SDA_Out();
for(i=0;i<8;i++)
{
IIC_SCL_Reset;
if((data&0x80)==1)
IIC_SDA_Set;
else
IIC_SDA_Reset;
Delay_us(2);
IIC_SCL_Set;
Delay_us(2);
IIC_SCL_Reset;
data<<=1;
}
} //D′ò»¸ö×Ö½ú
void WriteCmd(u8 command)
{
IIC_Start();
IIC_WriteByte(0x78);
IIC_Wait_Ask();
IIC_WriteByte(0x00);
IIC_Wait_Ask();
IIC_WriteByte(command);
IIC_Wait_Ask();
IIC_Stop();
} //D′Ãüáî
void WriteDat(u8 data)
{
IIC_Start();
IIC_WriteByte(0x78);
IIC_Wait_Ask();
IIC_WriteByte(0x40);
IIC_Wait_Ask();
IIC_WriteByte(data);
IIC_Wait_Ask();
IIC_Stop();
} //D′êy¾Y
void OLED_Init(void)
{
Delay_ms(100); //????????
WriteCmd(0xAE); //display off
WriteCmd(0x20); //Set Memory Addressing Mode
WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
WriteCmd(0xc8); //Set COM Output Scan Direction
WriteCmd(0x00); //---set low column address
WriteCmd(0x10); //---set high column address
WriteCmd(0x40); //--set start line address
WriteCmd(0x81); //--set contrast control register
WriteCmd(0xff); //???? 0x00~0xff
WriteCmd(0xa1); //--set segment re-map 0 to 127
WriteCmd(0xa6); //--set normal display
WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
WriteCmd(0x3F); //
WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
WriteCmd(0xd3); //-set display offset
WriteCmd(0x00); //-not offset
WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
WriteCmd(0x80); //--set divide ratio
WriteCmd(0xd9); //--set pre-charge period
WriteCmd(0x22); //
WriteCmd(0xda); //--set com pins hardware configuration
WriteCmd(0x12);
WriteCmd(0xdb); //--set vcomh
WriteCmd(0x20); //0x20,0.77xVcc
WriteCmd(0x8d); //--set DC-DC enable
WriteCmd(0x14); //
WriteCmd(0xaf); //--turn on oled panel
}
void OLED_ON(void)
{
WriteCmd(0X8D); //?????
WriteCmd(0X14); //?????
WriteCmd(0XAF); //OLED??
}
void OLED_OFF(void)
{
WriteCmd(0X8D); //?????
WriteCmd(0X10); //?????
WriteCmd(0XAE); //OLED??
}
void OLED_SetPos(unsigned char x, unsigned char y) //???????
{
WriteCmd(0xb0+y);
WriteCmd(((x&0xf0)>>4)|0x10);
WriteCmd((x&0x0f)|0x01);
}
void OLED_Fill(unsigned char fill_Data)
{
unsigned char m,n;
for(m=0;m<8;m++)
{
WriteCmd(0xb0+m); //page0-page1
WriteCmd(0x00); //low column start address
WriteCmd(0x10); //high column start address
for(n=0;n<128;n++)
{
WriteDat(fill_Data);
}
}
}
void OLED_CLS(void)
{
OLED_Fill(0x00);
}
下面是我的主函数:
int main()
{
IIC_Init();
OLED_ON();
OLED_Init();
OLED_Fill('a');
}
有点怀疑是不是我的oled坏了
试试这个历程
一周热门 更多>