(01)f103,4pin四脚的 oled(01)

本文介绍了一种基于STM32微控制器的IIC接口模拟驱动实现方法,包括IIC的基本函数声明与实现,以及如何利用这些函数进行数据收发。此外,还涉及了OLED屏幕的显示控制,包括文本、数字及图片的显示。

iic.h

/******************************************************************
 * 文件:IIC.h
 * 功能:声明模拟IIC基本函数
 * 日期:2018-03-04
 * 作者:zx
 * 版本:Ver.1.0 | 最初版本
 * 
 * Copyright (C) 2018 zx. All rights reserved.
*******************************************************************/
#ifndef __IIC_H
#define __IIC_H

#include "stm32f10x.h"

/**************************以下宏定义用于移植******************************/
#define IIC_SPEED 1											 //IIC通信延时时间,单位us

#define IIC_SDA_RCC RCC_APB2Periph_GPIOB                     //SDA时钟
#define IIC_SCL_RCC RCC_APB2Periph_GPIOB                     //SCL时钟

#define IIC_SDA_PORT GPIOB                                   //SDA引脚所在GPIO组
#define IIC_SCL_PORT GPIOB                                   //SCL引脚所在GPIO组

#define IIC_SDA_PIN GPIO_Pin_10                              //SDA引脚
#define IIC_SCL_PIN GPIO_Pin_11                              //SCL引脚

#define IIC_SDA_IN() setSDA_IN()                             //设置SDA为输入 
#define IIC_SDA_OUT() setSDA_OUT()                           //设置SDA为输出

#define IIC_SDA_H() GPIO_SetBits(IIC_SDA_PORT,IIC_SDA_PIN)   //拉高SDA
#define IIC_SDA_L() GPIO_ResetBits(IIC_SDA_PORT,IIC_SDA_PIN) //拉低SDA

#define IIC_SCL_H() GPIO_SetBits(IIC_SCL_PORT,IIC_SCL_PIN)   //拉高SCL
#define IIC_SCL_L() GPIO_ResetBits(IIC_SCL_PORT,IIC_SCL_PIN) //拉低SCL

/********************************~END~***********************************/

//IIC返回的两种状态
typedef enum
{
   
   
    NACK = 0x00,    //无响应
    ACK  = 0x01     //有响应
}IIC_ACK;

void setSDA_OUT(void);
void setSDA_IN(void);

void initIIC(void);
void startIIC(void);
void stopIIC(void);
void sendIICByte(u8 byte);
u8  receiveIICByte(void);
void sendIICAck(void);
void sendIICNAck(void);
IIC_ACK waitAck(void);

#endif

iic.c

/******************************************************************
 * 文件:IIC.c
 * 功能:实现模拟IIC基本函数
 * 日期:2018-03-04
 * 作者:zx
 * 版本:Ver.1.0 | 最初版本
 * 
 * Copyright (C) 2018 zx. All rights reserved.
*******************************************************************/
#include "IIC/IIC.h"
#include "DELAY/Delay.h"

/**
 * 功能:设置SDA引脚为输入状态,用于检测从机的ACK信号以及接收数据
 * 参数:None
 * 返回值:None
 */
void setSDA_IN(void)
{
   
   
	GPIO_InitTypeDef GPIO_InitStructure;                  //定义GPIO初始化结构体

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIO时钟

    GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;		      //SDA引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         //设置上拉输入

	GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);	      //设置生效
}

/**
 * 功能:设置SDA引脚为输出状态,用于向外发送数据
 * 参数:None
 * 返回值:None
 */
void setSDA_OUT(void)
{
   
   
    GPIO_InitTypeDef GPIO_InitStructure;                  //定义GPIO初始化结构体

    RCC_APB2PeriphClockCmd(IIC_SDA_RCC, ENABLE);          //使能GPIO时钟

    GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;            //SDA引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;      //开漏输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);         //设置生效    
    GPIO_SetBits(IIC_SDA_PORT,IIC_SDA_PIN);               //SDA拉高 
}

/**
 * 功能:初始化模拟IIC引脚
 * 参数:None
 * 返回值:None
 */
void initIIC(void)
{
   
   
    GPIO_InitTypeDef GPIO_InitStructure;             //定义GPIO初始化结构体

    RCC_APB2PeriphClockCmd(IIC_SDA_RCC, ENABLE);     //使能SDA时钟

    GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;       //设置SDA引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置输出速度
    GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);    //设置生效    
    GPIO_SetBits(IIC_SDA_PORT,IIC_SDA_PIN);          //拉高SDA  

    RCC_APB2PeriphClockCmd(IIC_SCL_RCC, ENABLE);     //使能SCL时钟
    GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN;       //设置SCL引脚
    GPIO_Init(IIC_SCL_PORT, &GPIO_InitStructure);    //设置生效    
    GPIO_SetBits(IIC_SCL_PORT,IIC_SCL_PIN);          //拉高SCL   
}

/**
 * 功能:发起IIC开始信号
 * 参数:None
 * 返回值:None
 */
void startIIC(void)
{
   
   
    IIC_SDA_OUT();          //设置SDA引脚为开漏输出

    IIC_SCL_H();            //拉高SCL
    IIC_SDA_H();            //拉高SDA
    Delay_us(IIC_SPEED);    //延时一段时间
    IIC_SDA_L();            //拉低SDA,在SCK高电平器件产生下降沿
    Delay_us(IIC_SPEED);    //延时一段时间
    IIC_SCL_L();            //拉低时钟,完成一个时钟周期
}

/**
 * 功能:发起IIC停止信号
 * 参数:None
 * 返回值:None
 */
void stopIIC(void)
{
   
   
    IIC_SDA_OUT();

    IIC_SDA_L();
    IIC_SCL_H();
    Delay_us(IIC_SPEED);
    IIC_SDA_H();            //SCL高电平期间,产生SDA下降沿
    Delay_us(IIC_SPEED);
    IIC_SCL_L();
}

/**
 * 功能:发起一个字节数据
 * 参数:byte:待发送数据
 * 返回值:None
 */
void sendIICByte(u8 byte)
{
   
   
    u8 i;

    IIC_SDA_OUT();

    for(i=0;i<8;++i)
    {
   
   
        if(byte & 0x80)
        {
   
   
            IIC_SDA_H();
        }else 
        {
   
   
            IIC_SDA_L();
        }
        byte <<= 1;

        IIC_SCL_H();
        Delay_us(IIC_SPEED);
        IIC_SCL_L();
        Delay_us(IIC_SPEED);
    }
}

/**
 * 功能:接收一个字节数据
 * 参数:None
 * 返回值:返回采集到的数据
 */
u8 receiveIICByte(void)
{
   
   
    s8 i;
    u8 byte = 0;

    IIC_SDA_IN();
    Delay_us(IIC_SPEED);
    for(i=7;i>=0;--i)
    {
   
   
        IIC_SCL_H();
        Delay_us(IIC_SPEED);
        if(GPIO_ReadInputDataBit(IIC_SDA_PORT,IIC_SDA_PIN))
        {
   
   
            byte |= 0x01<<i;
        }else 
        {
   
   
            byte |= 0x00<<i;
        }

        IIC_SCL_L();
        Delay_us(IIC_SPEED);
    }

    return byte;
}

/**
 * 功能:发送响应信号
 * 参数:None
 * 返回值:None
 */
void sendIICAck(void)
{
   
   
    IIC_SDA_OUT();

    IIC_SDA_L();
    IIC_SCL_H();
    Delay_us(IIC_SPEED);
    IIC_SDA_H();
    IIC_SCL_L();
}

/**
 * 功能:发送非响应信号
 * 参数:None
 * 返回值:None
 */
void sendIICNAck(void)
{
   
   
    IIC_SDA_OUT();

    IIC_SDA_H();
    IIC_SCL_H();
    Delay_us(IIC_SPEED);
    IIC_SCL_L();
}
/**
 * 功能:等待从机ACK信号
 * 参数:None
 * 返回值:None
 */
IIC_ACK waitAck(void)
{
   
   
    u8 i = 0;

    IIC_SDA_IN();
    IIC_SCL_H();
    while(GPIO_ReadInputDataBit(IIC_SDA_PORT,IIC_SDA_PIN))
    {
   
   
        if(++i>50)
        {
   
   
            IIC_SCL_L();
            return  NACK;
        }
        Delay_us(1);
    }

    IIC_SCL_L();
    return ACK;
}


font.h

/******************************************************************
 * 文件:FONT.h
 * 功能:定义OLED屏幕显示字体资源库
 * 日期:2018-03-05
 * 作者:zx
 * 版本:Ver.1.0 | 最初版本
 * 标注:ASICII显示字符,方便取模
 *      'SPACE'!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
 * Copyright (C) 2018 zx. All rights reserved.
*******************************************************************/
#ifndef __OLEDFONT_H
#define __OLEDFONT_H 	   

/***************************************6*8 ANSIC点阵**************************************/
/*****************************************检索信息******************************************
 SPACE(0) !(1) "(2) #(3) $(4) %(5) &(6) '(7) ((8) )(9) *(10) +(11) ,(12) -(13) .(14) /(15)
 0(16) 1(17) 2(18) 3(19) 4(20) 5(21) 6(22) 7(23) 8(24) 9(25) :(26) ;(27) <(28) =(29) >(30) ?(31)
 @(32) A(33) B(34) C(35) D(36) E(37) F(38) G(39) H(40) I(41) J(42) K(43) L(44) M(45) N(46) O(47)
 P(48) Q(49) R(50) S(51) T(52) U(53) V(54) W(55) X(56) Y(57) Z(58) [(59) \(60) ](61) ^(62) _(63)
 `(64) a(65) b(66) c(67) d(68) e(69) f(70) g(71) h(72) i(73) j(74) k(75) l(76) m(77) n(78) o(79)
 p(80) q(81) r(82) s(83) t(84) u(85) v(86) w(87) x(88) y(89) z(90) {(91) |(92) }(93) ~(94)
*******************************************************************************************/
const unsigned char ANSIC0608[95][6] =		
{
   
   
    {
   
   0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/

    {
   
   0x00,0x00,0x4C,0x40,0x00,0x00},/*"!",1*/

    {
   
   0x00,0x02,0x02,0x02,0x00,0x00},/*""",2*/

    {
   
   0x20,0x7C,0x28,0x28,0x3E,0x20},/*"#",3*/

    {
   
   0x00,0x6C,0x4A,0x74,0x24,0x00},/*"$",4*/

    {
   
   0x0C,0x52,0x3C,0x7C,0x52,0x70},/*"%",5*/

    {
   
   0x30,0x4C,0x7A,0x6C,0x50,0x40},/*"&",6*/

    {
   
   0x00,0x02,0x00,0x00,0x00,0x00},/*"'",7*/

    {
   
   0x00,0x00,0x00,0x7C,0x82,0x00},/*"(",8*/

    {
   
   0x00,0x42,0x3C,0x00,0x00,0x00},/*")",9*/

    {
   
   0x00,0x18,0x38,0x10,0x18,0x00},/*"*",10*/

    {
   
   0x00,0x00,0x10,0x18,0x10,0x00},/*"+",11*/

    {
   
   0x00,0xC0,0x00,0x00,0x00,0x00},/*",",12*/

    {
   
   0x08,0x08,0x08,0x08,0x08,0x08},/*"-",13*/

    {
   
   0x00,0x40,0x00,0x00,0x00,0x00},/*".",14*/

    {
   
   0x00,0x40,0x30,0x08,0x06,0x00},/*"/",15*/

    {
   
   0x00,0x7C,0x42,0x42,0x7C,0x00},/*"0",16*/

    {
   
   0x00,0x00,0x44,0x7C,0x00,0x00},/*"1",17*/

    {
   
   0x00,0x64,0x62,0x52,0x4C,0x00},/*"2",18*/

    {
   
   0x00,0x64,0x42,0x4A,0x7C,0x00},/*"3",19*/

    {
   
   0x00,0x10,0x28,0x7C,0x20,0x00},/*"4",20*/

    {
   
   0x00,0x6C,0x4C,0x4C,0x70,0x00},/*"5",21*/

    {
   
   0x00,0x7C,0x4A,0x4A,0x74,0x00},/*"6",22*/

    {
   
   0x00,0x04,0x64,0x1C,0x04,0x00},/*"7",23*/

    {
   
   0x00,0x7C,0x4A,0x52,0x7C,0x00},/*"8",24*/

    {
   
   0x00,0x5C,0x52,0x52,0x3C,0x00},/*"9",25*/

    {
   
   0x00,0x00,0x48,0x48,0x00,0x00},/*":",26*/

    {
   
   0x00,0x00,0xC8,0x00,0x00,0x00},/*";",27*/

    {
   
   0x00,0x18,0x28,0x24,0x42,0x00},/*"<",28*/

    {
   
   0x00,0x18,0x18,0x18,0x18,0x00},/*"=",29*/

    {
   
   0x00,0x42,0x24,0x28,0x18,0x00},/*">",30*/

    {
   
   0x00,0x04,0x62,0x52,0x0C,0x00},/*"?",31*/

    {
   
   0x18,0x64,0x7A,0x56,0x6C,0x18},/*"@",32*/

    {
   
   0x40,0x30,0x1C,0x1C,0x70,0x00},/*"A",33*/

    {
   
   0x00,0x7C,0x54,0x54,0x5C,0x20},/*"B",34*/

    {
   
   0x18,0x64,0x42,0x42,0x42,0x24},/*"C",35*/

    {
   
   0x00,0x7C,0x44,0x44,0x24,0x18},/*"D",36*/

    {
   
   0x00,0x7C,0x54,0x54,0x44,0x00},/*"E",37*/

    {
   
   0x00,0x7C,0x14,0x14,0x1C,0x04},/*"F",38*/

    {
   
   0x38,0x44,0x42,0x42,0x64,0x00},/*"G",39*/

    {
   
   0x00,0x7C,0x10,0x10,0x7C,0x00},/*"H",40*/

    {
   
   0x00,0x00,0x7C,0x44,0x00,0x00},/*"I",41*/

    {
   
   0x80,0x80,0x80,0xFC,0x04,0x00},/*"J",42*/

    {
   
   0x00,0x7C,0x08,0x34,0x40,0x00},/*"K",43*/

    {
   
   0x00,0x7C,0x40,0x40,0x40,0x00},/*"L",44*/

    {
   
   0x70,0x4C,0x70,0x10,0x7C,0x00},/*"M",45*/

    {
   
   0x00,0x7C,0x08,0x10,0x3C,0x00},/*"N",46*/

    {
   
   0x18,0x64,0x42,0x42,0x44,0x38},/*"O",47*/

    {
   
   0x00,0x7C,0x14,0x14,0x0C,0x04},/*"P",48*/

    {
   
   0x38,0x44,0x62,0x42,0xC4,0x38},/*"Q",49*/

    {
   
   0x00,0x7C,0x14,0x14,0x6C,0x00},/*"R",50*/

    {
   
   0x00,0x4C,0x4A,0x52,0x74,0x00},/*"S",51*/

    {
   
   0x04,0x04,0x7C,0x04,0x04,0x04},/*"T",52*/

    {
   
   0x00,0x7C,0x40,0x40,0x7C,0x00},/*"U",53*/

    {
   
   0x00,0x0C,0x30,0x30,0x0C,0x00},/*"V",54*/

    {
   
   0x00,0x3C,0x14,0x3C,0x1C,0x04},/*"W",55*/

    {
   
   0x00,0x44,0x28,0x38,0x44,0x00},/*"X",56*/

    {
   
   0x00,0x04,0x78,0x08,0x04,0x00},/*"Y",57*/

    {
   
   0x00,0x64,0x54,0x4C,0x44,0x00},/*"Z",58*/

    {
   
   0x00,0x00,0xFE,0x82,0x80,0x00},/*"[",59*/

    {
   
   0x00,0x06,0x08,0x30,0x40,0x00},/*"\",60*/

    {
   
   0x00,0x80,0x82,0xFE,0x00,0x00},/*"]",61*/

    {
   
   0x00,0x01,0x01,0x01,0x01,0x00},/*"^",62*/

    {
   
   0x80,0x80,0x80,0x80,0x80,0x80},/*"_",63*/

    {
   
   0x00,0x01,0x01,0x00,0x00,0x00},/*"`",64*/

    {
   
   0x00,0x60,0x58,0x58,0x70,0x40},/*"a",65*/

    {
   
   0x00,0x7E,0x48,0x48,0x70,0x00},/*"b",66*/

    {
   
   0x00,0x70,0x48,0x48,0x40,0x00},/*"c",67*/

    {
   
   0x00,0x70,0x48,0x48,0x7E,0x40},/*"d",68*/

    {
   
   0x00,0x70,0x68,0x68,0x50,0x00},/*"e",69*/

    {
   
   0x00,0x08,0x7C,0x0C,0x0C,0x00},/*"f",70*/

    {
   
   0x00,0xF0,0xE8,0xE8,0xD8,0x08},/*"g",71*/

    {
   
   0x00,0x7E,0x08,0x08,0x70,0x00},/*"h",72*/

    {
   
   0x00,0x08,0x78,0x40,0x00,0x00},/*"i",73*/

    {
   
   0x00,0x80,0x80,0x88,0x7A,0x00},/*"j",74*/

    {
   
   0x00,0x7E,0x10,0x38,0x48,0x00},/*"k",75*/

    {
   
   0x00,0x00,0x7E,0x40,0x00,0x00},/*"l",76*/

    {
   
   0x78,0x48,0x48,0x70,0x48,0x70},/*"m",77*/

    {
   
   0x08,0x78,0x08,0x08,0x70,0x00},/*"n",78*/

    {
   
   0x00,0x70,0x48,0x48,0x70,0x00},/*"o",79*/

    {
   
   0x08,0xF8,0x48,0x48,0x70,0x00},/*"p",80*/

    {
   
   0x00,0x70,0x48,0x48,0xF0,0x00},/*"q",81*/

    {
   
   0x08,0x48,0x70,0x08,0x08,0x00},/*"r",82*/

    {
   
   0x00,0x50,0x58,0x68,0x68,0x00},/*"s",83*/

    {
   
   0x00,0x08,0x7C,0x48,0x48,0x00},/*"t",84*/

    {
   
   0x08,0x78,0x40,0x40,0x78,0x40},/*"u",85*/

    {
   
   0x08,0x18,0x20,0x20,0x18,0x00},/*"v",86*/

    {
   
   0x08,0x38,0x28,0x38,0x38,0x08},/*"w",87*/

    {
   
   0x00,0x48,0x38,0x38,0x48,0x00},/*"x",88*/

    {
   
   0x00,0x98,0xA0,0x60,0x18,0x08},/*"y",89*/

    {
   
   0x00,0x48,0x68,0x58,0x48,0x00},/*"z",90*/

    {
   
   0x00,0x00,0x00,0x7E,0x80,0x00},/*"{",91*/

    {
   
   0x00,0x00,0x00,0xFF,0x00,0x00},/*"|",92*/

    {
   
   0x00,0x80,0x7E,0x00,0x00,0x00},/*"}",93*/

    {
   
   0x00,0x01,0x01,0x02,0x02,0x00} /*"~",94*/
};
/************************************~END~************************************/


/****************************************8*16 ANSIC点阵************************************/
/*****************************************检索信息******************************************
 SPACE(0) !(1) "(2) #(3) $(4) %(5) &(6) '(7) ((8) )(9) *(10) +(11) ,(12) -(13) .(14) /(15)
 0(16) 1(17) 2(18) 3(19) 4(20) 5(21) 6(22) 7(23) 8(24) 9(25) :(26) ;(27) <(28) =(29) >(30) ?(31)
 @(32) A(33) B(34) C(35) D(36) E(37) F(38) G(39) H(40) I(41) J(42) K(43) L(44) M(45) N(46) O(47)
 P(48) Q(49) R(50) S(51) T(52) U(53) V(54) W(55) X(56) Y(57) Z(58) [(59) \(60) ](61) ^(62) _(63)
 `(64) a(65) b(66) c(67) d(68) e(69) f(70) g(71) h(72) i(73) j(74) k(75) l(76) m(77) n(78) o(79)
 p(80) q(81) r(82) s(83) t(84) u(85) v(86) w(87) x(88) y(89) z(90) {(91) |(92) }(93) ~(94)
*******************************************************************************************/
const unsigned char ANSIC0816[95][16] =	  
{
   
   
    {
   
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/

    {
   
   0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00},/*"!",1*/

    {
   
   0x00,0x10,0x0C,0x02,0x10,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/

    {
   
   0x00,0x40,0xC0,0x78,0x40,0xC0,0x78,0x00,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x00},/*"#",3*/

    {
   
   0x00,0x70,0x88,0x88,0xFC,0x08,0x30,0x00,0x00,0x18,0x20,0x20,0xFF,0x21,0x1E,0x00},/*"$",4*/

    {
   
   0xF0,0x08,0xF0,0x80,0x60,0x18,0x00,0x00,0x00,0x31,0x0C,0x03,0x1E,0x21,0x1E,0x00},/*"%",5*/

    {
   
   0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x2C,0x19,0x27,0x21,0x10},/*"&",6*/

    {
   
   0x00,0x12,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/

    {
   
   0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00},/*"(",8*/

    {
   
   0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00},/*")",9*/

    {
   
   0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00},/*"*",10*/

    {
   
   0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x0F,0x01,0x01,0x01},/*"+",11*/

    {
   
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x70,0x00,0x00,0x00,0x00,0x00},/*",",12*/

    {
   
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00},/*"-",13*/

    {
   
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},/*".",14*/

    {
   
   0x00,0x00,0x00,0x00,0xC0,0x38,0x04,0x00,0x00,0x60,0x18,0x07,0x00,0x00,0x00,0x00},/*"/",15*/

    {
   
   0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",16*/

    {
   
   0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00},/*"1",17*/

    {
   
   0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",18*/

    {
   
   0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00},/*"3",19*/

    {
   
   0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F
### STM32F103CBT6 HAL库驱动4-Pin OLED的解决方案 #### 1. 硬件连接说明 STM32F103CBT6 使用 I2C 接口与 4-Pin OLED 显示屏通信。通常情况下,OLED 的 SDA 和 SCL 引脚分别对应 MCU 的 GPIO 口,并通过软件配置为 I2C 功能模式。硬件连接如下表所示: | **OLED Pin** | **功能描述** | **MCU Pin (示例)** | |--------------|--------------------|---------------------| | VCC | 电源正极 | +3.3V 或 +5V | | GND | 地 | GND | | SDA | 数据线 | PB9 (I2C1_SDA) | | SCL | 时钟线 | PB8 (I2C1_SCL) | 以上硬件连接方式需根据实际开发板设计调整。 --- #### 2. 软件环境准备 为了实现 HAL 库驱动 OLED,需要完成以下准备工作: - 安装 Keil MDK 或 STM32CubeIDE 开发工具。 - 下载并安装 SSD1306 图形显示控制器驱动库[^3]。 - 配置 STM32 的 I2C 外设以支持与 OLED 的通信。 --- #### 3. 初始化代码示例 以下是基于 HAL 库的初始化代码片段,用于配置 I2C 并加载 OLED 屏幕驱动程序。 ```c #include "stm32f1xx_hal.h" #include "ssd1306.h" // 定义全局变量 SSD1306_t Dev; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_I2C1_Init(void); int main(void) { // 初始化系统时钟 HAL_Init(); SystemClock_Config(); // 初始化GPIO和I2C外设 MX_GPIO_Init(); MX_I2C1_Init(); // 初始化OLED屏幕 if(SSD1306_Init(&Dev, I2C1, SSD1306_ADDR_128_64) != SSD1306_OK){ Error_Handler(); // 错误处理函数 } while(1) { // 在屏幕上绘制文字或图形 SSD1306_Fill(&Dev, Black); // 清除屏幕 SSD1306_SetCursor(&Dev, 0, 0); // 设置光标位置 SSD1306_WriteString(&Dev, "Hello World", Font_7x10, White); // 输出字符串 SSD1306_UpdateScreen(&Dev); // 刷新屏幕 HAL_Delay(1000); // 延迟一秒 } } /** * @brief 配置I2C1外设 */ static void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; // 标准模式:100kHz hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } } ``` --- #### 4. 关键点解析 ##### (1)I2C 总线速度配置 在 `MX_I2C1_Init` 函数中设置了 I2C 的工作频率为 100 kHz(标准模式)。如果需要更高的传输速率,可以将其更改为快速模式(400 kHz),但需要注意 OLED 是否支持该频率[^4]。 ##### (2)错误处理机制 当初始化失败时调用 `Error_Handler()` 函数。开发者可以根据需求自定义此函数的行为,例如点亮 LED 提示错误状态。 ##### (3)字体与颜色管理 使用 `Font_7x10` 字体渲染字符,默认前景色为白色 (`White`),背景色为黑色 (`Black`)。可以通过修改参数来更改样式。 --- #### 5. 注意事项 - 确保 STM32 的供电电压与 OLED 兼容(通常是 3.3V 或 5V)。 - 如果 OLED 不响应,请检查其地址是否正确(常见地址有 `0x3C` 和 `0x3D`)。 - 若遇到通信异常,可尝试降低 I2C 工作频率至更低值(如 50 kHz)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值