历史上的今天
今天是:2024年09月07日(星期六)
2019年09月07日 | STM32 IIC OLED中英文显示
2019-09-07 来源:eefocus
简介 ; II2C OLED 中英文显示 ADC数据采集实时显示 八路ADC
一 先上代码
#include "oled.h"
#include "sys.h"
#include "delay.h"
#include "oledfont.h"
#include "delay.h"
#include "bmp.h"
#include "gbk.h"
#define uint unsigned int
#define uchar unsigned char
//OLED显存
u8 OLED_GRAM[128][8];
// 开始信号:SCLK为高电平 SDA由高电平跳变为低电平 开始传输数据
// 结束信号:SCLK为高电平 SDA由低电平跳变为高电平 结束传输数据
void IIC_Start(void) // 开始信号
{
OLED_SCLK_Set(); //SCLK置高 1
OLED_SDIN_Set(); //SDA置高 1
delay_us(4);
OLED_SDIN_Clr(); //SDA置低 0
delay_us(4);
OLED_SCLK_Clr(); //SCLK置低 0
}
void IIC_Stop(void) //结束信号
{
OLED_SCLK_Set(); //SCLK置高 1
OLED_SDIN_Clr(); //SDA置低 0
delay_us(4);
OLED_SDIN_Set(); //SDA置高 1
}
void IIC_Wait_Ack(void) //应答信号
{
OLED_SCLK_Set();
OLED_SCLK_Clr();
}
//写一个II2C字节
void Write_IIC_Byte(uchar IIC_Byte)
{
uchar i,m,da;
da = IIC_Byte;
OLED_SCLK_Clr();
for(i = 0;i < 8;i++)
{
m = da;
m = m&0x80;
if(m==0x80)
{
OLED_SDIN_Set();
}else
{
OLED_SDIN_Clr();
}
da<<=1;
OLED_SCLK_Set();
OLED_SCLK_Clr();
}
}
//写命令
void Write_IIC_Command(uchar IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x78);
IIC_Wait_Ack();
Write_IIC_Byte(0x00); //写指令
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Command);
IIC_Wait_Ack();
IIC_Stop();
}
void Write_IIC_Data(uchar IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78);
IIC_Wait_Ack();
Write_IIC_Byte(0x40); // 写数据
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Data);
IIC_Wait_Ack();
IIC_Stop();
}
//写一个字节
void OLED_WR_Byte(uchar dat,uchar cmd)
{
if(cmd) //如果cmd为真(不等于0) 就执行Write_IIC_Data(dat); 如果不为真则执行else中的Write_IIC_Command(dat);
{
Write_IIC_Data(dat);
}else{
Write_IIC_Command(dat);
}
}
void OLED_Set_Pos(uchar x,uchar y) //坐标设置
{
OLED_WR_Byte(0xb0+y,OLED_CMD); //显示0-7页 y的取值范围为0-7
OLED_WR_Byte((x&0xf0)>>4|0x10,OLED_CMD);//取8位起始列地址的高四位
OLED_WR_Byte((x&0x0f),OLED_CMD);//取8位起始列地址的低四位
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示
//size:选择字体 12/16/24
void OLED_ShowChar(uchar x,uchar y,uchar chr,uchar Size)
{
uchar i,c;
c=chr-' ';
if(x>Max_Column-1)
{
x=0;
y+=2;
}
if(Size==16)
{
OLED_Set_Pos(x,y);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
OLED_Set_Pos(x,y+1);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
}
else {
OLED_Set_Pos(x,y);
for(i=0;i<6;i++)
OLED_WR_Byte(F6x8[c][i],OLED_DATA);
}
}
//m^n函数
u32 oled_pow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
//显示2个数字
//x,y :起点坐标
//len :数字的位数
//size:字体大小
//mode:模式 0,填充模式;1,叠加模式
//num:数值(0~4294967295);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
{
u8 t,temp;
u8 enshow=0;
for(t=0;t temp=(num/oled_pow(10,len-t-1))%10; if(enshow==0&&t<(len-1)) { if(temp==0) { OLED_ShowChar(x+(size2/2)*t,y,' ',size2); continue; }else enshow=1; } OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); } } //显示字符串 //x,y:起点坐标 //size:字体大小 //*p:字符串起始地址 void OLED_ShowString(uchar x,uchar y,uchar *p,uchar Size) { uchar j = 0; while(p[j]!='




