目前版本V1.0
V1.0 2024/2/4 更新
目录
整体电路图
DHT11是用来测温湿度的 NTC负反馈热敏电阻是用来粗略测量温度的 DS1302时钟模块
OLED是用来显示的 蜂鸣器是用来报警的 HC05是蓝牙模块和声音传感器可以选择删去(本文并没有用到)
3D效果图
我画图排版这些比较差,如果需要自己重新设计排版等需求的,可以在下面的链接中下载
百度网盘:
链接:https://pan.baidu.com/s/12ZPU9pmEkyd6dxfbSfBP3g?pwd=F103
提取码:F103
按键部分
代码部分
key.c
#include "stm32f10x.h" // Device header
#include "KEY.h"
#include "Delay.h"
/**
* @brief 按键初始化
* @param 无
* @retval 无
*/
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=Key4_Pin|Key5_Pin|Key6_Pin|Key7_Pin;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/**
* @brief 按键扫描
* @param 无
* @retval 获取按键的状态
*/
uint8_t KEY_Scan(void)
{
if(!Key_4)//左下键按下
{
while(Key_4==0)//等待按键松开
Delay_ms(5);//延时消抖
return 4;
}
else if(!Key_5)//右下键按下
{
while(Key_5==0);//等待按键松开
Delay_ms(5);//延时消抖
return 5;
}
else if(!Key_6)//左上键按下
{
while(Key_6==0);//等待按键松开
Delay_ms(5);//延时消抖
return 6;
}
else if(!Key_7)//右上键按下
{
while(Key_7==0);//等待按键松开
Delay_ms(5);//延时消抖
return 7;
}
else {return 0;}
}
key.h
#ifndef __KEY_H
#define __KEY_H
/*-------------------------------------------------------------------------------*/
/*引脚定义*/
#define Key_Port GPIOB
#define Key4_Pin GPIO_Pin_4
#define Key5_Pin GPIO_Pin_5
#define Key6_Pin GPIO_Pin_6
#define Key7_Pin GPIO_Pin_7
#define Key_4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)
#define Key_5 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)
#define Key_6 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)
#define Key_7 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)
/*-------------------------------------------------------------------------------*/
/*相关函数*/
void KEY_Init(void);
uint8_t KEY_Scan(void);
#endif
实时时钟部分
采用DS1302模块
代码部分
DS1302.c
#include "stm32f10x.h" // Device header
#include "DS1302.h"
/*-------------------------------------------------------------------------------*/
struct TIMEData TimeData;
uint8_t read_time[7];
/*起始时间定义*/
int Base_year =0x24; //year 年
int Base_month =0x02; //months 月
int Base_day =0x01; //day 日
int Base_hour =0x00; //hours 时
int Base_minute =0x00; //minutes 分
int Base_second =0x00; //seconds 秒
int Base_week =0x04; //week 星期
/*闹钟时间定义*/
int Clock_hour =0x00; //hours
int Clock_minute =0x00; //minutes
int Clock_second =0x00; //seconds
/*-------------------------------------------------------------------------------*/
/**
* @brief us延时
* @param 无
* @retval 无
*/
void DS1302_Delay_us(uint32_t xus)
{
SysTick->LOAD = 72 * xus; //设置定时器重装值
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器
}
/**
* @brief ms延时
* @param 无
* @retval 无
*/
void DS1302_Delay_ms(uint32_t xms)
{
while(xms--){DS1302_Delay_us(1000);}
}
/**
* @brief 获取实时时间
* @param 无
* @retval 无
*/
void DS1302_RealTime(void)
{
//从DS1302读取实时时间(BCD码)
read_time[0]=DS1302_read_rig(0x81);//读秒
read_time[1]=DS1302_read_rig(0x83);//读分
read_time[2]=DS1302_read_rig(0x85);//读时
read_time[3]=DS1302_read_rig(0x87);//读日
read_time[4]=DS1302_read_rig(0x89);//读月
read_time[5]=DS1302_read_rig(0x8B);//读星期
read_time[6]=DS1302_read_rig(0x8D);//读年
//BCD码转换为10进制 BCD码转十进制:DEC=BCD>>4*10+BCD&0x0f; (2位BCD) >>4 == /16 &0x0f==%16
TimeData.Base_second=(read_time[0]>>4)*10+(read_time[0]&0x0f);
TimeData.Base_minute=((read_time[1]>>4)&(0x07))*10+(read_time[1]&0x0f);
TimeData.Base_hour=(read_time[2]>>4)*10+(read_time[2]&0x0f);
TimeData.Base_day=(read_time[3]>>4)*10+(read_time[3]&0x0f);
TimeData.Base_month=(read_time[4]>>4)*10+(read_time[4]&0x0f);
TimeData.Base_week=read_time[5];
TimeData.Base_year=(read_time[6]>>4)*10+(read_time[6]&0x0f)+2000;
TimeData.Clock_hour=(Clock_hour>>4)*10+(Clock_hour&0x0f);
TimeData.Clock_minute=(Clock_minute>>4)*10+(Clock_minute&0x0f);
TimeData.Clock_second=(Clock_second>>4)*10+(Clock_second&0x0f);
DS1302_Delay_ms(5);//延时
}
/**
* @brief 基础时间设置 会自动进制 无需调整
* @param 无
* @retval 无
*/
void DS1302_BaseTime(void)
{
DS1302_wirte_rig(0x8e,0x00);//关闭写保护
DS1302_wirte_rig(0x8c,Base_year);//年
DS1302_wirte_rig(0x88,Base_month);//月
DS1302_wirte_rig(0x86,Base_day);//日
DS1302_wirte_rig(0x84,Base_hour);//小时
DS1302_wirte_rig(0x82,Base_minute);//分钟
DS1302_wirte_rig(0x80,Base_second);//秒
DS1302_wirte_rig(0x8a,Base_week);//星期
DS1302_wirte_rig(0x8e,0x80);//关闭写保护
}
/**
* @brief 初始化DS1302
* @param 无
* @retval 无
*/
void DS1302_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_Init();//开启时钟
GPIO_InitStructure.GPIO_Pin = RST_Pin; //RST CE
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(RST_PORT, &GPIO_InitStructure);//初始化RST
GPIO_InitStructure.GPIO_Pin = SCLK_Pin; //SCLK
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(SCLK_PORT, &GPIO_InitStructure);//初始化SCLK
RST(0);SCLK(0);
DS1302_BaseTime();//初始化时间
DS1302_Delay_ms(5);
}
/**
* @brief DATA引脚是要输入还是输出
* @param num 为0 输出状态
num 为1 输入状态
* @retval 无
*/
void DS1302_DATA_Init(uint16_t flag)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_Init();//开启时钟
GPIO_InitStructure.GPIO_Pin = DATA_Pin; //DATA
if(flag==0)
{
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置双向I/O端口为输出态
}
else if(flag==1)
{
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //配置双向I/O端口为输入态
}
GPIO_Init(DATA_PORT, &GPIO_InitStructure);
if(flag==0){ DATA(0);}
}
/**
* @brief 向DS1302发送一字节数据
* @param data 需要发送的字符
* @retval 无
*/
void DS1302_write_onebyte(uint8_t data)
{
DS1302_DATA_Init(0);//设置为输出模式
uint8_t count=0;
SCLK(0);
for(count=0;count<8;count++)
{ SCLK(0);
if(data&0x01){DATA(1);}
else{DATA(0);}//先准备好数据再发送
SCLK(1);//拉高时钟线,发送数据
data>>=1;
}
}
/**
* @brief 向指定寄存器地址发送数据
* @param address 地址
data 需要发送的字符
* @retval 无
*/
void DS1302_wirte_rig(uint8_t address,uint8_t data)
{
uint8_t temp1=address;
uint8_t temp2=data;
RST(0);SCLK(0);
DS1302_Delay_us(1);
RST(1);
DS1302_Delay_us(2);
DS1302_write_onebyte(temp1);
DS1302_write_onebyte(temp2);
RST(0);SCLK(0);
DS1302_Delay_us(2);
}
/**
* @brief 从指定地址读取一字节数据
* @param address 地址
* @retval 无
*/
uint8_t DS1302_read_rig(uint8_t address)
{
uint8_t temp3=address;
uint8_t count=0;
uint8_t return_data=0x00;
RST(0);SCLK(0);
DS1302_Delay_us(3);
RST(1);
DS1302_Delay_us(3);
DS1302_write_onebyte(temp3);
DS1302_DATA_Init(1);//配置I/O口为输入
DS1302_Delay_us(2);
for(count=0;count<8;count++)
{
DS1302_Delay_us(2);//使电平持续一段时间
return_data>>=1;
SCLK(1);DS1302_Delay_us(4);//使高电平持续一段时间
SCLK(0);DS1302_Delay_us(14);//延时14us后再去读取电压,更加准确
if(GPIO_ReadInputDataBit(DATA_PORT,DATA_Pin))
{return_data=return_data|0x80;}
}
DS1302_Delay_us(2);
RST(0);
DATA(0);
return return_data;
}
/**
* @brief 加值函数
* @param num需要被加值的数据
* @retval 添加后的值
*/
int add(int num)
{
num=num+1;
if((num-(int)num/0x10*0x10)%0x0A==0)
{
num=(int)num/0x10*0x10+0x10;
return num;
}
else{return num;}
}
/**
* @brief 多值加值
* @param num需要被加值的数据
* @retval 无
*/
void Set_add(int num)
{
switch(num)
{
//年
case 1:{ Base_year=add(Base_year);
if(Base_year>0x99){Base_year=0x99;}break;
}
//月
case 2:{ Base_month=add(Base_month);
if(Base_month>0x12){Base_month=Base_month-0x12;Set_add(1);}break;
}
//日
case 3:{ Base_day=add(Base_day);
if(Base_month==2)//2月
{
if(Base_year%4==0)//闰年
{
if(Base_day>0x29){Base_day=Base_day-0x29;Set_add(2);}
}
else //非闰年
{
if(Base_day>0x28){Base_day=Base_day-0x28;Set_add(2);}
}
}
else if(Base_month==4|Base_month==6|Base_month==9|Base_month==11)
{
if(Base_day>0x30){Base_day=Base_day-0x30;Set_add(2);}
}
else if(Base_month==12)//12月要判断进年
{
if(Base_day>0x31){Base_day=Base_day-0x31;Set_add(2);}
}
else //1 3 5 7 8 10 月
{
if(Base_day>0x31){Base_day=Base_day-0x31;Set_add(2);}
}
break;
}
//时
case 4:{ Base_hour=add(Base_hour);
if(Base_hour==0x24){Base_hour=0x00;}//时归0 日进1
break;
}
//分
case 5:{ Base_minute=add(Base_minute);
if(Base_minute==0x60){Base_minute=0x00;}//分归0 时进1
break;}
//秒
case 6:{ Base_second=add(Base_second);
if(Base_second==0x60){Base_second=0x00;}//秒归0 //分进1
break;}
//星期
case 7:{ Base_week=Base_week+1;
if(Base_week==0x08){Base_week=0x01;}
break;}
//闹钟时
case 8:{ Clock_hour=add(Clock_hour);
if(Clock_hour>0x24){Clock_hour=0x00;}
break;
}
//闹钟分
case 9:{ Clock_minute=add(Clock_minute);
if(Clock_minute>0x60){Clock_minute=0x00;}
break;}
//闹钟秒
case 10:{ Clock_second=add(Clock_second);
if(Clock_second>0x60){Clock_second=0x00;}
break;}
}
DS1302_Init();
}
/**
* @brief 减值函数
* @param num需要被减值的数据
* @retval 减值后的值
*/
int decrease(int num)
{
if(num%0x10==0) num=num-0x06;
num=num-1;
return num;
}
/**
* @brief 多值减值
* @param num需要被减值的数据
* @retval 无
*/
void Set_decrease(int num)
{
switch(num)
{
//年
case 1:{ Base_year=decrease(Base_year);
if(Base_year<0x00){Base_year=0x00;}
break;
}
//月
case 2:{ Base_month=decrease(Base_month);
if(Base_month<0x01){Base_month=0x12;Set_decrease(1);}break;
}
//日
case 3:{ Base_day=decrease(Base_day);
if(Base_month==3)//3月退回2月
{
if(Base_year%4==0)//闰年
{
if(Base_day<0x01){Base_day=0x29;Set_decrease(2);}
}
else //非闰年
{
if(Base_day<0x01){Base_day=0x28;Set_decrease(2);}
}
}
else if(Base_month==4|Base_month==6|Base_month==9|Base_month==11)
{
if(Base_day<0x01){Base_day=0x31;Set_decrease(2);}
}
else if(Base_month==1)//1月要判断退年
{
if(Base_day<0x01){Base_day=0x31;Set_decrease(2);}
}
else //1 3 5 7 8 10 月
{
if(Base_day<0x01){Base_day=0x30;Set_decrease(2);}
}
break;
}
//时
case 4:{ Base_hour=decrease(Base_hour);
if(!(Base_hour>0x00&&Base_hour<0x24)){Base_hour=0x00;}
break;
}
//分
case 5:{ Base_minute=decrease(Base_minute);
if(!(Base_minute>0x00&&Base_minute<0x59)){Base_minute=0x00;}
break;}
//秒
case 6:{ Base_second=decrease(Base_second);
if(!(Base_second>0x00&&Base_second<0x59)){Base_second=0x00;}
break;}
//星期
case 7:{ Base_week=Base_week-1;
if(Base_week==0x00){Base_week=0x07;}
break;}
//闹钟时
case 8:{ Clock_hour=decrease(Clock_hour);
if(!(Clock_hour>0x00&&Clock_hour<0x24)){Clock_hour=0x00;}
break;
}
//闹钟分
case 9:{ Clock_minute=decrease(Clock_minute);
if(!(Clock_minute>0x00&&Clock_minute<0x59)){Clock_minute=0x00;}
break;}
//闹钟秒
case 10:{ Clock_second=decrease(Clock_second);
if(!(Clock_second>0x00&&Clock_second<0x59)){Clock_second=0x00;}
break;}
}
DS1302_Init();
}
DS1302.h
#ifndef __DS1302_H
#define __DS1302_H
/*-------------------------------------------------------------------------------*/
/*引脚定义*/
#define RST_PORT GPIOA
#define RST_Pin GPIO_Pin_7
#define RST(x) x ? GPIO_SetBits(RST_PORT,RST_Pin): GPIO_ResetBits(RST_PORT,RST_Pin);
#define SCLK_PORT GPIOA
#define SCLK_Pin GPIO_Pin_5
#define SCLK(x) x ? GPIO_SetBits(SCLK_PORT,SCLK_Pin): GPIO_ResetBits(SCLK_PORT,SCLK_Pin);
#define DATA_PORT GPIOA
#define DATA_Pin GPIO_Pin_6
#define DATA(x) x ? GPIO_SetBits(DATA_PORT,DATA_Pin): GPIO_ResetBits(DATA_PORT,DATA_Pin);
#define RCC_Init() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/*-------------------------------------------------------------------------------*/
struct TIMEData
{
uint16_t Base_year;
uint8_t Base_month;
uint8_t Base_day;
uint8_t Base_hour;
uint8_t Base_minute;
uint8_t Base_second;
uint8_t Base_week;
uint8_t Clock_hour;
uint8_t Clock_minute;
uint8_t Clock_second;
};//创建TIMEData结构体方便存储时间日期数据
extern struct TIMEData TimeData;//全局变量
/*-------------------------------------------------------------------------------*/
/*相关函数*/
void DS1302_RealTime(void);//获取实时时间
void DS1302_BaseTime(void);//基础时间设置
void DS1302_DATA_Init(uint16_t num);//设置DATA端口输出还是输入
void DS1302_write_onebyte(uint8_t data);//向DS1302发送一字节数据
void DS1302_wirte_rig(uint8_t address,uint8_t data);//向指定寄存器写一字节数据
uint8_t DS1302_read_rig(uint8_t address);//从指定寄存器读一字节数据
void DS1302_Delay_us(uint32_t xus);
void DS1302_Delay_ms(uint32_t xms);
int add(int num);
void Set_add(int num);
int decrease(int num);
void Set_decrease(int num);
/*-------------------------------------------------------------------------------*/
/*常用函数*/
void DS1302_Init(void);//DS1302初始化函数
void Show_Time(void);//显示时间
/*-------------------------------------------------------------------------------*/
#endif
音乐播放部分
采用无缘蜂鸣器播放歌曲
代码部分
beep.c
#include "stm32f10x.h" // Device header
#include "BEEP.h"
/**
* @brief BEEP蜂鸣器初始化
* @param arr psc 定时器参数
* @retval 无
*/
void TIM2_PWM_Init(u16 arr,u16 psc)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//定时器时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外设时钟使能
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 不分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 50;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2 模式1和2正好相反变化
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse =50; //设置待装入捕获比较寄存器的脉冲值CCR
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_Cmd(TIM2, ENABLE); //使能TIM2
}
beep.h
#ifndef __BEEP_H
#define __BEEP_H
/*-------------------------------------------------------------------------------*/
/*引脚定义*/
#define BEEP_PORT GPIOA
#define BEEP_Pin GPIO_Pin_0
#define BEEP(x) x ? GPIO_SetBits(BEEP_PORT,BEEP_Pin):GPIO_ResetBits(BEEP_PORT,BEEP_Pin);
#define Beep(x) GPIO_WriteBit(BEEP_PORT,BEEP_Pin,(BitAction)(x));
/*-------------------------------------------------------------------------------*/
/*相关函数*/
void TIM2_PWM_Init(u16 arr,u16 psc);
#endif
music.c
#include "stm32f10x.h" // Device header
#include "MUSIC.h"
int tone[]=
{
H5_,H4,M6,H4,H7,H6_,H5_,M6,H4,H4,H6_,M6,H4,H4,
M6,H4_,M6,H5_,H4,M6,H4,H7,H6_,H5_,M6,H4,H4,H6_,
M6,H4,H4,M6,H6_,H4,M6, //前奏34
E,M6,M6,H4,H4,H2_,H1_, //故事的小黄花41
E,M6,M6,H4,H4,H2_,H1_,H2_,H4,H6_, //从出生那年就飘着51
E,M6,M6,H4,H4,H2_,H1_, //童年的荡秋千58
E,H1_,H2_,H1_,H1,H1_,H2_,H1,H1_,H2_,H4, //随记忆一直晃到现在69
H6_,H4,H4,H1_,H1,H1_,H2_, //lalala.....76
H4,H2_,H1_,H1_,H1_,H1_,H2_,H1_,H2_,H4, //lalala.....86
H6_,H4,H2_,H1_,H1,H1_,H2_,H4, //吹着前奏望着天空94
H2_,H1_,H1_,H1_,H1_,H2_,H1_,H2_,H4, //我想起花瓣试着掉落103
E,H4,H4,H4,H4,H5_,H4_,H4,M6,H1,H1_,H4,H4, //没想到失去的勇气我还留着116
E,H4,H4,H4,H4,H1_,H4, //好想再问一遍123
H5_,H4_,H4,M6,H1,H1_,H4,H2_, //你会等待还是离开131
H1_,H2_,H1,H1_,H4,M6,M4_,M4,M4_,M6,H4, //刮风这天我试过握着你手142
E,H4,M5_,M5_,E,M5_,M6,M6, //但偏偏雨渐渐150
E,M6,H1,H1_,H2_,H1_,H1,H1_, //大到我看你不见158
E,H1_,H1,M6,H1_,E,H1,M6,M4_,M2_,M4_,M4,M4, //还要多久我才能在你身边171
E,M4,M4,M6,M6,M5_,M6,H1, //等到放晴的那天179
H2_,H1_,H1,M6,M5_,H4,M5_,M4_,M4_, //也许我会比较好一点188
H1_,H2_,H1,H1_,E,H4,M6,M4_,M4,M4_,M6,H4, //从前从前有个人爱你很久200
E,H4,M5_,M5_,E,M5_,M6,M6, //但偏偏风渐渐208
E,M6,H1,H1_,H2_,H1_,H1,H1_, //大到我看你不见216
E,H1_,H1,M6,H1_,E,H1,M6,M4_,M2_,M4_,M4,M4, //好不容易又能再多爱一天229
E,H4,M4,M6,M6,M5_,M6, //但故事的最后236
H1,H5_,H4_,H4,H2_,H1_,H2_,E,H1_,H4, //你好像还是说了拜拜246
};
int beat[]=
{
2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2,
2, 2, 2, 2, 1, 1, 2, //前奏
2, 2, 2, 2,4, 2, 2, //故事的小黄花
2, 2, 2, 2, 2, 1, 1, 1, 1, 2, //从出生那年就飘着
2, 2, 2, 2,4, 2, 2, //童年的荡秋千
2,4, 1, 1, 1, 1, 1, 1, 1, 1, 2, //随记忆一直晃到现在
2, 2, 2, 2, 2, 2, 2, //Re So So Si Do Si La
1, 1, 2, 2, 2, 2, 1, 1, 2,4, //So La Si Si Si Si La Si La So
2, 2, 2, 2, 2, 2, 2, 1, //吹着前奏 望着天空
1, 2, 2, 2, 2, 1, 1, 2, 3, //我想起花瓣试着掉落
16, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,5, //没想到 失去的勇气我还留着
2, 1, 1, 1, 1, 2, 2, //好想再问一遍
2, 2, 2, 2, 2, 2, 2,5, //你会等待还是离开
2, 2, 2,4, 2, 2, 2, 2, 2, 2, 2, //刮风这天 我试过握着你手
2, 2, 2, 2, 2, 2, 2, 2, //但偏偏 雨渐渐
2, 2, 2, 2, 2, 2, 2,5, //大到我看你不见
3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,5, //还要多久 我才能在你身边
2, 2, 2, 2, 2, 2, 2, 2, //等到放晴的那天
2, 2, 2, 2, 2, 2, 3, 1,4, //也许我会比较好一点
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, //从前从前 有个人爱你很久
2, 2, 2, 2, 2, 2, 2, 2, //但偏偏 风渐渐
2, 2, 2, 2, 2, 2, 2,6, //大到我看你不见
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,5, //好不容易 又能再多爱一天
2, 2, 2, 2, 2, 2, 2, //但故事的最后
2, 2, 2, 2, 2, 2,4, 20, 2,8, //你好像还是说了 拜拜
};
/**
* @brief 单音符播放
* @param tone 要播放的音调
* @param time 节拍
* @param space 停顿
* @retval 无
*/
void Play_Music(int tone,int time,int space)
{
TIM_PrescalerConfig(TIM2,tone,TIM_PSCReloadMode_Immediate);
Music_Delay_ms(time);
TIM_PrescalerConfig(TIM2,0,TIM_PSCReloadMode_Immediate);
Music_Delay_ms(space);
}
/**
* @brief 播放完整音乐
* @param 无
* @retval 无
*/
void Music_play(void)
{
int space;int j;int time;
for(uint8_t i=0;i<=Music_Length;i++)
{
space=10;j=beat[i];
time=j*180;
Play_Music(tone[i],time,space);
}
}
/**
* @brief 延时
* @param 无
* @retval 无
*/
void Music_Delay_ms(uint32_t xms)
{
while(xms--)
{
SysTick->LOAD = 72 * 1000; //设置定时器重装值
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器
}
}
music.h
#ifndef __MUSIC_H
#define __MUSIC_H
/*-------------------------------------------------------------------------------*/
/*相关定义*/
#define L1 262
#define L1_ 277
#define L2 294
#define L2_ 311
#define L3 31
#define L4 349
#define L4_ 370
#define L5 392
#define L5_ 415
#define L6 440
#define L6_ 466
#define L7 494
#define M1 523
#define M1_ 554
#define M2 587
#define M2_ 622
#define M3 659
#define M4 698
#define M4_ 740
#define M5 784
#define M5_ 831
#define M6 880
#define M6_ 932
#define M7 988
#define H1 1046
#define H1_ 1109
#define H2 1175
#define H2_ 1245
#define H3 1318
#define H4 1397
#define H4_ 1480
#define H5 1568
#define H5_ 1661
#define H6 1760
#define H6_ 1865
#define H7 1976
#define E 0 //empty空拍
#define P1 16 //全音符 X----
#define P2 8 //2分音符 X-
#define P4 4 //4分音符(1拍) X
#define P8 2 //8分音符 X_
#define P16 1 //16分音符 X__
#define P32 0.5 //32分音符 X___
#define Music_Length 246
/*-------------------------------------------------------------------------------*/
/*相关函数*/
void Music_Delay_ms(uint32_t xms);
void Music_play(void);
#endif
温湿度部分
采用DHT11温湿度传感器
接线图
DHT1 ------STM32
VCC-----------STM32的3.3V供电
DATA---------STM32的PA4
NC------------悬空
GND----------STM32的GND
介绍
DHT11的更多详细通信原理等,请参考:
玩转传感器——DHT11温湿度传感器(STM32版)_温湿度传感器接线图-CSDN博客
代码部分
DHT11.c
#include "stm32f10x.h" // Device header
#include "DHT11.h"
u32 rec_data[4];//0 1 湿度 2 3温度
/**
* @brief DHT11输入输出模式
* @param mode 0输入 1输出
* @retval 无
*/
void DHT11_Mode(uint8_t mode)
{
RCC_APB2PeriphClockCmd(RCC_Port, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
if(mode ==0)//输入模式
{
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
}
else//输出模式
{
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
}
GPIO_InitStructure.GPIO_Pin = DHT11_Pin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Port, &GPIO_InitStructure);
}
/**
* @brief DHT11延时
* @param xus 多少us
* @retval 无
*/
void DHT11_Delay_us(uint32_t xus)
{
SysTick->LOAD = 72 * xus; //设置定时器重装值
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器
}
/**
* @brief DHT11延时
* @param xms 多少ms
* @retval 无
*/
void DHT11_Delay_ms(uint32_t xms)
{
while(xms--)
{
DHT11_Delay_us(1000);
}
}
/**
* @brief DHT11启动
* @param 无
* @retval 无
*/
void DHT11_Start(void) //启动
{
DHT11_Mode(1);//开启输出模式
DHT11(1);
DHT11_Delay_ms(30); //先拉高30ms
DHT11(0);
DHT11_Delay_ms(20);//拉低20ms
DHT11(1);
DHT11_Delay_us(30);//拉高30us
DHT11_Mode(0);//开启输入模式
}
/**
* @brief DHT11获取一个字节
* @param 无
* @retval 字节
*/
char DHT11_Get_Byte(void)
{
unsigned char i = 0;
unsigned char data;
for(i=0;i<8;i++) //1个数据就是1个字节byte,1个字节byte有8位bit
{
while( Read_Data == 0); //从1bit开始,低电平变高电平,等待低电平结束
DHT11_Delay_us(30); //延迟30us是为了区别数据0和数据1,0只有26~28us
data <<= 1; //左移
if( Read_Data == 1 ) //如果过了30us还是高电平的话就是数据1
{
data += 1; //数据+1
}
while( Read_Data == 1 ); //高电平变低电平,等待高电平结束
}
return data;
}
/**
* @brief DHT11获取温湿度
* @param 无
* @retval 无
*/
void DHT11_REC_Data(void)
{
unsigned int R_H,R_L,T_H,T_L;
unsigned char RH,RL,TH,TL,CHECK;
DHT11_Start(); //主机发送信号
DHT11(1); //拉高电平
if( Read_Data == 0 ) //判断DHT11是否响应
{
while( Read_Data == 0); //低电平变高电平,等待低电平结束
while( Read_Data == 1); //高电平变低电平,等待高电平结束
R_H = DHT11_Get_Byte();
R_L = DHT11_Get_Byte();
T_H = DHT11_Get_Byte();
T_L = DHT11_Get_Byte();
CHECK = DHT11_Get_Byte(); //接收5个数据
DHT11(0); //当最后一bit数据传送完毕后,DHT11拉低总线 50us
DHT11_Delay_us(55); //这里延时55us
DHT11(1); //随后总线由上拉电阻拉高进入空闲状态。
if(R_H + R_L + T_H + T_L == CHECK) //和检验位对比,判断校验接收到的数据是否正确
{
RH = R_H;
RL = R_L;
TH = T_H;
TL = T_L;
}
}
rec_data[0] = RH;//湿度整数
rec_data[1] = RL;//湿度小数
rec_data[2] = TH;//温度整数
rec_data[3] = TL;//温度小数
}
DHT11.h
#ifndef __DHT11_H
#define __DHT11_H
extern u32 rec_data[4];
/*----------------------------DHT11引脚配置----------------------------*/
#define DHT11_Pin GPIO_Pin_4
#define Port GPIOA
#define RCC_Port RCC_APB2Periph_GPIOA
#define DHT11(x) x?GPIO_SetBits(Port, DHT11_Pin):GPIO_ResetBits(Port, DHT11_Pin)//置电平
#define Read_Data GPIO_ReadInputDataBit(Port, DHT11_Pin) //读取电平
/*------------------------------函数------------------------------*/
void DHT11_Delay_us(uint32_t xus);
void DHT11_Delay_ms(uint32_t xms);
void DHT11_Mode(uint8_t mode);
void DHT11_Start(void);
char DHT11_Get_Byte(void);
void DHT11_REC_Data(void);//获取数据
#endif
OLED显示部分
OLED.c
#include "stm32f10x.h" // Device header
#include "Font_Library.h"
#include "OLED.h"
const float PI = 3.1415926;
/**
* @brief I2C的状态
* @param 无
* @retval 无
*/
void OLED_I2C_STATE(uint8_t mode)
{
if (mode==1)//I2C开始
{
I2C_W_SDA(1);
I2C_W_SCL(1);
I2C_W_SDA(0);
I2C_W_SCL(0);
}
else if(mode==0)// I2C停止
{
I2C_W_SDA(0);
I2C_W_SCL(1);
I2C_W_SDA(1);
}
}
/**
* @brief 发送一个字节
* @param Byte 要发送的一个字节
* @retval 无
*/
void OLED_SendByte(uint8_t Byte)
{
if(CP==0)//SPI
{
for (uint8_t i = 0; i < 8; i++)
{
SPI_W_D0(0);
SPI_W_D1(Byte & (0x80 >> i));
SPI_W_D0(1);
}
}
else if(CP==1)//I2C
{
for (uint8_t i = 0; i < 8; i++)
{
I2C_W_SDA(Byte & (0x80 >> i));
I2C_W_SCL(1);
I2C_W_SCL(0);
}
I2C_W_SCL(1); //额外的一个时钟,不处理应答信号
I2C_W_SCL(0);
}
}
/**
* @brief OLED写命令
* @param Command 要写入的命令
* @retval 无
*/
void OLED_WriteCommand(uint8_t Command)
{
if(CP==0)//SPI
{
SPI_W_CS(0);
SPI_W_DC(0);
OLED_SendByte(Command);
SPI_W_CS(1);
}
else if(CP==1)//I2C
{
OLED_I2C_STATE(1);
OLED_SendByte(0x78); //从机地址
OLED_SendByte(0x00); //写命令
OLED_SendByte(Command);
OLED_I2C_STATE(0);
}
}
/**
* @brief OLED写数据
* @param Data 要写入的数据
* @retval 无
*/
void OLED_WriteData(uint8_t Data)
{
if(CP==0)//SPI
{
SPI_W_CS(0);
SPI_W_DC(1);
OLED_SendByte(Data);
SPI_W_CS(1);
}
else if(CP==1)//I2C
{
OLED_I2C_STATE(1);
OLED_SendByte(0x78); //从机地址
OLED_SendByte(0x40); //写数据
OLED_SendByte(Data);
OLED_I2C_STATE(0);
}
}
/**
* @brief OLED设置光标位置
* @param Y 以左上角为原点,向下方向的坐标,范围:0~7
* @param X 以左上角为原点,向右方向的坐标,范围:0~127
* @retval 无
*/
void OLED_SetCursor(uint8_t Y, uint8_t X)
{
OLED_WriteCommand(0xB0 | Y); //设置Y位置
OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4)); //设置X位置高4位
OLED_WriteCommand((X & 0x0F)|0x00 ); //设置X位置低4位
}
/**
* @brief OLED清屏
* @param 无
* @retval 无
*/
void OLED_Clear(void)
{
for (uint8_t j = 0; j < 8; j++)
{
OLED_SetCursor(j, 0);
for(uint8_t i = 0; i < OLED_Length; i++)
{
OLED_WriteData(0x00);
}
}
}
/**
* @brief OLED清屏(某行某列)
* @param hang 0~4 第0~4行 如果只要清列 hang=0
* @param lie 0~16 第0~16列 如果只要清行 lie=0
* @retval 无
*/
void OLED_Clear_hang(uint8_t hang,uint8_t lie)
{
uint8_t i, j;
for (j = hang*2-2; j < 2*hang; j++)
{
OLED_SetCursor(j, 0);
for(i = 0; i < OLED_Length; i++)
{
OLED_WriteData(0x00);
}
}
for (j = 0; j < 8; j++)
{
OLED_SetCursor(j, lie*8-8);
for(i = lie*8-8; i <lie*8; i++)
{
OLED_WriteData(0x00);
}
}
}
/**
* @brief OLED显示一个字符
* @param Line 行位置,范围:1~4
* @param Column 列位置,范围:1~16
* @param Char 要显示的一个字符,范围:ASCII可见字符
* @retval 无
*/
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char)
{
OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8); //设置光标位置在上半部分
for (uint8_t i = 0; i < 8; i++)
{
OLED_WriteData(ASCALL_8x16[Char - ' '][i]); //显示上半部分内容
}
OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8); //设置光标位置在下半部分
for (uint8_t i = 0; i < 8; i++)
{
OLED_WriteData(ASCALL_8x16[Char - ' '][i + 8]); //显示下半部分内容
}
}
/**
* @brief OLED显示字符串
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param String 要显示的字符串,范围:ASCII可见字符
* @retval 无
*/
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{
for (uint8_t i = 0; String[i] != '\0'; i++)
{
OLED_ShowChar(Line, Column + i, String[i]);
}
}
/**
* @brief OLED显示数字(十进制,正数
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~4294967295
* @retval 无
*/
void OLED_ShowUnsignedNum(uint8_t Line, uint8_t Column, uint32_t Number,uint8_t Length)
{
for (uint8_t i = 0; i < Length; i++)
{
OLED_ShowChar(Line, Column + i, Number / MyPow(10, Length - i - 1) % 10 + '0');
}
}
/**
* @brief OLED显示数字(十进制,正数)
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~4294967295
* @retval 无
*/
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number)
{
uint8_t Length=MyJudge(Number);//要显示数字的长度,范围:1~10
for (uint8_t i = 0; i < Length; i++)
{
OLED_ShowChar(Line, Column + i, Number / MyPow(10, Length - i - 1) % 10 + '0');
}
}
/**
* @brief OLED显示数字(十进制,带符号数)
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:-2147483648~2147483647
* @retval 无
*/
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number)
{
uint32_t Number1= Number;
if (Number >= 0)
{
OLED_ShowChar(Line, Column, '+');
}
else
{
OLED_ShowChar(Line, Column, '-');
Number1 = -Number;
}
uint8_t length=MyJudge(Number);//要显示数字的长度,范围:1~10
for (uint8_t i = 0; i < length; i++)
{
OLED_ShowChar(Line, Column + i + 1, Number1 / MyPow(10, length - i - 1) % 10 + '0');
}
}
/**
* @brief 获取整数有几位
* @param num 整数值 范围:-2147483648~2147483647
* @retval datalength 几位
*/
int32_t MyJudge(int32_t num)
{
int32_t integer=num;
int32_t datalength=0;
while(integer!=0)
{
datalength++;
integer=integer/10;//一共有几位
}
if (num==0) datalength=1;
return datalength;
}
/**
* @brief OLED显示数字(十六进制,正数)
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~0xFFFFFFFF
* @param Length 要显示数字的长度,范围:1~8
* @retval 无
*/
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
uint8_t i, SingleNumber;
for (i = 0; i < Length; i++)
{
SingleNumber = Number / MyPow(16, Length - i - 1) % 16;
if (SingleNumber < 10)
{
OLED_ShowChar(Line, Column + i, SingleNumber + '0');
}
else
{
OLED_ShowChar(Line, Column + i, SingleNumber - 10 + 'A');
}
}
}
/**
* @brief OLED显示数字(二进制,正数)
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~1111 1111 1111 1111
* @param Length 要显示数字的长度,范围:1~16
* @retval 无
*/
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
for (uint8_t i = 0; i < Length; i++)
{
OLED_ShowChar(Line, Column + i, Number / MyPow(2, Length - i - 1) % 2 + '0');
}
}
/**
* @brief OLED初始化
* @param 无
* @retval 无
*/
void OLED_Init(void)
{
for (uint32_t i = 0; i < 1000; i++) //上电延时
{
for (uint32_t j = 0; j < 1000; j++);
}
if(CP==1)//I2C初始化
{
I2C_RCC();
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN;
GPIO_Init(I2C_SCL_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = I2C_SDA_PIN;
GPIO_Init(I2C_SDA_PORT, &GPIO_InitStructure);
I2C_W_SCL(1);
I2C_W_SDA(1);
}
else if(CP==0)//SPI
{
SPI_RCC();
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = SPI_D0_Pin;
GPIO_Init(SPI_D0_Port, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SPI_D1_Pin;
GPIO_Init(SPI_D1_Port, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SPI_RES_Pin;
GPIO_Init(SPI_RES_Port, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SPI_DC_Pin;
GPIO_Init(SPI_DC_Port, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SPI_CS_Pin;
GPIO_Init(SPI_CS_Port, &GPIO_InitStructure);
SPI_W_D0(1);
SPI_W_D1(1);
SPI_W_RES(1);
SPI_W_DC(1);
SPI_W_CS(1);
}
OLED_WriteCommand(0xAE); //关闭显示
OLED_WriteCommand(0xD5); //设置显示时钟分频比/振荡器频率
OLED_WriteCommand(0x80);
OLED_WriteCommand(0xA8); //设置多路复用率
OLED_WriteCommand(0x3F);
OLED_WriteCommand(0xD3); //设置显示偏移
OLED_WriteCommand(0x00);
OLED_WriteCommand(0x40); //设置显示开始行
OLED_WriteCommand(0xA1); //设置左右方向,0xA1正常 0xA0左右反置
OLED_WriteCommand(0xC8); //设置上下方向,0xC8正常 0xC0上下反置
OLED_WriteCommand(0xDA); //设置COM引脚硬件配置
OLED_WriteCommand(0x12);
OLED_WriteCommand(0x81); //设置对比度控制
OLED_WriteCommand(0xCF);
OLED_WriteCommand(0xD9); //设置预充电周期
OLED_WriteCommand(0xF1);
OLED_WriteCommand(0xDB); //设置VCOMH取消选择级别
OLED_WriteCommand(0x30);
OLED_WriteCommand(0xA4); //设置整个显示打开/关闭
OLED_WriteCommand(0xA6); //设置正常/倒转显示
OLED_WriteCommand(0x8D); //设置充电泵
OLED_WriteCommand(0x14);
OLED_WriteCommand(0xAF); //开启显示
OLED_Clear(); //OLED清屏
}
/**
* @brief oled显示汉字
* @param Line 起始行位置
* @param Column 起始列位置
* @param num字模库的下标位置
* @retval 无
*/
void OLED_ShowChinese(uint8_t Line, uint8_t Column, uint8_t Num)
{
uint8_t wide = 16;//字宽
OLED_SetCursor(( Line - 1 ) * 2, ( Column - 1 )* wide); //参数1:把光标设置在第几行. 参数2:把光标设置在第几列
for (uint8_t i = 0; i < wide; i++)
{
OLED_WriteData(Chinese_16x16_[2*Num][i]);//显示上半部分内容
}
OLED_SetCursor(( Line - 1 ) * 2 + 1,( Column - 1) * wide);
for (uint8_t i = 0; i < wide ; i++)
{
OLED_WriteData(Chinese_16x16_[2*Num][i+wide]);//显示下半部分内容
}
}
/**
* @brief 绘制一个像素点
* @param xy 坐标 x的范围0~127,y的范围0~64
* @retval 无
*/
void OLED_PutPixel(uint8_t x,uint8_t y)
{
uint8_t data1= 0x01<<(y%8);; //data1当前点的数据
OLED_WriteCommand(0xb0+(y>>3));
OLED_WriteCommand(((x&0xf0)>>4)|0x10);
OLED_WriteCommand((x&0x0f)|0x00);
OLED_WriteData(data1);
}
/**
* @brief 绘制一个菱形
* @param xy 中心坐标
* @param d 端点距离中心的距离
* @retval 无
*/
void OLED_PutDiamond(uint8_t x,uint8_t y,uint8_t d)
{
for(uint8_t i=0;i<=d;i++)
{
OLED_PutPixel(x-i,y-d+i);//左上
OLED_PutPixel(x-d+i,y+i);//左下
OLED_PutPixel(x+i,y-d+i);//右上
OLED_PutPixel(x+d-i,y+i);//右下
}
}
/**
* @brief 绘制一个长方形
* @param xy 中心坐标
* @param l长
* @param w宽
* @retval 无
*/
void OLED_PutRectangle(uint8_t x,uint8_t y,uint8_t l,uint8_t w)
{
uint8_t width=w;
uint8_t length=l;
if(width>=length)
{
uint8_t t=width;
width=length;
length=t;
}
for(uint8_t i=0;i<=width;i++)
{
OLED_PutPixel(x-length/2,y-width/2+i);
OLED_PutPixel(x+length/2,y-width/2+i);
}
for(uint8_t i=0;i<=length;i++)
{
OLED_PutPixel(x-length/2+i,y-width/2);
OLED_PutPixel(x-length/2+i,y+width/2);
}
}
/**
* @brief 绘制一个圆形
* @param xy 圆心坐标
* @param r半径
* @retval 无
*/
void OLED_PutCircle(uint8_t x,uint8_t y,uint8_t r)
{
double k=(PI/360);//数值不要改动
for(int i=0;i<=180;i++)
{
OLED_PutPixel(x+MyCos(k*i)*r,y+MySin(k*i)*r);//上半圆
OLED_PutPixel(x+MyCos(k*i)*r,y-MySin(k*i)*r);//上半圆
OLED_PutPixel(x-MyCos(k*i)*r,y-MySin(k*i)*r);//下半圆
OLED_PutPixel(x-MyCos(k*i)*r,y+MySin(k*i)*r);//下半圆
}
OLED_Delay_ms(5);
}
/**
* @brief 绘制一条直线
* @param x1y1 点坐标
* @param x2y2 点坐标
* @retval 无
*/
void OLED_PutLine(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2)
{
uint8_t Y1=y1;
int8_t deltaX=x2-x1;
int8_t deltaY=y2-y1;
int8_t k= deltaY/deltaX;
if(x1>x2){deltaX=-deltaX;}
if(y1>y2){Y1=y2;deltaY=-deltaY;}
if(x1==x2)
{
for(uint8_t i=0;i<=deltaY;i++)
{
OLED_PutPixel(x1,Y1+i);
}
}
else
{
for(uint8_t i=0;i<=(int)deltaX;i++)
{
OLED_PutPixel(x1+i,(int)(k * i + y1));
}
}
}
/**
* @brief 自动显示浮点数的整数部分和小数部分 并自带符号
* @param hang 显示在第几行
* @param lie 显示从第几列开始
* @param num 数值
* @param reserve 需要保留几位小鼠
* @retval 无
*/
void OLED_ShowFloat (uint8_t hang,uint8_t lie,double num,uint8_t reserve)
{
int32_t integer=(int)num;
uint8_t length=MyJudge(integer);
float decimal=(num-integer)*MyPow(10,reserve);
if (num<0){decimal=-decimal;}
OLED_ShowSignedNum(hang,lie,integer);//整数部分
OLED_ShowString(hang,length+lie+1,"."); //小数点
OLED_ShowNum(hang,length+lie+2,decimal);//小数部分
}
/*水平滚动*/
/**************************************
* 函 数 名: OLED_vertical_scroll
* 功能说明: 水平滚动
* 形 参: 第二行27 向右 26向左
* 返 回 值: 无
*************************************/
//void OLED_vertical_scroll(void)
//{
// OLED_WriteCommand(0x2E); //关闭滚动
//
// OLED_WriteCommand(0x26); //27向右 26向左
//
// OLED_WriteCommand(0x00); //虚拟字节
// OLED_WriteCommand(0x00); //起始页
// OLED_WriteCommand(0x07); //滚动时间间隔 0x07
// OLED_WriteCommand(0x07); //终止页 7
// OLED_WriteCommand(0x00); //虚拟字节
// OLED_WriteCommand(0xFF); //虚拟字节
// OLED_WriteCommand(0x2F); //开启滚动
//}
/**
* @brief OLED次方函数
* @retval 返回值等于X的Y次方
*/
int32_t MyPow(int32_t X, int32_t Y)
{
uint32_t Result = 1;
while (Y--) {Result *= X;}
return Result;
}
/**
* @brief 求绝对值
* @retval 绝对值
*/
int32_t MyAbs(int32_t x)
{
return ((x > 0) ? x : -x);
}
/**
* @brief 求绝对值
* @retval 绝对值
*/
float MyFabs(float x)
{
return ((x > 0.0) ? x : -x);
}
/**
* @brief 求sin
* @retval sin
*/
float MySin(float x)
{
float n,sum,x2,temp;
int32_t i, m;
m = (int32_t)(x / 2/PI);
x = x - 2*PI * m;
n = x;
sum = 0.0f;
i = 1;
x2 = x * x;
do
{
sum += n;
i++;
temp = -n * x2;
n = temp / (((i << 2) - 6) * i + 2); // n = temp / (2*i - 1) / (2*i - 2);
} while (MyFabs(n)>=(1e-3f));
return sum;
}
/**
* @brief 求cos
* @retval cos
*/
float MyCos(float x)
{
return MySin(PI/2.0f-x);
}
/**
* @brief 求tan
* @retval tan
*/
float MyTan(float x)
{
return MySin(x)/MyCos(x);
}
/**
* @brief 求最小值
* @retval min
*/
int32_t MyMin(int32_t x, int32_t y)
{
return ((x>y)?y:x);
}
/**
* @brief 求最大值
* @retval max
*/
int32_t MyMax(int32_t x, int32_t y)
{
return ((x>y)?x:y);
}
/**
* @brief 显示正弦波
* @param max 最大值
* @retval 无
*/
void OLED_PutSin(int max)
{
float sin_arr[OLED_Length+1];
for(uint8_t i =1;i<=OLED_Length;i++)
{
sin_arr[i]=(MySin(2*PI*i/OLED_width)*max)/OLED_width*1.5+OLED_width/2;
OLED_PutPixel(i,sin_arr[i]);
OLED_Delay_ms(5);
if(i==OLED_Length-1){OLED_Delay_ms(500);OLED_Clear();}
}
}
/**
* @brief 显示方波
* @param max min 最大值最小值
* @param paragraph 要几个周期的波形 (分几段)
* @retval 无
* @example OLED_PutSquare(0,256,2);
*/
void OLED_PutSquare(uint16_t min,uint16_t max,uint16_t paragraph)
{
uint16_t square_arr[OLED_Length];
uint16_t max_min=max-min;
paragraph=paragraph*2;
for(uint16_t i=1;i<=paragraph;i++)
{
for(uint16_t j =(i-1)*OLED_Length/paragraph;j<=i*OLED_Length/paragraph;j++)
{
square_arr[j]=max_min/OLED_width+OLED_width/2+20*MyPow(-1,i-1);
}
}
uint16_t Left;uint16_t Right;
for(uint16_t i =0;i<=OLED_Length-1;i++)
{
OLED_PutPixel(i,square_arr[i]);
OLED_Delay_ms(10);
if(i!=0)
{
Left=MyMin(square_arr[i],square_arr[i-1]);
Right=MyMax(square_arr[i],square_arr[i-1]);
for(uint16_t j=Left;j<=Right;j++){OLED_PutPixel(i,j);}
}
if(i==OLED_Length-1){OLED_Clear();}
}
}
/**
* @brief 显示三角波
* @param max min 最大值最小值
* @param paragraph 要几个周期的波形 (分几段)
* @retval 无
* @example OLED_triangular_arr(0,256,8);
*/
void OLED_PutTriangular(int min,int max,int paragraph)
{
float triangular_arr[OLED_Length];
int max_min=max-min;
int Paragraph=paragraph*2;
for(int i=1;i<=Paragraph;i++)
{
for(int j =(i-1)*OLED_Length/Paragraph;j<=i*OLED_Length/Paragraph;j++)
{
if(i%2==1)
{
triangular_arr[j]=min/OLED_width+max_min/OLED_width*(-j+i*OLED_Length/Paragraph);//偶数段上升
}
else
{
triangular_arr[j]=max/OLED_width-max_min/OLED_width*(j-(i-1)*OLED_Length/Paragraph);//奇数段下降
}
}
}
//显示示例
for(int j =0;j<OLED_Length;j++)
{
OLED_PutPixel(j,triangular_arr[j]);
OLED_Delay_ms(10);
if(j==OLED_Length-1){OLED_Clear();}
}
}
void OLED_Delay_us(uint32_t xus)
{
SysTick->LOAD = 72 * xus; //设置定时器重装值
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器
}
void OLED_Delay_ms(uint32_t xms)
{
while(xms--)
{
OLED_Delay_us(1000);
}
}
void OLED_Delay_s(uint32_t xs)
{
while(xs--)
{
OLED_Delay_ms(1000);
}
}
OLED.h
#ifndef __OLED_H
#define __OLED_H
extern const float PI;
/*------------------------------------------------------------------*/
/*OLED尺寸大小定义*/
#define OLED_Length 128
#define OLED_width 64
/*------------------------------------------------------------------*/
/*通信协议选择*/
//int SPI=0; int I2C=1;
#define CP 1 //Communication_protocol通信协议
/*----------------------------I2C引脚配置----------------------------*/
#define I2C_SCL_PIN GPIO_Pin_12
#define I2C_SCL_PORT GPIOB
#define I2C_SDA_PIN GPIO_Pin_13
#define I2C_SDA_PORT GPIOB
#define I2C_RCC() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE)
#define I2C_W_SCL(x) GPIO_WriteBit(I2C_SCL_PORT,I2C_SCL_PIN, (BitAction)(x))
#define I2C_W_SDA(x) GPIO_WriteBit(I2C_SDA_PORT,I2C_SDA_PIN, (BitAction)(x))
/*----------------------------SPI引脚配置----------------------------*/
#define SPI_D0_Pin GPIO_Pin_12
#define SPI_D0_Port GPIOB
#define SPI_D1_Pin GPIO_Pin_13
#define SPI_D1_Port GPIOB
#define SPI_RES_Pin GPIO_Pin_14
#define SPI_RES_Port GPIOB
#define SPI_DC_Pin GPIO_Pin_15
#define SPI_DC_Port GPIOB
#define SPI_CS_Pin GPIO_Pin_8
#define SPI_CS_Port GPIOA
#define SPI_RCC() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);\
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
#define SPI_W_D0(x) GPIO_WriteBit(SPI_D0_Port, SPI_D0_Pin, (BitAction)(x))
#define SPI_W_D1(x) GPIO_WriteBit(SPI_D1_Port, SPI_D1_Pin, (BitAction)(x))
#define SPI_W_RES(x) GPIO_WriteBit(SPI_RES_Port,SPI_RES_Pin, (BitAction)(x))
#define SPI_W_DC(x) GPIO_WriteBit(SPI_DC_Port, SPI_DC_Pin, (BitAction)(x))
#define SPI_W_CS(x) GPIO_WriteBit(SPI_CS_Port, SPI_CS_Pin, (BitAction)(x))
/*------------------------------------------------------------------*/
/*常用函数*/
void OLED_Init(void);//初始化
void OLED_Clear(void);//清屏
void OLED_Clear_hang(uint8_t hang,uint8_t lie);//清楚某列某行
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number);//显示数值
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String);//显示字符串
void OLED_ShowChinese(uint8_t Line, uint8_t Column, uint8_t Num);//显示汉字
void OLED_ShowFloat (uint8_t hang,uint8_t lie,double num,uint8_t reserve);//显示浮点数
void OLED_ShowUnsignedNum(uint8_t Line, uint8_t Column, uint32_t Number,uint8_t Length);//限制长度显示
/*------------------------------------------------------------------*/
/*数据传输函数*/
void OLED_I2C_STATE(uint8_t mode);
void OLED_SendByte(uint8_t Byte);
void OLED_WriteData(uint8_t Data);
void OLED_WriteCommand(uint8_t Command);
void OLED_SetCursor(uint8_t Y, uint8_t X);
/*------------------------------------------------------------------*/
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char);
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number);
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowFloat(uint8_t hang,uint8_t lie,double num,uint8_t reserve);
/*------------------------------------------------------------------*/
/*延时函数*/
void OLED_Delay_us(uint32_t xms);
void OLED_Delay_ms(uint32_t xms);
void OLED_Delay_s(uint32_t xs);
/*------------------------------------------------------------------*/
/*数学函数*/
int32_t MyPow(int32_t X, int32_t Y);
int32_t MyJudge(int32_t num);
int32_t MyAbs(int32_t x);
float MyFabs(float x);
float MySin(float x);
float MyCos(float x);
float MyTan(float x);
int32_t MyMin(int32_t x, int32_t y);
int32_t MyMax(int32_t x, int32_t y);
/*------------------------------------------------------------------*/
/*绘图函数*/
void OLED_PutPixel(uint8_t x,uint8_t y);
void OLED_PutDiamond(uint8_t x,uint8_t y,uint8_t d);
void OLED_PutRectangle(uint8_t x,uint8_t y,uint8_t l,uint8_t w);
void OLED_PutCircle(uint8_t x,uint8_t y,uint8_t r) ;
void OLED_PutLine(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2) ;
void OLED_PutSin(int max);
void OLED_PutSquare(uint16_t min,uint16_t max,uint16_t paragraph);
void OLED_PutTriangular(int min,int max,int paragraph);
/*------------------------------------------------------------------*/
#endif
汉字库
Font_Library.h
#ifndef __Font_Library_H
#define __Font_Library_H
/*OLED字模库,宽8像素,高16像素*/
const uint8_t ASCALL_8x16[][16]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,
0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,
0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,
0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,
0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,
0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,
0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,
0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,
0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,
0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,
0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,
0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,
0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,
0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,
0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,
0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,
0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,
0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,
0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,
0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,
0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,
0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,
0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,
0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,
0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,
0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,
0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,
0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,
0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,
0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,
0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,
0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,
0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,
0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,
0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,
0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,
0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,
0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,
0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,
0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,
0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,
0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,
0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,
0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,
0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,
0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,
0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,
0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,
0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,
0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,
0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,
0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,
0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};
/* (16 X 16 , 宋体 )*/
const uint8_t Chinese_16x16_[][16]=
{
{0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00},//dian
{0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00},//电0
{0x10,0x0C,0x44,0x24,0x14,0x84,0x45,0x26,0x44,0x84,0x14,0x24,0x44,0x14,0x0C,0x00},//rong
{0x04,0x04,0x02,0xFE,0x45,0x44,0x44,0x44,0x44,0x44,0x45,0xFE,0x02,0x04,0x04,0x00},/*"容",1*/
{0x00,0x00,0xFC,0x04,0xD4,0x54,0x54,0x54,0xD4,0x04,0x7F,0x84,0xC5,0x36,0x04,0x00},//gan
{0x88,0x66,0x01,0x00,0x63,0x82,0x82,0x92,0xAB,0x84,0x82,0xC1,0x02,0x24,0xCF,0x00},/*"感",2*/
{0x00,0xFE,0x02,0x22,0xDA,0x06,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00},//zu
{0x00,0xFF,0x08,0x10,0x08,0x47,0x40,0x7F,0x42,0x42,0x42,0x42,0x7F,0x40,0x40,0x00},/*"阻",3*/
{0x00,0x00,0xFE,0x02,0x82,0x82,0x82,0x82,0xFA,0x82,0x82,0x82,0x82,0x82,0x02,0x00},//ya
{0x80,0x60,0x1F,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x44,0x58,0x40,0x40,0x00},/*"压",4*/
{0x10,0x60,0x02,0x8C,0x00,0x44,0x64,0x54,0x4D,0x46,0x44,0x54,0x64,0xC4,0x04,0x00},//liu
{0x04,0x04,0x7E,0x01,0x80,0x40,0x3E,0x00,0x00,0xFE,0x00,0x00,0x7E,0x80,0xE0,0x00},/*"流",5*/
{0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00},//nian
{0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00},/*"年",6*/
{0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00},//yue
{0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00},/*"月",7*/
{0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00},//ri
{0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00},/*"日",8*/
{0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00},//shi
{0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0x00},/*"时",9*/
{0x80,0x40,0x20,0x90,0x88,0x86,0x80,0x80,0x80,0x83,0x8C,0x10,0x20,0x40,0x80,0x00},//fen
{0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00,0x00},/*"分",10*/
{0x24,0x24,0xA4,0xFE,0x23,0x22,0x00,0xC0,0x38,0x00,0xFF,0x00,0x08,0x10,0x60,0x00},//miao
{0x08,0x06,0x01,0xFF,0x01,0x06,0x81,0x80,0x40,0x40,0x27,0x10,0x0C,0x03,0x00,0x00},/*"秒",11*/
{0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00},//zheng
{0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00},/*"正",12*/
{0x00,0x20,0x10,0xE8,0x24,0x27,0x24,0xA4,0x24,0x34,0x2C,0xE0,0x00,0x00,0x00,0x00},//fu
{0x00,0x80,0x80,0x4F,0x40,0x20,0x18,0x07,0x10,0x10,0x20,0x4F,0x80,0x00,0x00,0x00},/*"负",13*/
{0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00},//san
{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00},/*"三",14*/
{0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00},//er
{0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00},/*"二",15*/
{0x10,0x10,0xD0,0xFF,0x90,0x10,0x02,0x02,0xFE,0x02,0x02,0x62,0x5A,0xC6,0x00,0x00},//ji
{0x04,0x03,0x00,0xFF,0x00,0x43,0x30,0x8F,0x80,0x43,0x2C,0x10,0x2C,0x43,0x80,0x00},/*"极",16*/
{0x88,0x64,0x23,0xA2,0xA6,0xAA,0xA2,0xBA,0xA4,0xA3,0xA2,0x26,0x2A,0xA2,0x62,0x00},//guan
{0x00,0x00,0x00,0xFF,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4B,0xF8,0x00,0x00,0x00,0x00},/*"管",17*/
{0x00,0x00,0xC0,0x40,0x40,0x40,0x7F,0x48,0x48,0x48,0x48,0xC8,0x08,0x08,0x00,0x00},//dian
{0x80,0x40,0x37,0x04,0x04,0x14,0x64,0x04,0x14,0x64,0x04,0x07,0x10,0xE0,0x00,0x00},/*"点",18*/
{0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0xC8,0x49,0x4E,0x48,0xC8,0x08,0x08,0x00,0x00},//kang
{0x04,0x44,0x82,0x7F,0x01,0x80,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00},/*"抗",19*/
{0x40,0x7C,0x40,0x7F,0x48,0x48,0x40,0xF2,0x12,0x1A,0xD6,0x12,0x12,0xF2,0x02,0x00},//ping
{0x90,0x8E,0x40,0x4F,0x20,0x1E,0x80,0x4F,0x20,0x18,0x07,0x10,0x20,0x4F,0x80,0x00},/*"频",20*/
{0x00,0x14,0xA4,0x44,0x24,0x34,0xAD,0x66,0x24,0x94,0x04,0x44,0xA4,0x14,0x00,0x00},//lv
{0x08,0x09,0x08,0x08,0x09,0x09,0x09,0xFD,0x09,0x09,0x0B,0x08,0x08,0x09,0x08,0x00},/*"率",21*/
{0x00,0x00,0xFE,0x82,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0xFE,0x00,0x00,0x00},//zhou
{0x80,0x60,0x1F,0x00,0x00,0x1E,0x12,0x12,0x12,0x1E,0x40,0x80,0x7F,0x00,0x00,0x00},/*"周",22*/
{0x00,0x04,0xFF,0x24,0x24,0x24,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00},//qi
{0x88,0x48,0x2F,0x09,0x09,0x19,0xAF,0x48,0x30,0x0F,0x02,0x42,0x82,0x7F,0x00,0x00},/*"期",23*/
{0x08,0x08,0x08,0x08,0x88,0x78,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00},//zuo
{0x20,0x10,0x48,0x46,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x40,0x00},/*"左",24*/
{0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00},//zhong
{0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00},/*"中",25*/
{0x08,0x08,0x08,0x08,0xC8,0x38,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00},//you
{0x08,0x04,0x02,0x01,0xFF,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00,0x00},/*"右",26*/
{0x08,0x08,0xE8,0x29,0x2E,0x28,0xE8,0x08,0x08,0xC8,0x0C,0x0B,0xE8,0x08,0x08,0x00},//qian
{0x00,0x00,0xFF,0x09,0x49,0x89,0x7F,0x00,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,0x00},/*"前",27*/
{0x00,0x00,0x00,0xFC,0x24,0x24,0x24,0x24,0x22,0x22,0x22,0x23,0x22,0x20,0x20,0x00},//hou
{0x40,0x20,0x18,0x07,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00},/*"后",28*/
{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00},//shang
{0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00},/*"上",29*/
{0x02,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x42,0x82,0x02,0x02,0x02,0x02,0x00},//xia
{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00},/*"下",30*/
{0x40,0x40,0x42,0xCC,0x00,0x00,0xFF,0x49,0x49,0xC9,0x49,0x49,0x7F,0x80,0x00,0x00},//tui
{0x00,0x40,0x20,0x1F,0x20,0x40,0x5F,0x48,0x44,0x40,0x41,0x42,0x45,0x58,0x40,0x00},/*"退",31*/
{0x40,0x40,0x42,0xCC,0x00,0x80,0x88,0x88,0xFF,0x88,0x88,0xFF,0x88,0x88,0x80,0x00},//jing
{0x00,0x40,0x20,0x1F,0x20,0x40,0x50,0x4C,0x43,0x40,0x40,0x5F,0x40,0x40,0x40,0x00},/*"进",32*/
{0x00,0x80,0x60,0xF8,0x07,0x04,0xE4,0xA4,0xA4,0xBF,0xA4,0xA4,0xE4,0x04,0x00,0x00},
{0x01,0x00,0x00,0xFF,0x40,0x40,0x7F,0x4A,0x4A,0x4A,0x4A,0x4A,0x7F,0x40,0x40,0x00},/*"值",33*/
{0x80,0x80,0x80,0x80,0xFF,0x80,0x80,0xA0,0x90,0x88,0x84,0x82,0x80,0x80,0x80,0x00},//chang
{0x00,0x00,0x00,0x00,0xFF,0x40,0x21,0x12,0x04,0x08,0x10,0x20,0x20,0x40,0x40,0x00},/*"长",34*/
{0x10,0x0C,0x24,0x24,0x24,0x74,0x25,0x26,0x24,0x74,0x24,0x24,0x24,0x14,0x0C,0x00},//kuan
{0x80,0x80,0x80,0x5F,0x41,0x21,0x11,0x0D,0x71,0x81,0x81,0x9F,0x80,0x80,0xE0,0x00},/*"宽",35*/
{0x04,0x04,0x04,0x04,0xF4,0x94,0x95,0x96,0x94,0x94,0xF4,0x04,0x04,0x04,0x04,0x00},//gao
{0x00,0xFE,0x02,0x02,0x7A,0x4A,0x4A,0x4A,0x4A,0x4A,0x7A,0x02,0x82,0xFE,0x00,0x00},/*"高",36*/
{0x00,0x40,0x42,0x44,0x58,0x40,0xC0,0xFF,0xC0,0x40,0x50,0x48,0x46,0x40,0x00,0x00},//mi
{0x20,0x20,0x10,0x08,0x04,0x03,0x00,0xFF,0x00,0x03,0x04,0x08,0x10,0x20,0x20,0x00},/*"米",37*/
{0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00},//wen
{0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00},/*"温",38*/
{0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00},//shi
{0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00},/*"湿",39*/
{0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00},//du
{0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00},/*"度",40*/
{0x10,0x60,0x02,0x8C,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0xFF,0x00,0x00},//ce
{0x04,0x04,0x7E,0x01,0x80,0x47,0x30,0x0F,0x10,0x27,0x00,0x47,0x80,0x7F,0x00,0x00},/*"测",41*/
{0x20,0x20,0x20,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBE,0x20,0x20,0x20,0x00},//liang
{0x00,0x80,0x80,0xAF,0xAA,0xAA,0xAA,0xFF,0xAA,0xAA,0xAA,0xAF,0x80,0x80,0x00,0x00},/*"量",42*/
{0x00,0x80,0x60,0xF8,0x07,0x00,0x1C,0xE0,0x01,0x06,0x00,0xE0,0x1E,0x00,0x00,0x00},//yi
{0x01,0x00,0x00,0xFF,0x00,0x80,0x40,0x20,0x13,0x0C,0x13,0x20,0x40,0x80,0x80,0x00},/*"仪",43*/
{0x80,0x80,0x9E,0x92,0x92,0x92,0x9E,0xE0,0x80,0x9E,0xB2,0xD2,0x92,0x9E,0x80,0x00},//qi
{0x08,0x08,0xF4,0x94,0x92,0x92,0xF1,0x00,0x01,0xF2,0x92,0x94,0x94,0xF8,0x08,0x00},/*"器",44*/
{0x10,0x10,0x10,0xFF,0x90,0x20,0x98,0x48,0x28,0x09,0x0E,0x28,0x48,0xA8,0x18,0x00},//kong
{0x02,0x42,0x81,0x7F,0x00,0x40,0x40,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x40,0x00},/*"控",45*/
{0x40,0x50,0x4E,0x48,0x48,0xFF,0x48,0x48,0x48,0x40,0xF8,0x00,0x00,0xFF,0x00,0x00},//zhi
{0x00,0x00,0x3E,0x02,0x02,0xFF,0x12,0x22,0x1E,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00},/*"制",46*/
{0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00,0x00,0x00},//shi
{0x81,0x41,0x21,0x1D,0x21,0x41,0x81,0xFF,0x89,0x89,0x89,0x89,0x89,0x81,0x81,0x00},/*"是",47*/
{0x00,0x02,0x82,0x82,0x42,0x22,0x12,0xFA,0x06,0x22,0x22,0x42,0x42,0x82,0x00,0x00},//fou
{0x01,0x01,0x00,0xFC,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0xFC,0x00,0x00,0x01,0x00},/*"否",48*/
{0x00,0x80,0x60,0xF8,0x07,0x00,0xFC,0x84,0x84,0x84,0xFE,0x82,0x83,0x82,0x80,0x00},//di
{0x01,0x00,0x00,0xFF,0x00,0x00,0xFF,0x40,0x20,0x00,0x41,0x8E,0x30,0x40,0xF8,0x00},/*"低",49*/
{0x80,0xFE,0x82,0x82,0xFE,0x80,0xFE,0x82,0x82,0xFE,0x80,0x00,0xF8,0x00,0xFF,0x00},
{0x40,0x3F,0x00,0x20,0xBF,0x40,0x3F,0x40,0x80,0x7F,0x00,0x00,0x4F,0x80,0x7F,0x00},/*"删",50*/
{0x00,0xFE,0x22,0x5A,0x86,0x20,0x10,0x28,0x24,0xE3,0x24,0x28,0x10,0x20,0x20,0x00},
{0x00,0xFF,0x04,0x08,0x27,0x11,0x0D,0x41,0x81,0x7F,0x01,0x05,0x09,0x31,0x00,0x00},/*"除",51*/
{0x00,0x00,0x22,0x32,0x2A,0xA6,0xA2,0x62,0x21,0x11,0x09,0x81,0x01,0x00,0x00,0x00},
{0x00,0x42,0x22,0x13,0x0B,0x42,0x82,0x7E,0x02,0x02,0x0A,0x12,0x23,0x46,0x00,0x00},/*"系",52*/
{0x20,0x30,0xAC,0x63,0x30,0x00,0x88,0xC8,0xA8,0x99,0x8E,0x88,0xA8,0xC8,0x88,0x00},
{0x22,0x67,0x22,0x12,0x12,0x80,0x40,0x30,0x0F,0x00,0x00,0x3F,0x40,0x40,0x71,0x00},/*"统",53*/
{0x20,0x30,0xAC,0x63,0x20,0x18,0x80,0x82,0x42,0x22,0x12,0x1A,0x26,0x42,0x80,0x00},
{0x22,0x67,0x22,0x12,0x12,0x12,0x40,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x40,0x00},/*"经",54*/
{0x20,0x30,0xAC,0x63,0x20,0x18,0x00,0x08,0x48,0x48,0xFF,0x48,0x48,0x48,0x08,0x00},
{0x22,0x67,0x22,0x12,0x12,0x12,0x00,0x02,0x02,0x02,0xFF,0x02,0x12,0x22,0x1E,0x00},/*"纬",55*/
{0x00,0x00,0xF8,0x49,0x4A,0x4C,0x48,0xF8,0x48,0x4C,0x4A,0x49,0xF8,0x00,0x00,0x00},
{0x10,0x10,0x13,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x13,0x10,0x10,0x00},/*"单",56*/
{0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x90,0x0C,0x03,0x0C,0x90,0x20,0x40,0x40,0x00},
{0x01,0x00,0x00,0xFF,0x00,0x80,0x60,0x1F,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00},/*"价",57*/
{0x00,0x80,0x40,0x20,0x18,0x06,0x80,0x00,0x07,0x18,0x20,0x40,0x80,0x00,0x00,0x00},
{0x01,0x00,0x20,0x70,0x28,0x26,0x21,0x20,0x20,0x24,0x38,0x60,0x00,0x01,0x01,0x00},/*"公",58*/
{0x00,0x00,0xFE,0x20,0x20,0x20,0x00,0xF2,0x12,0x1A,0xD6,0x12,0x12,0xF2,0x02,0x00},
{0x00,0x00,0x1F,0x08,0x04,0x02,0x80,0x4F,0x20,0x18,0x07,0x10,0x20,0x4F,0x80,0x00},/*"顷",59*/
{0x20,0x20,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x20,0x20,0x00},
{0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00},/*"元",60*/
{0x40,0x44,0x24,0xA4,0x94,0x8C,0x84,0xFF,0x84,0x8C,0x94,0xA4,0x24,0x44,0x40,0x00},
{0x40,0x40,0x40,0x5F,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x5F,0x40,0x40,0x40,0x00},/*"查",61*/
{0x40,0x40,0x42,0xCC,0x00,0x20,0xD0,0x4C,0x4B,0x48,0xC8,0x08,0x08,0xF8,0x00,0x00},
{0x00,0x00,0x00,0x7F,0x20,0x10,0x1F,0x12,0x12,0x12,0x5F,0x80,0x40,0x3F,0x00,0x00},/*"询",62*/
{0x40,0x40,0x42,0xCC,0x00,0x00,0x00,0x84,0x84,0x84,0x84,0x84,0xFC,0x00,0x00,0x00},
{0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0x3F,0x40,0x40,0x40,0x40,0x41,0x40,0x70,0x00},/*"记",63*/
{0x80,0x80,0x82,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x80,0x80,0x80,0x00},
{0x40,0x40,0x22,0x24,0x10,0x48,0x80,0x7F,0x04,0x08,0x18,0x24,0x22,0x40,0x40,0x00},/*"录",64*/
{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00},
{0x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00},/*"大",65*/
{0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x20,0x40,0x80,0x00,0x00},
{0x08,0x04,0x03,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x01,0x0E,0x00},/*"小",66*/
{0x10,0x10,0x10,0xFF,0x10,0x90,0x00,0xFE,0x91,0x80,0xFF,0x80,0x92,0xFE,0x00,0x00},
{0x04,0x44,0x82,0x7F,0x01,0x00,0x80,0x82,0x46,0x2A,0x13,0x2A,0x46,0x82,0x80,0x00},/*"搜",67*/
{0x80,0x60,0x24,0x24,0x24,0xA4,0x64,0x3F,0x24,0x24,0xA4,0x24,0x24,0xA0,0x60,0x00},
{0x00,0x80,0x48,0x29,0x09,0x4D,0x8D,0x7B,0x0B,0x09,0x28,0x4C,0x98,0x00,0x00,0x00},/*"索",68*/
{0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x24,0xA4,0x24,0x22,0x22,0xA3,0x62,0x00,0x00},
{0x00,0x40,0x20,0x1F,0x20,0x58,0x47,0x50,0x48,0x45,0x42,0x45,0x48,0x50,0x40,0x00},/*"返",69*/
{0x00,0x00,0xFE,0x02,0x02,0xF2,0x12,0x12,0x12,0xF2,0x02,0x02,0xFE,0x00,0x00,0x00},
{0x00,0x00,0x7F,0x20,0x20,0x27,0x24,0x24,0x24,0x27,0x20,0x20,0x7F,0x00,0x00,0x00},/*"回",70*/
{0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0xFC,0x00,0x00,0x00},
{0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0xFC,0x00,0x00},/*"出",71*/
{0x00,0x3E,0x22,0xE2,0x22,0x3E,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0xE2,0x02,0x00},
{0x20,0x3F,0x20,0x1F,0x11,0x11,0x00,0x7F,0x44,0x44,0x44,0x44,0x44,0x47,0x40,0x00},/*"距",72*/
{0x04,0x04,0x04,0xF4,0x84,0xD4,0xA5,0xA6,0xA4,0xD4,0x84,0xF4,0x04,0x04,0x04,0x00},
{0x00,0xFE,0x02,0x02,0x12,0x3A,0x16,0x13,0x12,0x1A,0x32,0x42,0x82,0x7E,0x00,0x00},/*"离",73*/
{0x02,0x02,0xE2,0x22,0x22,0xF2,0x2E,0x22,0x22,0xE2,0x22,0x22,0xE2,0x02,0x02,0x00},
{0x00,0x00,0xFF,0x40,0x40,0x7F,0x49,0x49,0x49,0x7F,0x40,0x40,0xFF,0x00,0x00,0x00},/*"面",74*/
{0x20,0x24,0x24,0xA4,0xFE,0x23,0x22,0x20,0xFC,0x04,0x04,0x04,0x04,0xFC,0x00,0x00},
{0x10,0x08,0x06,0x01,0xFF,0x01,0x06,0x80,0x63,0x19,0x01,0x01,0x09,0x33,0xC0,0x00},/*"积",75*/
{0x10,0x0C,0x44,0x24,0x14,0x04,0x05,0x06,0x04,0x04,0x14,0x24,0x44,0x14,0x0C,0x00},
{0x00,0x40,0x40,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x40,0x00,0x00},/*"空",76*/
{0x00,0xF8,0x01,0x06,0x00,0xF0,0x12,0x12,0x12,0xF2,0x02,0x02,0x02,0xFE,0x00,0x00},
{0x00,0xFF,0x00,0x00,0x00,0x1F,0x11,0x11,0x11,0x1F,0x00,0x40,0x80,0x7F,0x00,0x00},/*"间",77*/
{0x48,0x4A,0xFA,0x0A,0xFE,0x09,0xF9,0x49,0xA8,0x00,0x00,0xF0,0x00,0x00,0xFF,0x00},
{0x22,0x11,0x0B,0x04,0xFF,0x04,0x09,0x12,0x23,0x00,0x00,0x0F,0x40,0x80,0x7F,0x00},/*"剩",78*/
{0x80,0x80,0x40,0x20,0x50,0x48,0x44,0xC3,0x44,0x48,0x50,0x20,0x40,0x80,0x80,0x00},
{0x00,0x40,0x22,0x1A,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x0A,0x12,0x60,0x00,0x00},/*"余",79*/
{0x20,0x22,0xA2,0x7E,0x22,0x22,0xFE,0x22,0x22,0x00,0x7C,0x00,0x00,0xFF,0x00,0x00},
{0x44,0x42,0x49,0x48,0x48,0x48,0x49,0x7E,0x48,0x48,0x48,0x49,0x4A,0x41,0x40,0x00},/*"型",80*/
{0x80,0x80,0x80,0xBE,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xBE,0x80,0x80,0x80,0x00},
{0x00,0x00,0x00,0x06,0x05,0x04,0x04,0x04,0x44,0x84,0x44,0x3C,0x00,0x00,0x00,0x00},/*"号",81*/
{0x00,0xFE,0x20,0x20,0x3F,0x20,0x00,0xFC,0x24,0xE4,0x24,0x22,0x23,0xE2,0x00,0x00},
{0x80,0x7F,0x01,0x01,0xFF,0x80,0x60,0x1F,0x80,0x41,0x26,0x18,0x26,0x41,0x80,0x00},/*"版",82*/
{0x00,0x10,0x10,0x10,0x10,0xD0,0x30,0xFF,0x30,0xD0,0x10,0x10,0x10,0x10,0x00,0x00},
{0x10,0x08,0x04,0x02,0x09,0x08,0x08,0xFF,0x08,0x08,0x09,0x02,0x04,0x08,0x10,0x00},/*"本",83*/
{0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E,0x82,0x82,0x82,0x9E,0xA0,0x20,0x20,0x00},
{0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43,0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0x00},/*"设",84*/
{0x20,0x10,0x0C,0xF3,0x12,0x12,0x52,0x92,0x12,0x12,0x12,0xF2,0x02,0x02,0x00,0x00},
{0x01,0x01,0x1F,0x11,0x11,0x11,0x15,0x19,0x51,0x91,0x51,0x3F,0x11,0x11,0x01,0x00},/*"每",85*/
{0x10,0x60,0x02,0xCC,0x80,0x80,0xFC,0x40,0x20,0xFF,0x10,0x08,0xF8,0x00,0x00,0x00},
{0x04,0x04,0x7E,0x01,0x00,0x00,0x3F,0x40,0x40,0x4F,0x40,0x44,0x47,0x40,0x78,0x00},/*"池",86*/
{0x08,0x08,0xC8,0x48,0x48,0x48,0x49,0xCE,0x48,0x48,0x48,0x48,0xC8,0x08,0x08,0x00},
{0x00,0x00,0xFF,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00},/*"亩",87*/
{0x20,0x20,0xFF,0x20,0x20,0x00,0xF8,0x88,0x88,0x88,0xFF,0x88,0x88,0xA8,0x18,0x00},
{0x10,0x30,0x1F,0x08,0x88,0x60,0x1F,0x80,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00},/*"坡",88*/
{0x20,0x30,0xAC,0x63,0x30,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00},
{0x22,0x67,0x22,0x12,0x12,0x40,0x40,0x7F,0x42,0x42,0x42,0x42,0x7F,0x40,0x40,0x00},/*"组",89*/
{0x20,0x10,0xE8,0x24,0x27,0x24,0x24,0xE4,0x24,0x34,0x2C,0x20,0xE0,0x00,0x00,0x00},
{0x80,0x60,0x1F,0x09,0x09,0x09,0x09,0x7F,0x09,0x09,0x49,0x89,0x7F,0x00,0x00,0x00},/*"角",90*/
{0x00,0x00,0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"°",91*/
{0x10,0x0C,0x24,0x24,0xA4,0x64,0x25,0x26,0x24,0x24,0xA4,0x24,0x24,0x14,0x0C,0x00},
{0x40,0x40,0x48,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x4B,0x48,0x40,0x40,0x00},/*"室",92*/
{0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00},
{0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00},/*"温",93*/
{0x00,0xF8,0x01,0x22,0x20,0x22,0x2A,0xF2,0x22,0x22,0x22,0x22,0x02,0xFE,0x00,0x00},
{0x00,0xFF,0x00,0x00,0x1F,0x01,0x01,0x7F,0x09,0x11,0x0F,0x40,0x80,0x7F,0x00,0x00},/*"闹",94*/
{0x20,0x10,0x2C,0xE7,0x24,0x24,0x00,0xF0,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00},
{0x01,0x01,0x01,0x7F,0x21,0x11,0x00,0x07,0x02,0x02,0xFF,0x02,0x02,0x07,0x00,0x00},/*"钟",95*/
{0x10,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,0xF8,0x08,0x08,0x08,0xF8,0x00,0x00},
{0x80,0x40,0x30,0x0F,0x40,0x80,0x7F,0x00,0x00,0x7F,0x20,0x20,0x20,0x7F,0x00,0x00},/*"加",96*/
{0x00,0x02,0x0C,0xC0,0x00,0xF8,0x08,0x48,0x48,0x48,0x08,0xFF,0x08,0x09,0x8A,0x00},
{0x02,0x02,0x7F,0x80,0x40,0x3F,0x00,0x1E,0x92,0x5E,0x20,0x17,0x38,0x46,0xF1,0x00},/*"减",97*/
{0x00,0x00,0xFE,0x82,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0xFE,0x00,0x00,0x00},
{0x80,0x60,0x1F,0x00,0x00,0x1E,0x12,0x12,0x12,0x1E,0x40,0x80,0x7F,0x00,0x00,0x00},/*"周",98*/
{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"一",99*/
{0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00},
{0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00},/*"二",100*/
{0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00},
{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00},/*"三",101*/
{0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00},
{0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00},/*"四",102*/
{0x00,0x02,0x42,0x42,0x42,0xC2,0x7E,0x42,0x42,0x42,0x42,0xC2,0x02,0x02,0x00,0x00},
{0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x00},/*"五",103*/
{0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2C,0x20,0x20,0x20,0x20,0x20,0x20,0x00},
{0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x60,0x00,0x00},/*"六",104*/
{0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00},/*"日",105*/
{0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00},
{0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00},/*"◆",106*/
{0x00,0x00,0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"°",107*/
{0x00,0x10,0xE0,0x10,0x10,0xE0,0x10,0x10,0xE0,0x00,0x44,0x62,0x52,0x4C,0x00,0x00},
{0x00,0x00,0x0F,0x00,0x00,0x0F,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"㎡",108*/
{0x00,0x17,0x15,0xD5,0x55,0x57,0x55,0x7D,0x55,0x57,0x55,0xD5,0x15,0x17,0x00,0x00},
{0x40,0x40,0x40,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x40,0x40,0x40,0x00},/*"置",109*/
{0x08,0x08,0xF9,0x4A,0x48,0xC8,0x48,0x20,0xD8,0x17,0x10,0x10,0xF0,0x10,0x10,0x00},
{0x40,0x30,0x0F,0x20,0x40,0x3F,0x80,0x40,0x21,0x16,0x08,0x16,0x21,0x40,0x80,0x00},/*"放",110*/
{0x82,0xBA,0xAA,0xAA,0xBA,0x82,0xBE,0x82,0x20,0x18,0x0F,0xC8,0x08,0x28,0x18,0x00},
{0x00,0x1E,0x12,0x12,0x5E,0x80,0x7F,0x00,0x80,0x60,0x1C,0x03,0x1C,0x60,0x80,0x00},/*"歌",111*/
{0x80,0x80,0xC0,0xC0,0xE0,0xA0,0x90,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00},
{0x00,0x00,0x01,0x01,0x03,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"←",112*/
{0x02,0x02,0xF2,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0x00},
{0x80,0x80,0x87,0x4C,0x54,0x24,0x34,0x4F,0x44,0x44,0x84,0x84,0x87,0x80,0x80,0x00},/*"更",113*/
{0x00,0x00,0x10,0x10,0x98,0xA4,0x47,0x44,0xA4,0x54,0x0C,0x04,0x00,0x00,0x00,0x00},
{0x00,0x81,0x89,0x89,0x44,0x44,0x4A,0x31,0x21,0x11,0x09,0x05,0x03,0x00,0x00,0x00},/*"多",114*/
{0x08,0x08,0x08,0xF8,0x08,0x08,0x08,0x10,0x10,0xFF,0x10,0x10,0x10,0xF0,0x00,0x00},
{0x10,0x30,0x10,0x1F,0x08,0x88,0x48,0x30,0x0E,0x01,0x40,0x80,0x40,0x3F,0x00,0x00},/*"功",115*/
{0x08,0xCC,0x4A,0x49,0x48,0x4A,0xCC,0x18,0x00,0x7F,0x88,0x88,0x84,0x82,0xE0,0x00},
{0x00,0xFF,0x12,0x12,0x52,0x92,0x7F,0x00,0x00,0x7E,0x88,0x88,0x84,0x82,0xE0,0x00},/*"能",116*/
{0x00,0x10,0x88,0xC4,0x33,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x48,0x40,0x00},
{0x02,0x01,0x00,0xFF,0x00,0x02,0x0A,0x32,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x00},/*"待",117*/
{0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00},
{0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00},/*"开",118*/
{0x00,0x00,0x18,0x16,0x10,0xD0,0xB8,0x97,0x90,0x90,0x90,0x92,0x94,0x10,0x00,0x00},
{0x00,0x20,0x10,0x8C,0x83,0x80,0x41,0x46,0x28,0x10,0x28,0x44,0x43,0x80,0x80,0x00},/*"发",119*/
{0x20,0x18,0x08,0xEA,0xAC,0xA8,0xA8,0xAF,0xA8,0xA8,0xAC,0xEA,0x08,0x28,0x18,0x00},
{0x00,0x00,0x3E,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x12,0x22,0x1E,0x00,0x00,0x00},/*"常",120*/
{0x80,0x88,0x88,0xFF,0x88,0x88,0x80,0xFE,0x02,0x02,0xF2,0x02,0x02,0xFE,0x00,0x00},
{0x40,0x20,0x18,0x07,0x08,0xB0,0x40,0x23,0x18,0x06,0x01,0x7E,0x80,0x83,0xE0,0x00},/*"规",121*/
};
#endif
串口(蓝牙)部分
代码部分
Myusart1.c
#include "stm32f10x.h" // Device header
#include "stdio.h"
#include "Myusart1.h"
/**
* @brief 串口
* @param 无
* @retval 无
*/
void USART1_Init(long Baudrate)
{
RCC_APB2PeriphClockCmd(RCC_PORT, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = TX_Pin;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //TX复用输出
GPIO_Init(GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = RX_Pin;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //RX浮空输入
GPIO_Init(GPIO_PORT, &GPIO_InitStruct);
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate = Baudrate; //波特率
USART_InitStruct.USART_WordLength = USART_WordLength_8b; //8位数据位
USART_InitStruct.USART_StopBits = USART_StopBits_1; //1位停止位
USART_InitStruct.USART_Parity = USART_Parity_No; //无校验位
USART_InitStruct.USART_Mode = USART_Mode_Use;//收发模式
USART_InitStruct.USART_HardwareFlowControl= USART_HardwareFlowControl_None;//硬件流控制,一般选择none
USART_Init(USART1, &USART_InitStruct);
// 允许串口中断
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;//中断通道为串口1
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//先站优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority =1;//从占优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能
NVIC_Init(&NVIC_InitStruct);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 允许串口接受中断
USART_Cmd(USART1, ENABLE);// 使能串口
}
//发送字节
void USART1_SendData(uint16_t data)
{
USART_SendData(USART1,data);//发送一个字节数据到USART
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送结束
}
//串口1 发送字符串
#include "Delay.h"
void USART1_SendString(char* str)
{
while(*str != '\0')//判断字符是否可以输出 // 字符串自带一个结束标志位'\0'
{
USART1_SendData(*str);
str++;
Delay_ms(10);
}
}
void USART1_SendNum(u32* num,u8 length)
{
for(u8 i=0;i<length;i++)
{
USART1_SendData(num[i]);
Delay_ms(10);
}
Delay_ms(1000);
}
//重定向 库函数printf到串口,重定向后可使用printf函数
//fputc 不能改名字
int fputc(int byte_, FILE *f)
{
USART_SendData(USART1, (uint8_t) byte_);//发送一个字节数据到串口
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完毕
return (byte_);
}
Myusart1.h
#ifndef __MyUSART1_H
#define __MyUSART1_H
/*-------------------------------------------------------------------------------*/
/*引脚定义*/
//该串口只用于发送数据到另外一个地方,数据来源为 ADC或者单片机采集到的频率数据等等
#define TX_Pin GPIO_Pin_9 //A9 TX
#define RX_Pin GPIO_Pin_10 //A10 RX
#define GPIO_PORT GPIOA
#define RCC_PORT RCC_APB2Periph_GPIOA
#define USART_Mode_Use USART_Mode_Tx //发送模式
/*-------------------------------------------------------------------------------*/
//Baudrate 波特率 比如9600
void USART1_Init(long Baudrate);
void USART1_SendData(uint16_t data);
void USART1_SendString(char* str);
void USART1_SendNum(u32* num,u8 length);
#endif
运行功能部分
代码部分
Function.c
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "DHT11.h"
#include "DS1302.h"
#include "Key.h"
#include "Delay.h"
#include "ADC.h"
#include "BEEP.h"
#include "music.h"
#include "Myusart1.h"
extern int Base_year,Base_month,Base_day,Base_hour,Base_minute,Base_second,Base_week;
extern int Clock_hour,Clock_minute,Clock_second;
/**
* @brief 显示温湿度
* @param 无
* @retval 无
*/
void Show_TemperatureHumidity(void)
{
int Row_Tem=4;int Col_Tem=1;
int Row_Hum=4;int Col_Hum=1;
DHT11_Delay_ms(1000);
DHT11_REC_Data(); //接收温度和湿度的数据
//温度显示
OLED_ShowUnsignedNum(Row_Tem,Col_Tem,rec_data[2],2); //整数
OLED_ShowString(Row_Tem,Col_Tem+2,".");
OLED_ShowUnsignedNum(Row_Tem,Col_Tem+3,rec_data[3],1);//小数
OLED_ShowChinese(Row_Tem,Col_Tem+2,107);//℃
OLED_ShowString(Row_Tem,Col_Tem+5,"C");
//湿度显示
OLED_ShowUnsignedNum(Row_Hum,Col_Hum+11,rec_data[0],2);
OLED_ShowString(Row_Hum,Col_Hum+13,"%RH");
}
/**
* @brief 显示时间
* @param 无
* @retval 无
*/
void Show_Time(void)
{
DS1302_RealTime();
int Row_y_m_d=1;int Col_y_m_d=1;
OLED_ShowUnsignedNum(Row_y_m_d,Col_y_m_d,TimeData.Base_year,4);OLED_ShowString(Row_y_m_d,Col_y_m_d+4,"-");
OLED_ShowUnsignedNum(Row_y_m_d,Col_y_m_d+5,TimeData.Base_month,2);OLED_ShowString(Row_y_m_d,Col_y_m_d+7,"-");
OLED_ShowUnsignedNum(Row_y_m_d,Col_y_m_d+8,TimeData.Base_day,2);
OLED_ShowChinese(Row_y_m_d,Col_y_m_d+6,98);//周
switch(TimeData.Base_week)
{
case 01:OLED_ShowChinese(Row_y_m_d,Col_y_m_d+7,99);break;//周一
case 02:OLED_ShowChinese(Row_y_m_d,Col_y_m_d+7,100);break;//周二
case 03:OLED_ShowChinese(Row_y_m_d,Col_y_m_d+7,101);break;//周三
case 04:OLED_ShowChinese(Row_y_m_d,Col_y_m_d+7,102);break;//周四
case 05:OLED_ShowChinese(Row_y_m_d,Col_y_m_d+7,103);break;//周五
case 06:OLED_ShowChinese(Row_y_m_d,Col_y_m_d+7,104);break;//周六
case 07:OLED_ShowChinese(Row_y_m_d,Col_y_m_d+7,105);break;//周日
}
int Row_h_m_s=2;int Col_h_m_s=4;
OLED_ShowUnsignedNum(Row_h_m_s,Col_h_m_s,TimeData.Base_hour,2);OLED_ShowString(Row_h_m_s,Col_h_m_s+2,":");//时
OLED_ShowUnsignedNum(Row_h_m_s,Col_h_m_s+3,TimeData.Base_minute,2);OLED_ShowString(Row_h_m_s,Col_h_m_s+5,":");//分
OLED_ShowUnsignedNum(Row_h_m_s,Col_h_m_s+6,TimeData.Base_second,2);//秒
}
int coordinate=1;
int mode_flag=0;
int set_flag=0;
int clock_flag=7;
void Multi_level_menu(void)
{
int keynum;
keynum=KEY_Scan();
if(keynum==6)//下移
{
coordinate++;
if(coordinate>4) coordinate=1;
OLED_Clear();
}
else if(keynum==5)//上移
{
coordinate--;
if(coordinate<1) coordinate=4;
OLED_Clear();
}
else if(keynum==7)//进入配置模式
{
mode_flag=1-mode_flag;
OLED_Clear();
}
OLED_ShowChinese(1,1,9);//时钟
OLED_ShowChinese(1,2,95);
OLED_ShowChinese(2,1,94);//闹钟
OLED_ShowChinese(2,2,95);
OLED_ShowChinese(3,1,110);//放歌
OLED_ShowChinese(3,2,111);
OLED_ShowChinese(4,1,120);//常规
OLED_ShowChinese(4,2,121);
OLED_ShowChinese(coordinate,3,112);
if(mode_flag==1){OLED_Clear();}
while(mode_flag==1&&coordinate==1)//时钟设置
{
OLED_ShowChinese(4,1,84);//设置
OLED_ShowChinese(4,2,109);
keynum=KEY_Scan();
if(keynum==7) {mode_flag=1-mode_flag; OLED_Clear();}
else if(keynum==4)
{
set_flag++;
if(set_flag==8) set_flag=1;
int key_row=4;int key_col=4;
switch(set_flag)
{ //年月日时分秒 周
//OLED_Clear();
case 1:OLED_ShowChinese(key_row,key_col,6);break;
case 2:OLED_ShowChinese(key_row,key_col,7);break;
case 3:OLED_ShowChinese(key_row,key_col,8);break;
case 4:OLED_ShowChinese(key_row,key_col,9);break;
case 5:OLED_ShowChinese(key_row,key_col,10);break;
case 6:OLED_ShowChinese(key_row,key_col,11);break;
case 7:OLED_ShowChinese(key_row,key_col,22);break;
}
}
else if(keynum==6){Set_decrease(set_flag);}//减
else if(keynum==5){Set_add(set_flag);}//加
else if(keynum==0){Show_Time();}
}
//闹钟设置
while(coordinate==2&&mode_flag==1)
{
keynum=KEY_Scan();
if(keynum==7) {mode_flag=1-mode_flag;coordinate=1;OLED_Clear();}
else if(keynum==4)
{
clock_flag++;
if(clock_flag==11) clock_flag=8;
int key_row=4;int key_col=4;
switch(clock_flag)
{
case 8:OLED_ShowChinese(key_row,key_col,9);break;
case 9:OLED_ShowChinese(key_row,key_col,10);break;
case 10:OLED_ShowChinese(key_row,key_col,11);break;
}
}
else if(keynum==6){Set_decrease(clock_flag);}//减
else if(keynum==5){Set_add(clock_flag);}//加
else if(keynum==0)
{
OLED_ShowChinese(4,1,84);//设置
OLED_ShowChinese(4,2,109);
OLED_ShowChinese(2,1,94);
OLED_ShowChinese(2,2,95);
OLED_ShowChinese(1,1,122);
OLED_ShowChinese(1,2,9);
DS1302_RealTime();
int Row_h_m_s=1;int Col_h_m_s=6;
OLED_ShowUnsignedNum(Row_h_m_s,Col_h_m_s,TimeData.Base_hour,2);
OLED_ShowString(Row_h_m_s,Col_h_m_s+2,":");//时
OLED_ShowUnsignedNum(Row_h_m_s,Col_h_m_s+3,TimeData.Base_minute,2);
OLED_ShowString(Row_h_m_s,Col_h_m_s+5,":");//分
OLED_ShowUnsignedNum(Row_h_m_s,Col_h_m_s+6,TimeData.Base_second,2);//秒
int Row_clock_h_m_s=2;int Col_clock_h_m_s=6;
OLED_ShowUnsignedNum(Row_clock_h_m_s,Col_clock_h_m_s,TimeData.Clock_hour,2);
OLED_ShowString(Row_clock_h_m_s,Col_clock_h_m_s+2,":");//时
OLED_ShowUnsignedNum(Row_clock_h_m_s,Col_clock_h_m_s+3,TimeData.Clock_minute,2);
OLED_ShowString(Row_clock_h_m_s,Col_clock_h_m_s+5,":");//分
OLED_ShowUnsignedNum(Row_clock_h_m_s,Col_clock_h_m_s+6,TimeData.Clock_second,2);//秒
}
}
while(coordinate==3&&mode_flag==1)//放歌有问题
{
TIM2_PWM_Init(100-1,1440-1);
Music_play();
keynum=KEY_Scan();
if(keynum==7) {mode_flag=1-mode_flag; coordinate=1;OLED_Clear();TIM2_PWM_Init(0,0);}
}
while(coordinate==4&&mode_flag==1)
{
Show_TemperatureHumidity();
Show_Time();
keynum=KEY_Scan();
if(keynum==7)
{
coordinate=1;
mode_flag=0;
OLED_Clear();
}
while((TimeData.Clock_hour==TimeData.Base_hour)&&
(TimeData.Clock_minute==TimeData.Base_minute)&&(TimeData.Clock_second==TimeData.Base_second))
{
TIM2_PWM_Init(100-1,1440-1);///Music_play();//放歌会卡在放歌循环里
Delay_ms(1000);
TIM2_PWM_Init(0,0);
Delay_ms(1000);
keynum=KEY_Scan();
if(keynum==7) break;
}
}
}
Function.h
#ifndef __Function_H
#define __Function_H
void Show_TemperatureHumidity(void);
void Show_Time(void) ;
void Show_Key(void);
void Multi_level_menu(void);
#endif
主函数
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "ADC.h"
#include "DHT11.h"
#include "DS1302.h"
#include "Key.h"
#include "Function.h"
#include "Myusart1.h"
int main(void)
{
OLED_Init();
KEY_Init();
DS1302_Init();
DHT11_Start();
USART1_Init(9600);
MyADC_Init();
while (1)
{
Multi_level_menu();
}
}
(更新中,请稍等)