static void OLED_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //¶¨ÒåÒ»¸öGPIO_InitTypeDefÀàÐ͵ĽṹÌå
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); //´ò¿ªGPIOCµÄÍâÉèʱÖÓ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //Ñ¡Ôñ¿ØÖƵÄÒý½Å
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //ÉèÖÃΪͨÓÿªÂ©Êä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //ÉèÖÃÊä³öËÙÂÊΪ50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure); //µ÷Óÿ⺯Êý³õʼ»¯GPIOA
OLED_SCLK_Set(); //ÉèPC2£¨SCL£©Îª¸ßµçƽ
OLED_SDIN_Set(); //ÉèPC3£¨SDA£©Îª¸ßµçƽ
}
static void OLED_IIC_Start(void)
{
OLED_SCLK_Set(); //ʱÖÓÏßÖøß
OLED_SDIN_Set(); //ÐźÅÏßÖøß
delay_us(1);
OLED_SDIN_CLr(); //ÐźÅÏßÖõÍ
delay_us(1);
OLED_SCLK_CLr(); //ʱÖÓÏßÖõÍ
delay_us(1);
}
static void OLED_IIC_Stop(void)
{
OLED_SDIN_CLr(); //ÐźÅÏßÖõÍ
delay_us(1);
OLED_SCLK_Set(); //ʱÖÓÏßÖøß
delay_us(1);
OLED_SDIN_Set(); //ÐźÅÏßÖøß
delay_us(1);
}
static unsigned char IIC_Wait_Ack(void)
{
unsigned char ack;
OLED_SCLK_CLr(); //ʱÖÓÏßÖõÍ
delay_us(1);
OLED_SDIN_Set(); //ÐźÅÏßÖøß
delay_us(1);
OLED_SCLK_Set(); //ʱÖÓÏßÖøß
delay_us(1);
if(OLED_READ_SDIN()) //¶ÁÈ¡SDAµÄµçƽ
ack = IIC_NO_ACK; //Èç¹ûΪ1£¬Ôò´Ó»úûÓÐÓ¦´ð
else
ack = IIC_ACK; //Èç¹ûΪ0£¬Ôò´Ó»úÓ¦´ð
OLED_SCLK_CLr();//ʱÖÓÏßÖõÍ
delay_us(1);
return ack; //·µ»Ø¶ÁÈ¡µ½µÄÓ¦´ðÐÅÏ¢
}
static void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i; //¶¨Òå±äÁ¿
for(i=0;i<8;i++) //forÑ»·8´Î
{
OLED_SCLK_CLr(); //ʱÖÓÏßÖõͣ¬Îª´«ÊäÊý¾Ý×ö×¼±¸
delay_us(1);
if(IIC_Byte & 0x80) //¶ÁÈ¡×î¸ßλ
OLED_SDIN_Set();//×î¸ßλΪ1
else
OLED_SDIN_CLr(); //×î¸ßλΪ0
IIC_Byte <<= 1; //Êý¾Ý×óÒÆ1λ
delay_us(1);
OLED_SCLK_Set(); //ʱÖÓÏßÖøߣ¬²úÉúÉÏÉýÑØ£¬°ÑÊý¾Ý·¢ËͳöÈ¥
delay_us(1);
}
OLED_SCLK_CLr(); //ʱÖÓÏßÖõÍ
delay_us(1);
while(IIC_Wait_Ack()); //´Ó»úÓ¦´ð
}
static void Write_IIC_Command(unsigned char IIC_Command)
{
OLED_IIC_Start();
Write_IIC_Byte(0x78);//дÈë´Ó»úµØÖ·£¬SD0 = 0
Write_IIC_Byte(0x00);//дÈëÃüÁî
Write_IIC_Byte(IIC_Command);//Êý¾Ý
OLED_IIC_Stop(); //·¢ËÍÍ£Ö¹ÐźÅ
}
/*
@brief IICдÈëÊý¾Ý
@param IIC_Data£ºÊý¾Ý
@retval ÎÞ
*/
static void Write_IIC_Data(unsigned char IIC_Data)
{
OLED_IIC_Start();
Write_IIC_Byte(0x78); //дÈë´Ó»úµØÖ·£¬SD0 = 0
Write_IIC_Byte(0x40); //дÈëÊý¾Ý
Write_IIC_Byte(IIC_Data);//Êý¾Ý
OLED_IIC_Stop(); //·¢ËÍÍ£Ö¹ÐźÅ
}
//¶ÔOLEDдÈëÒ»¸ö×Ö½Ú
void OLED_WR_Byte(unsigned char dat,unsigned char cmd)
{
if(cmd)
{
Write_IIC_Data(dat); //дÈëÊý¾Ý
}
else {
Write_IIC_Command(dat); //дÈëÃüÁî
}
}
//ÉèÖÃÊý¾ÝдÈëµÄÆðʼÐУ¬ÁÐ
//x: ÁеÄÆðʼµÍµØÖ·ÓÚÆðʼ¸ßµØÖ·
//y: Ò³ ÆðʼҳµÄµØÖ· 0-7
以stm32与oled之间通信为例,配置软件(模拟)iic
最新推荐文章于 2023-04-03 23:51:08 发布