文章目录
理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:
显示自己的学号和姓名;
显示AHT20的温度和湿度;
上下或左右的滑动显示长字符。
可以看我上次写的文章:STM32 I2C协议读取温湿度传感器
我这里使用的是4针脚的OLED屏,通信协议是I2C。

1、所有的汉字或者英文都是下面的原理:
由左至右,每8个点占用一个字节,最后不足8个字节的占用一个字节,而且从最高位向最低位排列。
2、生成的字库说明:(以12×12例子)
一个汉字占用字节数:12÷8=1····4也就是占用了2×12=24个字节。
编码排序A0A0→A0FEA1A0→A2FE依次排列。
以12×12字库的“我”为例:“我”的编码为CED2,所以在汉字排在CEH-AOH=2EH区的D2H-A0H=32H个。所以在12×12字库的起始位置就是[{FE-A0}*2EH+32H]*24=104976开始的24个字节就是我的点阵模。
这里我使用的取字模软件为PCtoLCD2002,打开软件之后按下图进行设置


输入要得到的字模,点击生成字模,再把生成的字模的代码复制即可

这里可以用上次的AHT20的工程,复制一个,再添加OLED相关文件即可。
或者也可以直接下载我的代码。(注意是I2C通信,4针脚屏)

原本的字模库中已经有了数字和相关符号的字模,这里的10x16像素的字模库是刚才通过软件提取出来的,需要与数字的字模库分开定义,因为定义的像素并不一样。
除此之外,自带的函数里面并没有输出中文的方法,需要我们自己定义。
/**
* @brief OLED初始化
* @param Line 起始行位置
* @param Column 起始列位置
* @retval 无
*/
void OLED_ShowCHINESE(uint8_t Line, uint8_t Column, uint8_t Num)
{
uint8_t i;
uint8_t wide = 20;//字宽
OLED_SetCursor(( Line - 1 ) * 2, ( Column - 1 )* wide); //参数1:把光标设置在第几页. 参数2:把光标设置在第几列
for (i = 0; i < wide; i++)
{
OLED_WriteData(OLED_F10x16[Num][i]); //显示上半部分内容
}
OLED_SetCursor(( Line - 1 ) * 2 + 1,( Column - 1) * wide);
for (i = 0; i < wide ; i++)
{
OLED_WriteData(OLED_F10x16[Num][i+wide]); //显示下半部分内容
}
}
这之后要实现滚动效果,代码及功能如下:
OLED_WriteCommand(0x2E); //关闭滚动
OLED_WriteCommand(0x26); //向右滚动,27则向左
OLED_WriteCommand(0x00); //虚拟字节
OLED_WriteCommand(0x00); //起始页 这里为0
OLED_WriteCommand(0x07); //滚动速度
OLED_WriteCommand(0x03); //终止页 这里为3,也就是之后的姓名,学号
OLED_WriteCommand(0x00); //虚拟字节
OLED_WriteCommand(0xFF); //虚拟字节
OLED_WriteCommand(0x2F); //开启滚动
然后是主函数main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "AHT20-21_DEMO_V1_3.h"
#include <stdio.h>
int main(void)
{
Init_I2C_Sensor_Port();//初始化SDA,SCL的IO口的函数
uint32_t CT_data[2];
volatile int c1,t1;
Delay_1ms(500);
OLED_Init();//初始化OLED
if((AHT20_Read_Status()&0x18)!=0x18)
{
AHT20_Start_Init(); //重新初始化寄存器
Delay_1ms(10);
}
OLED_ShowCHINESE(1,1,0); //第1行第1列调用字模库第0个字 陈
OLED_ShowCHINESE(1,2,1); //第1行第2列调用字模库第1个字 爽
OLED_ShowString(2,1,"632007060523"); //第二行第一列显示字符串
OLED_ShowCHINESE(3,1,3);//第3行第1列调用字模库第3个字 湿
OLED_ShowCHINESE(3,2,4);//第3行第2列调用字模库第4个字 度
OLED_ShowString(3,6,":");
OLED_ShowCHINESE(4,1,2);//第4行第2列调用字模库第2个字 温
OLED_ShowCHINESE(4,2,4);//第3行第2列调用字模库第4个字 度
OLED_ShowString(4,6,":");
while(1)
{
OLED_WriteCommand(0x2E); //关闭滚动
OLED_WriteCommand(0x26); //向右滚动,27则向左
OLED_WriteCommand(0x00); //虚拟字节
OLED_WriteCommand(0x00); //起始页 这里为0
OLED_WriteCommand(0x07); //滚动速度
OLED_WriteCommand(0x03); //终止页 这里为3,也就是之后的姓名,学号
OLED_WriteCommand(0x00); //虚拟字节
OLED_WriteCommand(0xFF); //虚拟字节
OLED_WriteCommand(0x2F); //开启滚动
//AHT20_Read_CTdata(CT_data);
AHT20_Read_CTdata_crc(CT_data); //CRC校验
while(CT_data[0]==0x00&&CT_data[1]==0x00)
{
AHT20_Read_CTdata_crc(CT_data);//CRC校验后,读取数据
}
c1 = CT_data[0]*100*10/1024/1024;
t1 = CT_data[1]*200*10/1024/1024-500;
下一步客户处理数据,我们这里用两个字符串来表示计算得到的值
char str1[5];
char str2[5];
sprintf(str1,"%.2f",c1/10.0);
sprintf(str2,"%.2f",t1/10.0);
OLED_ShowString(3,7,str1);//把浮点数转为字符串显示在屏上
OLED_ShowString(4,7,str2);
Delay_1ms(2000);
}
}
B1接管脚2,B0接管脚4,其他的按图接即可,图二中有几根线多余,上面的两根红线和蓝线原本是连接LED灯的,下面的三根线(蓝、黄、绿)原本是连接CH340模块的,可以不用接,本次实验不需要。


可以看到,输出了自己的学号姓名,显示了温湿度,且当手靠近传感器时,温湿度有变化,并实现了滚动效果。

本次实验主要使用标准库导入了AHT20模块和OLED模块,实现了显示温湿度数据和学号姓名的滚动显示。OLED屏的使用比较方便,用来调试啥的也很不错。
点阵汉字的字模读取与显示
基于STM32的0.96OLED基本显示学习,及 上下或左右的滑动显示长字符(使用硬件刷屏模式),OLED显示变量值操作详细解析
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi
相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
如果我在模型中设置验证消息validates:name,:presence=>{:message=>'Thenamecantbeblank.'}我如何让该消息显示在闪光警报中,这是我迄今为止尝试过的方法defcreate@message=Message.new(params[:message])if@message.valid?ContactMailer.send_mail(@message).deliverredirect_to(root_path,:notice=>"Thanksforyourmessage,Iwillbeintouchsoon")elseflash[:error]