初始版本

This commit is contained in:
yueming
2021-09-01 14:03:46 +08:00
parent 4e0dc1ed9d
commit 975adfb602
123 changed files with 59901 additions and 0 deletions

View File

@@ -0,0 +1,220 @@
#include "battery.h"
/*电池,获取电池信息*/
void Bat_GetWorkInfor(void)
{
/***读取正在充电指示***/
if(Read_BatCharging()==0)
DevParam.BatCharging = 1;
else
DevParam.BatCharging = 0;
if(DevParam.BatInforGetTime >= 300)
{
if(DevParam.BatCheck < 100)
DevParam.BatCheck++;
/***获取电池电压***/
DevParam.BatVoltage = ADC_GetSimpleData();
if(DevParam.BatVoltage >= 3.58)
{
/***转换电池容量***/
if(DevParam.BatVoltage>=4.16)
DevParam.ShortBatSOC = 100;
else if(DevParam.BatVoltage>=4.08)
DevParam.ShortBatSOC = 90;
else if(DevParam.BatVoltage>=3.97)
DevParam.ShortBatSOC = 80;
else if(DevParam.BatVoltage>=3.90)
DevParam.ShortBatSOC = 70;
else if(DevParam.BatVoltage>=3.84)
DevParam.ShortBatSOC = 60;
else if(DevParam.BatVoltage>=3.79)
DevParam.ShortBatSOC = 50;
else if(DevParam.BatVoltage>=3.76)
DevParam.ShortBatSOC = 40;
else if(DevParam.BatVoltage>=3.73)
DevParam.ShortBatSOC = 30;
else if(DevParam.BatVoltage>=3.71)
DevParam.ShortBatSOC = 20;
else if(DevParam.BatVoltage>=3.65)
DevParam.ShortBatSOC = 10;
}
else
{
DevParam.ShortBatSOC = 0;
}
DevParam.BatInforGetTime = 0;
}
}
/*显示部分,电池图标外形刷新*/
void Show_BatIconShapeRefresh(void)
{
#ifdef Device_LCD
// 电池外形
SimLCD_PointColor = SimLCDColor_WHITE;
SimLCD_DrawLine( 200, 9, 222, 9);
SimLCD_DrawLine( 200, 21, 222, 21);
SimLCD_DrawLine( 200, 9, 200, 21);
SimLCD_DrawLine( 222, 9, 222, 21);
SimLCD_DrawLine( 197, 13, 200, 13); // 上横线
SimLCD_DrawLine( 197, 13, 197, 17); // 中横线
SimLCD_DrawLine( 197, 17, 200, 17); // 下横线
#endif
}
/*显示部分,电池图标刷新*/
void Show_BatIconRefresh(void)
{
if((DevParam.BatIconRefreshTime>=500)&&(DevParam.BatCheck>=2))
{
#ifdef Device_LCD
uint8_t i = 0;
uint16_t FontColor = 0;
if( (DevParam.BatCharging==1)&&(DevParam.RunPhase!=0) )
{// 充电中,电池图标变成绿色
FontColor = SimLCDColor_GREEN;
}
else if(DevParam.RunPhase==RunPhase_Runing)
{// 其他,电池图标变成白色
FontColor = SimLCDColor_WHITE;
}
// 显示SOC
if(DevParam.ShortBatSOC!=DevParam.BatSOC)
{
if( DevParam.ShortBatSOC >= 80 ) {
SimLCD_PointColor = FontColor;
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 202, i, 205, i);
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 207, i, 210, i);
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 212, i, 215, i);
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 217, i, 220, i);
}
else if( DevParam.ShortBatSOC >= 60 ) {
SimLCD_PointColor = SimLCDColor_BLACK;
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 202, i, 205, i);
SimLCD_PointColor = FontColor;
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 207, i, 210, i);
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 212, i, 215, i);
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 217, i, 220, i);
}
else if( DevParam.ShortBatSOC >= 40 ) {
SimLCD_PointColor = SimLCDColor_BLACK;
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 202, i, 205, i);
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 207, i, 210, i);
SimLCD_PointColor = FontColor;
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 212, i, 215, i);
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 217, i, 220, i);
}
else if( DevParam.ShortBatSOC >= 20 ) {
SimLCD_PointColor = SimLCDColor_BLACK;
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 202, i, 205, i);
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 207, i, 210, i);
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 212, i, 215, i);
SimLCD_PointColor = FontColor;
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 217, i, 220, i);
}
else if( DevParam.ShortBatSOC >= 1 ) {
SimLCD_PointColor = SimLCDColor_BLACK;
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 202, i, 205, i);
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 207, i, 210, i);
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 212, i, 215, i);
for( i = 12; i < 19; i++)
SimLCD_DrawLine( 217, i, 220, i);
}
Power_LCD(1);
DevParam.BatSOC =DevParam.ShortBatSOC;
}
#endif
DevParam.BatIconRefreshTime = 0;
}
}
/*显示部分,侧边跳动*/
void Show_BroadSideBeat(void)
{
if(DevParam.SideBeatTime>=2000)
{
#ifdef Device_LCD
uint8_t i = 0;
if(DevParam.SideBeat==1) {
SimLCD_PointColor = SimLCDColor_CYAN;
for(i = 0; i < 13; i++)
SimLCD_DrawLine( 0, i, 32, i);
DevParam.SideBeat = 2;
}
else if(DevParam.SideBeat==2) {
SimLCD_PointColor = SimLCDColor_CYAN;
for(i = 15; i < 28; i++)
SimLCD_DrawLine( 0, i, 24, i);
DevParam.SideBeat = 3;
}
else if(DevParam.SideBeat==3) {
SimLCD_PointColor = SimLCDColor_CYAN;
for(i = 30; i < 43; i++)
SimLCD_DrawLine( 0, i, 16, i);
DevParam.SideBeat = 4;
}
else if(DevParam.SideBeat==4) {
SimLCD_PointColor = SimLCDColor_CYAN;
for(i = 45; i < 58; i++)
SimLCD_DrawLine( 0, i, 8, i);
DevParam.SideBeat = 5;
}
else if(DevParam.SideBeat==5) {
SimLCD_PointColor = SimLCDColor_BLACK;
for(i = 0; i < 13; i++)
SimLCD_DrawLine( 0, i, 32, i);
for(i = 15; i < 28; i++)
SimLCD_DrawLine( 0, i, 24, i);
for(i = 30; i < 43; i++)
SimLCD_DrawLine( 0, i, 16, i);
for(i = 45; i < 58; i++)
SimLCD_DrawLine( 0, i, 8, i);
DevParam.SideBeat = 1;
}
#endif
DevParam.SideBeatTime = 0;
}
}

View File

@@ -0,0 +1,31 @@
#ifndef _BATTERY_H_
#define _BATTERY_H_
#include "stm32f10x.h"
#include "bsp_timer3.h"
#include "bsp_port.h"
#include "bsp_adc.h"
#include "simulation_lcd.h"
/*电池,获取电池信息*/
void Bat_GetWorkInfor(void);
/*显示部分,电池图标外形刷新*/
void Show_BatIconShapeRefresh(void);
/*显示部分,电池图标刷新*/
void Show_BatIconRefresh(void);
/*显示部分,侧边跳动*/
void Show_BroadSideBeat(void);
#endif

View File

@@ -0,0 +1,127 @@
#include "dev_work.h"
void Dev_ScanExtIndicate(void)
{
/*开机检测*/
if(DevParam.RunPhase==0)
{
if(Read_BootKey())
{
Delay_ms(200);
if(Read_BootKey())
{
while(Read_BootKey());
DevParam.ShortRunPhase = RunPhase_Runing;
}
}
else
{
DevParam.ShortRunPhase = RunPhase_Standby;
}
}
// 待机模式
if(DevParam.RunPhase==RunPhase_Standby)
{
if(Read_BootKey())
{
Delay_ms(200);
if(Read_BootKey())
{
while(Read_BootKey());
DevParam.ShortRunPhase = RunPhase_Runing;
}
}
}
// 运行模式
if(DevParam.RunPhase==RunPhase_Runing)
{
if(Read_BootKey())
{
Delay_ms(200);
if(Read_BootKey())
{
while(Read_BootKey());
// 关机/进入待机状态
if(DevParam.BatCharging)
DevParam.ShortRunPhase = RunPhase_Standby;
else
DevParam.ShortRunPhase = RunPhase_Close;
}
}
}
}
/*切换工作模式*/
void Dev_SwitchWorkMode(void)
{
if(DevParam.RunPhase!=DevParam.ShortRunPhase)
{
if(DevParam.ShortRunPhase == RunPhase_Runing)
{
// 显示初始化
#ifdef Device_LCD
Power_LCD(0);
/*显示部分,基础外形刷新*/
Show_BasicShapeRefresh();
/*显示部分,电池图标外形刷新*/
if(DevParam.RunPhase == 0)
Show_BatIconShapeRefresh();
else
Power_LCD(1);
#endif
// 侧边跳动初始化
DevParam.SideBeat = 1;
/*空气检测仪初始化*/
PMD4_Init();
DevParam.RunPhase = RunPhase_Runing;
}
if(DevParam.ShortRunPhase == RunPhase_Standby)
{
Power_PMD4(0);
#ifdef Device_LCD
Power_LCD(0);
if(DevParam.RunPhase==0)
{
/*显示部分,电池图标外形刷新*/
Show_BatIconShapeRefresh();
}
else if(DevParam.RunPhase==RunPhase_Runing)
{
// 进行清屏操作
SimLCD_Clear(SimLCDColor_BLACK);
/*显示部分,电池图标外形刷新*/
Show_BatIconShapeRefresh();
// 数据部分清零
DevParam.BatSOC = 0;
Power_LCD(1);
}
#endif
DevParam.RunPhase = RunPhase_Standby;
}
// 关机模式
if(DevParam.ShortRunPhase == RunPhase_Close)
{
Delay_ms(1000);
Power_PMD4(0);
Power_LCD(0);
Power_3V3(0);
DevParam.RunPhase = RunPhase_Close;
while(1);
}
}
}

View File

@@ -0,0 +1,29 @@
#ifndef _DEV_WORK_H_
#define _DEV_WORK_H_
#include "stm32f10x.h"
#include "bsp_timer3.h"
#include "bsp_port.h"
#include "bsp_adc.h"
#include "simulation_lcd.h"
#include "battery.h"
#include "pm_uart3.h"
void Dev_ScanExtIndicate(void);
void Dev_SwitchWorkMode(void);
#endif

View File

@@ -0,0 +1,253 @@
#include "esp8266_uart2.h"
//检测应答命令
static uint8_t* ESP8266_CheckCmd(uint8_t *str)
{
char *strx = 0;
if(UART2ReadFlag&0x8000)
{
UART2ReadBuf[UART2ReadFlag&0x7FFF] = 0;//添加结束符
strx = strstr((const char*)UART2ReadBuf,(const char*)str);
}
return (uint8_t*)strx;
}
//cmd:发送的命令字符串
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//返回值:0,发送成功 1,发送失败
static uint8_t ESP8266_SendCmd(uint8_t *cmd,uint8_t *ack,uint16_t waittime) {
UART2ReadFlag = 0;
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
Dev_UART2SendStr("%s\r\n", cmd);//发送命令
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
Delay_ms(10);
if(UART2ReadFlag&0x8000)
{
if(ESP8266_CheckCmd(ack))
{
UART2ReadFlag = 0;
return 0;
}
else
{
UART2ReadFlag = 0;
return 1;
}
}
}
if(waittime==0)
{
return 1;
}
}
return 1;
}
uint8_t ESP8266_SendStr(char* fmt,...)
{
uint8_t tbuf[200] = {0};
uint16_t i = 0,j = 0;
va_list ap;
va_start(ap, fmt);
vsprintf((char*)tbuf, fmt, ap);
va_end(ap);
j = strlen((const char*)tbuf);
for( i = 0; i < j; i++)
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET){}
USART_SendData(USART2, tbuf[i]);
}
while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET){}
return 0;
}
uint8_t ESP8266_SendData(uint8_t *tbuf, uint16_t len)
{
uint16_t i = 0;
for( i = 0; i < len; i++)
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET){}
USART_SendData(USART2, tbuf[i]);
}
while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET){}
return 0;
}
// STA模式下获取本地IP
void ESP8266_GetLocalIP(uint8_t* ipbuf){
uint8_t *p,*p1;
if(ESP8266_SendCmd( (uint8_t *)"AT+CIFSR", (uint8_t *)"OK", 50))
{
ipbuf[0] = 0;
return;
}
p = ESP8266_CheckCmd((uint8_t *)"\"");
p1 = (uint8_t *)strstr((const char*)(p+1),"\"");
*p1=0;
sprintf((char*)ipbuf,"%s",p+1);
}
//退出透传模式 0,退出成功; 1,退出失败
uint8_t ESP8266_QuitTrans(void){
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET){};
USART_SendData(USART2, '+');
Delay_ms(15);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET){};
USART_SendData(USART2, '+');
Delay_ms(15);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET){};
USART_SendData(USART2, '+');
Delay_ms(500); //等待500ms
return ESP8266_SendCmd((uint8_t *)"AT",(uint8_t *)"OK",20);//退出透传判断
}
//获取连接状态 0,未连接;1,连接成功.
uint8_t ESP8266_ConstaCheck(void){
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSTATUS",(uint8_t *)"OK",50));
return 0;
}
uint8_t ESP8266_APInit(char *name, char *password){
uint8_t Sbuf[60] ={0};
// UART2
BSP_UART2Init(115200);
Delay_ms(1000);
Delay_ms(1000);
while(ESP8266_SendCmd((uint8_t *)"AT",(uint8_t *)"OK",200))
{//退出透传
ESP8266_QuitTrans();
//关闭透传模式
ESP8266_SendCmd((uint8_t *)"AT+CIPMODE=0",(uint8_t *)"OK",200);
Delay_ms(1000);
}
// 关闭回显
while(ESP8266_SendCmd((uint8_t *)"ATE0",(uint8_t *)"OK",200));
// 设置波特率
while(ESP8266_SendCmd((uint8_t *)"AT+UART=115200,8,1,0,0",(uint8_t *)"OK",200));
Delay_ms(10);
// 设置WIFI AP模式
while(ESP8266_SendCmd((uint8_t *)"AT+CWMODE=2",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+RST",(uint8_t *)"OK",200));
// 延时4秒等待重启成功
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
memset(Sbuf, 0 , sizeof(Sbuf));
sprintf((char*)Sbuf, "AT+CWSAP=\"%s\",\"%s\",1,4", name, password);
while(ESP8266_SendCmd(Sbuf, (uint8_t *)"OK", 1000));
#ifdef TCP_Mode
#endif
#ifdef UDP_Mode
while(ESP8266_SendCmd((uint8_t *)"AT+CIPMUX=0",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSTART=\"UDP\",\"255.255.255.255\",60156,42254,0",(uint8_t *)"OK",500));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPMODE=1",(uint8_t *)"OK",300));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSEND",(uint8_t *)"OK",200));
#endif
UART2ReadFlag = 0;
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
return 0;
}
uint8_t ESP8266_STAConnect(char *name, char *password){
uint8_t Sbuf[60] ={0};
memset(Sbuf, 0 , sizeof(Sbuf));
sprintf((char*)Sbuf,"AT+CWJAP=\"%s\",\"%s\"", name, password);
if(ESP8266_SendCmd( Sbuf, (uint8_t *)"WIFI GOT IP", 100)){
return 1;
}
else {
#ifdef TCP_Mode
while(ESP8266_SendCmd((uint8_t *)"AT+CIPMUX=0",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSTART=\"TCP\",\"192.168.0.102\",8086",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPMODE=1",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSEND",(uint8_t *)"OK",20));
#endif
#ifdef UDP_Mode
while(ESP8266_SendCmd((uint8_t *)"AT+CIPMUX=0",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSTART=\"UDP\",\"192.168.1.6\",8086,8086,0",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPMODE=1",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSEND",(uint8_t *)"OK",20));
#endif
UART2ReadFlag = 0;
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
return 0;
}
}
uint8_t ESP8266_STAInit(void){
// 初始化串口
BSP_UART2Init(115200);
// 延时2秒等待串口初始化完成
Delay_ms(1000);
Delay_ms(1000);
while(ESP8266_SendCmd((uint8_t *)"AT",(uint8_t *)"OK",200))
{
//退出透传
ESP8266_QuitTrans();
//关闭透传模式
ESP8266_SendCmd((uint8_t *)"AT+CIPMODE=0",(uint8_t *)"OK",200);
Delay_ms(800);
}
// 关闭回显
while(ESP8266_SendCmd((uint8_t *)"ATE0",(uint8_t *)"OK",200));
// 设置波特率
while(ESP8266_SendCmd((uint8_t *)"AT+UART=115200,8,1,0,0",(uint8_t *)"OK",200));
Delay_ms(10);
// 设置WIFI STA模式
while(ESP8266_SendCmd((uint8_t *)"AT+CWMODE=1",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+RST",(uint8_t *)"OK",200));
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
return 1;
}

View File

@@ -0,0 +1,23 @@
#ifndef _ESP8266_UART2_H_
#define _ESP8266_UART2_H_
#include "stm32f10x.h"
#include "bsp_uart2.h"
#include "stdio.h"
#include "string.h"
#include "stdarg.h"
//#define TCP_Mode 1
#define UDP_Mode 1
uint8_t ESP8266_SendStr(char* fmt,...);
uint8_t ESP8266_SendData(uint8_t *tbuf, uint16_t len);
uint8_t ESP8266_APInit(char *name, char *password);
uint8_t ESP8266_STAInit(void);
uint8_t ESP8266_STAConnect(char *name, char *password);
#endif

View File

@@ -0,0 +1,269 @@
#include "esp8266_work.h"
/****************************
配网流程
1、将无线设备初始化为AP模式默认设置为
2、
****************************/
static uint8_t NetWorkFlow = 1;
static uint32_t Nport = 0;
static uint8_t Nssid[20] = {0};
static uint8_t Npassword[20] = {0};
MQTTPacket_connectData MQTT_ConnectData = MQTTPacket_connectData_initializer;
char MQTT_ClientId[150] = {0};
char MQTT_Username[65] = {0};
char MQTT_Password[65] = {0};
volatile uint16_t MQTT_ReadBufLen = 0;
int ESP8266_WaitData(unsigned char* buf, int count)
{
while(1)
{
if(UART2ReadFlag&0x8000)
{
memcpy(buf, (void*)&UART2ReadBuf[MQTT_ReadBufLen], count);
MQTT_ReadBufLen += count;
return count;
}
Delay_ms(10);
}
}
uint8_t MQTT_UserSubscribe(char *pSubTopic) {
uint8_t buf[200] = {0};
uint32_t buflen = sizeof(buf);
int32_t msgid = 1;
int32_t req_qos = 0; // 服务质量
MQTTString topicString = MQTTString_initializer;
topicString.cstring = pSubTopic;
// 订阅格式化
MQTTSerialize_subscribe(buf, buflen, 0, msgid, 1, &topicString, &req_qos);
// 发送订阅
UART2ReadFlag = 0;
ESP8266_SendStr((char *)buf);
if (MQTTPacket_read(buf, buflen, ESP8266_WaitData)==SUBACK) /* wait for suback */
{
unsigned short submsgid;
int subcount;
int granted_qos;
MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, buf, buflen);
if (granted_qos != 0)
{
//Sys_SendLog("granted qos != 0, %d\n", granted_qos);
return 0;
}
else
{
//Sys_SendLog("granted qos = 0\n");
return 1;
}
}
else
{
//Sys_SendLog("no suback received!\r\n");
return 0;
}
}
// MQTT_Publish("/mqtt/topic/0", "hello0");
void MQTT_UserPublish(char *pPubTopic, char *payload, int payloadlen) {
uint8_t buf[400] = {0};
int buflen = sizeof(buf);
MQTTString topicString = MQTTString_initializer;
int len = 0;
topicString.cstring = pPubTopic;
len += MQTTSerialize_publish((unsigned char *)(buf + len), buflen - len, 0, 0, 0, 0, topicString, (unsigned char *)payload, payloadlen);
ESP8266_SendStr((char *)buf);
}
uint8_t buf[400] = {0};
int buflen = 0;
void ESP8266_NetWorkFlow(void)
{
// 第一步初始化为AP
if(NetWorkFlow == 1) {
ESP8266_APInit("XiaoYi_IOT_AirBox", "asdqwe9867");
NetWorkFlow = 2;
}
// 第二步持续发送UDP广播
else if(NetWorkFlow == 2) {
if(DevParam.ESP8266SendTime >= 2000)
{
ESP8266_SendStr("{\"code\":\"0\",\"msg\":\"start connect\"}");
DevParam.ESP8266SendTime = 0;
}
}
// 第三步,返回接受成功信息
else if(NetWorkFlow == 3) {
ESP8266_SendStr("{\"code\":\"1\",\"msg\":\"getWifiInfo:success\"}");
NetWorkFlow = 4;
}
// 第四步,连接家庭无线
else if(NetWorkFlow == 4) {
ESP8266_STAInit();
while(ESP8266_STAConnect((char *)Nssid, (char *)Npassword));
NetWorkFlow = 5;
}
else if(NetWorkFlow == 5) {
MQTT_ConnectData.MQTTVersion = 4; // 3.1.1
MQTT_ConnectData.keepAliveInterval = 60; // 设置心跳包间隔时间
MQTT_ConnectData.clientID.cstring = (char *)MQTT_ClientId;// 客户端ID
MQTT_ConnectData.username.cstring = (char *)MQTT_Username;// 用户名
MQTT_ConnectData.password.cstring = (char *)MQTT_Password;// 密码
MQTT_ConnectData.cleansession = 0; // 清除会话
//rc = aiotMqttSign(product_key, device_name, device_secret, \
//MQTT_ConnectData.clientID.cstring, MQTT_ConnectData.username.cstring, MQTT_ConnectData.password.cstring);
//if (rc < 0) {
//Sys_SendLog("aiotMqttSign -%0x4x\n", -rc);
//return -1;
//}
// 网络连接
//char *host = "a1ykSq0uPgd.iot-as-mqtt.cn-shanghai.aliyuncs.com";
//int port = 1883;
//transport_open( host, port);
// 发送 登录数据
// 将连接字符串格式化一下,现在还没有发送
memset(buf, 0 ,sizeof(buf));
buflen = sizeof(buf);
MQTTSerialize_connect( buf, buflen, &MQTT_ConnectData);
UART2ReadFlag = 0;
ESP8266_SendStr((char *)buf);
// 等待connack
if (MQTTPacket_read(buf, buflen, ESP8266_WaitData) == CONNACK){
unsigned char sessionPresent, connack_rc;
if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0)
{
//Sys_SendLog("Unable to connect,return code %d\r\n", connack_rc);
//return -1;
}
}
/*订阅*/
MQTT_UserSubscribe("status/set/7CDFA1049ADA"); //更新设备状态
MQTT_UserSubscribe("status/get/7CDFA1049ADA"); //获取设备状态
MQTT_UserSubscribe("setting/set/7CDFA1049ADA");//更新设备配置
MQTT_UserSubscribe("setting/get/7CDFA1049ADA");//获取设备配置
}
else if(NetWorkFlow == 10)
{
if(DevParam.ESP8266SendTime >= 2000)
{
MQTTSerialize_pingreq(buf, buflen);// 发送心跳
ESP8266_SendStr((char *)buf);
DevParam.ESP8266SendTime = 0;
}
// 发布设备状态
else if(DevParam.ESP8266SendTime>=1500){
// /a1ykSq0uPgd/qmvH76OCy2FeGp9DDMPx/user/update
// 0x00 00000001 0032 0100 001223
char txBuf[30] = {0};
char txLen = 0;
//txBuf[txLen++] = COMMAND_REPORT;// 属性上报
txBuf[txLen++] = 0x00;txBuf[txLen++] = 0x00;txBuf[txLen++] = 0x00;txBuf[txLen++] = 0x01;// ID
//txBuf[txLen++] = (uint8_t)(DeviceData.prop_int16 >> 8);txBuf[txLen++] = (uint8_t)(DeviceData.prop_int16 >> 0); // INT16
//txBuf[txLen++] = DeviceData.prop_bool; // BOOL
//txBuf[txLen++] = (uint8_t)(DeviceData.prop_int16 >> 8);txBuf[txLen++] = (uint8_t)(DeviceData.prop_int16 >> 0);// FLOAT
MQTT_UserPublish("device_info", txBuf, txLen);
DevParam.ESP8266SendTime = 0;
}
}
}
cJSON *root = NULL;
char JsonString[100] = {0};
uint16_t init = 0;
uint16_t i = 0;
uint8_t rbuf[256] = {0};
uint8_t rlen = 0;
void ESP8266_NetReceiveInfor(void)
{
if(UART2ReadFlag&0x8000)
{
if(NetWorkFlow == 2) {
// {"port":"60156","ssid":"xxx","password":"xxxx"}
if(UART2ReadBuf[0] == '{')
{
for(i = 0;;i++)
{
JsonString[i] = UART2ReadBuf[i];
if(UART2ReadBuf[i] == '}')
{
// 解析数据
root = cJSON_Parse((char *)JsonString);
if(root == NULL)
{
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
UART3ReadFlag = 0;
return;
}
Nport = cJSON_GetObjectItem(root, "port")->valuedouble;
if(Nport==60156)
{
sprintf((char *)Nssid, "%s",cJSON_GetObjectItem(root, "ssid")->valuestring);
sprintf((char *)Npassword,"%s",cJSON_GetObjectItem(root, "password")->valuestring);
// 进入无线第三步
NetWorkFlow = 3;
}
cJSON_Delete(root);
memset(JsonString, 0, sizeof(JsonString));
break;
}
}
}
}
if(NetWorkFlow == 10)
{
rlen = UART2ReadFlag&(~(1<<15));
memcpy(rbuf, (void*)&UART2ReadBuf, rlen);
memset(UART2ReadBuf, 0, sizeof(UART2ReadBuf));
UART2ReadFlag = 0;
if (strstr((char *)rbuf, "CLOSED"))
{
}
else
{
if (0xD0 == *rbuf)
{
//Sys_SendLog("MQTT Heart Beat \r\n");
}
else
{
// strncpy(Topic, (void*)(rbuf+4), rbuf[3]);
// printf("Topic: %s\r\n", Topic);
// strncpy(message,(void*)(rbuf+4+rbuf[3]),rbuf[1]-rbuf[3]-2);
// printf("Message: %s\r\n", message);
// memset(rbuf, 0, sizeof(rbuf));
}
}
}
}
}

View File

@@ -0,0 +1,18 @@
#ifndef _ESP8266_WORK_H_
#define _ESP8266_WORK_H_
#include "stm32f10x.h"
#include "esp8266_uart2.h"
#include "cJSON.h"
#include "MQTTPacket.h"
#include "MQTTConnect.h"
void ESP8266_NetWorkFlow(void);
void ESP8266_NetReceiveInfor(void);
#endif

View File

@@ -0,0 +1,196 @@
#include "pm_uart3.h"
// 校验
// 校验正确--0xff 校验错误--0x00
uint8_t PMD4_CheckSum(uint8_t *data) {
uint8_t i = 0, result = 0;
uint16_t sum = 0;
if( (data[0] == 0x42) && (data[1] == 0x4d) )
{
for(i = 0; i < 30; i++)
{
sum += data[i];
}
if( sum == ((data[30]<<8) + data[31]) )
{
result = 0xff;
}
}
return result;
}
// PM 初始化
void PMD4_Init(void) {
BSP_UART3Init(9600);
Power_PMD4(1);
Delay_ms(20);
}
// 请求获取空气信息
void PMD4_ReqGetAirInfor(uint8_t Code) {
uint16_t sum = 0;
uint8_t data[20] = {0};
uint8_t i = 0;
data[0] = 0x42;
data[1] = 0x4d;
data[2] = Code;
data[3] = 0x00;
data[4] = 0x00;
for(i = 0; i < 5; i++)
{
sum += data[i];
}
data[5] = (uint8_t)(sum>>8);
data[6] = (uint8_t)(sum>>0);
BSP_UART3SendData(data, 7);
}
/*PMD4获取空气信息*/
void PMD4_GetAirInfor(void)
{
#ifdef Device_LCD
uint16_t x = 0, y = 0;
uint8_t i = 0;
#endif
if(UART3ReadFlag&0x8000)
{
if( PMD4_CheckSum(UART3ReadBuf)==0xff)
{
DevParam.PM1_0 = (uint16_t)(UART3ReadBuf[4]<<8) + (uint16_t)(UART3ReadBuf[5]<<0);
DevParam.PM2_5 = (uint16_t)(UART3ReadBuf[6]<<8) + (uint16_t)(UART3ReadBuf[7]<<0);
DevParam.PM10 = (uint16_t)(UART3ReadBuf[8]<<8) + (uint16_t)(UART3ReadBuf[9]<<0);
}
UART3ReadFlag = 0;
memset((void *)UART3ReadBuf, 0, sizeof(UART3ReadBuf));
}
if(DevParam.AirInforGetTime >= 2000)
{
PMD4_ReqGetAirInfor(0xE2);
DevParam.AirInforGetTime = 0;
}
/**********显示实时空气信息*****************/
#ifdef Device_LCD
// PM1.0
if(DevParam.ShowPM1_0 != DevParam.PM1_0)
{
x = (uint16_t)(SimLCD.width/2/2-20);
y = 260;
// 1
i = (uint8_t)(DevParam.PM1_0/100);
SimLCD_NewShowChar( (x+8), y, (i + 16));
// 1
i = (uint8_t)(DevParam.PM1_0/10%10);
SimLCD_NewShowChar( (x+16), y, (i + 16));
// 0
i = (uint8_t)(DevParam.PM1_0%10);
SimLCD_NewShowChar( (x+24), y, (i + 16));
DevParam.ShowPM1_0 = DevParam.PM1_0;
}
// PM2.5
if(DevParam.ShowPM2_5 != DevParam.PM2_5)
{
x = (uint16_t)(SimLCD.width/2-20);
y = 80;
// 1
i = (uint8_t)(DevParam.PM2_5/100);
SimLCD_NewShowChar( (x+8), y, (i + 16));
// 1
i = (uint8_t)(DevParam.PM2_5/10%10);
SimLCD_NewShowChar( (x+16), y, (i + 16));
// 0
i = (uint8_t)(DevParam.PM2_5%10);
SimLCD_NewShowChar( (x+24), y, (i + 16));
DevParam.ShowPM2_5 = DevParam.PM2_5;
}
// PM10
if(DevParam.PM10 != DevParam.ShowPM10)
{
x = (uint16_t)(SimLCD.width/2/2*3-16);
y = 260;
// 1
i = (uint8_t)(DevParam.PM10/100);
SimLCD_NewShowChar( (x+8), y, (i + 16));
// 1
i = (uint8_t)(DevParam.PM10/10%10);
SimLCD_NewShowChar( (x+16), y, (i + 16));
// 0
i = (uint8_t)(DevParam.PM10%10);
SimLCD_NewShowChar( (x+24), y, (i + 16));
DevParam.ShowPM10 = DevParam.PM10;
}
#endif
}
/*显示部分,基础外形刷新*/
void Show_BasicShapeRefresh(void)
{
#ifdef Device_LCD
uint16_t x = 0, y = 0;
// 画上边内圆
x = (uint16_t)(SimLCD.width/2);
y = (uint16_t)(SimLCD.height/3) + 10;
// 填充圆环 r0外圆 r1内圆
SimLCD_PointColor = SimLCDColor_CYAN;
SimLCD_FillTorus( x, y, 100, 90);
// 画下边两个圆
x = (uint16_t)(SimLCD.width/2/2*3);
y = (uint16_t)(SimLCD.height/3*2) + (uint16_t)(SimLCD.height/3/2);
// 填充圆环 r0外圆 r1内圆
SimLCD_PointColor = SimLCDColor_YELLOW;
SimLCD_FillTorus( x, y, 50, 45);
x = (uint16_t)(SimLCD.width/2/2);
y = (uint16_t)(SimLCD.height/3*2) + (uint16_t)(SimLCD.height/3/2);
SimLCD_PointColor = SimLCDColor_LIGHTGREEN;
SimLCD_FillTorus( x, y, 50, 45);
// 显示字符串 PM2.5 ug/m3 PM1.0 PM10
x = (uint16_t)(SimLCD.width/2-24);
y = 40;
SimLCD_Show_PM2_5( x, y);
x = (uint16_t)(SimLCD.width/2-20);
y = 180;
SimLCD_Show_ug_m3( x, y);
x = (uint16_t)(SimLCD.width/2/2-20);
y = 230;
SimLCD_Show_PM1_0( x, y);
x = (uint16_t)(SimLCD.width/2/2*3-16);
y = 230;
SimLCD_Show_PM10( x, y);
#endif
}

View File

@@ -0,0 +1,28 @@
#ifndef _PM_UART3_H_
#define _PM_UART3_H_
#include "stm32f10x.h"
#include "bsp_uart3.h"
#include "bsp_timer3.h"
#include "bsp_port.h"
#include "simulation_lcd.h"
void PMD4_Init(void);
/*PMD4获取空气信息*/
void PMD4_GetAirInfor(void);
/*显示部分,基础外形刷新*/
void Show_BasicShapeRefresh(void);
#endif

View File

@@ -0,0 +1,270 @@
#ifndef _SIMULATION_FONT_H_
#define _SIMULATION_FONT_H_
//常用ASCII表
//偏移量32
//ASCII字符集: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
//PC2LCD2002取模方式设置阴码+逐列式+顺向+C51格式
//总共3个字符集12*12、16*16和24*24用户可以自行新增其他分辨率的字符集。
//每个字符所占用的字节数为:(size/8+((size%8)?1:0))*(size/2),其中size:是字库生成时的点阵大小(12/16/24...)
const unsigned char Simulation_Asc1206[95][12]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0x00,0x3F,0x40,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
{0x00,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x00,0x00},/*""",2*/
{0x09,0x00,0x0B,0xC0,0x3D,0x00,0x0B,0xC0,0x3D,0x00,0x09,0x00},/*"#",3*/
{0x18,0xC0,0x24,0x40,0x7F,0xE0,0x22,0x40,0x31,0x80,0x00,0x00},/*"$",4*/
{0x18,0x00,0x24,0xC0,0x1B,0x00,0x0D,0x80,0x32,0x40,0x01,0x80},/*"%",5*/
{0x03,0x80,0x1C,0x40,0x27,0x40,0x1C,0x80,0x07,0x40,0x00,0x40},/*"&",6*/
{0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x40,0x20},/*"(",8*/
{0x00,0x00,0x40,0x20,0x20,0x40,0x1F,0x80,0x00,0x00,0x00,0x00},/*")",9*/
{0x09,0x00,0x06,0x00,0x1F,0x80,0x06,0x00,0x09,0x00,0x00,0x00},/*"*",10*/
{0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x00,0x00},/*"+",11*/
{0x00,0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/
{0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00},/*"-",13*/
{0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/
{0x00,0x20,0x01,0xC0,0x06,0x00,0x38,0x00,0x40,0x00,0x00,0x00},/*"/",15*/
{0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"0",16*/
{0x00,0x00,0x10,0x40,0x3F,0xC0,0x00,0x40,0x00,0x00,0x00,0x00},/*"1",17*/
{0x18,0xC0,0x21,0x40,0x22,0x40,0x24,0x40,0x18,0x40,0x00,0x00},/*"2",18*/
{0x10,0x80,0x20,0x40,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"3",19*/
{0x02,0x00,0x0D,0x00,0x11,0x00,0x3F,0xC0,0x01,0x40,0x00,0x00},/*"4",20*/
{0x3C,0x80,0x24,0x40,0x24,0x40,0x24,0x40,0x23,0x80,0x00,0x00},/*"5",21*/
{0x1F,0x80,0x24,0x40,0x24,0x40,0x34,0x40,0x03,0x80,0x00,0x00},/*"6",22*/
{0x30,0x00,0x20,0x00,0x27,0xC0,0x38,0x00,0x20,0x00,0x00,0x00},/*"7",23*/
{0x1B,0x80,0x24,0x40,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"8",24*/
{0x1C,0x00,0x22,0xC0,0x22,0x40,0x22,0x40,0x1F,0x80,0x00,0x00},/*"9",25*/
{0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x00,0x04,0x60,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/
{0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40},/*"<",28*/
{0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x00,0x00},/*"=",29*/
{0x00,0x00,0x40,0x40,0x20,0x80,0x11,0x00,0x0A,0x00,0x04,0x00},/*">",30*/
{0x18,0x00,0x20,0x00,0x23,0x40,0x24,0x00,0x18,0x00,0x00,0x00},/*"?",31*/
{0x1F,0x80,0x20,0x40,0x27,0x40,0x29,0x40,0x1F,0x40,0x00,0x00},/*"@",32*/
{0x00,0x40,0x07,0xC0,0x39,0x00,0x0F,0x00,0x01,0xC0,0x00,0x40},/*"A",33*/
{0x20,0x40,0x3F,0xC0,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"B",34*/
{0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x30,0x80,0x00,0x00},/*"C",35*/
{0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"D",36*/
{0x20,0x40,0x3F,0xC0,0x24,0x40,0x2E,0x40,0x30,0xC0,0x00,0x00},/*"E",37*/
{0x20,0x40,0x3F,0xC0,0x24,0x40,0x2E,0x00,0x30,0x00,0x00,0x00},/*"F",38*/
{0x0F,0x00,0x10,0x80,0x20,0x40,0x22,0x40,0x33,0x80,0x02,0x00},/*"G",39*/
{0x20,0x40,0x3F,0xC0,0x04,0x00,0x04,0x00,0x3F,0xC0,0x20,0x40},/*"H",40*/
{0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x00,0x00},/*"I",41*/
{0x00,0x60,0x20,0x20,0x20,0x20,0x3F,0xC0,0x20,0x00,0x20,0x00},/*"J",42*/
{0x20,0x40,0x3F,0xC0,0x24,0x40,0x0B,0x00,0x30,0xC0,0x20,0x40},/*"K",43*/
{0x20,0x40,0x3F,0xC0,0x20,0x40,0x00,0x40,0x00,0x40,0x00,0xC0},/*"L",44*/
{0x3F,0xC0,0x3C,0x00,0x03,0xC0,0x3C,0x00,0x3F,0xC0,0x00,0x00},/*"M",45*/
{0x20,0x40,0x3F,0xC0,0x0C,0x40,0x23,0x00,0x3F,0xC0,0x20,0x00},/*"N",46*/
{0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"O",47*/
{0x20,0x40,0x3F,0xC0,0x24,0x40,0x24,0x00,0x18,0x00,0x00,0x00},/*"P",48*/
{0x1F,0x80,0x21,0x40,0x21,0x40,0x20,0xE0,0x1F,0xA0,0x00,0x00},/*"Q",49*/
{0x20,0x40,0x3F,0xC0,0x24,0x40,0x26,0x00,0x19,0xC0,0x00,0x40},/*"R",50*/
{0x18,0xC0,0x24,0x40,0x24,0x40,0x22,0x40,0x31,0x80,0x00,0x00},/*"S",51*/
{0x30,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x30,0x00,0x00,0x00},/*"T",52*/
{0x20,0x00,0x3F,0x80,0x00,0x40,0x00,0x40,0x3F,0x80,0x20,0x00},/*"U",53*/
{0x20,0x00,0x3E,0x00,0x01,0xC0,0x07,0x00,0x38,0x00,0x20,0x00},/*"V",54*/
{0x38,0x00,0x07,0xC0,0x3C,0x00,0x07,0xC0,0x38,0x00,0x00,0x00},/*"W",55*/
{0x20,0x40,0x39,0xC0,0x06,0x00,0x39,0xC0,0x20,0x40,0x00,0x00},/*"X",56*/
{0x20,0x00,0x38,0x40,0x07,0xC0,0x38,0x40,0x20,0x00,0x00,0x00},/*"Y",57*/
{0x30,0x40,0x21,0xC0,0x26,0x40,0x38,0x40,0x20,0xC0,0x00,0x00},/*"Z",58*/
{0x00,0x00,0x00,0x00,0x7F,0xE0,0x40,0x20,0x40,0x20,0x00,0x00},/*"[",59*/
{0x00,0x00,0x70,0x00,0x0C,0x00,0x03,0x80,0x00,0x40,0x00,0x00},/*"\",60*/
{0x00,0x00,0x40,0x20,0x40,0x20,0x7F,0xE0,0x00,0x00,0x00,0x00},/*"]",61*/
{0x00,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10},/*"_",63*/
{0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x02,0x80,0x05,0x40,0x05,0x40,0x03,0xC0,0x00,0x40},/*"a",65*/
{0x20,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x03,0x80,0x00,0x00},/*"b",66*/
{0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x40,0x06,0x40,0x00,0x00},/*"c",67*/
{0x00,0x00,0x03,0x80,0x04,0x40,0x24,0x40,0x3F,0xC0,0x00,0x40},/*"d",68*/
{0x00,0x00,0x03,0x80,0x05,0x40,0x05,0x40,0x03,0x40,0x00,0x00},/*"e",69*/
{0x00,0x00,0x04,0x40,0x1F,0xC0,0x24,0x40,0x24,0x40,0x20,0x00},/*"f",70*/
{0x00,0x00,0x02,0xE0,0x05,0x50,0x05,0x50,0x06,0x50,0x04,0x20},/*"g",71*/
{0x20,0x40,0x3F,0xC0,0x04,0x40,0x04,0x00,0x03,0xC0,0x00,0x40},/*"h",72*/
{0x00,0x00,0x04,0x40,0x27,0xC0,0x00,0x40,0x00,0x00,0x00,0x00},/*"i",73*/
{0x00,0x10,0x00,0x10,0x04,0x10,0x27,0xE0,0x00,0x00,0x00,0x00},/*"j",74*/
{0x20,0x40,0x3F,0xC0,0x01,0x40,0x07,0x00,0x04,0xC0,0x04,0x40},/*"k",75*/
{0x20,0x40,0x20,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00},/*"l",76*/
{0x07,0xC0,0x04,0x00,0x07,0xC0,0x04,0x00,0x03,0xC0,0x00,0x00},/*"m",77*/
{0x04,0x40,0x07,0xC0,0x04,0x40,0x04,0x00,0x03,0xC0,0x00,0x40},/*"n",78*/
{0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x40,0x03,0x80,0x00,0x00},/*"o",79*/
{0x04,0x10,0x07,0xF0,0x04,0x50,0x04,0x40,0x03,0x80,0x00,0x00},/*"p",80*/
{0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x50,0x07,0xF0,0x00,0x10},/*"q",81*/
{0x04,0x40,0x07,0xC0,0x02,0x40,0x04,0x00,0x04,0x00,0x00,0x00},/*"r",82*/
{0x00,0x00,0x06,0x40,0x05,0x40,0x05,0x40,0x04,0xC0,0x00,0x00},/*"s",83*/
{0x00,0x00,0x04,0x00,0x1F,0x80,0x04,0x40,0x00,0x40,0x00,0x00},/*"t",84*/
{0x04,0x00,0x07,0x80,0x00,0x40,0x04,0x40,0x07,0xC0,0x00,0x40},/*"u",85*/
{0x04,0x00,0x07,0x00,0x04,0xC0,0x01,0x80,0x06,0x00,0x04,0x00},/*"v",86*/
{0x06,0x00,0x01,0xC0,0x07,0x00,0x01,0xC0,0x06,0x00,0x00,0x00},/*"w",87*/
{0x04,0x40,0x06,0xC0,0x01,0x00,0x06,0xC0,0x04,0x40,0x00,0x00},/*"x",88*/
{0x04,0x10,0x07,0x10,0x04,0xE0,0x01,0x80,0x06,0x00,0x04,0x00},/*"y",89*/
{0x00,0x00,0x04,0x40,0x05,0xC0,0x06,0x40,0x04,0x40,0x00,0x00},/*"z",90*/
{0x00,0x00,0x00,0x00,0x04,0x00,0x7B,0xE0,0x40,0x20,0x00,0x00},/*"{",91*/
{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00},/*"|",92*/
{0x00,0x00,0x40,0x20,0x7B,0xE0,0x04,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
{0x40,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x40,0x00},/*"~",94*/
};
const unsigned char Simulation_Asc1608[95][16]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xCC,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
{0x00,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x00,0x00},/*""",2*/
{0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x00,0x00},/*"#",3*/
{0x00,0x00,0x0E,0x18,0x11,0x04,0x3F,0xFF,0x10,0x84,0x0C,0x78,0x00,0x00,0x00,0x00},/*"$",4*/
{0x0F,0x00,0x10,0x84,0x0F,0x38,0x00,0xC0,0x07,0x78,0x18,0x84,0x00,0x78,0x00,0x00},/*"%",5*/
{0x00,0x78,0x0F,0x84,0x10,0xC4,0x11,0x24,0x0E,0x98,0x00,0xE4,0x00,0x84,0x00,0x08},/*"&",6*/
{0x08,0x00,0x68,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x18,0x18,0x20,0x04,0x40,0x02,0x00,0x00},/*"(",8*/
{0x00,0x00,0x40,0x02,0x20,0x04,0x18,0x18,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*")",9*/
{0x02,0x40,0x02,0x40,0x01,0x80,0x0F,0xF0,0x01,0x80,0x02,0x40,0x02,0x40,0x00,0x00},/*"*",10*/
{0x00,0x80,0x00,0x80,0x00,0x80,0x0F,0xF8,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00},/*"+",11*/
{0x00,0x01,0x00,0x0D,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/
{0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80},/*"-",13*/
{0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/
{0x00,0x00,0x00,0x06,0x00,0x18,0x00,0x60,0x01,0x80,0x06,0x00,0x18,0x00,0x20,0x00},/*"/",15*/
{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},/*"0",16*/
{0x00,0x00,0x08,0x04,0x08,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"1",17*/
{0x00,0x00,0x0E,0x0C,0x10,0x14,0x10,0x24,0x10,0x44,0x11,0x84,0x0E,0x0C,0x00,0x00},/*"2",18*/
{0x00,0x00,0x0C,0x18,0x10,0x04,0x11,0x04,0x11,0x04,0x12,0x88,0x0C,0x70,0x00,0x00},/*"3",19*/
{0x00,0x00,0x00,0xE0,0x03,0x20,0x04,0x24,0x08,0x24,0x1F,0xFC,0x00,0x24,0x00,0x00},/*"4",20*/
{0x00,0x00,0x1F,0x98,0x10,0x84,0x11,0x04,0x11,0x04,0x10,0x88,0x10,0x70,0x00,0x00},/*"5",21*/
{0x00,0x00,0x07,0xF0,0x08,0x88,0x11,0x04,0x11,0x04,0x18,0x88,0x00,0x70,0x00,0x00},/*"6",22*/
{0x00,0x00,0x1C,0x00,0x10,0x00,0x10,0xFC,0x13,0x00,0x1C,0x00,0x10,0x00,0x00,0x00},/*"7",23*/
{0x00,0x00,0x0E,0x38,0x11,0x44,0x10,0x84,0x10,0x84,0x11,0x44,0x0E,0x38,0x00,0x00},/*"8",24*/
{0x00,0x00,0x07,0x00,0x08,0x8C,0x10,0x44,0x10,0x44,0x08,0x88,0x07,0xF0,0x00,0x00},/*"9",25*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x03,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/
{0x00,0x00,0x00,0x80,0x01,0x40,0x02,0x20,0x04,0x10,0x08,0x08,0x10,0x04,0x00,0x00},/*"<",28*/
{0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00},/*"=",29*/
{0x00,0x00,0x10,0x04,0x08,0x08,0x04,0x10,0x02,0x20,0x01,0x40,0x00,0x80,0x00,0x00},/*">",30*/
{0x00,0x00,0x0E,0x00,0x12,0x00,0x10,0x0C,0x10,0x6C,0x10,0x80,0x0F,0x00,0x00,0x00},/*"?",31*/
{0x03,0xE0,0x0C,0x18,0x13,0xE4,0x14,0x24,0x17,0xC4,0x08,0x28,0x07,0xD0,0x00,0x00},/*"@",32*/
{0x00,0x04,0x00,0x3C,0x03,0xC4,0x1C,0x40,0x07,0x40,0x00,0xE4,0x00,0x1C,0x00,0x04},/*"A",33*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x04,0x11,0x04,0x0E,0x88,0x00,0x70,0x00,0x00},/*"B",34*/
{0x03,0xE0,0x0C,0x18,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x1C,0x10,0x00,0x00},/*"C",35*/
{0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},/*"D",36*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x04,0x17,0xC4,0x10,0x04,0x08,0x18,0x00,0x00},/*"E",37*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x00,0x17,0xC0,0x10,0x00,0x08,0x00,0x00,0x00},/*"F",38*/
{0x03,0xE0,0x0C,0x18,0x10,0x04,0x10,0x04,0x10,0x44,0x1C,0x78,0x00,0x40,0x00,0x00},/*"G",39*/
{0x10,0x04,0x1F,0xFC,0x10,0x84,0x00,0x80,0x00,0x80,0x10,0x84,0x1F,0xFC,0x10,0x04},/*"H",40*/
{0x00,0x00,0x10,0x04,0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x04,0x00,0x00,0x00,0x00},/*"I",41*/
{0x00,0x03,0x00,0x01,0x10,0x01,0x10,0x01,0x1F,0xFE,0x10,0x00,0x10,0x00,0x00,0x00},/*"J",42*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x03,0x80,0x14,0x64,0x18,0x1C,0x10,0x04,0x00,0x00},/*"K",43*/
{0x10,0x04,0x1F,0xFC,0x10,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00},/*"L",44*/
{0x10,0x04,0x1F,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x1F,0xFC,0x10,0x04,0x00,0x00},/*"M",45*/
{0x10,0x04,0x1F,0xFC,0x0C,0x04,0x03,0x00,0x00,0xE0,0x10,0x18,0x1F,0xFC,0x10,0x00},/*"N",46*/
{0x07,0xF0,0x08,0x08,0x10,0x04,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},/*"O",47*/
{0x10,0x04,0x1F,0xFC,0x10,0x84,0x10,0x80,0x10,0x80,0x10,0x80,0x0F,0x00,0x00,0x00},/*"P",48*/
{0x07,0xF0,0x08,0x18,0x10,0x24,0x10,0x24,0x10,0x1C,0x08,0x0A,0x07,0xF2,0x00,0x00},/*"Q",49*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x00,0x11,0xC0,0x11,0x30,0x0E,0x0C,0x00,0x04},/*"R",50*/
{0x00,0x00,0x0E,0x1C,0x11,0x04,0x10,0x84,0x10,0x84,0x10,0x44,0x1C,0x38,0x00,0x00},/*"S",51*/
{0x18,0x00,0x10,0x00,0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x00,0x18,0x00,0x00,0x00},/*"T",52*/
{0x10,0x00,0x1F,0xF8,0x10,0x04,0x00,0x04,0x00,0x04,0x10,0x04,0x1F,0xF8,0x10,0x00},/*"U",53*/
{0x10,0x00,0x1E,0x00,0x11,0xE0,0x00,0x1C,0x00,0x70,0x13,0x80,0x1C,0x00,0x10,0x00},/*"V",54*/
{0x1F,0xC0,0x10,0x3C,0x00,0xE0,0x1F,0x00,0x00,0xE0,0x10,0x3C,0x1F,0xC0,0x00,0x00},/*"W",55*/
{0x10,0x04,0x18,0x0C,0x16,0x34,0x01,0xC0,0x01,0xC0,0x16,0x34,0x18,0x0C,0x10,0x04},/*"X",56*/
{0x10,0x00,0x1C,0x00,0x13,0x04,0x00,0xFC,0x13,0x04,0x1C,0x00,0x10,0x00,0x00,0x00},/*"Y",57*/
{0x08,0x04,0x10,0x1C,0x10,0x64,0x10,0x84,0x13,0x04,0x1C,0x04,0x10,0x18,0x00,0x00},/*"Z",58*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFE,0x40,0x02,0x40,0x02,0x40,0x02,0x00,0x00},/*"[",59*/
{0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x80,0x00,0x60,0x00,0x1C,0x00,0x03,0x00,0x00},/*"\",60*/
{0x00,0x00,0x40,0x02,0x40,0x02,0x40,0x02,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00},/*"]",61*/
{0x00,0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x00,0x00},/*"^",62*/
{0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01},/*"_",63*/
{0x00,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x00,0x98,0x01,0x24,0x01,0x44,0x01,0x44,0x01,0x44,0x00,0xFC,0x00,0x04},/*"a",65*/
{0x10,0x00,0x1F,0xFC,0x00,0x88,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x70,0x00,0x00},/*"b",66*/
{0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x00},/*"c",67*/
{0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x11,0x08,0x1F,0xFC,0x00,0x04},/*"d",68*/
{0x00,0x00,0x00,0xF8,0x01,0x44,0x01,0x44,0x01,0x44,0x01,0x44,0x00,0xC8,0x00,0x00},/*"e",69*/
{0x00,0x00,0x01,0x04,0x01,0x04,0x0F,0xFC,0x11,0x04,0x11,0x04,0x11,0x00,0x18,0x00},/*"f",70*/
{0x00,0x00,0x00,0xD6,0x01,0x29,0x01,0x29,0x01,0x29,0x01,0xC9,0x01,0x06,0x00,0x00},/*"g",71*/
{0x10,0x04,0x1F,0xFC,0x00,0x84,0x01,0x00,0x01,0x00,0x01,0x04,0x00,0xFC,0x00,0x04},/*"h",72*/
{0x00,0x00,0x01,0x04,0x19,0x04,0x19,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"i",73*/
{0x00,0x00,0x00,0x03,0x00,0x01,0x01,0x01,0x19,0x01,0x19,0xFE,0x00,0x00,0x00,0x00},/*"j",74*/
{0x10,0x04,0x1F,0xFC,0x00,0x24,0x00,0x40,0x01,0xB4,0x01,0x0C,0x01,0x04,0x00,0x00},/*"k",75*/
{0x00,0x00,0x10,0x04,0x10,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"l",76*/
{0x01,0x04,0x01,0xFC,0x01,0x04,0x01,0x00,0x01,0xFC,0x01,0x04,0x01,0x00,0x00,0xFC},/*"m",77*/
{0x01,0x04,0x01,0xFC,0x00,0x84,0x01,0x00,0x01,0x00,0x01,0x04,0x00,0xFC,0x00,0x04},/*"n",78*/
{0x00,0x00,0x00,0xF8,0x01,0x04,0x01,0x04,0x01,0x04,0x01,0x04,0x00,0xF8,0x00,0x00},/*"o",79*/
{0x01,0x01,0x01,0xFF,0x00,0x85,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x70,0x00,0x00},/*"p",80*/
{0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x01,0x05,0x01,0xFF,0x00,0x01},/*"q",81*/
{0x01,0x04,0x01,0x04,0x01,0xFC,0x00,0x84,0x01,0x04,0x01,0x00,0x01,0x80,0x00,0x00},/*"r",82*/
{0x00,0x00,0x00,0xCC,0x01,0x24,0x01,0x24,0x01,0x24,0x01,0x24,0x01,0x98,0x00,0x00},/*"s",83*/
{0x00,0x00,0x01,0x00,0x01,0x00,0x07,0xF8,0x01,0x04,0x01,0x04,0x00,0x00,0x00,0x00},/*"t",84*/
{0x01,0x00,0x01,0xF8,0x00,0x04,0x00,0x04,0x00,0x04,0x01,0x08,0x01,0xFC,0x00,0x04},/*"u",85*/
{0x01,0x00,0x01,0x80,0x01,0x70,0x00,0x0C,0x00,0x10,0x01,0x60,0x01,0x80,0x01,0x00},/*"v",86*/
{0x01,0xF0,0x01,0x0C,0x00,0x30,0x01,0xC0,0x00,0x30,0x01,0x0C,0x01,0xF0,0x01,0x00},/*"w",87*/
{0x00,0x00,0x01,0x04,0x01,0x8C,0x00,0x74,0x01,0x70,0x01,0x8C,0x01,0x04,0x00,0x00},/*"x",88*/
{0x01,0x01,0x01,0x81,0x01,0x71,0x00,0x0E,0x00,0x18,0x01,0x60,0x01,0x80,0x01,0x00},/*"y",89*/
{0x00,0x00,0x01,0x84,0x01,0x0C,0x01,0x34,0x01,0x44,0x01,0x84,0x01,0x0C,0x00,0x00},/*"z",90*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x3E,0xFC,0x40,0x02,0x40,0x02},/*"{",91*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00},/*"|",92*/
{0x00,0x00,0x40,0x02,0x40,0x02,0x3E,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
{0x00,0x00,0x60,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00},/*"~",94*/
};
const unsigned char Simulation_Asc3636[5][36]= {
{0x00,0x00,0x00,0x0F,0xFF,0xF8,0x0F,0xFF,0xF8,0x0C,0x0C,0x00,0x0C,0x0C,0x00,0x0C,0x0C,0x00,0x04,0x0C,0x00,0x06,0x0C,0x00,0x06,0x1C,0x00,0x03,0xF8,0x00,0x01,0xF0,
0x00,0x00,0x00,0x00},/*"P",0*/
{0x00,0x00,0x00,0x0F,0xFF,0xF8,0x0F,0xFF,0xF8,0x0F,0xF0,0x00,0x00,0xFF,0x80,0x00,0x07,0xF8,0x00,0x07,0xF8,0x01,0xFF,0x00,0x0F,0xE0,0x00,0x0F,0xFF,0xF8,0x0F,0xFF,
0xF8,0x00,0x00,0x00},/*"M",1*/
{0x00,0x00,0x00,0x01,0x80,0x10,0x07,0x80,0x70,0x06,0x00,0xF0,0x0C,0x01,0xD0,0x0C,0x03,0x90,0x0C,0x07,0x10,0x0E,0x1C,0x10,0x07,0xF8,0x10,0x03,0xE0,0x10,0x00,0x00,
0x10,0x00,0x00,0x00},/*"2",2*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00},/*".",3*/
{0x00,0x00,0x80,0x00,0x38,0xE0,0x07,0xF8,0x70,0x07,0xB0,0x10,0x04,0x20,0x18,0x04,0x20,0x18,0x04,0x30,0x18,0x04,0x30,0x30,0x04,0x3C,0xF0,0x04,0x1F,0xE0,0x00,0x03,
0x00,0x00,0x00,0x00},/*"5",4*/
};
const unsigned char Simulation_Asc3838[10][90]= {
{0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFC,0x00,0x00,
0x00,0x3F,0xFF,0xC0,0x00,0x00,0x7F,0xFF,0xF0,0x00,
0x00,0xFC,0x01,0xF8,0x00,0x01,0xE0,0x00,0x78,0x00,
0x03,0xC0,0x00,0x1C,0x00,0x03,0x80,0x00,0x1C,0x00,
0x03,0x00,0x00,0x0E,0x00,0x03,0x00,0x00,0x0E,0x00,
0x03,0x80,0x00,0x1C,0x00,0x03,0xC0,0x00,0x3C,0x00,
0x01,0xF0,0x00,0x78,0x00,0x00,0xFF,0xFF,0xF0,0x00,
0x00,0x7F,0xFF,0xE0,0x00,0x00,0x0F,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"0",0*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x70,
0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFC,0x00,0x03,0xFF,0xFF,0xFC,0x00,0x03,0xFF,0xFF,0xFC,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"1",1*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x70,0x00,0x1C,0x00,0x00,0xF8,0x00,0x3C,0x00,0x01,0xE0,0x00,0x7C,0x00,0x03,0xC0,0x00,0xFC,0x00,0x03,0x80,
0x01,0xEC,0x00,0x03,0x80,0x03,0xCC,0x00,0x03,0x80,0x0F,0x0C,0x00,0x03,0x80,0x1E,0x0C,0x00,0x03,0x80,0x3C,0x0C,0x00,0x03,0x80,0xF8,0x0C,0x00,0x01,0xE7,0xE0,0x0C,
0x00,0x01,0xFF,0xC0,0x0C,0x00,0x00,0xFF,0x00,0x0C,0x00,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"2",2*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x30,0x00,0xE0,0x00,0x00,0x70,0x00,0xF0,0x00,0x01,0xF0,0x00,0x78,0x00,0x01,0xC0,0x00,0x3C,0x00,0x03,0x80,
0x00,0x1C,0x00,0x03,0x80,0x60,0x0C,0x00,0x03,0x00,0xE0,0x0C,0x00,0x03,0x00,0xE0,0x0C,0x00,0x03,0x80,0xE0,0x1C,0x00,0x03,0x81,0xF0,0x1C,0x00,0x01,0xE7,0xB8,0x78,
0x00,0x01,0xFF,0x3F,0xF8,0x00,0x00,0xFE,0x1F,0xF0,0x00,0x00,0x18,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"3",3*/
{0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x7B,0x80,0x00,0x00,0x01,0xE3,0x80,0x00,0x00,0x03,
0xC3,0x80,0x00,0x00,0x0F,0x83,0x80,0x00,0x00,0x1E,0x03,0x80,0x00,0x00,0x7C,0x03,0x80,0x00,0x00,0xF0,0x03,0x80,0x00,0x03,0xFF,0xFF,0xFC,0x00,0x03,0xFF,0xFF,0xFC,
0x00,0x03,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"4",4*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xE0,0x00,0x00,0x07,0xE0,0xF0,0x00,0x00,0xFF,0xE0,0x78,0x00,0x03,0xFF,0xC0,0x1C,0x00,0x03,0xF1,0x80,0x1C,0x00,0x03,0x83,
0x80,0x0E,0x00,0x03,0x83,0x80,0x0E,0x00,0x03,0x83,0x80,0x0E,0x00,0x03,0x83,0x80,0x0C,0x00,0x03,0x83,0x80,0x1C,0x00,0x03,0x81,0xC0,0x3C,0x00,0x03,0x81,0xE0,0x78,
0x00,0x03,0x80,0xFF,0xF8,0x00,0x03,0x80,0x7F,0xE0,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"5",5*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x03,0xF8,0xF8,0x00,0x00,0x07,0xE0,0x3C,0x00,0x00,0x1F,
0xC0,0x1C,0x00,0x00,0x3F,0x80,0x0C,0x00,0x00,0xF9,0x80,0x0E,0x00,0x01,0xF1,0x80,0x0E,0x00,0x03,0xC1,0x80,0x0E,0x00,0x03,0x01,0xC0,0x0C,0x00,0x02,0x01,0xC0,0x1C,
0x00,0x00,0x00,0xE0,0x7C,0x00,0x00,0x00,0xFF,0xF8,0x00,0x00,0x00,0x7F,0xF0,0x00,0x00,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},/*"6",6*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x03,0x80,0x00,0x1C,0x00,0x03,0x80,
0x00,0xFC,0x00,0x03,0x80,0x07,0xFC,0x00,0x03,0x80,0x1F,0xE0,0x00,0x03,0x80,0x7F,0x00,0x00,0x03,0x81,0xF8,0x00,0x00,0x03,0x87,0xE0,0x00,0x00,0x03,0x9F,0x00,0x00,
0x00,0x03,0xFC,0x00,0x00,0x00,0x03,0xF0,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"7",7*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x00,0x00,0x7E,0x1F,0xF0,0x00,0x00,0xFF,0xBF,0xF8,0x00,0x01,0xE7,0xF8,0x3C,0x00,0x03,0x81,0xF0,0x1C,0x00,0x03,0x80,
0xE0,0x0C,0x00,0x03,0x80,0xE0,0x0E,0x00,0x03,0x00,0xE0,0x0E,0x00,0x03,0x80,0xE0,0x0E,0x00,0x03,0x80,0xE0,0x0C,0x00,0x03,0x81,0xF0,0x1C,0x00,0x01,0xE7,0xB8,0x3C,
0x00,0x00,0xFF,0x3F,0xF8,0x00,0x00,0x7E,0x1F,0xF0,0x00,0x00,0x00,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"8",8*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x7F,0xE0,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x01,0xE0,0x78,0x00,0x00,0x03,0xC0,0x38,0x06,0x00,0x03,0x80,
0x18,0x1E,0x00,0x03,0x80,0x18,0x7E,0x00,0x03,0x80,0x19,0xF8,0x00,0x03,0x80,0x1F,0xE0,0x00,0x03,0x80,0x3F,0xC0,0x00,0x03,0xC0,0x7F,0x00,0x00,0x01,0xE1,0xFC,0x00,
0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"9",9*/
};
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,206 @@
#ifndef _SIMULATION_LCD_H_
#define _SIMULATION_LCD_H_
#include "stm32f10x.h"
#include "bsp_clock.h"
#include "stdlib.h"
typedef struct
{
uint16_t width; // LCD 宽度
uint16_t height; // LCD 高度
uint16_t id; // LCD ID
uint8_t dir; // 横屏还是竖屏控制0竖屏1横屏。
uint8_t wramcmd; // 开始写gram指令
uint8_t setxcmd; // 设置x坐标指令
uint8_t setycmd; // 设置y坐标指令
}SimLCD_t;
extern SimLCD_t SimLCD; //管理LCD重要参数
//LCD的画笔颜色和背景色
extern uint16_t SimLCD_PointColor;// 画笔颜色
extern uint16_t SimLCD_BackColor;// 背景色
//扫描方向定义
#define SimLCD_L2R_U2D 0 //从左到右,从上到下
#define SimLCD_L2R_D2U 1 //从左到右,从下到上
#define SimLCD_R2L_U2D 2 //从右到左,从上到下
#define SimLCD_R2L_D2U 3 //从右到左,从下到上
#define SimLCD_U2D_L2R 4 //从上到下,从左到右
#define SimLCD_U2D_R2L 5 //从上到下,从右到左
#define SimLCD_D2U_L2R 6 //从下到上,从左到右
#define SimLCD_D2U_R2L 7 //从下到上,从右到左
// 默认的扫描方向
#define SimLCD_DefScanDir SimLCD_L2R_U2D
void SimLCD_Init(void);
void SimLCD_Clear(uint16_t color);
void SimLCD_DrawPoint(uint16_t x, uint16_t y);
uint16_t SimLCD_ReadPoint(uint16_t x, uint16_t y);
void SimLCD_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t color);
void SimLCD_ColorFill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t *color);
void SimLCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void SimLCD_DrawCircle(uint16_t x0,uint16_t y0,uint8_t r);
void SimLCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void SimLCD_ShowNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size);
void SimLCD_ShowxNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size,uint8_t mode);
void SimLCD_ShowString(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint8_t size,uint8_t *p);
void SimLCD_FillTorus(uint16_t x0,uint16_t y0,uint16_t r0,uint16_t r1);
void SimLCD_Show_PM2_5(uint16_t x, uint16_t y);
void SimLCD_Show_ug_m3(uint16_t x, uint16_t y);
void SimLCD_Show_PM1_0(uint16_t x, uint16_t y);
void SimLCD_Show_PM10(uint16_t x, uint16_t y);
void SimLCD_NewShowChar(uint16_t x, uint16_t y, uint16_t ziti);
void SimLCD_NewShowNum32(uint16_t x, uint16_t y, uint16_t ziti);
//画笔颜色
#define SimLCDColor_WHITE 0xFFFF
#define SimLCDColor_BLACK 0x0000
#define SimLCDColor_BLUE 0x001F
#define SimLCDColor_BRED 0XF81F
#define SimLCDColor_GRED 0XFFE0
#define SimLCDColor_GBLUE 0X07FF
#define SimLCDColor_RED 0xF800
#define SimLCDColor_MAGENTA 0xF81F
#define SimLCDColor_GREEN 0x07E0
#define SimLCDColor_CYAN 0x7FFF
#define SimLCDColor_YELLOW 0xFFE0
#define SimLCDColor_BROWN 0XBC40 //棕色
#define SimLCDColor_BRRED 0XFC07 //棕红色
#define SimLCDColor_GRAY 0X8430 //灰色
//GUI颜色
#define SimLCDColor_DARKBLUE 0X01CF //深蓝色
#define SimLCDColor_LIGHTBLUE 0X7D7C //浅蓝色
#define SimLCDColor_GRAYBLUE 0X5458 //灰蓝色
//以上三色为PANEL的颜色
#define SimLCDColor_LIGHTGREEN 0X841F //浅绿色
//#define SimLCDColor_LIGHTGRAY 0XEF5B //浅灰色(PANNEL)
#define SimLCDColor_LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色
#define SimLCDColor_LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色)
#define SimLCDColor_LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色)
//9320/9325 LCD寄存器
#define SimLCD_R0 0x00
#define SimLCD_R1 0x01
#define SimLCD_R2 0x02
#define SimLCD_R3 0x03
#define SimLCD_R4 0x04
#define SimLCD_R5 0x05
#define SimLCD_R6 0x06
#define SimLCD_R7 0x07
#define SimLCD_R8 0x08
#define SimLCD_R9 0x09
#define SimLCD_R10 0x0A
#define SimLCD_R12 0x0C
#define SimLCD_R13 0x0D
#define SimLCD_R14 0x0E
#define SimLCD_R15 0x0F
#define SimLCD_R16 0x10
#define SimLCD_R17 0x11
#define SimLCD_R18 0x12
#define SimLCD_R19 0x13
#define SimLCD_R20 0x14
#define SimLCD_R21 0x15
#define SimLCD_R22 0x16
#define SimLCD_R23 0x17
#define SimLCD_R24 0x18
#define SimLCD_R25 0x19
#define SimLCD_R26 0x1A
#define SimLCD_R27 0x1B
#define SimLCD_R28 0x1C
#define SimLCD_R29 0x1D
#define SimLCD_R30 0x1E
#define SimLCD_R31 0x1F
#define SimLCD_R32 0x20
#define SimLCD_R33 0x21
#define SimLCD_R34 0x22
#define SimLCD_R36 0x24
#define SimLCD_R37 0x25
#define SimLCD_R40 0x28
#define SimLCD_R41 0x29
#define SimLCD_R43 0x2B
#define SimLCD_R45 0x2D
#define SimLCD_R48 0x30
#define SimLCD_R49 0x31
#define SimLCD_R50 0x32
#define SimLCD_R51 0x33
#define SimLCD_R52 0x34
#define SimLCD_R53 0x35
#define SimLCD_R54 0x36
#define SimLCD_R55 0x37
#define SimLCD_R56 0x38
#define SimLCD_R57 0x39
#define SimLCD_R59 0x3B
#define SimLCD_R60 0x3C
#define SimLCD_R61 0x3D
#define SimLCD_R62 0x3E
#define SimLCD_R63 0x3F
#define SimLCD_R64 0x40
#define SimLCD_R65 0x41
#define SimLCD_R66 0x42
#define SimLCD_R67 0x43
#define SimLCD_R68 0x44
#define SimLCD_R69 0x45
#define SimLCD_R70 0x46
#define SimLCD_R71 0x47
#define SimLCD_R72 0x48
#define SimLCD_R73 0x49
#define SimLCD_R74 0x4A
#define SimLCD_R75 0x4B
#define SimLCD_R76 0x4C
#define SimLCD_R77 0x4D
#define SimLCD_R78 0x4E
#define SimLCD_R79 0x4F
#define SimLCD_R80 0x50
#define SimLCD_R81 0x51
#define SimLCD_R82 0x52
#define SimLCD_R83 0x53
#define SimLCD_R96 0x60
#define SimLCD_R97 0x61
#define SimLCD_R106 0x6A
#define SimLCD_R118 0x76
#define SimLCD_R128 0x80
#define SimLCD_R129 0x81
#define SimLCD_R130 0x82
#define SimLCD_R131 0x83
#define SimLCD_R132 0x84
#define SimLCD_R133 0x85
#define SimLCD_R134 0x86
#define SimLCD_R135 0x87
#define SimLCD_R136 0x88
#define SimLCD_R137 0x89
#define SimLCD_R139 0x8B
#define SimLCD_R140 0x8C
#define SimLCD_R141 0x8D
#define SimLCD_R143 0x8F
#define SimLCD_R144 0x90
#define SimLCD_R145 0x91
#define SimLCD_R146 0x92
#define SimLCD_R147 0x93
#define SimLCD_R148 0x94
#define SimLCD_R149 0x95
#define SimLCD_R150 0x96
#define SimLCD_R151 0x97
#define SimLCD_R152 0x98
#define SimLCD_R153 0x99
#define SimLCD_R154 0x9A
#define SimLCD_R157 0x9D
#define SimLCD_R192 0xC0
#define SimLCD_R193 0xC1
#define SimLCD_R229 0xE5
#endif

View File

@@ -0,0 +1,116 @@
#include "stmflash.h"
//读取指定地址的半字(16位数据)
//faddr:读地址(此地址必须为2的倍数!!)
//返回值:对应数据.
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
return *(vu16*)faddr;
}
#if STM32_FLASH_WREN //如果使能了写
//不检查的写入
//WriteAddr:起始地址
//pBuffer:数据指针
//NumToWrite:半字(16位)数
void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
u16 i;
for(i=0;i<NumToWrite;i++)
{
FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);
WriteAddr+=2;//地址增加2.
}
}
//从指定地址开始写入指定长度的数据
//WriteAddr:起始地址(此地址必须为2的倍数!!)
//pBuffer:数据指针
//NumToWrite:半字(16位)数(就是要写入的16位数据的个数.)
#if STM32_FLASH_SIZE<256
#define STM_SECTOR_SIZE 1024 //字节
#else
#define STM_SECTOR_SIZE 2048
#endif
u16 STMFLASH_BUF[STM_SECTOR_SIZE/2];//最多是2K字节
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
u32 secpos; //扇区地址
u16 secoff; //扇区内偏移地址(16位字计算)
u16 secremain; //扇区内剩余地址(16位字计算)
u16 i;
u32 offaddr; //去掉0X08000000后的地址
if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址
FLASH_Unlock(); //解锁
offaddr=WriteAddr-STM32_FLASH_BASE; //实际偏移地址.
secpos=offaddr/STM_SECTOR_SIZE; //扇区地址 0~127 for STM32F103RBT6
secoff=(offaddr%STM_SECTOR_SIZE)/2; //在扇区内的偏移(2个字节为基本单位.)
secremain=STM_SECTOR_SIZE/2-secoff; //扇区剩余空间大小
if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围
while(1)
{
STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容
for(i=0;i<secremain;i++)//校验数据
{
if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除
}
if(i<secremain)//需要擦除
{
FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除这个扇区
for(i=0;i<secremain;i++)//复制
{
STMFLASH_BUF[i+secoff]=pBuffer[i];
}
STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区
}else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.
if(NumToWrite==secremain)break;//写入结束了
else//写入未结束
{
secpos++; //扇区地址增1
secoff=0; //偏移位置为0
pBuffer+=secremain; //指针偏移
WriteAddr+=secremain; //写地址偏移
NumToWrite-=secremain; //字节(16位)数递减
if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
else secremain=NumToWrite;//下一个扇区可以写完了
}
};
FLASH_Lock();//上锁
}
#endif
//从指定地址开始读出指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToWrite:半字(16位)数
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)
{
u16 i;
for(i=0;i<NumToRead;i++)
{
pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.
ReadAddr+=2;//偏移2个字节.
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//WriteAddr:起始地址
//WriteData:要写入的数据
void Test_Write(u32 WriteAddr,u16 WriteData)
{
STMFLASH_Write(WriteAddr,&WriteData,1);//写入一个字
}

View File

@@ -0,0 +1,44 @@
#ifndef __STMFLASH_H__
#define __STMFLASH_H__
#include "stm32f10x.h"
#include "bsp_clock.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//用户根据自己的需要设置
#define STM32_FLASH_SIZE 512 //所选STM32的FLASH容量大小(单位为K)
#define STM32_FLASH_WREN 1 //使能FLASH写入(0不是能;1使能)
//////////////////////////////////////////////////////////////////////////////////////////////////////
//FLASH起始地址
#define STM32_FLASH_BASE 0x08000000 //STM32 FLASH的起始地址
//FLASH解锁键值
u16 STMFLASH_ReadHalfWord(u32 faddr); //读出半字
void STMFLASH_WriteLenByte(u32 WriteAddr,u32 DataToWrite,u16 Len); //指定地址开始写入指定长度的数据
u32 STMFLASH_ReadLenByte(u32 ReadAddr,u16 Len); //指定地址开始读取指定长度数据
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite); //从指定地址开始写入指定长度的数据
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead); //从指定地址开始读出指定长度的数据
//测试写入
void Test_Write(u32 WriteAddr,u16 WriteData);
#endif