这是一个卑微电子信息学员的开始
3月27日工作记录
这是学习stm32的第n天
卑微电子信息学员开始了stm32的学习过程。
写一个傻子都会的IIC屏
我发现在网上使用Stm32G系列的人很少,没有什么参考的例子
IIC详解
我以前写过
https://blog.csdn.net/mohaoyuan/article/details/105345206
写的这么好没人看.jpg
给我划重点!!
CUBEMAX操作
1配置时钟和SW
2随便设置两个引脚
我这边引脚设置了OD 但其实默认的就可以
OLED.H和DELAY.H文件编写
delay.c文件
#include "delay.h"
//微秒级的延时
void delay_us(uint32_t delay_us)
{
volatile unsigned int num;
volatile unsigned int t;
for (num = 0; num < delay_us; num++)
{
t = 11;
while (t != 0)
{
t--;
}
}
}
//毫秒级的延时
void delay_ms(uint16_t delay_ms)
{
volatile unsigned int num;
for (num = 0; num < delay_ms; num++)
{
delay_us(1000);
}
}
delay.h文件
#ifndef __DELAY_H
#define __DELAY_H
#include "main.h"
void delay_ms(uint16_t delay_ms);
void delay_us(uint32_t delay_us);
#endif
给我划重点!这里delay函数用的是软件延时,其实时间是很不准确,但是,只要有延时就足够应对IIC,准确的延时嘛,自己设timer去。
olcd.c文件
#include "oled.h"
#include "stdlib.h"
#include "oledfont.h"
//IIC Start
**********************************************/
void IIC_Start()
{
OLED_SCLK_Set() ;
OLED_SDIN_Set();
OLED_SDIN_Clr();
OLED_SCLK_Clr();
}
/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
OLED_SCLK_Clr();
OLED_SDIN_Clr();
OLED_SDIN_Set();
OLED_SCLK_Set() ;
}
/**********************************************
// IIC Write byte
**********************************************/
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
for(i=0;i<8;i++)
{
m=da;
OLED_SCLK_Clr();
m=m&0x80;
if(m==0x80)
{OLED_SDIN_Set();}
else OLED_SDIN_Clr();
da=da<<1;
OLED_SCLK_Set();
}
OLED_SCLK_Clr();
OLED_SCLK_Set() ;
}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x
我随便给点意思一下,olcd.c文件你哪里来的屏问哪里要。
olcd.h文件
#ifndef __OLED_H
#define __OLED_H
#include "stdlib.h"
#include "main.h"
#include "delay.h"
#define OLED_MODE 0
#define SIZE 8
#define XLevelL 0x00
#define XLevelH 0x10
#define Max_Column 128
#define Max_Row 64
#define Brightness 0xFF
#define X_WIDTH 128
#define Y_WIDTH 64
//-----------------OLED IIC端口定义----------------
#define OLED_SCLK_Clr() GPIOC->BSRR = (uint32_t)GPIO_PIN_12 << 16U;delay_us(1)
#define OLED_SCLK_Set() GPIOC->BSRR = GPIO_PIN_12;delay_us(1)
#define OLED_SDIN_Clr() GPIOC->BSRR = (uint32_t)GPIO_PIN_10 << 16U;delay_us(1)
#define OLED_SDIN_Set() GPIOC->BSRR = GPIO_PIN_10;delay_us(1)
#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
//OLED控制用函数
void OLED_WR_Byte(unsigned dat,unsigned cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t t);
void OLED_Fill(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2,uint8_t dot);
void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size);
void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size);
void OLED_ShowString(uint8_t x,uint8_t y, uint8_t *p,uint8_t Char_Size);
void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no);
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
void Delay_50ms(unsigned int Del_50ms);
void Delay_1ms(unsigned int Del_1ms);
void fill_picture(unsigned char fill_Data);
void Picture();
void IIC_Start();
void IIC_Stop();
void Write_IIC_Command(unsigned char IIC_Command);
void Write_IIC_Data(unsigned char IIC_Data);
void Write_IIC_Byte(unsigned char IIC_Byte);
#endif
oled.h文件就有一点小技巧
这是一般人家给你的垃圾:
这是你动了脑子的结果:
这个main.h属于偷鸡小技巧,不懂嘛就多动脑子。
后面的嘛,我觉得但凡有点脑子都改懂了。
源文件嘛,给你个链接自个送钱去。
本文仅供学习使用,禁止一切转载或调用,最终解释权由作者本人享有。