一、I2C简介
1、I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。
2、总线特点:I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。I2C总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
3、 I2C串行总线概述
I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。
I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。
每个接到I2C总线上的器件都有唯一的地址。主机与其他器件间的数据传送可以是由主机发送数据到其他器件,这时主机即为发送器。由总线上接收数据的器件即为接收器。
在多主机系统中,可能同时有几个主机企图启动总线传送数据。为了避免混乱,I2C总线要通过总线仲裁,以决定由哪一台主机控制总线。
二、资料下载
资料是从店家给的网站下载:点这里
我使用的是0.96寸的IIC所以打开的该链接,打开后是这样的界面,拉到最下方
下载链接后解压:
三、I2C接口实验
1、准备工作
按照下图路径打开下载的第一个安装包,打开OLED
2、生成字模
这个是刚刚下载好的生成字模的软件
点击设置更改为下列设置
输入了自己想要的字之后点生成字模,然后将生成后的复制到程序代码中
3、修改代码
再打开第一步打开的keil代码
先编译,再打开oledfont.h
将生成的字模复制过去
再打开main.c,修改下列代码
showchinese函数用来显示汉字
showstring函数用来显示字符串
4、将IIC连接到开发板
连接结果:
5、运行程序
将刚刚修改的程序下载到开发板中
显示结果:
6、显示温湿度
接着上篇的工程,将之前温湿度模块中的myiic.c和hemtem.c文件移植到这个工程里,并添加路径,得到如下:
修改主程序如下:
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
#include "temhum.h"
#include "myiic.h"
int main(void)
{ u32 CT_data[2]={0};
volatile float hum=0,tem=0;
temphum_init();
delay_init();
NVIC_Configuration();
OLED_Init();
OLED_Clear(0);
while(1)
{
GUI_ShowCHinese(16,36,16,"湿度",1);
GUI_ShowCHinese(16,54,16,"温度",1);
delay_ms(1500);
OLED_Clear(0);
GUI_ShowString(16,18,"631807030501",8,1);
delay_ms(1500);
OLED_Clear(0);
AHT20_Read_CTdata(CT_data); //???CRC??,????AHT20????????
hum = CT_data[0]*100*10/1024/1024; //???????(???10?)
tem = CT_data[1]*200*10/1024/1024-500;//???????(???10?)
GUI_ShowNum(50,36,hum/10,10,8,1);
GUI_ShowNum(50,54,tem/10,10,8,1);
delay_ms(3000);
}
显示结果:
7、滚动显示
使用直接控制硬件刷新效果这种滚动方式
原理:左右滚动滑动的实现,是使用单独的1KB内存,去处理图片拼接后的图像。而由于刷屏方式比较特殊,左右拼接的方式就是内存移位,而且是Byte与Byte间的移位,这就更方便了。
滚动方式:
0x2F:激活滚动 0x2E:关闭滚动
0x26:水平滚动右向 0x27:水平滚动左向
0x29:水平和垂直滚动右向 0x2A:水平和垂直滚动左向
0xA3:垂直滚动
修改oledfont.h的字模
我修改为信息工程
将主函数修改为如下代码:
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
int main(void)
{ u8 t;
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init(); //LED端口初始化
// delay_ms(8000);
OLED_Init(); //初始化OLED
OLED_Clear(0) ;
t=' ';
OLED_ShowString(4,3,"hello loulu teacher",21);//显示的字符串
OLED_ShowCHinese(6,0,0);//信
OLED_ShowCHinese(26,0,1);//息
OLED_ShowCHinese(46,0,1);//工
OLED_ShowCHinese(66,0,1);//程
delay_ms(50000);
OLED_WR_Byte(0x2e,OLED_CMD);;//关滚动
OLED_WR_Byte(0x2A,OLED_CMD);//29向右,2a向左
OLED_WR_Byte(0x00,OLED_CMD);//A:空字节
OLED_WR_Byte(0x00,OLED_CMD);//B:水平起始页
OLED_WR_Byte(0x00,OLED_CMD);//C:水平滚动速度
OLED_WR_Byte(0x07,OLED_CMD);//D:水平结束页
OLED_WR_Byte(0x01,OLED_CMD);//E:每次垂直滚动位移
OLED_WR_Byte(0x2f,OLED_CMD);//开滚动
}
显示结果:
四、参考链接
五、总结
在做完了IIC的OLED显示实验,实现了显示姓名、学号、滚动等。熟悉了取字模显示中文、字符串等。对IIC写入等有了更好的认识。收获很大,也十分有趣。