STM32基于i2c的OLED驱动代码,(不用下载,即可查看全文QAQ)

STM32基于i2c的OLED驱动代码,(不⽤下载,即可查看全⽂QAQ)
#ifndef IIC_H
#define IIC_H
#include “sys.h”
#define I2C_CLK PBout(8)
#define I2C_SDA_W PBout(9)
#define I2C_SDA_R PBin(9)
#define SDA_OUT() {GPIOB->MODER&=~(0x03<<18);GPIOB->MODER|=0x01<<18; }
#define SDA_IN() GPIOB->MODER&=~(0x03<<18)
void MyI2C_Init(void);
void I2C_Start(void);
芜湖市民心声网
void I2C_Stop(void);
void I2C_WaitAnswer(void);
void I2C_Answer(void);
void I2C_NoAnswer(void);
void I2C_Send_Byte(u8 msg);
u8 I2C_Read_Byte(unsigned char ack);
#endif
/********************************************************
@file iic.c
@brief 软件模拟iic
@Author ⼀位不愿透露姓名的⽹友 QWQ
*******************************************************/
#include “iic.h”
#include “delay.h”
//iic初始化设置为推挽输出,i2c浮空状态都为⾼的缘故
void MyI2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin  =  GPIO_Pin_8 |GPIO_Pin_9;
GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
I2C_CLK = 1;
I2C_SDA_W = 1;
}
void I2C_Start(void)
{
SDA_OUT();
//浮空双线输出拉⾼
I2C_CLK = 1;
I2C_SDA_W = 1;
usleep(4);
I2C_SDA_W = 0;//SDA线由⾼变低
usleep(4);
I2C_CLK = 0;//钳住时钟线 , 准备数据接受}
void I2C_Stop(void)
{
SDA_OUT();
//浮空双线输出拉⾼
I2C_CLK = 0;
I2C_SDA_W = 0;
usleep(4);
I2C_CLK = 1;
I2C_SDA_W = 1;
蔗糖脂肪酸酯usleep(4);
}
//等待应答
void I2C_WaitAnswer(void)
{
u8 t=0;
SDA_IN(); //SDA 设置为输⼊
I2C_SDA_W=1;
usleep(1);
相位表
I2C_CLK=1;
usleep(1);
while(I2C_SDA_R)
{
t++;
if(t>250)
{
I2C_Stop();
break;
}
}
I2C_CLK=0;
}
//产⽣应答
void I2C_Answer(void)
{
SDA_OUT();
I2C_CLK=0;
I2C_SDA_W=0;
usleep(2);
I2C_CLK=1;
usleep(2);
I2C_CLK=0;
}
//不产⽣应答
void I2C_NoAnswer(void)
{
SDA_OUT();
I2C_CLK=0;
I2C_SDA_W=1;
usleep(2);
I2C_CLK=1;
usleep(2);
I2C_CLK=0;
}
//IIC 发送⼀个字节
void I2C_Send_Byte(u8 msg)
{
u8 t;
SDA_OUT();圈疗
I2C_CLK = 0;//拉低时钟开始数据传输for(t=0;t<8;t++)
{
I2C_SDA_W=(msg&0x80)>>7;
msg<<=1;
usleep(2);
I2C_CLK=1;
usleep(2);
I2C_CLK=0;
usleep(2);
}
}
//接受⼀个字节
u8 I2C_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN(); //SDA 设置为输⼊
for(i=0;i<8;i++ )
{
I2C_CLK=0;
usleep(2);
I2C_CLK=1;
receive<<=1;
if(I2C_SDA_R)
receive++;
usleep(1);
百姓健康舞
}
if (!ack) I2C_NoAnswer();//发送 nACK
else I2C_Answer(); //发送 ACK
return receive;
}
/********************************************************
@file oled.h
@brief OLED基于I2C传输的驱动代码
OLED屏幕⼤⼩128*64
@Author ⼀位不愿透露姓名的⽹友 QWQ
*******************************************************/
#ifndef __OLED_H
#define __OLED_H
#include “sys.h”
#include “stdlib.h”
//OLED模式设置
//0: 4线串⾏模式 (模块的BS1,BS2均接GND)//1: 并⾏8080模式 (模块的BS1,BS2均接VCC)//2: i2c模式(本次采⽤)
#define OLED_MODE 2
//-----------------OLED端⼝定义----------------
#define OLED_CS PBout(7)
#define OLED_RST PGout(15)
#define OLED_RS PDout(6)
#define OLED_WR PAout(4)
#define OLED_RD PDout(7)
//使⽤2线I2C接⼝时使⽤
#define OLED_I2C_CLK PBout(8)
#define OLED_I2C_SDA_W PBout(9)
#define OLED_I2C_SDA_R PBin(9)
//使⽤4线串⾏接⼝时使⽤
#define OLED_SCLK PCout(6)
#define OLED_SDIN PCout(7)
#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
/
/OLED通⽤控制⽤函数
void OLED_Send(u8 dat,u8 cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Fresh_OLED(void);
//i2c专⽤
void OLED_CmdSend(u8 cmd);
void OLED_DataSend(u8 data);
void OLED_Init(void);
聚酯纤维布void OLED_Clear(void);
void OLED_ClearSlectBlock(u8 x1,u8 y1,u8 x2,u8 y2);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);
void OLED_ShowString(u8 x,u8 y,const u8 *p,u8 size);
#endif
#include “oled.h”
#include “oledfont.h”
#include “delay.h”
#include “iic.h”
/********************************************************
@file oled.c
@brief OLED基于I2C传输的代码
OLED屏幕⼤⼩128*64
@Author ⼀位不愿透露姓名的⽹友 QWQ
*******************************************************/
//初始化SSD1306
void OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Perip h_GPIOE|RCC_AHB1Periph_GPIOG, ENABLE);//使能PORTA~E,PORTG时钟
#if OLED_MODE==1 //使⽤8080并⼝模式
//GPIO初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7 ;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_11;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化

本文发布于:2024-09-22 15:34:06,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/651286.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:输出   模式   接受   浮空
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议