一、任務目標
理解OLED屏顯和漢字點陣編碼原理,使用STM32F103的SPI或IIC接口實現(xiàn)以下功能:
-
顯示自己的學號和姓名;
-
顯示AHT20的溫度和濕度;
-
上下或左右的滑動顯示長字符。
二、材料準備
硬件:
- STM32F103C8T6最小板
- AHT20溫濕度傳感器
- ST-LINK 仿真器
- 4針腳使用I2C通信協(xié)議的OLED屏
- 面包板
- 杜邦線
軟件:
- KEIL 5
- 字模軟件
三、AHT20溫濕度傳感器的使用
可以看我上次寫的文章:STM32 I2C協(xié)議讀取溫濕度傳感器
四、OLED的使用
1.硬件
我這里使用的是4針腳的OLED屏,通信協(xié)議是I2C。
2.字模
漢字編碼原理
-
1、所有的漢字或者英文都是下面的原理:
由左至右,每8個點占用一個字節(jié),最后不足8個字節(jié)的占用一個字節(jié),而且從最高位向最低位排列。 -
2、生成的字庫說明:(以12×12例子)
一個漢字占用字節(jié)數(shù):12÷8=1····4也就是占用了2×12=24個字節(jié)。
編碼排序A0A0→A0FEA1A0→A2FE依次排列。
以12×12字庫的“我”為例:“我”的編碼為CED2,所以在漢字排在CEH-AOH=2EH區(qū)的D2H-A0H=32H個。所以在12×12字庫的起始位置就是[{FE-A0}*2EH+32H]*24=104976開始的24個字節(jié)就是我的點陣模。
取字模
這里我使用的取字模軟件為PCtoLCD2002,打開軟件之后按下圖進行設置
輸入要得到的字模,點擊生成字模,再把生成的字模的代碼復制即可
3.工程
這里可以用上次的AHT20的工程,復制一個,再添加OLED相關文件即可。
或者也可以直接下載我的代碼。(注意是I2C通信,4針腳屏)
原本的字模庫中已經(jīng)有了數(shù)字和相關符號的字模,這里的10x16像素的字模庫是剛才通過軟件提取出來的,需要與數(shù)字的字模庫分開定義,因為定義的像素并不一樣。
除此之外,自帶的函數(shù)里面并沒有輸出中文的方法,需要我們自己定義。
/**
* @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); //參數(shù)1:把光標設置在第幾頁. 參數(shù)2:把光標設置在第幾列
for (i = 0; i < wide; i++)
{
OLED_WriteData(OLED_F10x16[Num][i]); //顯示上半部分內(nèi)容
}
OLED_SetCursor(( Line - 1 ) * 2 + 1,( Column - 1) * wide);
for (i = 0; i < wide ; i++)
{
OLED_WriteData(OLED_F10x16[Num][i+wide]); //顯示下半部分內(nèi)容
}
}
這之后要實現(xiàn)滾動效果,代碼及功能如下:
OLED_WriteCommand(0x2E); //關閉滾動
OLED_WriteCommand(0x26); //向右滾動,27則向左
OLED_WriteCommand(0x00); //虛擬字節(jié)
OLED_WriteCommand(0x00); //起始頁 這里為0
OLED_WriteCommand(0x07); //滾動速度
OLED_WriteCommand(0x03); //終止頁 這里為3,也就是之后的姓名,學號
OLED_WriteCommand(0x00); //虛擬字節(jié)
OLED_WriteCommand(0xFF); //虛擬字節(jié)
OLED_WriteCommand(0x2F); //開啟滾動
然后是主函數(shù)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口的函數(shù)
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列調(diào)用字模庫第0個字 陳
OLED_ShowCHINESE(1,2,1); //第1行第2列調(diào)用字模庫第1個字 爽
OLED_ShowString(2,1,"632007060523"); //第二行第一列顯示字符串
OLED_ShowCHINESE(3,1,3);//第3行第1列調(diào)用字模庫第3個字 濕
OLED_ShowCHINESE(3,2,4);//第3行第2列調(diào)用字模庫第4個字 度
OLED_ShowString(3,6,":");
OLED_ShowCHINESE(4,1,2);//第4行第2列調(diào)用字模庫第2個字 溫
OLED_ShowCHINESE(4,2,4);//第3行第2列調(diào)用字模庫第4個字 度
OLED_ShowString(4,6,":");
while(1)
{
OLED_WriteCommand(0x2E); //關閉滾動
OLED_WriteCommand(0x26); //向右滾動,27則向左
OLED_WriteCommand(0x00); //虛擬字節(jié)
OLED_WriteCommand(0x00); //起始頁 這里為0
OLED_WriteCommand(0x07); //滾動速度
OLED_WriteCommand(0x03); //終止頁 這里為3,也就是之后的姓名,學號
OLED_WriteCommand(0x00); //虛擬字節(jié)
OLED_WriteCommand(0xFF); //虛擬字節(jié)
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校驗后,讀取數(shù)據(jù)
}
c1 = CT_data[0]*100*10/1024/1024;
t1 = CT_data[1]*200*10/1024/1024-500;
下一步客戶處理數(shù)據(jù),我們這里用兩個字符串來表示計算得到的值
char str1[5];
char str2[5];
sprintf(str1,"%.2f",c1/10.0);
sprintf(str2,"%.2f",t1/10.0);
OLED_ShowString(3,7,str1);//把浮點數(shù)轉(zhuǎn)為字符串顯示在屏上
OLED_ShowString(4,7,str2);
Delay_1ms(2000);
}
}
4.電路連接
B1接管腳2,B0接管腳4,其他的按圖接即可,圖二中有幾根線多余,上面的兩根紅線和藍線原本是連接LED燈的,下面的三根線(藍、黃、綠)原本是連接CH340模塊的,可以不用接,本次實驗不需要。
圖片來源:江科大自化協(xié)
5.實驗效果
可以看到,輸出了自己的學號姓名,顯示了溫濕度,且當手靠近傳感器時,溫濕度有變化,并實現(xiàn)了滾動效果。
五、總結(jié)
本次實驗主要使用標準庫導入了AHT20模塊和OLED模塊,實現(xiàn)了顯示溫濕度數(shù)據(jù)和學號姓名的滾動顯示。OLED屏的使用比較方便,用來調(diào)試啥的也很不錯。文章來源:http://www.zghlxwxcb.cn/news/detail-780316.html
六、參考資料
點陣漢字的字模讀取與顯示
基于STM32的0.96OLED基本顯示學習,及 上下或左右的滑動顯示長字符(使用硬件刷屏模式),OLED顯示變量值操作詳細解析文章來源地址http://www.zghlxwxcb.cn/news/detail-780316.html
到了這里,關于STM32 OLED顯示漢字及屏幕滾動(I2C協(xié)議)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!