历史上的今天
返回首页

历史上的今天

今天是:2024年08月29日(星期四)

正在发生

2019年08月29日 | STM32 >> OLED 小屏幕(Code)

2019-08-29 来源:eefocus

我的OLED 屏幕使用I2C 通讯


需要注意的是:把控好通讯的方式及时序准确性即可。


oled.h

/**

  ******************************************************************************

  * @file    oled.h

  * @author  Waao

  * @version V1.0.0

  * @date    22-Feb-2019

  * @brief   This file contains some board support package's definition for the LED.

  *            

  ******************************************************************************

  * @attention

  *

  * None

*

  ******************************************************************************

  */

#ifndef __OLED_H_

#define __OLED_H_


#include

#include

#include



extern unsigned char F6x8[][6];

extern unsigned char F8X16[];

extern char Hzk[][32];


#define I2C_1

//#define I2C_2


/* SCL->PD5  

   SDA->PD6 */

#ifdef I2C_1

#define SCL_GPIO_PORT            GPIOD

#define SCL_GPIO_PIN             GPIO_Pin_5

#define SCL_GPIO_CLK             RCC_AHB1Periph_GPIOD

  #define SCL_CLK_Open             RCC_AHB1PeriphClockCmd(SCL_GPIO_CLK, ENABLE)

  #define SCL_1                    GPIO_SetBits(SCL_GPIO_PORT, SCL_GPIO_PIN)

  #define SCL_0                    GPIO_ResetBits(SCL_GPIO_PORT, SCL_GPIO_PIN)


#define SDA_GPIO_PORT            GPIOD

#define SDA_GPIO_PIN             GPIO_Pin_6

#define SDA_GPIO_CLK             RCC_AHB1Periph_GPIOD

  #define SDA_CLK_Open             RCC_AHB1PeriphClockCmd(SDA_GPIO_CLK, ENABLE)

  #define SDA_1                    GPIO_SetBits(SDA_GPIO_PORT, SDA_GPIO_PIN)

  #define SDA_0                    GPIO_ResetBits(SDA_GPIO_PORT, SDA_GPIO_PIN)


#else /* I2C_2 */

/* You can use other gpio port and define on here */

#endif


/***************** Delay function *******************/

#define Delay_1us                  Delay(1)

#define Delay_10us                 Delay(10)

#define Delay_1ms                  Delay(1000)

#define Delay_10ms                 Delay(10000)

#define Delay_100ms                Delay(100000)

#define Delay_200ms                Delay(200000)

#define Delay_500ms                Delay(500000)

/****************************************************/


/********************** cmd *************************/

#define OLED_CMD                   0 // command

#define OLED_DATA                  1 // data

/****************************************************/


#define SIZE                       16

#define Max_Column                128




void OLED_GPIO_Config(void);

void SDA_Mode_Input(void);

void SDA_Mode_Output(void);

void I2C_START(void);

void I2C_STOP(void);

int Wait_For_ACK(void);

void Send_Byte(u8 BYTE);

void Write_Data(u8 DATA);

void Write_Command(u8 Command);

void OLED_Write_Byte(u8 dat,u8 cmd);

void OLED_Display_On(void);

void OLED_Display_Off(void);

void OLED_Clear(void);

void OLED_Set_Pos(unsigned char x, unsigned char y);

void OLED_Init(void);

void OLED_ShowChar(u8 x,u8 y,u8 chr);

void OLED_ShowCC(u8 x,u8 y,u8 no);


#endif




oled.c

/**

  ******************************************************************************

  * @file    oled.c

  * @author  Waao

  * @version V1.0.0

  * @date    22-Feb-2019

  * @brief   This file contains some board support package's functions for the OLED.

  *            

  ******************************************************************************

  * @attention

  *

  * None

*

  ******************************************************************************

  */


#include "oled.h"

#include



/**

  * @brief  Initialize the gpio.

  * @param  None  

  * @retval None

  */

void OLED_GPIO_Config(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;


  SCL_CLK_Open;

SDA_CLK_Open;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


  GPIO_InitStructure.GPIO_Pin = SCL_GPIO_PIN;

  GPIO_Init(SCL_GPIO_PORT, &GPIO_InitStructure);


  GPIO_InitStructure.GPIO_Pin = SDA_GPIO_PIN;

  GPIO_Init(SDA_GPIO_PORT, &GPIO_InitStructure);


  SCL_1;

  SDA_1;

}



/**

  * @brief  Turn the SDA to inpot mode.

  * @param  None  

  * @retval None

  */

void SDA_Mode_Input(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;


SDA_CLK_Open;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Pin = SDA_GPIO_PIN;

  GPIO_Init(SDA_GPIO_PORT, &GPIO_InitStructure);

}



/**

  * @brief  Turn the SDA to output mode.

  * @param  None  

  * @retval None

  */

void SDA_Mode_Output(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;


SDA_CLK_Open;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Pin = SDA_GPIO_PIN;

  GPIO_Init(SDA_GPIO_PORT, &GPIO_InitStructure);

}




/**

  * @brief  I2C startup signal.

  * @param  None  

  * @retval None

  */

void I2C_START(void)

{

  SCL_1;

  SDA_1;


  SDA_0;

  Delay_1us;


  SCL_0;

}



/**

  * @brief  I2C stop signal.

  * @param  None  

  * @retval None

  */

void I2C_STOP(void)

{

  SDA_0;

  SCL_0;


  SCL_1;

  Delay_10us;


  SDA_1;

}



/**

  * @brief  Waiting fot ACK.

  * @param  None  

  * @retval SET: ACK

  *         RESET: NOT ACK

  */

int Wait_For_ACK(void)

{

  u8 TEMP = 0;


/* Turn the SDA mode to input is important */

SDA_Mode_Input();

  SCL_0;

  Delay_1us;

  SCL_1;

  Delay_1us;

  TEMP = GPIO_ReadInputDataBit(SDA_GPIO_PORT, SDA_GPIO_PIN);

  SCL_0;

  SDA_1;

SDA_Mode_Output();


if(TEMP)

{

printf("nError Code 1");

return RESET;

}

printf("nAck Successful!");

  return SET;

}



/**

  * @brief  I2C send byte.

  * @param  DATA: One byte of data you want to transmit

  * @retval None  

  */

void Send_Byte(u8 BYTE)

{

  u8 i = 0, VALUES = 0, TEMP = 0;

VALUES = BYTE;

  SCL_0;


  for(i=0; i<8; i++)

  {

TEMP = VALUES & 0x80;

VALUES = VALUES << 1;


    if(TEMP == 0x80)

    {

      SDA_1;

    } 

    else

    {

      SDA_0;

    }

Delay_1us;

    SCL_1;

    Delay_1us;

    SCL_0;

}

SDA_1;

}



/**

  * @brief  I2C send DATA.

  * @param  DATA: One byte of data you want to transmit

  * @retval None  

  */

void Write_Data(u8 DATA)

{

  I2C_START();

  Send_Byte(0x78);

Wait_For_ACK();

  Send_Byte(0x40);

Wait_For_ACK();

  Send_Byte(DATA);

Wait_For_ACK();

  I2C_STOP();

}



/**

  * @brief  I2C send DATA.

  * @param  DATA: One byte of data you want to transmit

  * @retval None  

  */

void Write_Command(u8 Command)

{

  I2C_START();

  Send_Byte(0x78);

Wait_For_ACK();

  Send_Byte(0x00);

Wait_For_ACK();

  Send_Byte(Command);

Wait_For_ACK();

  I2C_STOP();

}



/**

  * @brief  Write a byte to OLED.

  * @param  dat: The byte you want to transmit

  *         cmd: Specified this byte is data or command

  * @retval None  

  */

void OLED_Write_Byte(u8 dat,u8 cmd)

{

if(cmd)

{

   Write_Data(dat);

}

else 

  {

   Write_Command(dat);

}

}



/**

  * @brief  Turn on the screen.

  * @param  None

  * @retval None  

  */

void OLED_Display_On(void)

{

OLED_Write_Byte(0X8D,OLED_CMD);  

OLED_Write_Byte(0X14,OLED_CMD);  

OLED_Write_Byte(0XAF,OLED_CMD);  

}



/**

  * @brief  Turn off the screen.

  * @param  None

  * @retval None  

  */

void OLED_Display_Off(void)

{

OLED_Write_Byte(0X8D,OLED_CMD);  

OLED_Write_Byte(0X10,OLED_CMD); 

OLED_Write_Byte(0XAE,OLED_CMD); 

}    



/**

  * @brief  Clear the screen.

  * @param  None

  * @retval None  

  */

void OLED_Clear(void)  

{  

u8 i,n;     

for(i=0;i<8;i++)  

{  

OLED_Write_Byte (0xb0+i,OLED_CMD);    //ÉèÖÃÒ³µØÖ·£¨0~7£©

OLED_Write_Byte (0x02,OLED_CMD);      //ÉèÖÃÏÔʾλÖáªÁе͵ØÖ·

OLED_Write_Byte (0x10,OLED_CMD);      //ÉèÖÃÏÔʾλÖáªÁиߵØÖ·   

for(n=0;n<128;n++)

OLED_Write_Byte(0,OLED_DATA); 

} //¸üÐÂÏÔʾ

推荐阅读

史海拾趣

Grand Halo Technology Co Ltd公司的发展小趣事

对于自动关灯开关电路,网友们可能会提出多种问题,这里列出一些常见问题及其回答:

1. 自动关灯是如何实现的?

回答: 自动关灯通常通过传感器(如光敏电阻、红外传感器、人体感应传感器等)和电路控制来实现。例如,使用光敏电阻可以根据环境光线变化自动开关灯;人体感应传感器则在检测到人体移动时开启灯光,并在一定时间内无人移动时自动关闭。

2. 需要哪些主要元件来构建一个简单的自动关灯电路?

回答: 构建一个简单的自动关灯电路,你可能需要光敏电阻(或相应传感器)、继电器(或晶体管等开关元件)、电阻、电容(用于去抖动或延时)、电源(如电池或直流适配器)、以及LED灯或实际的白炽灯/荧光灯作为负载。对于更复杂的人体感应型,还需要红外传感器模块。

3. 如何调节自动关灯的延时时间?

回答: 调节自动关灯的延时时间通常通过改变电路中的电容或电阻值来实现。在延时电路中,电容充电或放电的时间决定了延时长度。增加电容值或增大充电电阻值可以延长延时时间,反之则缩短。

4. 自动关灯电路是否节能?

回答: 是的,自动关灯电路在无人或光线充足时自动关闭灯光,从而有效减少不必要的电能消耗,达到节能的目的。这对于长时间无人使用或光线条件良好的场所尤为有效。

5. 如何保证自动关灯电路的稳定性和可靠性?

回答: 要保证自动关灯电路的稳定性和可靠性,首先应选择质量可靠的元件;其次,合理设计电路布局,避免元件间相互干扰;此外,还可以加入过流保护、过压保护等安全措施;最后,进行充分的测试,确保电路在不同环境条件下都能正常工作。

6. 能否将自动关灯电路与智能家居系统连接?

回答: 是的,许多现代自动关灯电路都支持智能家居系统集成。通过WiFi、蓝牙或Zigbee等无线通信技术,可以将自动关灯开关连接到智能家居中心控制器上,实现远程控制、定时开关、场景模式切换等功能,使家居生活更加智能化和便捷。

Barry Industries Inc公司的发展小趣事

在国内市场取得一定成绩后,Barry Industries Inc开始积极拓展国际市场。公司参加了多个国际电子展会,与国际知名企业建立了合作关系,成功将产品打入国际市场。同时,Barry还积极寻求与国际先进技术的交流与合作,不断提升自身的技术水平和产品质量。

GTM公司的发展小趣事

在国内市场取得一定成绩后,Barry Industries Inc开始积极拓展国际市场。公司参加了多个国际电子展会,与国际知名企业建立了合作关系,成功将产品打入国际市场。同时,Barry还积极寻求与国际先进技术的交流与合作,不断提升自身的技术水平和产品质量。

Aborn Electronics Inc公司的发展小趣事

Aborn Electronics Inc公司创立之初,面临着资金短缺、市场竞争激烈和技术壁垒等多重挑战。创始人凭借对电子技术的深厚理解和对市场需求的敏锐洞察,带领团队攻克了一个又一个技术难关。公司最初的产品线集中在电子元器件的生产和供应上,通过优化生产流程和降低成本,逐渐在市场上站稳了脚跟。同时,Aborn Electronics积极与各大电子厂商建立合作关系,为公司的长远发展奠定了坚实的基础。

Akros[台湾超硕股份有限公司]公司的发展小趣事

面对日益激烈的市场竞争,Akros公司积极寻求市场拓展的机会。公司开始参加国际电子展会,与全球各地的客户建立联系。通过展示其独特的技术优势和高质量的产品,Akros逐渐赢得了国际市场的认可。同时,公司还加强了与全球供应链的合作,实现了原材料的全球化采购,降低了生产成本,提高了产品的竞争力。

BEKA Associates Ltd公司的发展小趣事

在快速发展的过程中,BCD Semi(Diodes)积极寻求风险投资和资本运作的支持。公司通过吸引国内外知名的投资机构参与投资,获得了大量的资金支持,为公司的研发、生产和市场拓展提供了有力的保障。同时,BCD Semi还通过并购、合作等方式,与行业内的其他企业实现资源共享和优势互补,进一步提升了公司的综合实力。

问答坊 | AI 解惑

ARM9,ARM7同cortex-m3的数据在RAM的存贮的区别

ARM9 ARM7在RAM中是以字节,字,半字来存贮的,它们是按照一定的关系存放的,所以ARM9 ,ARM7可以把变量以字和半字来存取的。这样会浪费一个些空,具体浪费多大要根据指令情况而定,而CORTEX-M3就不是这样,而是按照无关联组织的,自由的存放,而在 ...…

查看全部问答>

FPGA与CPLD的区别

FPGA与CPLD区别,这是问题究竟有哪些方面…

查看全部问答>

有偿求助嵌入式技术:

受友人之托,发此求助内容:有效期至2010年4月25日 Linux下用S3C2440实现对IIC器件(如IIC的AD转换芯片)、SPI器件(如SPI的AD转换芯片)、GPIO(如LED数码管、矩阵键盘)等的读取和控制;以及LPC2440芯片内部定时器和中断系统及串口等控制,要求 ...…

查看全部问答>

求助,关于串口通讯

        各位前辈高手,小弟刚入行不久。求教关于串口通讯的问题。         R-232 DB9 接口,接线方式 2,3,5,对接。         数据格式:通信控制 ...…

查看全部问答>

EVC上控件显示的问题!

    各位老大 这个问题很菜,在控件上用了Gruopbox以后,Gruopbox里包含的控件都不能显示了,比如按钮之类的,这是啥原因啊?去掉Gruopbox就可以了,请各位指教!…

查看全部问答>

国产PLC有免费试用啦

国产PLC有免费试用啦   应广大用户需求,广州微嵌最近推出PLC产品免费试用优惠,只要你有需求,我们可以满足你的要求. 分别有WQ-32MT-2DA和WQ-36MT-3DA两种型号.   产品特点 ● WQ-32MT-2DA/WQ-36MT-3DA 是完全自主研发的国产精品,具 ...…

查看全部问答>

招聘信息{深圳}

发个招聘信息,有兴趣的联系我,比较急。知名外企,base深圳,HW Designer,要求: 1,模拟数字信号设计,混合信号设计; 2,RF设计; 3,fpga经验; 4,英语能沟通; 5,3年以上设计经验。行业发展好!电话:13073026582 email:ellen.lee@betterco ...…

查看全部问答>

废物利用充电保护板

手机拆下来的保护板,很常见,免得淘宝了,前提是废电池的保护模块是正常的哦,焊接时请勿弄错极性哦,注意绝缘的处理哦,我也是看到就贴来了,板块不对的话请版主移动哦,o(∩_∩)o 哈哈 1 2 3 买来的盒子是双节串联的,必须改成单节,这样空 ...…

查看全部问答>

Could not power up debug port: Control/Status register reads 000000F0

在仿真的时候软件突然无法响应,强制关闭后出现该问题: 现在无法下载程序仿真,每次都出现这个提示:Could not power up debug port: Control/Status register reads 000000F0 仿真器型号:J-Link  V8 求解答~ 谢谢! [ 本帖最后由 ...…

查看全部问答>

基于FPGA的串口集线器

最近在做基于FPGA的串口集线器,大家有什么好的方案?…

查看全部问答>