汉字点阵与OLED屏显

重庆交通大学信息科学与工程学院

《嵌入式系统基础A》课程

实验报告

班 级: 物联网工程2101

姓名-学号 : 江欣朋-632007060327

实验项目名称: 汉字点阵与OLED屏显

实验项目性质: 设计性

实验所属课程: 《嵌入式系统基础A》

实验室(中心): 南岸校区语音大楼

指 导 教 师 : 娄路

完成时间: 2023 年 11 月 20 日

一、实验内容和任务

1. 串口传输文件的练习。将两台笔记本电脑,借助 usb转rs232 模块和杜邦线,建立起串口连接。然后用串口助手等工具软件(带文件传输功能)将一台笔记本上的一个大文件(图片、视频和压缩包软件)传输到另外一台电脑,预算文件大小、波特率和传输时间三者之间的关系,并对比实际传输时间。参考:电脑间串口连接传输文件_串口线怎么和电脑连接-CSDN博客
2. 学习理解汉字的机内码、区位码编码规则和字形数据存储格式。在Ubuntu下用C/C++(或python) 调用opencv库编程显示一张图片,并打开一个名为"logo.txt"的文本文件(其中只有一行文本文件,包括你自己的名字和学号),按照名字和学号去读取汉字24*24点阵字形字库(压缩包中的文件HZKf2424.hz)中对应字符的字形数据,将名字和学号叠加显示在此图片右下位置。

汉字点阵字库原理 (1).pdf

中文点阵字库的使用方法(安富莱电子) (1).pdf

logo(示例).txt

用OpenCV在图片上绘制点阵汉字 (1).docx

addtext(汉字叠加代码-函数模块化,非常灵活)-计科1503班-孙西从) (1).cpp

实验作业(3)-汉字叠加-计科1503班-孙西从.doc参考:点阵汉字的字模读取与显示_c++怎么读取汉字点阵库文件-CSDN博客【精选】【嵌入式14】点阵汉字的字模读取与显示-CSDN博客https://blog.csdn.net/qq_46467126/article/details/121313820
3.  理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:1) 显示自己的学号和姓名; 2) 显示AHT20的温度和湿度;3) 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。参考:
【精选】stm32+(4SPI)OLED显示数据_4线spioled_机智的橙子的博客-CSDN博客https://blog.csdn.net/qq_45659777/article/details/121454312【精选】【嵌入式16】STM32+OLED屏显应用实例_基于stm32智能实现播放音乐,同时oled上显示播放音乐-CSDN博客https://blog.csdn.net/qq_46467126/article/details/121439142
基于SPI通信方式的OLED显示_spi oled读写时序-CSDN博客
基于STM32的0.96寸OLED显示屏显示数据_stm32oled屏幕清除某个区域-CSDN博客

二、实验要求

1. 分组要求:每个学生独立完成,即1人1组。

2. 程序及报告文档要求:具有较好的可读性,如叙述准确、标注明确、截图清晰等。

3.将完整项目代码打包,且与作业报告(md和pdf文件)和博客地址一起提交至学习通。

三. 实验过程介绍 (此处可以填博客内容)

理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:

显示AHT20的温度和湿度; 先把AHT20.C .H加入文件夹

1.添加文件选择路经

2.修改main.c

/****************************************************************************************************

//=========================================电源接线================================================//

// OLED模块               STM32单片机

//   VCC         接       DC 5V/3.3V      //OLED屏电源正

//   GND         接          GND          //OLED屏电源地

//=======================================液晶屏数据线接线==========================================//

//本模块默认数据总线类型为4线制SPI

// OLED模块               STM32单片机

//   D1          接          PB15        //OLED屏SPI写信号

//=======================================液晶屏控制线接线==========================================//

// OLED模块               STM32单片机

//   CS          接          PB11        //OLED屏片选控制信号

//   RES         接          PB12        //OLED屏复位控制信号

//   DC          接          PB10        //OLED屏数据/命令选择控制信号

//   D0          接          PB13        //OLED屏SPI时钟信号

//=========================================触摸屏接线=========================================//

//本模块不带触摸功能,所以不需要触摸屏接线

****************************************************************************************************/

#include "delay.h"

#include "sys.h"

#include "oled.h"

#include "gui.h"

#include "test.h"

#include "AHT20-21_DEMO_V1_3.h"

//存放温度和湿度

uint32_t CT_data[2]={0,0};

//湿度和温度

volatile int  c1,t1;

//用于LED显示的温度和湿度

u8 temp[10];  

u8 hum[10];

//初始化PC13用于测试

void GPIOC13_Init(void){

GPIO_InitTypeDef  GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_ResetBits(GPIOC,GPIO_Pin_13);

}

//初始化以及前期准备

void Init(void);

//读取温湿度

void getData(void);

//显示温湿度

void showData(void);

int main(void)

{

//初始化

Init();

while(1){

//获取数据

getData();

//显示数据

showData();

//延时

Delay_1ms(3100);

//OLED_Clear(0);

}

}

//初始化以及前期准备

void Init(void){

//初始化PC12

GPIOC13_Init();

//延时函数初始化   

delay_init();    

//初始化OLED

OLED_Init();

//清屏(全黑)

OLED_Clear(0);    

//开机显示信息

Delay_1ms(1000);

AHT20_Init();

/***********************************************************************************/

/**///①刚上电,产品芯片内部就绪需要时间,延时100~500ms,建议500ms

/***********************************************************************************/

Delay_1ms(1000);

OLED_Clear(0);

}

//读取温湿度

void getData(){

//AHT20_Read_CTdata(CT_data);       //不经过CRC校验,直接读取AHT20的温度和湿度数据    推荐每隔大于1S读一次

AHT20_Read_CTdata(CT_data);;  //crc校验后,读取AHT20的温度和湿度数据

c1 = CT_data[0]*1000/1024/1024;  //计算得到湿度值c1(放大了10倍)

t1 = CT_data[1]*2000/1024/1024-500;//计算得到温度值t1(放大了10倍)

//转为字符串易于显示

temp[0]=t1/100+'0';

temp[1]=(t1/10)%10+'0';

temp[2]='.';

temp[3]=t1%10+'0';

temp[4]='\0';

hum[0]=c1/100+'0';

hum[1]=(c1/10)%10+'0';

hum[2]='.';

hum[3]=c1%10+'0';

hum[4]=32;

hum[5]='%';

hum[6]='\0';

}

//显示温湿度

void showData(){

//显示温度

GUI_ShowCHinese(15,8,16,"温湿度显示",1);

GUI_ShowCHinese(15,28,16,"温度",1);

GUI_ShowString(47,28,":",16,1);

GUI_ShowString(62,28,temp,16,1);

GUI_ShowCHinese(96,28,16,"℃",1);

//显示湿度

GUI_ShowCHinese(15,48,16,"湿度",1);

GUI_ShowString(47,48,":",16,1);

GUI_ShowString(62,48,hum,16,1);

}

3.修改AHT20.C

*******************************************/

/*@版权所有/:广州奥松电子有限公司          */

/*@作者:温湿度传感器事业部                */

/*@版本:V1.2                              */

/*******************************************/

#include "AHT20-21_DEMO_V1_3.h"

void Delay_N10us(uint32_t t)//延时函数

{

  uint32_t k;

   while(t--)

  {

    for (k = 0; k < 2; k++);//110

  }

}

void SensorDelay_us(uint32_t t)//延时函数

{

for(t = t-2; t>0; t--)

{

Delay_N10us(1);

}

}

void Delay_4us(void) //延时函数

{

Delay_N10us(1);

Delay_N10us(1);

Delay_N10us(1);

Delay_N10us(1);

}

void Delay_5us(void) //延时函数

{

Delay_N10us(1);

Delay_N10us(1);

Delay_N10us(1);

Delay_N10us(1);

Delay_N10us(1);

}

void Delay_1ms(uint32_t t) //延时函数

{

   while(t--)

  {

    SensorDelay_us(1000);//延时1ms

  }

}

//void AHT20_Clock_Init(void) //延时函数

//{

// RCC_APB2PeriphClockCmd(CC_APB2Periph_GPIOB,ENABLE);

//}

void SDA_Pin_Output_High(void)   //将PB7配置为输出 , 并设置为高电平, PB7作为I2C的SDA

{

GPIO_InitTypeDef  GPIO_InitStruct;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB,& GPIO_InitStruct);

GPIO_SetBits(GPIOB,GPIO_Pin_7);

}

void SDA_Pin_Output_Low(void)  //将P7配置为输出  并设置为低电平

{

GPIO_InitTypeDef  GPIO_InitStruct;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB,& GPIO_InitStruct);

GPIO_ResetBits(GPIOB,GPIO_Pin_7);

}

void SDA_Pin_IN_FLOATING(void)  //SDA配置为浮空输入

{

GPIO_InitTypeDef  GPIO_InitStruct;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init( GPIOB,&GPIO_InitStruct);

}

void SCL_Pin_Output_High(void) //SCL输出高电平,PB6作为I2C的SCL

{

GPIO_SetBits(GPIOB,GPIO_Pin_6);

}

void SCL_Pin_Output_Low(void) //SCL输出低电平

{

GPIO_ResetBits(GPIOB,GPIO_Pin_6);

}

void Init_I2C_Sensor_Port(void) //初始化I2C接口,输出为高电平

{

GPIO_InitTypeDef  GPIO_InitStruct;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB,& GPIO_InitStruct);

GPIO_SetBits(GPIOB,GPIO_Pin_15);//输出高电平

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB,& GPIO_InitStruct);

GPIO_SetBits(GPIOB,GPIO_Pin_15);//输出高电平

}

void I2C_Start(void)  //I2C主机发送START信号

{

SDA_Pin_Output_High();

SensorDelay_us(8);

SCL_Pin_Output_High();

SensorDelay_us(8);

SDA_Pin_Output_Low();

SensorDelay_us(8);

SCL_Pin_Output_Low();

SensorDelay_us(8);   

}

void AHT20_WR_Byte(uint8_t Byte) //往AHT20写一个字节

{

uint8_t Data,N,i;

Data=Byte;

i = 0x80;

for(N=0;N<8;N++)

{

SCL_Pin_Output_Low();

Delay_4us();

if(i&Data)

{

SDA_Pin_Output_High();

}

else

{

SDA_Pin_Output_Low();

}

    SCL_Pin_Output_High();

Delay_4us();

Data <<= 1;

}

SCL_Pin_Output_Low();

SensorDelay_us(8);   

SDA_Pin_IN_FLOATING();

SensorDelay_us(8);

}

uint8_t AHT20_RD_Byte(void)//从AHT20读取一个字节

{

uint8_t Byte,i,a;

Byte = 0;

SCL_Pin_Output_Low();

SDA_Pin_IN_FLOATING();

SensorDelay_us(8);

for(i=0;i<8;i++)

{

    SCL_Pin_Output_High();

Delay_5us();

a=0;

if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)) a=1;

Byte = (Byte<<1)|a;

SCL_Pin_Output_Low();

Delay_5us();

}

  SDA_Pin_IN_FLOATING();

SensorDelay_us(8);

return Byte;

}

uint8_t Receive_ACK(void)   //看AHT20是否有回复ACK

{

uint16_t CNT;

CNT = 0;

SCL_Pin_Output_Low();

SDA_Pin_IN_FLOATING();

SensorDelay_us(8);

SCL_Pin_Output_High();

SensorDelay_us(8);

while((GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7))  && CNT < 100)

CNT++;

if(CNT == 100)

{

return 0;

}

  SCL_Pin_Output_Low();

SensorDelay_us(8);

return 1;

}

void Send_ACK(void)   //主机回复ACK信号

{

SCL_Pin_Output_Low();

SensorDelay_us(8);

SDA_Pin_Output_Low();

SensorDelay_us(8);

SCL_Pin_Output_High();

SensorDelay_us(8);

SCL_Pin_Output_Low();

SensorDelay_us(8);

SDA_Pin_IN_FLOATING();

SensorDelay_us(8);

}

void Send_NOT_ACK(void) //主机不回复ACK

{

SCL_Pin_Output_Low();

SensorDelay_us(8);

SDA_Pin_Output_High();

SensorDelay_us(8);

SCL_Pin_Output_High();

SensorDelay_us(8);

SCL_Pin_Output_Low();

SensorDelay_us(8);

    SDA_Pin_Output_Low();

SensorDelay_us(8);

}

void Stop_I2C(void)   //一条协议结束

{

SDA_Pin_Output_Low();

SensorDelay_us(8);

SCL_Pin_Output_High();

SensorDelay_us(8);

SDA_Pin_Output_High();

SensorDelay_us(8);

}

uint8_t AHT20_Read_Status(void)//读取AHT20的状态寄存器

{

uint8_t Byte_first;

I2C_Start();

AHT20_WR_Byte(0x71);

Receive_ACK();

Byte_first = AHT20_RD_Byte();

Send_NOT_ACK();

Stop_I2C();

return Byte_first;

}

uint8_t AHT20_Read_Cal_Enable(void)  //查询cal enable位有没有使能

{

uint8_t val = 0;//ret = 0,

  val = AHT20_Read_Status();

 if((val & 0x68)==0x08)

 return 1;

   else  return 0;

 }

void AHT20_SendAC(void) //向AHT20发送AC命令

{

I2C_Start();

AHT20_WR_Byte(0x70);

Receive_ACK();

AHT20_WR_Byte(0xac);//0xAC采集命令

Receive_ACK();

AHT20_WR_Byte(0x33);

Receive_ACK();

AHT20_WR_Byte(0x00);

Receive_ACK();

Stop_I2C();

}

//CRC校验类型:CRC8/MAXIM

//多项式:X8+X5+X4+1

//Poly:0011 0001  0x31

//高位放到后面就变成 1000 1100 0x8c

//C现实代码:

uint8_t Calc_CRC8(uint8_t *message,uint8_t Num)

{

        uint8_t i;

        uint8_t byte;

        uint8_t crc=0xFF;

  for(byte=0; byte<Num; byte++)

  {

    crc^=(message[byte]);

    for(i=8;i>0;--i)

    {

      if(crc&0x80) crc=(crc<<1)^0x31;

      else crc=(crc<<1);

    }

  }

        return crc;

}

void AHT20_Read_CTdata(uint32_t *ct) //没有CRC校验,直接读取AHT20的温度和湿度数据

{

volatile uint8_t  Byte_1th=0;

volatile uint8_t  Byte_2th=0;

volatile uint8_t  Byte_3th=0;

volatile uint8_t  Byte_4th=0;

volatile uint8_t  Byte_5th=0;

volatile uint8_t  Byte_6th=0;

 uint32_t RetuData = 0;

uint16_t cnt = 0;

AHT20_SendAC();//向AHT10发送AC命令

Delay_1ms(80);//延时80ms左右

    cnt = 0;

while(((AHT20_Read_Status()&0x80)==0x80))//直到状态bit[7]为0,表示为空闲状态,若为1,表示忙状态

{

SensorDelay_us(1508);

if(cnt++>=100)

{

 break;

 }

}

I2C_Start();

AHT20_WR_Byte(0x71);

Receive_ACK();

Byte_1th = AHT20_RD_Byte();//状态字,查询到状态为0x98,表示为忙状态,bit[7]为1;状态为0x1C,或者0x0C,或者0x08表示为空闲状态,bit[7]为0

Send_ACK();

Byte_2th = AHT20_RD_Byte();//湿度

Send_ACK();

Byte_3th = AHT20_RD_Byte();//湿度

Send_ACK();

Byte_4th = AHT20_RD_Byte();//湿度/温度

Send_ACK();

Byte_5th = AHT20_RD_Byte();//温度

Send_ACK();

Byte_6th = AHT20_RD_Byte();//温度

Send_NOT_ACK();

Stop_I2C();

RetuData = (RetuData|Byte_2th)<<8;

RetuData = (RetuData|Byte_3th)<<8;

RetuData = (RetuData|Byte_4th);

RetuData =RetuData >>4;

ct[0] = RetuData;//湿度

RetuData = 0;

RetuData = (RetuData|Byte_4th)<<8;

RetuData = (RetuData|Byte_5th)<<8;

RetuData = (RetuData|Byte_6th);

RetuData = RetuData&0xfffff;

ct[1] =RetuData; //温度

}

void AHT20_Read_CTdata_crc(uint32_t *ct) //CRC校验后,读取AHT20的温度和湿度数据

{

volatile uint8_t  Byte_1th=0;

volatile uint8_t  Byte_2th=0;

volatile uint8_t  Byte_3th=0;

volatile uint8_t  Byte_4th=0;

volatile uint8_t  Byte_5th=0;

volatile uint8_t  Byte_6th=0;

volatile uint8_t  Byte_7th=0;

 uint32_t RetuData = 0;

 uint16_t cnt = 0;

// uint8_t  CRCDATA=0;

 uint8_t  CTDATA[6]={0};//用于CRC传递数组

AHT20_SendAC();//向AHT10发送AC命令

Delay_1ms(80);//延时80ms左右

    cnt = 0;

while(((AHT20_Read_Status()&0x80)==0x80))//直到状态bit[7]为0,表示为空闲状态,若为1,表示忙状态

{

SensorDelay_us(1508);

if(cnt++>=100)

{

 break;

}

}

I2C_Start();

AHT20_WR_Byte(0x71);

Receive_ACK();

CTDATA[0]=Byte_1th = AHT20_RD_Byte();//状态字,查询到状态为0x98,表示为忙状态,bit[7]为1;状态为0x1C,或者0x0C,或者0x08表示为空闲状态,bit[7]为0

Send_ACK();

CTDATA[1]=Byte_2th = AHT20_RD_Byte();//湿度

Send_ACK();

CTDATA[2]=Byte_3th = AHT20_RD_Byte();//湿度

Send_ACK();

CTDATA[3]=Byte_4th = AHT20_RD_Byte();//湿度/温度

Send_ACK();

CTDATA[4]=Byte_5th = AHT20_RD_Byte();//温度

Send_ACK();

CTDATA[5]=Byte_6th = AHT20_RD_Byte();//温度

Send_ACK();

Byte_7th = AHT20_RD_Byte();//CRC数据

Send_NOT_ACK();                           //注意: 最后是发送NAK

Stop_I2C();

if(Calc_CRC8(CTDATA,6)==Byte_7th)

{

RetuData = (RetuData|Byte_2th)<<8;

RetuData = (RetuData|Byte_3th)<<8;

RetuData = (RetuData|Byte_4th);

RetuData =RetuData >>4;

ct[0] = RetuData;//湿度

RetuData = 0;

RetuData = (RetuData|Byte_4th)<<8;

RetuData = (RetuData|Byte_5th)<<8;

RetuData = (RetuData|Byte_6th);

RetuData = RetuData&0xfffff;

ct[1] =RetuData; //温度

}

else

{

ct[0]=0x00;

ct[1]=0x00;//校验错误返回值,客户可以根据自己需要更改

}//CRC数据

}

void AHT20_Init(void)   //初始化AHT20

{

Init_I2C_Sensor_Port();

I2C_Start();

AHT20_WR_Byte(0x70);

Receive_ACK();

AHT20_WR_Byte(0xa8);//0xA8进入NOR工作模式

Receive_ACK();

AHT20_WR_Byte(0x00);

Receive_ACK();

AHT20_WR_Byte(0x00);

Receive_ACK();

Stop_I2C();

Delay_1ms(10);//延时10ms左右

I2C_Start();

AHT20_WR_Byte(0x70);

Receive_ACK();

AHT20_WR_Byte(0xbe);//0xBE初始化命令,AHT20的初始化命令是0xBE,   AHT10的初始化命令是0xE1

Receive_ACK();

AHT20_WR_Byte(0x08);//相关寄存器bit[3]置1,为校准输出

Receive_ACK();

AHT20_WR_Byte(0x00);

Receive_ACK();

Stop_I2C();

Delay_1ms(10);//延时10ms左右

}

void JH_Reset_REG(uint8_t addr)

{

uint8_t Byte_first,Byte_second,Byte_third;

I2C_Start();

AHT20_WR_Byte(0x70);//原来是0x70

Receive_ACK();

AHT20_WR_Byte(addr);

Receive_ACK();

AHT20_WR_Byte(0x00);

Receive_ACK();

AHT20_WR_Byte(0x00);

Receive_ACK();

Stop_I2C();

Delay_1ms(5);//延时5ms左右

I2C_Start();

AHT20_WR_Byte(0x71);//

Receive_ACK();

Byte_first = AHT20_RD_Byte();

Send_ACK();

Byte_second = AHT20_RD_Byte();

Send_ACK();

Byte_third = AHT20_RD_Byte();

Send_NOT_ACK();

Stop_I2C();

    Delay_1ms(10);//延时10ms左右

I2C_Start();

AHT20_WR_Byte(0x70);///

Receive_ACK();

AHT20_WR_Byte(0xB0|addr);寄存器命令

Receive_ACK();

AHT20_WR_Byte(Byte_second);

Receive_ACK();

AHT20_WR_Byte(Byte_third);

Receive_ACK();

Stop_I2C();

Byte_second=0x00;

Byte_third =0x00;

}

void AHT20_Start_Init(void)

{

JH_Reset_REG(0x1b);

JH_Reset_REG(0x1c);

JH_Reset_REG(0x1e);

}

//int32_t main(void)

//{

//    uint32_t CT_data[2];

// volatile int  c1,t1;

// /***********************************************************************************/

// /**///①刚上电,产品芯片内部就绪需要时间,延时100~500ms,建议500ms

// /***********************************************************************************/

// Delay_1ms(500);

// /***********************************************************************************/

// /**///②上电第一次发0x71读取状态字,判断状态字是否为0x18,如果不是0x18,进行寄存器初始化

// /***********************************************************************************/

// if((AHT20_Read_Status()&0x18)!=0x18)

// {

// AHT20_Start_Init(); //重新初始化寄存器

// Delay_1ms(10);

// }

//

// /***********************************************************************************/

// /**///③根据客户自己需求发测量命令读取温湿度数据,当前while(1)循环发测量命令读取温湿度数据,仅供参考

// /***********************************************************************************/

// while(1)

// {

//  AHT20_Read_CTdata(CT_data);       //不经过CRC校验,直接读取AHT20的温度和湿度数据    推荐每隔大于1S读一次

//    //AHT20_Read_CTdata_crc(CT_data);  //crc校验后,读取AHT20的温度和湿度数据

//

//  c1 = CT_data[0]*100*10/1024/1024;  //计算得到湿度值c1(放大了10倍)

//  t1 = CT_data[1]*200*10/1024/1024-500;//计算得到温度值t1(放大了10倍)

// 下一步客户处理显示数据,

//  }

// }

5.在oledfont.h中加入:

"温",0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,

0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"温",0*/

"度",0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,

0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",1*/

"℃",0x60,0x00,0x91,0xF4,0x96,0x0C,0x6C,0x04,0x08,0x04,0x18,0x00,0x18,0x00,0x18,0x00,

0x18,0x00,0x18,0x00,0x18,0x00,0x08,0x00,0x0C,0x04,0x06,0x08,0x01,0xF0,0x00,0x00,/*"℃",0*/

"湿",0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,

0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00,/*"湿",0*/

"度",0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,

0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",1*/

  "显",0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,

  0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00,0x00,/*"显",0*/

  "示",0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,

  0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,/*"示",1*/

6.烧录

上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者一段歌词或诗词(使用硬件刷屏模式)。 修改main.c

//  

//本程序只供学习使用,未经作者许可,不得用于其它任何用途

//测试硬件:单片机STM32F103RCT6,正点原子MiniSTM32开发板,主频72MHZ,晶振12MHZ

//QDtech-OLED液晶驱动 for STM32

//xiao冯@ShenZhen QDtech co.,LTD

//公司网站:www.qdtft.com

//淘宝网站:http://qdtech.taobao.com

//wiki技术网站:http://www.lcdwiki.com

//我司提供技术支持,任何技术问题欢迎随时交流学习

//固话(传真) :+86 0755-23594567

//手机:15989313508(冯工)

//邮箱:lcdwiki01@gmail.com    support@lcdwiki.com    goodtft@163.com

//技术支持QQ:3002773612  3002778157

//技术交流QQ群:324828016

//创建日期:2018/8/27

//版本:V1.0

//版权所有,盗版必究。

//Copyright(C) 深圳市全动电子技术有限公司 2018-2028

//All rights reserved

/****************************************************************************************************

//=========================================电源接线================================================//

// OLED模块               STM32单片机

//   VCC         接       DC 5V/3.3V      //OLED屏电源正

//   GND         接          GND          //OLED屏电源地

//=======================================液晶屏数据线接线==========================================//

//本模块默认数据总线类型为4线制SPI

// OLED模块               STM32单片机

//   D1          接          PB15        //OLED屏SPI写信号

//=======================================液晶屏控制线接线==========================================//

// OLED模块               STM32单片机

//   CS          接          PB11        //OLED屏片选控制信号

//   RES         接          PB12        //OLED屏复位控制信号

//   DC          接          PB10        //OLED屏数据/命令选择控制信号

//   D0          接          PB13        //OLED屏SPI时钟信号

//=========================================触摸屏接线=========================================//

//本模块不带触摸功能,所以不需要触摸屏接线

****************************************************************************************************/

/***************************************************************************************************

  * @attention

  *

  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS

  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE

  * TIME. AS A RESULT, QD electronic SHALL NOT BE HELD LIABLE FOR ANY

  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING

  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE

  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.

****************************************************************************************************/

#include "stdlib.h"

#include "stdio.h"

#include "oled.h"

#include "delay.h"

#include "gui.h"

#include "test.h"

#include "bmp.h"

/*****************************************************************************

 * @name       :void TEST_MainPage(void)

 * @date       :2018-08-27

 * @function   :Drawing the main Interface of the Comprehensive Test Program

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void roll(void)

{

OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动

  OLED_WR_Byte(0x27,OLED_CMD);        //水平向左或者右滚动 26/27

  OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节

OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0

OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔

OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7

OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节

OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节

OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

}      

void TEST_MainPage(void)

{

GUI_ShowString(0,0,"Hello",16,1);

GUI_ShowCHinese(0,18,16,"欢迎来到重庆交通大学物联网实训室!",1);

delay_ms(1500);

delay_ms(1500);

}

/*****************************************************************************

 * @name       :void Test_Color(void)

 * @date       :2018-08-27

 * @function   :Color fill test(white,black)

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void Test_Color(void)

{

 GUI_Fill(0,0,WIDTH-1,HEIGHT-1,0);

 GUI_ShowString(10,10,"BLACK",16,1);

 delay_ms(1000);

 GUI_Fill(0,0,WIDTH-1,HEIGHT-1,1);

 delay_ms(1500);

}

/*****************************************************************************

 * @name       :void Test_Rectangular(void))

 * @date       :2018-08-27

 * @function   :Rectangular display and fill test

Display black,white rectangular boxes in turn,1000

milliseconds later,Fill the rectangle in black,white in turn

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void Test_Rectangular(void)

{

GUI_Fill(0,0,WIDTH/2-1,HEIGHT-1,0);

GUI_Fill(WIDTH/2,0,WIDTH-1,HEIGHT-1,1);

GUI_DrawRectangle(5, 5, WIDTH/2-1-5, HEIGHT-1-5,1);

GUI_DrawRectangle(WIDTH/2-1+5, 5, WIDTH-1-5, HEIGHT-1-5,0);

delay_ms(1000);

GUI_FillRectangle(5, 5, WIDTH/2-1-5, HEIGHT-1-5,1);

GUI_FillRectangle(WIDTH/2-1+5, 5, WIDTH-1-5, HEIGHT-1-5,0);

delay_ms(1500);

}

/*****************************************************************************

 * @name       :void Test_Circle(void)

 * @date       :2018-08-27

 * @function   :circular display and fill test

Display black,white circular boxes in turn,1000

milliseconds later,Fill the circular in black,white in turn

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void Test_Circle(void)

{

GUI_Fill(0,0,WIDTH/2-1,HEIGHT-1,0);

GUI_Fill(WIDTH/2,0,WIDTH-1,HEIGHT-1,1);

GUI_DrawCircle(WIDTH/2/2-1, HEIGHT/2-1, 1, 27);

GUI_DrawCircle(WIDTH/2+WIDTH/2/2-1, HEIGHT/2-1, 0, 27);

delay_ms(1000);

GUI_FillCircle(WIDTH/2/2-1, HEIGHT/2-1, 1, 27);

GUI_FillCircle(WIDTH/2+WIDTH/2/2-1, HEIGHT/2-1, 0, 27);

delay_ms(1500);

}

/*****************************************************************************

 * @name       :void Test_Triangle(void)

 * @date       :2018-08-27

 * @function   :triangle display and fill test

Display black,white triangle boxes in turn,1000

milliseconds later,Fill the triangle in black,white in turn

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void Test_Triangle(void)

{

GUI_Fill(0,0,WIDTH/2-1,HEIGHT-1,0);

GUI_Fill(WIDTH/2,0,WIDTH-1,HEIGHT-1,1);

GUI_DrawTriangel(5,HEIGHT-1-5,WIDTH/2/2-1,5,WIDTH/2-1-5,HEIGHT-1-5,1);

GUI_DrawTriangel(WIDTH/2-1+5,HEIGHT-1-5,WIDTH/2+WIDTH/2/2-1,5,WIDTH-1-5,HEIGHT-1-5,0);

delay_ms(1000);

GUI_FillTriangel(5,HEIGHT-1-5,WIDTH/2/2-1,5,WIDTH/2-1-5,HEIGHT-1-5,1);

GUI_FillTriangel(WIDTH/2-1+5,HEIGHT-1-5,WIDTH/2+WIDTH/2/2-1,5,WIDTH-1-5,HEIGHT-1-5,0);

delay_ms(1500);

}

/*****************************************************************************

 * @name       :void TEST_English(void)

 * @date       :2018-08-27

 * @function   :English display test

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void TEST_English(void)

{

GUI_ShowString(0,5,"6x8:abcdefghijklmnopqrstuvwxyz",8,1);

GUI_ShowString(0,25,"8x16:abcdefghijklmnopqrstuvwxyz",16,1);

delay_ms(1000);

GUI_ShowString(0,5,"6x8:ABCDEFGHIJKLMNOPQRSTUVWXYZ",8,1);

GUI_ShowString(0,25,"8x16:ABCDEFGHIJKLMNOPQRSTUVWXYZ",16,1);

delay_ms(1500);

}

/*****************************************************************************

 * @name       :void TEST_Number_Character(void)

 * @date       :2018-08-27

 * @function   :number and character display test

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void TEST_Number_Character(void)

{

GUI_Fill(0,0,WIDTH-1,HEIGHT/2-1,0);

GUI_ShowString(0,0,"6x8:!\"#$%&'()*+,-./:;<=>?@[]\\^_`~{}|",8,1);

GUI_ShowNum(30,16,1234567890,10,8,1);

delay_ms(1000);

OLED_Clear(0);

  GUI_ShowString(0,0,"8x16:!\"#$%&'()*+,-./:;<=>?@[]\\^_`~{}|",16,1);

GUI_ShowNum(40,32,1234567890,10,16,1);

delay_ms(1500);

OLED_Clear(0);

}

/*****************************************************************************

 * @name       :void TEST_Chinese(void)

 * @date       :2018-08-27

 * @function   :chinese display test

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void TEST_Chinese(void)

{

GUI_ShowString(45,0,"16x16",8,1);

GUI_ShowCHinese(16,20,16,"全动电子技术",1);

delay_ms(1000);

OLED_Clear(0);

GUI_ShowString(45,0,"24x24",8,1);

GUI_ShowCHinese(16,20,24,"全动电子",1);

delay_ms(1000);

OLED_Clear(0);

GUI_ShowString(45,0,"32x32",8,1);

GUI_ShowCHinese(0,20,32,"全动电子",1);

  delay_ms(1000);

OLED_Clear(0);

}

/*****************************************************************************

 * @name       :void TEST_BMP(void)

 * @date       :2018-08-27

 * @function   :BMP monochromatic picture display test

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void TEST_BMP(void)

{

GUI_DrawBMP(0,0,128,64, BMP2, 1);

delay_ms(1000);

GUI_DrawBMP(0,0,128,64, BMP3, 1);

delay_ms(1000);

GUI_DrawBMP(0,0,128,64, BMP4, 1);

delay_ms(1000);

}

/*****************************************************************************

 * @name       :void TEST_Menu1(void)

 * @date       :2018-08-27

 * @function   :Chinese selection menu display test

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void TEST_Menu1(void)

{

GUI_Fill(0,0,WIDTH-1,15,1);

GUI_ShowCHinese(32,0,16,"系统设置",0);

GUI_DrawCircle(10, 24, 1,6);

GUI_DrawCircle(10, 24, 1,3);

GUI_DrawCircle(10, 40, 1,6);

GUI_DrawCircle(10, 40, 1,3);

GUI_DrawCircle(10, 56, 1,6);

GUI_DrawCircle(10, 56, 1,3);

GUI_ShowString(20,16,"A.",16,1);

GUI_ShowCHinese(36,16,16,"音量设置",1);

GUI_ShowString(20,32,"B.",16,1);

GUI_ShowCHinese(36,32,16,"颜色设置",1);

GUI_ShowString(20,48,"C.",16,1);

GUI_ShowCHinese(36,48,16,"网络设置",1);

GUI_DrawRectangle(0, 0,WIDTH-1,HEIGHT-1,1);

GUI_DrawLine(WIDTH-1-10, 15, WIDTH-1-10, HEIGHT-1,1);

GUI_FillTriangel(WIDTH-1-9,20,WIDTH-1-5,16,WIDTH-1-1,20,1);

GUI_FillTriangel(WIDTH-1-9,HEIGHT-1-5,WIDTH-1-5,HEIGHT-1-1,WIDTH-1-1,HEIGHT-1-5,1);

GUI_FillCircle(10, 24, 1,3);

GUI_Fill(20,16,99,31,1);

GUI_ShowString(20,16,"A.",16,0);

GUI_ShowCHinese(36,16,16,"音量设置",0);

GUI_Fill(WIDTH-1-9,23,WIDTH-1-1,28,1);

delay_ms(1500);

GUI_FillCircle(10, 24, 0,3);

GUI_DrawCircle(10, 24, 1,3);

GUI_Fill(20,16,99,31,0);

GUI_ShowString(20,16,"A.",16,1);

GUI_ShowCHinese(36,16,16,"音量设置",1);

GUI_Fill(WIDTH-1-9,23,WIDTH-1-1,28,0);

GUI_FillCircle(10, 40, 1,3);

GUI_Fill(20,32,99,47,1);

GUI_ShowString(20,32,"B.",16,0);

GUI_ShowCHinese(36,32,16,"颜色设置",0);

GUI_Fill(WIDTH-1-9,37,WIDTH-1-1,42,1);

delay_ms(1500);

GUI_FillCircle(10, 40, 0,3);

GUI_DrawCircle(10, 40, 1,3);

GUI_Fill(20,32,99,47,0);

GUI_ShowString(20,32,"B.",16,1);

GUI_ShowCHinese(36,32,16,"颜色设置",1);

GUI_Fill(WIDTH-1-9,37,WIDTH-1-1,42,0);

GUI_FillCircle(10, 56, 1,3);

GUI_Fill(20,48,99,63,1);

GUI_ShowString(20,48,"C.",16,0);

GUI_ShowCHinese(36,48,16,"网络设置",0);

GUI_Fill(WIDTH-1-9,HEIGHT-1-13,WIDTH-1-1,HEIGHT-1-8,1);

delay_ms(1500);

}

/*****************************************************************************

 * @name       :void TEST_Menu2(void)

 * @date       :2018-08-27

 * @function   :English weather interface display test

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void TEST_Menu2(void)

{

u8 i;

srand(123456);

GUI_DrawLine(0, 10, WIDTH-1, 10,1);

GUI_DrawLine(WIDTH/2-1,11,WIDTH/2-1,HEIGHT-1,1);

GUI_DrawLine(WIDTH/2-1,10+(HEIGHT-10)/2-1,WIDTH-1,10+(HEIGHT-10)/2-1,1);

GUI_ShowString(0,1,"2019-08-17",8,1);

GUI_ShowString(78,1,"Saturday",8,1);

GUI_ShowString(14,HEIGHT-1-10,"Cloudy",8,1);

GUI_ShowString(WIDTH/2-1+2,13,"TEMP",8,1);

GUI_DrawCircle(WIDTH-1-19, 25, 1,2);

GUI_ShowString(WIDTH-1-14,20,"C",16,1);

GUI_ShowString(WIDTH/2-1+9,20,"32.5",16,1);

GUI_ShowString(WIDTH/2-1+2,39,"PM2.5",8,1);

GUI_ShowString(WIDTH/2-1+5,46,"90ug/m3",16,1);

GUI_DrawBMP(6,16,51,32, BMP5, 1);

for(i=0;i<15;i++)

{

GUI_ShowNum(WIDTH/2-1+9,20,rand()%4,1,16,1);

GUI_ShowNum(WIDTH/2-1+9+8,20,rand()%10,1,16,1);

GUI_ShowNum(WIDTH/2-1+9+8+16,20,rand()%10,1,16,1);

GUI_ShowNum(WIDTH/2-1+5,46,rand()%10,1,16,1);

GUI_ShowNum(WIDTH/2-1+5+8,46,rand()%10,1,16,1);

    delay_ms(500);

}

}

修改oledfont.h

```c

const typFNT_GB16 cfont16[] =

{

"欢",0x00,0x80,0x00,0x80,0xFC,0x80,0x04,0xFC,0x05,0x04,0x49,0x08,0x2A,0x40,0x14,0x40,

0x10,0x40,0x28,0xA0,0x24,0xA0,0x45,0x10,0x81,0x10,0x02,0x08,0x04,0x04,0x08,0x02,/*"欢",6*/

"迎",0x00,0x00,0x20,0x80,0x13,0x3C,0x12,0x24,0x02,0x24,0x02,0x24,0xF2,0x24,0x12,0x24,

0x12,0x24,0x12,0xB4,0x13,0x28,0x12,0x20,0x10,0x20,0x28,0x20,0x47,0xFE,0x00,0x00,/*"迎",7*/

"来",0x01,0x00,0x01,0x00,0x01,0x00,0x7F,0xFC,0x01,0x00,0x11,0x10,0x09,0x10,0x09,0x20,

0xFF,0xFE,0x03,0x80,0x05,0x40,0x09,0x20,0x31,0x18,0xC1,0x06,0x01,0x00,0x01,0x00,/*"来",8*/

"到",0x00,0x04,0xFF,0x84,0x08,0x04,0x10,0x24,0x22,0x24,0x41,0x24,0xFF,0xA4,0x08,0xA4,

0x08,0x24,0x08,0x24,0x7F,0x24,0x08,0x24,0x08,0x04,0x0F,0x84,0xF8,0x14,0x40,0x08,/*"到",9*/

"重",0x00,0x10,0x00,0xF8,0x3F,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,0x1F,0xF0,0x11,0x10,

0x1F,0xF0,0x11,0x10,0x1F,0xF0,0x01,0x00,0x3F,0xF8,0x01,0x00,0xFF,0xFE,0x00,0x00,/*"重",10*/

"庆",0x01,0x00,0x00,0x80,0x3F,0xFE,0x20,0x00,0x20,0x80,0x20,0x80,0x20,0x80,0x2F,0xFC,

0x20,0x80,0x21,0x40,0x21,0x40,0x22,0x20,0x42,0x20,0x44,0x10,0x88,0x08,0x10,0x06,/*"庆",11*/

"交",0x02,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x10,0x10,0x10,0x08,0x20,0x24,

0x48,0x24,0x04,0x40,0x02,0x80,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x30,0xC0,0x0E,/*"交",12*/

"通",0x00,0x00,0x47,0xF8,0x20,0x10,0x21,0xA0,0x00,0x40,0x07,0xFC,0xE4,0x44,0x24,0x44,

0x27,0xFC,0x24,0x44,0x24,0x44,0x27,0xFC,0x24,0x44,0x24,0x54,0x54,0x08,0x8F,0xFE,/*"通",13*/

"大",0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,

0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x40,0x08,0x20,0x10,0x10,0x20,0x08,0xC0,0x06,/*"大",14*/

"学",0x22,0x08,0x11,0x08,0x11,0x10,0x00,0x20,0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,

0x00,0x40,0x01,0x80,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,/*"学",15*/

"物",0x10,0x80,0x10,0x80,0x50,0x80,0x50,0xFC,0x7D,0x54,0x52,0x54,0x90,0x54,0x10,0x94,

0x1C,0x94,0xF1,0x24,0x52,0x24,0x10,0x44,0x10,0x44,0x10,0x84,0x11,0x28,0x10,0x10,/*"物",16*/

"联",0x00,0x88,0xFC,0x48,0x48,0x50,0x48,0x00,0x79,0xFC,0x48,0x20,0x48,0x20,0x78,0x20,

0x4B,0xFE,0x48,0x20,0x4C,0x50,0x78,0x50,0xC8,0x88,0x08,0x88,0x09,0x04,0x0A,0x02,/*"联",17*/

"网",0x00,0x00,0x7F,0xFC,0x40,0x04,0x40,0x04,0x42,0x14,0x52,0x94,0x4A,0x54,0x44,0x24,

0x44,0x24,0x4A,0x54,0x4A,0x54,0x52,0x94,0x61,0x04,0x40,0x04,0x40,0x14,0x40,0x08,/*"网",18*/

"实",0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x88,0x84,0x04,0x80,0x04,0x80,0x10,0x80,

0x08,0x80,0x08,0x80,0xFF,0xFE,0x01,0x40,0x02,0x20,0x04,0x10,0x18,0x08,0x60,0x04,/*"实",22*/

"训",0x01,0x04,0x21,0x24,0x11,0x24,0x11,0x24,0x01,0x24,0x01,0x24,0xF1,0x24,0x11,0x24,

0x11,0x24,0x11,0x24,0x11,0x24,0x15,0x24,0x19,0x24,0x12,0x24,0x02,0x04,0x04,0x04,/*"训",23*/

"室",0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x80,0x04,0x3F,0xF8,0x04,0x00,0x08,0x20,

0x1F,0xF0,0x01,0x10,0x01,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,/*"室",24*/

"!",0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,

0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,/*"!",25*/

};

修改test.c

```c

//  

//本程序只供学习使用,未经作者许可,不得用于其它任何用途

//测试硬件:单片机STM32F103RCT6,正点原子MiniSTM32开发板,主频72MHZ,晶振12MHZ

//QDtech-OLED液晶驱动 for STM32

//xiao冯@ShenZhen QDtech co.,LTD

//公司网站:www.qdtft.com

//淘宝网站:http://qdtech.taobao.com

//wiki技术网站:http://www.lcdwiki.com

//我司提供技术支持,任何技术问题欢迎随时交流学习

//固话(传真) :+86 0755-23594567

//手机:15989313508(冯工)

//邮箱:lcdwiki01@gmail.com    support@lcdwiki.com    goodtft@163.com

//技术支持QQ:3002773612  3002778157

//技术交流QQ群:324828016

//创建日期:2018/8/27

//版本:V1.0

//版权所有,盗版必究。

//Copyright(C) 深圳市全动电子技术有限公司 2018-2028

//All rights reserved

/****************************************************************************************************

//=========================================电源接线================================================//

// OLED模块               STM32单片机

//   VCC         接       DC 5V/3.3V      //OLED屏电源正

//   GND         接          GND          //OLED屏电源地

//=======================================液晶屏数据线接线==========================================//

//本模块默认数据总线类型为4线制SPI

// OLED模块               STM32单片机

//   D1          接          PB15        //OLED屏SPI写信号

//=======================================液晶屏控制线接线==========================================//

// OLED模块               STM32单片机

//   CS          接          PB11        //OLED屏片选控制信号

//   RES         接          PB12        //OLED屏复位控制信号

//   DC          接          PB10        //OLED屏数据/命令选择控制信号

//   D0          接          PB13        //OLED屏SPI时钟信号

//=========================================触摸屏接线=========================================//

//本模块不带触摸功能,所以不需要触摸屏接线

****************************************************************************************************/

/***************************************************************************************************

  * @attention

  *

  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS

  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE

  * TIME. AS A RESULT, QD electronic SHALL NOT BE HELD LIABLE FOR ANY

  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING

  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE

  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.

****************************************************************************************************/

#include "stdlib.h"

#include "stdio.h"

#include "oled.h"

#include "delay.h"

#include "gui.h"

#include "test.h"

#include "bmp.h"

/*****************************************************************************

 * @name       :void TEST_MainPage(void)

 * @date       :2018-08-27

 * @function   :Drawing the main Interface of the Comprehensive Test Program

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void roll(void)

{

OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动

  OLED_WR_Byte(0x27,OLED_CMD);        //水平向左或者右滚动 26/27

  OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节

OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0

OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔

OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7

OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节

OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节

OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

}      

void TEST_MainPage(void)

{

GUI_ShowString(0,0,"Hello",16,1);

GUI_ShowCHinese(0,18,16,"欢迎来到重庆交通大学物联网实训室!",1);

delay_ms(1500);

delay_ms(1500);

}

/*****************************************************************************

 * @name       :void Test_Color(void)

 * @date       :2018-08-27

 * @function   :Color fill test(white,black)

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void Test_Color(void)

{

 GUI_Fill(0,0,WIDTH-1,HEIGHT-1,0);

 GUI_ShowString(10,10,"BLACK",16,1);

 delay_ms(1000);

 GUI_Fill(0,0,WIDTH-1,HEIGHT-1,1);

 delay_ms(1500);

}

/*****************************************************************************

 * @name       :void Test_Rectangular(void))

 * @date       :2018-08-27

 * @function   :Rectangular display and fill test

Display black,white rectangular boxes in turn,1000

milliseconds later,Fill the rectangle in black,white in turn

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void Test_Rectangular(void)

{

GUI_Fill(0,0,WIDTH/2-1,HEIGHT-1,0);

GUI_Fill(WIDTH/2,0,WIDTH-1,HEIGHT-1,1);

GUI_DrawRectangle(5, 5, WIDTH/2-1-5, HEIGHT-1-5,1);

GUI_DrawRectangle(WIDTH/2-1+5, 5, WIDTH-1-5, HEIGHT-1-5,0);

delay_ms(1000);

GUI_FillRectangle(5, 5, WIDTH/2-1-5, HEIGHT-1-5,1);

GUI_FillRectangle(WIDTH/2-1+5, 5, WIDTH-1-5, HEIGHT-1-5,0);

delay_ms(1500);

}

/*****************************************************************************

 * @name       :void Test_Circle(void)

 * @date       :2018-08-27

 * @function   :circular display and fill test

Display black,white circular boxes in turn,1000

milliseconds later,Fill the circular in black,white in turn

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void Test_Circle(void)

{

GUI_Fill(0,0,WIDTH/2-1,HEIGHT-1,0);

GUI_Fill(WIDTH/2,0,WIDTH-1,HEIGHT-1,1);

GUI_DrawCircle(WIDTH/2/2-1, HEIGHT/2-1, 1, 27);

GUI_DrawCircle(WIDTH/2+WIDTH/2/2-1, HEIGHT/2-1, 0, 27);

delay_ms(1000);

GUI_FillCircle(WIDTH/2/2-1, HEIGHT/2-1, 1, 27);

GUI_FillCircle(WIDTH/2+WIDTH/2/2-1, HEIGHT/2-1, 0, 27);

delay_ms(1500);

}

/*****************************************************************************

 * @name       :void Test_Triangle(void)

 * @date       :2018-08-27

 * @function   :triangle display and fill test

Display black,white triangle boxes in turn,1000

milliseconds later,Fill the triangle in black,white in turn

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void Test_Triangle(void)

{

GUI_Fill(0,0,WIDTH/2-1,HEIGHT-1,0);

GUI_Fill(WIDTH/2,0,WIDTH-1,HEIGHT-1,1);

GUI_DrawTriangel(5,HEIGHT-1-5,WIDTH/2/2-1,5,WIDTH/2-1-5,HEIGHT-1-5,1);

GUI_DrawTriangel(WIDTH/2-1+5,HEIGHT-1-5,WIDTH/2+WIDTH/2/2-1,5,WIDTH-1-5,HEIGHT-1-5,0);

delay_ms(1000);

GUI_FillTriangel(5,HEIGHT-1-5,WIDTH/2/2-1,5,WIDTH/2-1-5,HEIGHT-1-5,1);

GUI_FillTriangel(WIDTH/2-1+5,HEIGHT-1-5,WIDTH/2+WIDTH/2/2-1,5,WIDTH-1-5,HEIGHT-1-5,0);

delay_ms(1500);

}

/*****************************************************************************

 * @name       :void TEST_English(void)

 * @date       :2018-08-27

 * @function   :English display test

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void TEST_English(void)

{

GUI_ShowString(0,5,"6x8:abcdefghijklmnopqrstuvwxyz",8,1);

GUI_ShowString(0,25,"8x16:abcdefghijklmnopqrstuvwxyz",16,1);

delay_ms(1000);

GUI_ShowString(0,5,"6x8:ABCDEFGHIJKLMNOPQRSTUVWXYZ",8,1);

GUI_ShowString(0,25,"8x16:ABCDEFGHIJKLMNOPQRSTUVWXYZ",16,1);

delay_ms(1500);

}

/*****************************************************************************

 * @name       :void TEST_Number_Character(void)

 * @date       :2018-08-27

 * @function   :number and character display test

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void TEST_Number_Character(void)

{

GUI_Fill(0,0,WIDTH-1,HEIGHT/2-1,0);

GUI_ShowString(0,0,"6x8:!\"#$%&'()*+,-./:;<=>?@[]\\^_`~{}|",8,1);

GUI_ShowNum(30,16,1234567890,10,8,1);

delay_ms(1000);

OLED_Clear(0);

  GUI_ShowString(0,0,"8x16:!\"#$%&'()*+,-./:;<=>?@[]\\^_`~{}|",16,1);

GUI_ShowNum(40,32,1234567890,10,16,1);

delay_ms(1500);

OLED_Clear(0);

}

/*****************************************************************************

 * @name       :void TEST_Chinese(void)

 * @date       :2018-08-27

 * @function   :chinese display test

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void TEST_Chinese(void)

{

GUI_ShowString(45,0,"16x16",8,1);

GUI_ShowCHinese(16,20,16,"全动电子技术",1);

delay_ms(1000);

OLED_Clear(0);

GUI_ShowString(45,0,"24x24",8,1);

GUI_ShowCHinese(16,20,24,"全动电子",1);

delay_ms(1000);

OLED_Clear(0);

GUI_ShowString(45,0,"32x32",8,1);

GUI_ShowCHinese(0,20,32,"全动电子",1);

  delay_ms(1000);

OLED_Clear(0);

}

/*****************************************************************************

 * @name       :void TEST_BMP(void)

 * @date       :2018-08-27

 * @function   :BMP monochromatic picture display test

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void TEST_BMP(void)

{

GUI_DrawBMP(0,0,128,64, BMP2, 1);

delay_ms(1000);

GUI_DrawBMP(0,0,128,64, BMP3, 1);

delay_ms(1000);

GUI_DrawBMP(0,0,128,64, BMP4, 1);

delay_ms(1000);

}

/*****************************************************************************

 * @name       :void TEST_Menu1(void)

 * @date       :2018-08-27

 * @function   :Chinese selection menu display test

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void TEST_Menu1(void)

{

GUI_Fill(0,0,WIDTH-1,15,1);

GUI_ShowCHinese(32,0,16,"系统设置",0);

GUI_DrawCircle(10, 24, 1,6);

GUI_DrawCircle(10, 24, 1,3);

GUI_DrawCircle(10, 40, 1,6);

GUI_DrawCircle(10, 40, 1,3);

GUI_DrawCircle(10, 56, 1,6);

GUI_DrawCircle(10, 56, 1,3);

GUI_ShowString(20,16,"A.",16,1);

GUI_ShowCHinese(36,16,16,"音量设置",1);

GUI_ShowString(20,32,"B.",16,1);

GUI_ShowCHinese(36,32,16,"颜色设置",1);

GUI_ShowString(20,48,"C.",16,1);

GUI_ShowCHinese(36,48,16,"网络设置",1);

GUI_DrawRectangle(0, 0,WIDTH-1,HEIGHT-1,1);

GUI_DrawLine(WIDTH-1-10, 15, WIDTH-1-10, HEIGHT-1,1);

GUI_FillTriangel(WIDTH-1-9,20,WIDTH-1-5,16,WIDTH-1-1,20,1);

GUI_FillTriangel(WIDTH-1-9,HEIGHT-1-5,WIDTH-1-5,HEIGHT-1-1,WIDTH-1-1,HEIGHT-1-5,1);

GUI_FillCircle(10, 24, 1,3);

GUI_Fill(20,16,99,31,1);

GUI_ShowString(20,16,"A.",16,0);

GUI_ShowCHinese(36,16,16,"音量设置",0);

GUI_Fill(WIDTH-1-9,23,WIDTH-1-1,28,1);

delay_ms(1500);

GUI_FillCircle(10, 24, 0,3);

GUI_DrawCircle(10, 24, 1,3);

GUI_Fill(20,16,99,31,0);

GUI_ShowString(20,16,"A.",16,1);

GUI_ShowCHinese(36,16,16,"音量设置",1);

GUI_Fill(WIDTH-1-9,23,WIDTH-1-1,28,0);

GUI_FillCircle(10, 40, 1,3);

GUI_Fill(20,32,99,47,1);

GUI_ShowString(20,32,"B.",16,0);

GUI_ShowCHinese(36,32,16,"颜色设置",0);

GUI_Fill(WIDTH-1-9,37,WIDTH-1-1,42,1);

delay_ms(1500);

GUI_FillCircle(10, 40, 0,3);

GUI_DrawCircle(10, 40, 1,3);

GUI_Fill(20,32,99,47,0);

GUI_ShowString(20,32,"B.",16,1);

GUI_ShowCHinese(36,32,16,"颜色设置",1);

GUI_Fill(WIDTH-1-9,37,WIDTH-1-1,42,0);

GUI_FillCircle(10, 56, 1,3);

GUI_Fill(20,48,99,63,1);

GUI_ShowString(20,48,"C.",16,0);

GUI_ShowCHinese(36,48,16,"网络设置",0);

GUI_Fill(WIDTH-1-9,HEIGHT-1-13,WIDTH-1-1,HEIGHT-1-8,1);

delay_ms(1500);

}

/*****************************************************************************

 * @name       :void TEST_Menu2(void)

 * @date       :2018-08-27

 * @function   :English weather interface display test

 * @parameters :None

 * @retvalue   :None

******************************************************************************/

void TEST_Menu2(void)

{

u8 i;

srand(123456);

GUI_DrawLine(0, 10, WIDTH-1, 10,1);

GUI_DrawLine(WIDTH/2-1,11,WIDTH/2-1,HEIGHT-1,1);

GUI_DrawLine(WIDTH/2-1,10+(HEIGHT-10)/2-1,WIDTH-1,10+(HEIGHT-10)/2-1,1);

GUI_ShowString(0,1,"2019-08-17",8,1);

GUI_ShowString(78,1,"Saturday",8,1);

GUI_ShowString(14,HEIGHT-1-10,"Cloudy",8,1);

GUI_ShowString(WIDTH/2-1+2,13,"TEMP",8,1);

GUI_DrawCircle(WIDTH-1-19, 25, 1,2);

GUI_ShowString(WIDTH-1-14,20,"C",16,1);

GUI_ShowString(WIDTH/2-1+9,20,"32.5",16,1);

GUI_ShowString(WIDTH/2-1+2,39,"PM2.5",8,1);

GUI_ShowString(WIDTH/2-1+5,46,"90ug/m3",16,1);

GUI_DrawBMP(6,16,51,32, BMP5, 1);

for(i=0;i<15;i++)

{

GUI_ShowNum(WIDTH/2-1+9,20,rand()%4,1,16,1);

GUI_ShowNum(WIDTH/2-1+9+8,20,rand()%10,1,16,1);

GUI_ShowNum(WIDTH/2-1+9+8+16,20,rand()%10,1,16,1);

GUI_ShowNum(WIDTH/2-1+5,46,rand()%10,1,16,1);

GUI_ShowNum(WIDTH/2-1+5+8,46,rand()%10,1,16,1);

    delay_ms(500);

}

}

烧录调试:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值