ESP8266_09基于IIC控制的OLED屏幕

事情比较多,停了几天,到目前为止,事情依然很多……
从第一节到第九节(也就是这一节),说的都是esp8266的基本应用,例如gpio、定时器、中断、pwm等等。从后面开始,将陆续说一下基于网络的用法,毕竟这是个联网的芯片,还是要联网玩,才更能体现它的特点。但偶尔,我可能还会说一下它的硬件的基本用法,例如adc、spi等,看情况吧,时间富裕与否~
好,这一节,主要说一下esp8266上面的iic接口。是的,它有spi接口,也有iic接口。但iic接口是使用gpio模拟的,也就是说,你可以使用8266上的任意两个gpio模拟出iic接口来。同时,每个管脚内部都有上拉电阻,无需外接。
注:esp8266只能用做iic主设备,不能用做从设备。
那我们是否还要写一堆iic的start函数、stop函数?
不用,官方的sdk已经给我们写好了整个的iic库,只要配置好要用的管脚,直接调用函数即可,例如:
i2c_master_start(void);
i2c_master_stop(void);
i2c_master_writebyte(uint8 wrdata);
如何使用?很简单,分四步:
1 添加相关源文件和头文件
把i2c_master.c拷入app下的driver文件夹,把i2c_master.h拷入app下的include下的driver文件夹。
2 选择要用到的gpio
打开i2c_master.h文件,管脚选择部分如下所示:
#definei2c_master_sda_mux periphs_io_mux_gpio2_u
#definei2c_master_scl_mux periphs_io_mux_mtms_u
#definei2c_master_sda_gpio 2
#definei2c_master_scl_gpio 14
#definei2c_master_sda_func func_gpio2
#definei2c_master_scl_func func_gpio14
通过这6个宏定义,配置好iic接口要用的时钟脚和数据脚,我这里想用gpio12和14,所以改成如下的样子:
#definei2c_master_sda_mux periphs_io_mux_mtdi_u
#definei2c_master_scl_mux periphs_io_mux_mtms_u
#definei2c_master_sda_gpio 12
#definei2c_master_scl_gpio 14
#definei2c_master_sda_func func_gpio12
#definei2c_master_scl_func func_gpio14
关于管脚的名字,主要看eagle_soc.h文件。
3 初始化iic管脚
通过下面的函数实现:
i2c_master_gpio_init();
4 开始写数据
用过24c02的童鞋都知道,iic的写操作,前后就几步:开始信号、写入设备地址、等待应答、写入存储地址、等待应答、写入数据、结束信号。这里结合sdk中的例程iot_demo中的iic代码,实现写数据的函数如下:
boolicache_flash_attrwrite_iic_data(unsignedchariic_data)
{
uint8 ack;
i2c_master_start();
i2c_master_writebyte(0x78); //d/c#=0; r/w#=0
ack = i2c_master_getack();
if(ack) {
os_printf(addrnotackwhentxwritecmd );
i2c_master_stop();
returnfalse;
}
i2c_master_writebyte(0x40); //write data
ack = i2c_master_getack();
if(ack) {
os_printf(addrnotackwhentxwritecmd );
i2c_master_stop();
returnfalse;
}
i2c_master_writebyte(iic_data);
ack = i2c_master_getack();
if(ack) {
os_printf(addrnotackwhentxwritecmd );
i2c_master_stop();
returnfalse;
}
i2c_master_stop();
}
上面代码中出现的函数,例如i2c_master_start()、i2c_master_writebyte(0x78)、i2c_master_getack();等,都已经在i2c_master.c中写好了。换句话说,我们只需要像堆积木一样,按照特定的顺序把这些函数摆下来就行了。
so,是不是很简单?
如何演示?
这里使用一个0.96寸的,带有iic接口的oled屏幕。这类屏幕按照我见过的接口不同,分两种:一种是4针的,只能接iic接口;一种是7针的,既能接iic,又能接spi。我手里这个是7针的,出厂默认spi接口,怎么切换到iic,我看了半天手册:
看起来不难,当我翻开我的液晶背面的时候,发现是这样:
所以我只把spi字符旁边的电阻改到iic旁边就可以了。
程序使用卖家提供的代码,做了一下移植。会用iic的自然就懂了,不懂就说明你还没学好iic。
7针的接口,针脚功能如下:
虽然iic只用到clk和sda两个脚,但是这里还要注意下复位管脚,要给它接一个高电平,否则无法工作。
程序移植完成,保存、清理、编译、下载一条龙,然后重新上电,效果如下所示:
程序里使用了一个软件定时器,每隔3秒刷新一下图片。

5G商用将至 将为室内无线网络带来一次革新
GlobalFoundries也缺钱了?经济因素搁置7nm LP项目
董明珠热评智能物流机器人 hachi delight现场获得高度认可
高级进阶:复杂业务系统的通用架构设计
光伏电站无人机巡检的工作流程步骤是怎样的
ESP8266_09基于IIC控制的OLED屏幕
通过51单片机实现直流电机调速
中国首批车内全无人、无远程遥控的RoboTaxi车队亮相
PCI插槽及测试点
双卡双VoLTE的时代已经到来,然而你的手机支持这个功能吗?
深度测评AMG GLE63运动SUV
长电滁州公司投产十周年 激扬十年 芯向未来
中国第一条FinFET生产线开始批量生产14 nm FinFET芯片
工业互联网驱动数字化转型之路
宜科最新推出以TOF算法为基本原理的激光传感器
计算机视觉中的ICP算法
区块链技术对于社会运行有什么影响
京东金融回应App侵犯隐私:系错误开发,未收集一张用户截图
编程要注意不允许有匹配 [xX][mM][lL] 的处理指令目标
钟玉伟:唱衰内燃机是短期政策导向和资本引导造成的假象