博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
嵌入式系统基础学习笔记(九):基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】
阅读量:4233 次
发布时间:2019-05-26

本文共 5407 字,大约阅读时间需要 18 分钟。

文章目录

一、准备工作

开发硬件:

  • 野火STM32 MINI开发板
  • SPI0.96寸显示屏
  • AHT20 温湿度传感器

开发软件:

  • Keil 5
  1. 打开keil 5,载入厂家给出的 Demo 程序,链接:

下载好后解压,在文件路径:

X;\0.96inch_SPI_OLED_Module_SSD1306_MSP096X_V1.0\1-Demo\Demo_STM32\0.96inch_OLED_Demo_STM32F103RCT6_Hardware_4-wire_SPI\PROJECT中找到keil5工程文件,打开

二、显示姓名、滚动显示

在厂家的 Demo 程序中有许多的演示部分,我们都不需要,要显示自己的姓名学号和滚动显示内容,只需要用到下面的部分

  1. 想要显示的中文的点阵数据,在oledfont.h文件里面,需要生成字模软件

在这里插入图片描述

2. 显示函数,写在test.c里面

在这里插入图片描述

  1. main函数功能实现

在这里插入图片描述

在设置好烧录选项后烧录进开发板中,结果如下

在这里插入图片描述

三、 显示AHT20传感器数据

AHT20接收数据和显示函数

void read_AHT20_once(void){
//延时 10 微妙 delay_ms(10); //传输数据前进行启动传感器和软复位 reset_AHT20(); delay_ms(10); //查看使能位 init_AHT20(); delay_ms(10); //触发测量 startMeasure_AHT20(); delay_ms(80); //读数据 read_AHT20(); delay_ms(5);}void reset_AHT20(void){
//数据传输开始信号 I2C_Start(); //发送数据 I2C_WriteByte(0x70); //接收 ACK 信号 ack_status = Receive_ACK(); //发送软复位命令(重启传感器系统) I2C_WriteByte(0xBA); //接收 ACK 信号 ack_status = Receive_ACK(); //停止 I2C 协议 I2C_Stop();}//0x70 —> 0111 0000 前七位表示 I2C 地址,第八位为0,表示 write//0xE1 —> 看状态字的校准使能位Bit[3]是否为 1//0x08 0x00 —> 0xBE 命令的两个参数,详见 AHT20 参考手册void init_AHT20(void){
//传输开始 I2C_Start(); //写入 0x70 数据 I2C_WriteByte(0x70); //接收 ACK 信号 ack_status = Receive_ACK(); //写入 0xE1 数据 I2C_WriteByte(0xE1); ack_status = Receive_ACK(); //写入 0x08 数据 I2C_WriteByte(0x08); ack_status = Receive_ACK(); //写入 0x00 数据 I2C_WriteByte(0x00); ack_status = Receive_ACK(); //停止 I2C 协议 I2C_Stop();}//0x70 —> 0111 0000 前七位表示 I2C 地址,第八位为0,表示 write//0xAC —> 触发测量//0x33 0x00 —> 0xAC 命令的两个参数,详见 AHT20 参考手册void startMeasure_AHT20(void){
//启动 I2C 协议 I2C_Start(); I2C_WriteByte(0x70); ack_status = Receive_ACK(); I2C_WriteByte(0xAC); ack_status = Receive_ACK(); I2C_WriteByte(0x33); ack_status = Receive_ACK(); I2C_WriteByte(0x00); ack_status = Receive_ACK(); I2C_Stop();}void read_AHT20(void){
uint8_t i; //初始化 readByte 数组 for(i=0; i<6; i++) {
readByte[i]=0; } I2C_Start(); //通过发送 0x71 可以获取一个字节的状态字 I2C_WriteByte(0x71); ack_status = Receive_ACK(); //接收 6 个 8 bit的数据 readByte[0]= I2C_ReadByte(); //发送 ACK 信号 Send_ACK(); readByte[1]= I2C_ReadByte(); Send_ACK(); readByte[2]= I2C_ReadByte(); Send_ACK(); readByte[3]= I2C_ReadByte(); Send_ACK(); readByte[4]= I2C_ReadByte(); Send_ACK(); readByte[5]= I2C_ReadByte(); //发送 NACK 信号 SendNot_Ack(); I2C_Stop(); //温湿度的二进制数据处理 //0x68 = 0110 1000 //0x08 = 0000 1000 if( (readByte[0] & 0x68) == 0x08 ) {
H1 = readByte[1]; //H1 左移 8 位并与 readByte[2] 相或 H1 = (H1<<8) | readByte[2]; H1 = (H1<<8) | readByte[3]; //H1 右移 4 位 H1 = H1>>4; H1 = (H1*1000)/1024/1024; T1 = readByte[3]; //与运算 T1 = T1 & 0x0000000F; T1 = (T1<<8) | readByte[4]; T1 = (T1<<8) | readByte[5]; T1 = (T1*2000)/1024/1024 - 500; AHT20_OutData[0] = (H1>>8) & 0x000000FF; AHT20_OutData[1] = H1 & 0x000000FF; AHT20_OutData[2] = (T1>>8) & 0x000000FF; AHT20_OutData[3] = T1 & 0x000000FF; } else {
AHT20_OutData[0] = 0xFF; AHT20_OutData[1] = 0xFF; AHT20_OutData[2] = 0xFF; AHT20_OutData[3] = 0xFF; } Show_OLED();}//转化字符串输出到 OLED 上void Show_OLED(void){
t = T1/100; switch(t) {
case 0:break; case 1:strTemp1 = "1";break; case 2:strTemp1 = "2";break; case 3:strTemp1 = "3";break; case 4:strTemp1 = "4";break; case 5:strTemp1 = "5";break; case 6:strTemp1 = "6";break; case 7:strTemp1 = "7";break; case 8:strTemp1 = "8";break; case 9:strTemp1 = "9";break; } t = (T1/10)%10; switch(t) {
case 0:strTemp2 = "0";break; case 1:strTemp2 = "1";break; case 2:strTemp2 = "2";break; case 3:strTemp2 = "3";break; case 4:strTemp2 = "4";break; case 5:strTemp2 = "5";break; case 6:strTemp2 = "6";break; case 7:strTemp2 = "7";break; case 8:strTemp2 = "8";break; case 9:strTemp2 = "9";break; } t = T1%10; switch(t) {
case 0:strTemp3 = "0";break; case 1:strTemp3 = "1";break; case 2:strTemp3 = "2";break; case 3:strTemp3 = "3";break; case 4:strTemp3 = "4";break; case 5:strTemp3 = "5";break; case 6:strTemp3 = "6";break; case 7:strTemp3 = "7";break; case 8:strTemp3 = "8";break; case 9:strTemp3 = "9";break; } t = H1/100; switch(t) {
case 0:break; case 1:strHumi1 = "1";break; case 2:strHumi1 = "2";break; case 3:strHumi1 = "3";break; case 4:strHumi1 = "4";break; case 5:strHumi1 = "5";break; case 6:strHumi1 = "6";break; case 7:strHumi1 = "7";break; case 8:strHumi1 = "8";break; case 9:strHumi1 = "9";break; } t = H1/100; switch(t) {
case 0:strHumi2 = "0";break; case 1:strHumi2 = "1";break; case 2:strHumi2 = "2";break; case 3:strHumi2 = "3";break; case 4:strHumi2 = "4";break; case 5:strHumi2 = "5";break; case 6:strHumi2 = "6";break; case 7:strHumi2 = "7";break; case 8:strHumi2 = "8";break; case 9:strHumi2 = "9";break; } t = H1/100; switch(t) {
case 0:strHumi3 = "0";break; case 1:strHumi3 = "1";break; case 2:strHumi3 = "2";break; case 3:strHumi3 = "3";break; case 4:strHumi3 = "4";break; case 5:strHumi3 = "5";break; case 6:strHumi3 = "6";break; case 7:strHumi3 = "7";break; case 8:strHumi3 = "8";break; case 9:strHumi3 = "9";break; } GUI_ShowString(40,32," ",16,1); GUI_ShowString(40,48," ",16,1); GUI_ShowCHinese(0,32,16,"温度:",1); GUI_ShowString(40,32,strTemp1,16,1); GUI_ShowString(48,32,strTemp2,16,1); GUI_ShowString(56,32,".",16,1); GUI_ShowString(64,32,strTemp3,16,1); GUI_ShowCHinese(72,32,16,"℃",1); GUI_ShowCHinese(0,48,16,"湿度:",1); GUI_ShowString(40,48,strHumi1,16,1); GUI_ShowString(48,48,strHumi2,16,1); GUI_ShowString(56,48,".",16,1); GUI_ShowString(64,48,strHumi3,16,1); GUI_ShowCHinese(72,48,16,"%",1);}

在main函数里加入显示函数

在这里插入图片描述

效果

在这里插入图片描述

转载地址:http://anpqi.baihongyu.com/

你可能感兴趣的文章
阿里巴巴数据产品经理工作总结
查看>>
大数据的特点及作用
查看>>
IBM朱辉:大数据分析的5个高复制使用场景及案例分享(含PPT)
查看>>
“医学数据银行”——临床大数据科研协作平台
查看>>
人工智能、机器学习、统计学、数据挖掘之间有什么区别?
查看>>
大数据架构师基础:hadoop家族,Cloudera系列产品介绍
查看>>
Java返回对象快捷键
查看>>
Hadoop web页面的授权设定
查看>>
Hadoop大数据平台运维工程师须掌握的基本命令集分享
查看>>
后Hadoop时代的大数据架构
查看>>
浅谈开源大数据平台的演变
查看>>
Spark编程指南——Python版
查看>>
从零教你在Linux环境下(ubuntu 12.04)如何编译hadoop2.4
查看>>
Cloudera Hadoop开源组件Sentry:为金融、政府、医疗保健使用hadoop打下基础
查看>>
Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败
查看>>
Linux启动Tomcat服务
查看>>
Rattle :基于R的数据挖掘工具:简介和安装
查看>>
Rattle :基于R的数据挖掘工具:功能概览
查看>>
通过eclipse查看、阅读hadoop2.4源码
查看>>
离线安装Cloudera Manager5.3.4与CDH5.3.4
查看>>