stm32f103c8t6模拟IIC驱动0.96oled STM32f103c8t6模拟IIC驱动0.96'OLED
模拟IIC驱动0.96’OLED
代码⼤部分考别⼈的,放这⾥作笔记,免得以后不着
四线IIC接⼝0.96‘OLED接线:
GND 电源地
VCC 3.3v电源
SCL 接PA5(SCL)
SDA 接PA7(SDA)
验证单⽚机型号:stm32f103c8t6
其他单⽚机的话修改⼀下引脚应该也ok
效果
⽤stm32f103c8t6内部RTC做万年历,0.96’OLED显⽰,效果如下图:
主要代码:
main.c
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
#include "rtc.h"
#include "include.h"
void OLED_ShowDate(u8 x,u8 y);
void OLED_ShowTime(u8 x,u8 y);
int main(void)
{
u8 t=0;
/**************************************Init*************************************/
delay_init();//延时函数初始化
NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级  LED_Init();
OLED_Init();//初始化OLED
OLED_Clear();
RTC_Init();//RTC初始化
RTC_Init();//RTC初始化
delay_ms(500);
while(1)
{
if(t!=calendar.sec)
{
t=calendar.sec;
OLED_ShowTime(32,12);
OLED_ShowDate(16,14);
}
delay_ms(300);
}
/*******************显⽰⽇期****************************/
//x坐标:0-33
//y坐标:0、10、12、14
/*******************************************************/
void OLED_ShowDate(u8 x,u8 y)
{
/
/ u8 t=0;
// if(t!=calendar.sec)
// {
//  t=calendar.sec;
OLED_ShowNum(x,y,calendar.w_year,4,16); OLED_ShowChar(x+32,y,'-',16);
OLED_ShowNum(x+40,y,calendar.w_month,2,16); if(calendar.w_month <=9)//不⾜两位数,前补零{
OLED_ShowNum(x+40,y,0,1,16);
}
OLED_ShowChar(x+56,y,'-',16);
OLED_ShowNum(x+64,y,calendar.w_date,2,16); if(calendar.w_date <=9)//不⾜两位数,前补零
{
茶树精油的作用
OLED_ShowNum(x+64,y,0,1,16);
}
OLED_ShowChar(x+80,y,' ',16);
OLED_ShowNum(x+88,y,calendar.week,1,16);
// }
}
/*******************显⽰⽇期****************************/
//x坐标:0-65
//y坐标:0、10、12、14
/*******************************************************/
void OLED_ShowTime(u8 x,u8 y)
{
// u8 t=0;
// if(t!=calendar.sec)
// {
//  t=calendar.sec;
OLED_ShowNum(x,y,calendar.hour,2,16);
if(calendar.hour <=9)//不⾜两位数,前补零
{
OLED_ShowNum(x,y,0,1,16);
}
OLED_ShowChar(x+16,y,':',16);
OLED_ShowNum(x+24,y,calendar.min,2,16);
if(calendar.min <=9)//不⾜两位数,前补零
{
OLED_ShowNum(x+24,y,0,1,16);
OLED_ShowNum(x+24,y,0,1,16);
}
OLED_ShowChar(x+40,y,':',16);
OLED_ShowNum(x+48,y,calendar.sec,2,16);
if(calendar.sec <=9)//不⾜两位数,前补零
{
OLED_ShowNum(x+48,y,0,1,16);
}
// }
}
oled.c
// oled.c
// ----------------------------------------------------------------//              GND  电源地
//              VCC  接5V或3.3v电源
//              SCL  接PA5(SCL)
//              SDA  接PA7(SDA)
//---------------------------------------------------
#include "oled.h"
#include "stdlib.h"
#include "oledfont.h"
#include "delay.h"
//OLED的显存
//存放格式如下.
//[0]0 1 2 3 (127)
//[1]0 1 2 3 (127)
//[2]0 1 2 3 (127)
//[3]0 1 2 3 (127)
//[4]0 1 2 3 (127)
//[5]0 1 2 3 (127)
/
/[6]0 1 2 3 (127)
//[7]0 1 2 3 (127)
/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{
OLED_SCLK_Set();
OLED_SDIN_Set();
OLED_SDIN_Clr();
OLED_SCLK_Clr();
}
/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
OLED_SCLK_Set();
// OLED_SCLK_Clr();
OLED_SDIN_Clr();
OLED_SDIN_Set();
}
void IIC_Wait_Ack()
{
OLED_SCLK_Set();
OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/
**********************************************/
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
OLED_SCLK_Clr();
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();
}
}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command) {
IIC_Start();
Write_IIC_Byte(0x78);//Slave address,SA0=0 IIC_Wait_Ack();
Write_IIC_Byte(0x00);//write command
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Command);
IIC_Wait_Ack();
IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
奥迪敞篷车
void Write_IIC_Data(unsigned char IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78);//D/C#=0; R/W#=0
IIC_Wait_Ack();
Write_IIC_Byte(0x40);//write data
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Data);
IIC_Wait_Ack();屋顶防水补漏
IIC_Stop();
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
if(cmd)
{
Write_IIC_Data(dat);
}
else
{
Write_IIC_Command(dat);
}
}
/********************************************
/
/ fill_Picture
********************************************/
void fill_picture(unsigned char fill_Data)
{
{
unsigned char m,n;
汪明荃罗家英
for(m=0;m<8;m++)
{
OLED_WR_Byte(0xb0+m,0);//page0-page1
OLED_WR_Byte(0x00,0);//low column start address
OLED_WR_Byte(0x10,0);//high column start address
for(n=0;n<128;n++)
{
OLED_WR_Byte(fill_Data,1);
}
}
}
/***********************Delay****************************************/
void Delay_50ms(unsigned int Del_50ms)
{
unsigned int m;
for(;Del_50ms>0;Del_50ms--)
for(m=6245;m>0;m--);
}
void Delay_1ms(unsigned int Del_1ms)
{
unsigned char j;
while(Del_1ms--)
{
for(j=0;j<123;j++);
}
}
//坐标设置
void OLED_Set_Pos(unsigned char x, unsigned char y)
{
OLED_WR_Byte(0xb0+y,OLED_CMD);
OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
OLED_WR_Byte((x&0x0f),OLED_CMD);
}
//开启OLED显⽰
void OLED_Display_On(void)
{
OLED_WR_Byte(0X8D,OLED_CMD);//SET DCDC命令
OLED_WR_Byte(0X14,OLED_CMD);//DCDC ON
OLED_WR_Byte(0XAF,OLED_CMD);//DISPLAY ON
}
//关闭OLED显⽰
void OLED_Display_Off(void)
{
OLED_WR_Byte(0X8D,OLED_CMD);//SET DCDC命令
OLED_WR_Byte(0X10,OLED_CMD);//DCDC OFF
OLED_WR_Byte(0XAE,OLED_CMD);//DISPLAY OFF
}
柯南主题曲演唱者
//清屏函数,清完屏,整个屏幕是⿊⾊的!和没点亮⼀样
void OLED_Clear(void)
{
两天一夜严泰雄u8 i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte(0xb0+i,OLED_CMD);//设置页地址(0~7)OLED_WR_Byte(0x00,OLED_CMD);//设置显⽰位置—列低地址OLED_WR_Byte(0x10,OLED_CMD);//设置显⽰位置—列⾼地址for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
}//更新显⽰