/******************************************************************
编 译 器:haawking ide v0.1.2
d s p:dsc28034湖人板
电 脑 配 置:windows10 专业版; 64 位操作系统
仿 真 器:hx100v2
使 用 库:无
作 用:在oled屏上显示文字及数字
说 明:无
版 本:v0.0.1
******************************************************************/
oled屏资料:
链接:https://pan.baidu.com/s/1sqlrv6j09xkwtcqlfhxdxq
提取码:8034
四针的oled屏用iic来写,原理在资料中 ,再结合以下例程,定能够轻松上手:
iic_oled.c、
//gpio配置
void i2c_gpio_config_oled(void)
{
eallow;
gpioctrlregs.gpapud.bit.gpio14 = 0;
gpioctrlregs.gpapud.bit.gpio15 = 0;
gpioctrlregs.gpaqsel1.bit.gpio14 = 3;
gpioctrlregs.gpaqsel1.bit.gpio15 = 3;
gpioctrlregs.gpadir.bit.gpio14 = 1;
gpioctrlregs.gpadir.bit.gpio15 = 1;
gpioctrlregs.gpamux1.bit.gpio14 = 0;
gpioctrlregs.gpamux1.bit.gpio15 = 0;
gpiodataregs.gpaset.bit.gpio14 = 1;
gpiodataregs.gpaset.bit.gpio15 = 1;
edis;
}
//得到输入数字的长度
int data_len(int data)
{
int n=0;
if(data==0)
return ++n;
while(data!=0)
{
n++;
data/=10;
}
return n;
}
//延时
void i2c_oled_delay(void) //延时函数
{
int i =50;
while(i)
{
i--;
}
}
//延时
void i2c_oled_delay_more(void)
{
int i =200;
while(i)
{
i--;
}
}
//以gpio14为scl,gpio15为sda向oled模块传送起始位
bool i2c_oled_start(void)//iic起始位
{
sda1_h;
scl1_h;
i2c_oled_delay();
if(!sda1_read)//sda线为低电平,总线忙,退出
{
return 0;
}
sda1_l;
i2c_oled_delay();
if(sda1_read)//sda线为高电平则总线出错,退出
{
return 0;
}
sda1_l;
i2c_oled_delay();
return 1;
}
//以gpio14为scl,gpio15为sda向oled模块传送停止位
void i2c_oled_stop(void)
{
scl1_l;
i2c_oled_delay();
sda1_l;
i2c_oled_delay();
scl1_h;
i2c_oled_delay();
sda1_h;
}
//以gpio14为scl,gpio15为sda向oled模块传送响应位
void i2c_oled_ack(void)
{
scl1_l;
i2c_oled_delay();
sda1_l;
i2c_oled_delay();
scl1_h;
i2c_oled_delay();
scl1_l;
i2c_oled_delay();
}
//以gpio14为scl,gpio15为sda向oled模块传送不响应位
void i2c_oled_noack(void)//不响应位
{
scl1_l;
i2c_oled_delay();
sda1_h;
i2c_oled_delay();
scl1_h;
i2c_oled_delay();
scl1_l;
i2c_oled_delay();
}
//接受ack,有返回1,无返回0
bool i2c_oled_waitack(void)//0无ack,1有ack
{
eallow;
gpioctrlregs.gpadir.bit.gpio15 = 0; //配置gpio15(sda)为输入模式
scl1_l;
i2c_oled_delay();
sda1_h;
i2c_oled_delay();
scl1_h;
i2c_oled_delay();
if(sda1_read)
{
scl1_l;
i2c_oled_delay();
return 0;
}
scl1_l;
i2c_oled_delay();
gpioctrlregs.gpadir.bit.gpio15 = 1; //配置gpio15为输出模式
edis;
return 1;
}
//判断是否有ack,有返回1,无返回0
bool juge_ack_oled(void)//判断有无ack
{
if(!i2c_oled_waitack())
{
i2c_oled_stop();
return 0;
}
return 1;
}
//用iic协议写数据sendbyte
void i2c_oled_sendbyte(uint8 sendbyte) //写入
{
uint8 i=8;
while(i--)
{
scl1_l;
i2c_oled_delay();
if(sendbyte&0x80)
sda1_h;
else
sda1_l;
sendbyte=sendbyte<<1;
i2c_oled_delay();
scl1_h;
i2c_oled_delay();
}
scl1_l;
}
//向oled模块传送写命令的要求,0x00,写命令iic_command(oled模块的写时序)
bool write_iic_oled_command(uint8 iic_command)//写命令
{
if(!i2c_oled_start())
{
return 0;//总线忙或出错
}
i2c_oled_sendbyte(oled_addr); //slave address,sa0=0
if(!juge_ack_oled())
return 0;
i2c_oled_sendbyte(0x00); //write command
if(!juge_ack_oled())
return 0;
i2c_oled_sendbyte(iic_command);
if(!juge_ack_oled())
return 0;
i2c_oled_stop();
return 1;
}
//向oled模块传送写数据的要求,0x40,写数据iic_data(oled模块的写时序)
bool write_iic_oled_data(uint8 iic_data)//写数据
{
if(!i2c_oled_start())
{
return 0;//总线忙或出错
}
i2c_oled_sendbyte(oled_addr); //d/c#=0; r/w#=0
if(!juge_ack_oled())
return 0;
i2c_oled_sendbyte(0x40); //write data
if(!juge_ack_oled())
return 0;
i2c_oled_sendbyte(iic_data);
if(!juge_ack_oled())
return 0;
i2c_oled_stop();
return 1;
}
//选择是写数据还是写命令,cmd==1则写数据,否则写命令
void oled_wr_byte(uint8 dat,int cmd)//写数据或命令
{
if(cmd)
{
write_iic_oled_data(dat);
}
else
{
write_iic_oled_command(dat);
}
}
//写入fill_data整个oled屏幕
void fill_picture(uint8 fill_data)
{
uint8 m,n;
for(m=0;m4)|0x10,oled_cmd);//列高地址
oled_wr_byte((x&0x0f),oled_cmd); //列低地址
}
//开启oled显示
void oled_display_on(void)
{
oled_wr_byte(set_dcdc,oled_cmd); //set dcdc命令
oled_wr_byte(0x14,oled_cmd); //dcdc on
oled_wr_byte(display_on,oled_cmd); //display on
}
//关闭oled显示
void oled_display_off(void)
{
oled_wr_byte(set_dcdc,oled_cmd); //set dcdc命令
oled_wr_byte(0x10,oled_cmd); //dcdc off
oled_wr_byte(display_off,oled_cmd); //display off
}
//清屏
void oled_clear(void)
{
uint8 i,n;
for(i=0;i<8;i++)
{
oled_wr_byte (page_address+i,oled_cmd); //设置页地址(0~7)
oled_wr_byte (low_column_address,oled_cmd); //设置显示位置—列低地址
oled_wr_byte (high_column_address,oled_cmd); //设置显示位置—列高地址
for(n=0;n<128;n++)
{
oled_wr_byte(0,oled_data);
i2c_oled_delay_more();
}
}
}
//全亮,将屏幕全变亮
void oled_on(void)
{
uint8 i,n;
for(i=0;i<8;i++)
{
oled_wr_byte (page_address+i,oled_cmd); //设置页地址(0~7)
oled_wr_byte (low_column_address,oled_cmd); //设置显示位置—列低地址
oled_wr_byte (high_column_address,oled_cmd); //设置显示位置—列高地址
for(n=0;nmax_column-1)
{
x=0;
y=y+2;
}
if(char_size ==16)
{
oled_set_pos(x,y);
for(i=0;i<8;i++)
{
oled_wr_byte(f8x16[c*16+i],oled_data);
i2c_oled_delay_more();
}
oled_set_pos(x,y+1);
for(i=0;i<8;i++)
{
oled_wr_byte(f8x16[c*16+i+8],oled_data);
i2c_oled_delay_more();
}
}
else
{
oled_set_pos(x,y);
for(i=0;i<6;i++)
oled_wr_byte(f6x8[c][i],oled_data);
}
}
//指数函数,m^n
uint32 oled_pow(int m,int n)
{
uint32 result=1;
while(n--)
result*=m;
return result;
}
//在指定位置(x,y)显示一串数字
void oled_shownum(int x,int y,uint32 num,int len,int size2)
{
int t,temp;
int enshow=0;
for(t=0;t;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,0,size2);
i2c_oled_delay_more();
continue;
}else enshow=1;
}
oled_showchar(x+(size2/2)*t,y,temp,size2);
i2c_oled_delay_more();
}
}
//在指定位置(x,y)显示汉字
void oled_showchinese(int x,int y,uint8 no)
{
uint8 t;
oled_set_pos(x,y);
for(t=0;t<16;t++)
{
oled_wr_byte(hzk[2*no][t],oled_data);
i2c_oled_delay_more();
}
oled_set_pos(x,y+1);
for(t=0;tintosc1trim.bit.coarsetrim = 0;
p_sysctrlregs->intosc2trim.bit.coarsetrim= 0;
edis;
initsysctrl();
dint;
initpiectrl();
ier_disable(0xffff);
ifr_disable(0xffff);
initpievecttable();
i2c_gpio_config_oled();
oled_init();
eint;
oled_clear();
oled_showchinese(28,0,0);
oled_showchinese(44,0,1);
oled_showchinese(60,0,2);
oled_showchinese(76,0,3);
oled_showchar(16,4,16,16);
oled_showchar(24,4,17,16);
oled_showchar(32,4,16,16);
oled_showchar(40,4,13,16);
oled_showchar(48,4,22,16);
oled_showchar(56,4,17,16);
oled_showchar(64,4,25,16);
oled_showchar(72,4,19,16);
oled_showchar(80,4,20,16);
oled_showchar(88,4,21,16);
oled_showchar(96,4,22,16);
oled_showchar(104,4,17,16);
while(1){}
return 0;
}
接线以及显示效果:
详细例程请参考
链接:https://pan.baidu.com/s/1c8i7osgjkifgp8ux-u6tmg
提取码:8034
————————————————
特别鸣谢 原创作者 博主「晟逸轩」
AR和MR共享体验是未来AR/MR的发展方向吗
为什么LDPC码不适合工业存储
realme X大师白蒜配色版正式发布搭载了骁龙710处理器屏占比高达91.2%
测量角位移的数字编码器-玻璃码盘介绍
机器视觉的五大典型应用
基于昊芯DSC28034+四针OLED屏 显示文字及数字
电源滤波电容的作用的选择
PS-9305S系列三轴按键试验机有哪些作用
无人机有哪些关键技术?
AT90S1200智力抢答器,AT90S1200 Responder
ZDS2024:一款面向工程师的更全面的示波器
今年最终户用光伏新增装机量将超过10GW,达到一个新的里程碑
KAIST最终赢得了“AI世界杯”冠军
奥比中光获专精特新“小巨人”企业认证
继续耍猴吧,红米note4X用的是骁龙625
全球首款碳纤维手机成功问世
AppleWatch5或继续延用OLED显示屏 并提供钛合金和陶瓷表壳型号供选择
iPhone12 Pro Max到底值不值得购买?
福特全新车型电动跨界SUV Mach-E即将发布百公里加速只需要5秒
体育馆人脸识别系统的应用案例