实例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);
		
	}	  
	
}
	

在这里插入图片描述
效果好很多。

  • 29
    点赞
  • 143
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值