学向勤中得,萤窗万卷书。这篇文章主要讲述实例6,stc8a8k单片机开发板4脚的OLED显示数据(I2C通信)相关的知识,希望能为你提供帮助。
一、实验目的
利用显示屏OLED显示数据,包括整数,小数,字符串等;
二、实验器材
stc8a8k自制开发板;
stc自动下载器;
4脚的OLED显示屏;
三、实验任务:
实验背景:
有时候我们需要测量温度,温度有小数点,比如35.6度,那么就是需要显示小数,怎么显示小数;
有时候,我们需要知道时间,135秒,这个秒不可能是小数,所以需要显示整数,怎么显示整数?
有时候,我们需要一些提示消息:
比如wen=35.6,sec=135
这个wen=,sec=怎么显示?所以需要显示字符串,来刚给人提示消息。
完成任务:
1、在特定坐标的地方,OLED上面显示小数1023.56,365.23;62.65;6.32;
2、在屏幕特定坐标,显示整数123456;
3、在屏幕特定坐标,显示字符串Wendu=;
四、实验步骤:
1、认识OLED;
OLED有四线IIC协议的,有7线SPI通信的,还有串口屏等等。
这里我们讲解的是四脚的OLED的使用。直接讲使用,具体内部驱动原理,后面自己再深入研究。我们的OLED,一般是12864,什么意思呢,就是整个屏幕,长是128个像素点,宽是64个像素点,每个字符,比如a,+,-等等,由多个像素点组成,**如果一个字符是88个像素点,那么最多可以实现
长度:128/8=16个字符
宽度:64/8=8行**
但是因为做得太密,一点空间不留,会显得显示效果不好,密密麻麻。所以宽度,尽量做成6行,行和行之间,隔3-5个像素点。
下图中绿色是显示区域:类似于黑板,在里面定义好显示什么数据,后面用好函数就好了。
文章图片
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201125104208346.png#pic_center)
文章图片
2、OLED接线;
有四个脚,两个是电源,GND,有两个是数据通信的引脚。根据oled.h头文件,根据实际的接线,修改相对应的引脚就可以了。
文章图片
文章图片
文章图片
注意,最外面是VCC,
分别是VCC,GND,P77,P43。
如果是对换,就接这个地方,下图这里,刚好是
GND,VCC,P74,P75.
文章图片
有一些店家的是GND,VCC,一定要看准了,不能对换。不然会烧,实在是反的,需要进行自己用洞洞板焊接一个转接板。
文章图片
3、OLED显示流程和相关函数
(1)包含头文件oled.h和头文件oled.c
把头文件路径添加进来。不然找不到这个oled。h
文章图片
文章图片
文章图片
(2)引入头文件的路径;
见前面的图。
(3)在主函数里面,添加oled.h文件;
文章图片
(4)修改oled.h里面的引脚的定义,和实物原理图对;
文章图片
记得,更改延时函数的延时次数。因为stc8a8k是增强版本的单片机,延时次数应该更加多。
(5)具体编程:
初始化OLED;
延时一下;
可以使用OLED里面的函数。
函数:
文章图片
主要有5个函数,分别进行讲解,这里特别说明下,没有写浮点数小数的显示函数,我们后面也讲解下。
函数1:void OLED_Init(void); //屏幕初始化
函数2:void OLED_Clear(void); //清空屏幕
:函数3:
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size); //
函数4:
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size); //显示整型*****
*函数5:void OLED_ShowString(u8 x,u8 y, u8 p,u8 Char_Size); //显示字符串
函数6:显示浮点数。
需要进行多一点设置。
在main函数前面,注意是前面,设置一个全局变量的数组;
unsigned char disbuf[9];
然后在main函数的头文件,包含一个头文件
#include< stdio.h>
然后显示浮点数的时候,先将浮点数,用sprintf函数变为字符串,然后用显示字符串的方法,显示出来。
比如,
float aa=3.15;
sprintf(disbuf,"%.2f",aa);//.2意思是2个小数点,注意有四舍五入的情况出现。
OLED_ShowString(0,0,disbuf,8);
多了一个步骤。
**
总的例子: **
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
代码:
//******************************************************************************/
#include "stc8a8k.h"
#include "oled.h"
#include "stdio.h"//显示浮点数的sprintf函数,需要
unsigned char disbuf[9];
//显示浮点数需要void delay_tms(unsigned int ms)
{
unsigned int i,j;
for(i=ms;
i>
0;
i--)
for(j=0;
j<
1100;
j++);
} int main(void)
{
unsigned char t=\'A\';
//注意是单引号
unsigned int intnum=63254;
float floatnum=123.45;
OLED_Init();
//初始化OLED
OLED_Clear() ;
while(1)
{
//测试字符串显示,测试结果:
//第一个参数,以8为间隔;
//第二个参数,是行,如果第四个参数是12,那么以1间隔0-1-2-3-4-5-6,如果第四个参数是16,那么以2间隔,0-2-4-6
//第三个参数,字符串,双引号括起来
//第四个参数,是字体尺寸12或者16,16字体大一写
OLED_ShowString(0,0,"1234567890123456!",12);
OLED_ShowString(8,1,"Hello1!",12);
OLED_ShowString(16,2,"Hello2!",12);
OLED_ShowString(0,3,"Hello3!",12);
OLED_ShowString(8,4,"Hello4!",12);
OLED_ShowString(16,5,"Hello5!",12);
OLED_ShowString(0,6,"Hello6!",12);
delay_tms(5000);
//显示5秒
OLED_Clear() ;
//清空屏幕OLED_ShowString(0,0,"1234567890123456",16);
OLED_ShowString(8,2,"Hello2!",16);
OLED_ShowString(16,4,"Hello4!",16);
OLED_ShowString(0,6,"Hello6!",16);
delay_tms(3000);
//显示5秒
OLED_Clear() ;
//清空屏幕OLED_ShowChar(0,0,\'W\',12);
//显示ASCII字符
OLED_ShowChar(8,0,\'e\',12);
//显示ASCII字符
OLED_ShowChar(16,0,\'n\',12);
//显示ASCII字符
OLED_ShowChar(24,0,\'=\',12);
//显示ASCII字符
OLED_ShowChar(32,0,\'2\',12);
//显示ASCII字符
OLED_ShowChar(40,0,\'6\',12);
//显示ASCII字符
OLED_ShowChar(48,0,\'.\',12);
//显示ASCII字符
OLED_ShowChar(56,0,\'5\',12);
//显示ASCII字符
delay_tms(3000);
//显示5秒
OLED_Clear() ;
//清空屏幕OLED_ShowNum(0,0,intnum,5,12);
// 63254
OLED_ShowNum(1,1,10000,5,12);
// 63254
OLED_ShowNum(2,2,23564,5,12);
// 63254
//OLED_ShowNum(6,0,6892,5,12);
//显示ASCII字符的码值
delay_tms(3000);
OLED_Clear() ;
//清空屏幕
OLED_ShowNum(0,0,intnum,5,16);
// 63254
OLED_ShowNum(1,2,10000,5,16);
// 63254
OLED_ShowNum(2,4,23564,5,16);
// 63254
//OLED_ShowNum(6,0,6892,5,16);
//显示ASCII字符的码值
delay_tms(3000);
OLED_Clear() ;
//清空屏幕//显示浮点数,两位小数。%.2f
sprintf(disbuf,"%.2f",floatnum);
OLED_ShowString(0,0,disbuf,12);
delay_tms(3000);
OLED_Clear() ;
//清空屏幕sprintf(disbuf,"%.2f",floatnum);
OLED_ShowString(0,0,disbuf,16);
delay_tms(3000);
OLED_Clear() ;
//清空屏幕 }
}
效果:
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
4、案例二:OLED显示屏布局(画黑板报,规划好显示界面)
小小操作:我们显示这个内容,
第一行显示温度;
第二行显示时间;
第三个显示一串字符串;
第四行,显示距离;
先画好黑板,然后用好函数进行显示就好了。
文章图片
文章图片
//******************************************************************************/
#include "stc8a8k.h"
#include "oled.h"
#include "stdio.h"//显示浮点数的sprintf函数,需要
unsigned char disbuf[9];
//显示浮点数需要void delay_tms(unsigned int ms)
{
unsigned int i,j;
for(i=ms;
i>
0;
i--)
for(j=0;
j<
1100;
j++);
} int main(void)
{
unsigned char t=\'A\';
//注意是单引号
unsigned int intnum=63254;
float floatnum=123.45;
OLED_Init();
//初始化OLED
OLED_Clear() ;
OLED_ShowString(0,0,"wen=",12);
OLED_ShowString(0,1,"time=",12);
OLED_ShowString(11*8,1,"sec",12);
OLED_ShowString(0,2,"***Hello,world!***",12);
OLED_ShowString(0,3,"dis=",12);
OLED_ShowString(11*8,3,"mm",12);
while(1)
{
//测试字符串显示,测试结果:
//第一个参数,以8为间隔;
//第二个参数,是行,如果第四个参数是12,那么以1间隔0-1-2-3-4-5-6,如果第四个参数是16,那么以2间隔,0-2-4-6
//第三个参数,字符串,双引号括起来
//第四个参数,是字体尺寸12或者16,16字体大一写
sprintf(disbuf,"%.2f",floatnum);
OLED_ShowString(4*8,0,disbuf,12);
OLED_ShowNum(5*8,1,intnum,5,12);
// 63254
sprintf(disbuf,"%.2f",floatnum);
OLED_ShowString(4*8,3,disbuf,12);
}
}
效果:
文章图片
*改善版本:用16为字体大小,这里第二个参数就是以2为倍数了:。
文章图片
//******************************************************************************/
#include "stc8a8k.h"
#include "oled.h"
#include "stdio.h"//显示浮点数的sprintf函数,需要
unsigned char disbuf[9];
//显示浮点数需要void delay_tms(unsigned int ms)
{
unsigned int i,j;
for(i=ms;
i>
0;
i--)
for(j=0;
j<
1100;
j++);
} int main(void)
{
unsigned char t=\'A\';
//注意是单引号
unsigned int intnum=63254;
float floatnum=123.45;
OLED_Init();
//初始化OLED
OLED_Clear() ;
OLED_ShowString(0,0,"wen=",16);
OLED_ShowString(0,2,"time=",16);
OLED_ShowString(11*8,2,"sec",16);
OLED_ShowString(0,4,"***Hello,world!***",16);
OLED_ShowString(0,6,"dis=",16);
OLED_ShowString(11*8,6,"mm",16);
while(1)
{
//测试字符串显示,测试结果:
//第一个参数,以8为间隔;
//第二个参数,是行,如果第四个参数是12,那么以1间隔0-1-2-3-4-5-6,如果第四个参数是16,那么以2间隔,0-2-4-6
//第三个参数,字符串,双引号括起来
//第四个参数,是字体尺寸12或者16,16字体大一写
sprintf(disbuf,"%.2f",floatnum);
OLED_ShowString(4*8,0,disbuf,16);
OLED_ShowNum(5*8,2,intnum,5,16);
// 63254
sprintf(disbuf,"%.2f",floatnum);
OLED_ShowString(4*8,6,disbuf,16);
}
}
【实例6,stc8a8k单片机开发板4脚的OLED显示数据(I2C通信)】
文章图片
效果好很多。
推荐阅读
- 实例8(stc8a8k外部中断,计算小车运行的距离)
- MYSQL查看和新增表分区
- 实例5(寄存器操作学习:stc8a8k单片机硬件PWM的原理和代码讲解(置1清0位操作和高8位低8位拆分))
- delay.h和delay.c程序,记得分别复制,保存成delay.h和delay.c文件。11.0592M晶振频率
- Linux配置定时,使用 crontab -e 与 直接编辑 /etc/crontab 的区别
- 浏览器自动将s标签添加到html错误中
- WordPress网站页脚下方的空白
- 论坛的最佳WordPress主题()
- Avada主题,更改相关项目文本