赞
踩
一、实验目的
利用显示屏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); } }
效果好很多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。