历史上的今天
今天是: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); } //¸üÐÂÏÔʾ
史海拾趣
|
ARM9,ARM7同cortex-m3的数据在RAM的存贮的区别 ARM9 ARM7在RAM中是以字节,字,半字来存贮的,它们是按照一定的关系存放的,所以ARM9 ,ARM7可以把变量以字和半字来存取的。这样会浪费一个些空,具体浪费多大要根据指令情况而定,而CORTEX-M3就不是这样,而是按照无关联组织的,自由的存放,而在 ...… 查看全部问答> |
|
受友人之托,发此求助内容:有效期至2010年4月25日 Linux下用S3C2440实现对IIC器件(如IIC的AD转换芯片)、SPI器件(如SPI的AD转换芯片)、GPIO(如LED数码管、矩阵键盘)等的读取和控制;以及LPC2440芯片内部定时器和中断系统及串口等控制,要求 ...… 查看全部问答> |
|
各位老大 这个问题很菜,在控件上用了Gruopbox以后,Gruopbox里包含的控件都不能显示了,比如按钮之类的,这是啥原因啊?去掉Gruopbox就可以了,请各位指教!… 查看全部问答> |
|
国产PLC有免费试用啦 应广大用户需求,广州微嵌最近推出PLC产品免费试用优惠,只要你有需求,我们可以满足你的要求. 分别有WQ-32MT-2DA和WQ-36MT-3DA两种型号. 产品特点 ● WQ-32MT-2DA/WQ-36MT-3DA 是完全自主研发的国产精品,具 ...… 查看全部问答> |
|
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 求解答~ 谢谢! [ 本帖最后由 ...… 查看全部问答> |




