一、概念相关
1.SPI是什么
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。
2.SPI协议
SPI总线是一种4线总线,因其硬件功能很强,所以与SPI有关的软件就相当简单,使中央处理器(Central Processing Unit,CPU)有更多的时间处理其他事务。正是因为这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。SPI是一种高速、高效率的串行接口技术。 SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。 (1)MISO– Master Input Slave Output,主设备数据输入,从设备数据输出; (2)MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入; (3)SCLK – Serial Clock,时钟信号,由主设备产生; (4)CS – Chip Select,从设备使能信号,由主设备控制。
二、0.96寸OLED显示屏显示
1.显示汉字及数字
(1)准备工作
①工具:keil + STM32F103C8最小开发版 + 0.96寸OLED显示屏 ②DEMO程序:下载链接 ③串口连线(按照下表对应连接即可): ④字模准备 需要使用PCtoLCD2002工具,直接在网上搜索下载即可。 打开软件即可进行字模的生成,但是需要注意修改设置。
(2)代码修改
由于使用的样本代码,并没有STM32F103C8这个种类,就用同一个系列的STM32F103RC。 打开gui.c里的oledfont.h文件,可以在这里增加自己定义的字模。 定义函数
void TEST_MainPage(void)
{
GUI_ShowCHinese(28,24,16,"狴鲲",1);
GUI_ShowString(4,48,"111222333444",16,1);
delay_ms(1500);
delay_ms(1500);
}
main函数
int main(void)
{
delay_init();
OLED_Init();
OLED_Clear(0);
while(1)
{
TEST_MainPage();
}
}
(3)运行结果
2.字符滚动
(1)代码修改
水平左右滚动
OLED_WR_Byte(0x2E,OLED_CMD);
OLED_WR_Byte(0x26,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0xFF,OLED_CMD);
OLED_WR_Byte(0x2F,OLED_CMD);
垂直和水平滚动
OLED_WR_Byte(0x2e,OLED_CMD);
OLED_WR_Byte(0x29,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x01,OLED_CMD);
OLED_WR_Byte(0x2F,OLED_CMD);
main函数
int main(void)
{
delay_init();
NVIC_Configuration();
OLED_Init();
OLED_Clear(0);
OLED_WR_Byte(0x2E,OLED_CMD);
OLED_WR_Byte(0x27,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0xFF,OLED_CMD);
TEST_MainPage();
OLED_WR_Byte(0x2F,OLED_CMD);
}
数据定义
void TEST_MainPage(void)
{
GUI_ShowCHinese(10,0,16,"帝王将相几抔土",1);
delay_ms(1500);
delay_ms(1500);
}
(2)运行结果
3.配合AHT20显示温度和湿度
1.准备工作
①导入文件:将上面OLED显示的文件导入AHT20的代码文件内 ②同时在keil内也需要导入
(2)代码修改
增加show_info函数,将信息显示到OLED屏上
void show_info(){
GUI_ShowCHinese(10,10,16,"温湿度显示",1);
GUI_ShowString(5,50,"温度:",16,1);
GUI_ShowNum(40,50,T1/100,1,16,1);
GUI_ShowNum(49,50,(T1/10)%10,1,16,1);
GUI_ShowString(56,50,".",16,1);
GUI_ShowNum(58,50,T1%10,1,16,1);
GUI_ShowString(70,50,"湿度:",16,1);
GUI_ShowNum(100,50,H1/100,1,16,1);
GUI_ShowNum(109,50,(H1/10)%10,1,16,1);
GUI_ShowString(116,50,".",16,1);
GUI_ShowNum(118,50,H1%10,1,16,1);
}
main函数
int main(void)
{
delay_init();
uart_init(115200);
IIC_Init();
NVIC_Configuration();
OLED_Init();
OLED_Clear(0);
while(1)
{
printf("温度湿度显示");
read_AHT20_once();
show_info();
delay_ms(5000);
OLED_Clear(0);
read_AHT20_once();
show_info();
delay_ms(5000);
OLED_Clear(0);
}
}
(3)运行结果
三、总结
本次实验学会了如何使用OLED进行字符的显示,学会了如何利用AHT20配合OLED进行温湿度显示。
参考链接
SPI (SPI协议) 基于STM32的温湿度采集——OLED显示
|