mirror of
https://github.com/wagiminator/ATmega-Soldering-Station.git
synced 2025-08-07 13:00:30 +03:00
1. Modify the scrolling direction to make the scrolling more coordinated with the number size change 2. The main page also USES numerical scrolling in the simplified mode to make the temperature change more vivid
1211 lines
108 KiB
C++
1211 lines
108 KiB
C++
/*License: http://creativecommons.org/licenses/by-sa/3.0/
|
||
采用CC3.0协议共享此程序
|
||
您可以自由地:
|
||
共享 — 在任何媒介以任何形式复制、发行本作品
|
||
演绎 — 修改、转换或以本作品为基础进行创作
|
||
在任何用途下,甚至商业目的。
|
||
本许可协议为“自由文化作品(Free Cultural Works)”所接受。
|
||
只要你遵守许可协议条款,许可人就无法收回你的这些权利。
|
||
|
||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
|
||
This is a human-readable summary of (and not a substitute for) the license. Disclaimer.
|
||
You are free to:
|
||
Share — copy and redistribute the material in any medium or format
|
||
Adapt — remix, transform, and build upon the material
|
||
for any purpose, even commercially.
|
||
This license is acceptable for Free Cultural Works.
|
||
The licensor cannot revoke these freedoms as long as you follow the license terms.
|
||
*/
|
||
// SolderingStation2
|
||
//
|
||
// ATmega328-controlled Soldering Station for Hakko T12 Tips.
|
||
//
|
||
// This version of the code implements:
|
||
// - Temperature measurement of the tip
|
||
// - Direct or PID control of the heater
|
||
// - Temperature control via rotary encoder
|
||
// - Boost mode by short pressing rotary encoder switch
|
||
// - Setup menu by long pressing rotary encoder switch
|
||
// - Handle movement detection (by checking ball switch)
|
||
// - Iron unconnected detection (by idenfying invalid temperature readings)
|
||
// - Time driven sleep/power off mode if iron is unused (movement detection)
|
||
// - Measurement of input voltage, Vcc and ATmega's internal temperature
|
||
// - Information display on OLED
|
||
// - Buzzer
|
||
// - Calibrating and managing different soldering tips
|
||
// - Storing user settings into the EEPROM
|
||
// - Tip change detection
|
||
//
|
||
// Power supply should be in the range of 16V/2A to 24V/3A and well
|
||
// stabilized.
|
||
//
|
||
// For calibration you need a soldering iron tips thermometer. For best results
|
||
// wait at least three minutes after switching on the soldering station before
|
||
// you start the calibration process.
|
||
//
|
||
// Controller: ATmega328p
|
||
// Core: Barebones ATmega (https://github.com/carlosefr/atmega)
|
||
// Clockspeed: 16 MHz external
|
||
//
|
||
// 2019/2020 by Stefan Wagner with great support from John Glavinos
|
||
// 2020-8 UI upgrade by LHW-createskyblue
|
||
|
||
// Project Page: https://easyeda.com/wagiminator
|
||
|
||
//关于界面-项目页面二维码
|
||
const unsigned char QRCode[] PROGMEM = { 0x00, 0x00, 0x3e, 0x0e, 0x7c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x0e, 0x7c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x0e, 0x7c, 0x0c, 0x00, 0x00, 0x1f, 0xfe, 0x3f, 0xc1, 0x8c, 0x0c, 0x7f, 0xf8, 0x1f, 0xfe, 0x3f, 0xc1, 0x8c, 0x0c, 0x7f, 0xf8, 0x18, 0x06, 0x30, 0x01, 0xf3, 0x8c, 0x60, 0x18, 0x18, 0x06, 0x30, 0x01, 0xf3, 0x8c, 0x60, 0x18, 0x18, 0x06, 0x30, 0x01, 0xf3, 0x8c, 0x60, 0x18, 0x18, 0x06, 0x3e, 0x0f, 0xf0, 0x0c, 0x60, 0x18, 0x18, 0x06, 0x3e, 0x0f, 0xf0, 0x0c, 0x60, 0x18, 0x18, 0x06, 0x3f, 0xc1, 0xf0, 0x0c, 0x60, 0x18, 0x18, 0x06, 0x3f, 0xc1, 0xf0, 0x0c, 0x60, 0x18, 0x18, 0x06, 0x3f, 0xc1, 0xf0, 0x0c, 0x60, 0x18, 0x1f, 0xfe, 0x3e, 0x30, 0x70, 0x0c, 0x7f, 0xf8, 0x1f, 0xfe, 0x3e, 0x30, 0x70, 0x0c, 0x7f, 0xf8, 0x00, 0x00, 0x31, 0xce, 0x73, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x31, 0xce, 0x73, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x31, 0xce, 0x73, 0x8c, 0x00, 0x00, 0xff, 0xff, 0xf0, 0x01, 0x83, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x01, 0x83, 0x8f, 0xff, 0xff, 0x00, 0xc0, 0x01, 0xc1, 0x8c, 0x00, 0x7f, 0x1f, 0x00, 0xc0, 0x01, 0xc1, 0x8c, 0x00, 0x7f, 0x1f, 0x00, 0xc0, 0x01, 0xc1, 0x8c, 0x00, 0x7f, 0x1f, 0x07, 0xc7, 0xcf, 0xce, 0x7f, 0x8c, 0x1f, 0xf8, 0x07, 0xc7, 0xcf, 0xce, 0x7f, 0x8c, 0x1f, 0xf8, 0x07, 0xc7, 0xcf, 0xce, 0x7f, 0x8c, 0x1f, 0xf8, 0xf8, 0x00, 0x3e, 0x3e, 0x03, 0xf0, 0x7f, 0x00, 0xf8, 0x00, 0x3e, 0x3e, 0x03, 0xf0, 0x7f, 0x00, 0xe0, 0xc7, 0xcf, 0xfe, 0x03, 0x80, 0x1f, 0xe7, 0xe0, 0xc7, 0xcf, 0xfe, 0x03, 0x80, 0x1f, 0xe7, 0xe0, 0xc7, 0xcf, 0xfe, 0x03, 0x80, 0x1f, 0xe7, 0x18, 0xc0, 0x31, 0xfe, 0x0c, 0x0c, 0x1c, 0xe0, 0x18, 0xc0, 0x31, 0xfe, 0x0c, 0x0c, 0x1c, 0xe0, 0xe7, 0x39, 0xf1, 0xf0, 0x03, 0xfc, 0x7c, 0xf8, 0xe7, 0x39, 0xf1, 0xf0, 0x03, 0xfc, 0x7c, 0xf8, 0xe7, 0x39, 0xf1, 0xf0, 0x03, 0xfc, 0x7c, 0xf8, 0x1f, 0x00, 0x31, 0xcf, 0xf3, 0x8c, 0x03, 0x00, 0x1f, 0x00, 0x31, 0xcf, 0xf3, 0x8c, 0x03, 0x00, 0xe0, 0x3f, 0xff, 0xc1, 0x83, 0x8f, 0x9c, 0xe7, 0xe0, 0x3f, 0xff, 0xc1, 0x83, 0x8f, 0x9c, 0xe7, 0xe0, 0x3f, 0xff, 0xc1, 0x83, 0x8f, 0x9c, 0xe7, 0x18, 0x00, 0x30, 0x0e, 0x00, 0x00, 0x00, 0xff, 0x18, 0x00, 0x30, 0x0e, 0x00, 0x00, 0x00, 0xff, 0x18, 0x00, 0x30, 0x0e, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x3e, 0x7c, 0x0f, 0xe0, 0x00, 0xff, 0xff, 0xf0, 0x3e, 0x7c, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x31, 0xce, 0x0c, 0x0c, 0x63, 0xe0, 0x00, 0x00, 0x31, 0xce, 0x0c, 0x0c, 0x63, 0xe0, 0x00, 0x00, 0x31, 0xce, 0x0c, 0x0c, 0x63, 0xe0, 0x1f, 0xfe, 0x30, 0x01, 0x83, 0x8f, 0xe0, 0xff, 0x1f, 0xfe, 0x30, 0x01, 0x83, 0x8f, 0xe0, 0xff, 0x18, 0x06, 0x31, 0xf1, 0x8f, 0x80, 0x03, 0xe7, 0x18, 0x06, 0x31, 0xf1, 0x8f, 0x80, 0x03, 0xe7, 0x18, 0x06, 0x31, 0xf1, 0x8f, 0x80, 0x03, 0xe7, 0x18, 0x06, 0x3f, 0xff, 0x83, 0x83, 0xe3, 0x1f, 0x18, 0x06, 0x3f, 0xff, 0x83, 0x83, 0xe3, 0x1f, 0x18, 0x06, 0x31, 0xfe, 0x73, 0x8f, 0x80, 0xf8, 0x18, 0x06, 0x31, 0xfe, 0x73, 0x8f, 0x80, 0xf8, 0x18, 0x06, 0x31, 0xfe, 0x73, 0x8f, 0x80, 0xf8, 0x1f, 0xfe, 0x31, 0xfe, 0x00, 0x0c, 0x60, 0xe7, 0x1f, 0xfe, 0x31, 0xfe, 0x00, 0x0c, 0x60, 0xe7, 0x00, 0x00, 0x31, 0xfe, 0x0c, 0x0f, 0x9f, 0xe0, 0x00, 0x00, 0x31, 0xfe, 0x0c, 0x0f, 0x9f, 0xe0, 0x00, 0x00, 0x31, 0xfe, 0x0c, 0x0f, 0x9f, 0xe0 };
|
||
|
||
//ICO
|
||
//width:16,height:16
|
||
const unsigned char Tag[] PROGMEM = { 0x00, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x73, 0x80, 0x61, 0xc0, 0x61, 0xe0, 0x73, 0xf0, 0x3f, 0xf8, 0x1f, 0xfc, 0x0f, 0xfe, 0x07, 0xff, 0x03, 0xff, 0x01, 0xfe, 0x00, 0xfc, 0x00, 0x78, 0x00, 0x30 };
|
||
const unsigned char Chip[] PROGMEM = { 0x12, 0x48, 0x12, 0x48, 0x1f, 0xf8, 0xe0, 0x07, 0x2e, 0x14, 0x2c, 0x04, 0xe8, 0x07, 0x20, 0x04, 0x20, 0x04, 0xe0, 0x07, 0x20, 0x04, 0x28, 0x14, 0xe0, 0x07, 0x1f, 0xf8, 0x12, 0x48, 0x12, 0x48 };
|
||
const unsigned char HeatPipe[] PROGMEM = { 0x00, 0x00, 0x09, 0x90, 0x11, 0x88, 0x21, 0x84, 0x11, 0x88, 0x09, 0x90, 0x11, 0x88, 0x21, 0x84, 0x11, 0x88, 0x09, 0x90, 0x11, 0x88, 0x21, 0x84, 0x11, 0x88, 0x09, 0x90, 0x01, 0x80, 0x00, 0x00 };
|
||
const unsigned char Lightning[] PROGMEM = { 0x00, 0x80, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x03, 0x80, 0x07, 0x80, 0x07, 0xf0, 0x0f, 0xf0, 0x0f, 0xe0, 0x1f, 0xc0, 0x01, 0xc0, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00 };
|
||
const unsigned char Thermometer[] PROGMEM = { 0x01, 0x80, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x03, 0x40, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x03, 0xc0 };
|
||
const unsigned char Pointer[] PROGMEM = { 0x20, 0x20, 0x70, 0xf8 };
|
||
//状态提示
|
||
//width:28,height:14 中文提示
|
||
const unsigned char S1[] PROGMEM = { 0x20, 0x92, 0x1f, 0xc0, 0x3d, 0xf9, 0x90, 0x40, 0x20, 0x90, 0x90, 0x40, 0x40, 0x90, 0x1f, 0xc0, 0x7b, 0xff, 0x00, 0x00, 0xa0, 0x01, 0x3f, 0xe0, 0x21, 0xf9, 0x02, 0x00, 0xfd, 0x09, 0x02, 0x00, 0x21, 0x09, 0x7f, 0xf0, 0x21, 0xf9, 0x05, 0x00, 0x21, 0x09, 0x45, 0x00, 0x29, 0x09, 0x88, 0x80, 0x31, 0xf9, 0x10, 0x70, 0x21, 0x08, 0x20, 0x20 };
|
||
const unsigned char S2[] PROGMEM = { 0x10, 0x40, 0x47, 0xc0, 0x17, 0xfc, 0x44, 0x40, 0x20, 0x03, 0xf4, 0x40, 0x23, 0xf8, 0x44, 0x40, 0x62, 0x08, 0xc4, 0x40, 0xa3, 0xf8, 0xe4, 0x40, 0x20, 0x01, 0x54, 0x40, 0x2f, 0xfd, 0x44, 0x40, 0x28, 0x06, 0x44, 0x40, 0x23, 0xf8, 0x44, 0x40, 0x20, 0x40, 0x44, 0x50, 0x20, 0x40, 0x48, 0x50, 0x21, 0x40, 0x50, 0x30, 0x20, 0x80, 0x40, 0x00 };
|
||
const unsigned char S3[] PROGMEM = { 0x10, 0x83, 0xdf, 0xc0, 0x10, 0x82, 0x50, 0x40, 0x20, 0x82, 0x50, 0x40, 0x2f, 0xff, 0xdf, 0xc0, 0x60, 0x82, 0x52, 0x00, 0x61, 0xc2, 0x52, 0x00, 0xa1, 0xc2, 0x5f, 0xe0, 0x22, 0xa3, 0xd2, 0x00, 0x22, 0xa2, 0x51, 0x00, 0x24, 0x92, 0x51, 0x00, 0x28, 0x8e, 0x50, 0x90, 0x30, 0x8b, 0xd4, 0x50, 0x20, 0x82, 0x58, 0x30, 0x20, 0x80, 0x10, 0x10 };
|
||
const unsigned char S4[] PROGMEM = { 0x23, 0xf2, 0x1f, 0xc0, 0x22, 0x11, 0x10, 0x40, 0xfb, 0xf0, 0x90, 0x40, 0x22, 0x12, 0x1f, 0xc0, 0x2a, 0x11, 0x10, 0x40, 0x33, 0xf1, 0x10, 0x40, 0x60, 0x00, 0x5f, 0xc0, 0xaf, 0xfc, 0x80, 0x00, 0x20, 0x41, 0x3f, 0xe0, 0x22, 0x43, 0x25, 0x20, 0x22, 0x79, 0x25, 0x20, 0x22, 0x41, 0x25, 0x20, 0xa5, 0x41, 0x25, 0x20, 0x48, 0xfd, 0x7f, 0xf0 };
|
||
const unsigned char S5[] PROGMEM = { 0x7f, 0xf8, 0x48, 0x80, 0x02, 0x00, 0x49, 0x00, 0x02, 0x01, 0xff, 0xf0, 0x02, 0x01, 0x00, 0x10, 0x02, 0x02, 0x7f, 0x20, 0x22, 0x00, 0x41, 0x00, 0x23, 0xf0, 0x7f, 0x00, 0x22, 0x00, 0x08, 0x00, 0x22, 0x00, 0xff, 0x80, 0x22, 0x00, 0x88, 0x80, 0x22, 0x00, 0x88, 0x80, 0x22, 0x00, 0x8a, 0x80, 0x22, 0x00, 0x89, 0x00, 0xff, 0xfc, 0x08, 0x00 };
|
||
const unsigned char S6[] PROGMEM = { 0x0f, 0x42, 0x1f, 0xc0, 0x78, 0x41, 0x10, 0x40, 0x08, 0x40, 0x90, 0x40, 0x08, 0x42, 0x1f, 0xc0, 0x08, 0x41, 0x10, 0x40, 0xff, 0xfd, 0x10, 0x40, 0x08, 0x40, 0x5f, 0xc0, 0x08, 0x40, 0x80, 0x00, 0x08, 0x41, 0x3f, 0xe0, 0x08, 0x43, 0x25, 0x20, 0x10, 0x41, 0x25, 0x20, 0x10, 0x41, 0x25, 0x20, 0x20, 0x41, 0x25, 0x20, 0x40, 0x41, 0x7f, 0xf0 };
|
||
const unsigned char S7[] PROGMEM = { 0x11, 0x40, 0x82, 0x00, 0x21, 0x20, 0x8f, 0xe0, 0x23, 0xfc, 0x82, 0x00, 0x4a, 0x23, 0xe2, 0x00, 0xfe, 0x20, 0x9f, 0xf0, 0x13, 0xf8, 0x80, 0x80, 0x22, 0x20, 0xc0, 0x80, 0x42, 0x21, 0xbf, 0xf0, 0xfb, 0xfa, 0x88, 0x80, 0x02, 0x20, 0x84, 0x80, 0x02, 0x20, 0x84, 0x80, 0x1a, 0x20, 0x80, 0x80, 0xe3, 0xfe, 0x82, 0x80, 0x02, 0x01, 0x01, 0x00 };
|
||
const unsigned char *S_table[] = {S1, S2, S3, S4, S5, S6, S7};
|
||
//width:16,height:16 图标库
|
||
const unsigned char c1[] PROGMEM = { 0x03, 0x80, 0x03, 0x80, 0x03, 0xc0, 0x07, 0xc0, 0x07, 0xe0, 0x0f, 0xe0, 0x0e, 0x70, 0x1e, 0x70, 0x1e, 0x70, 0x1e, 0x78, 0x3f, 0xf8, 0x3f, 0xfc, 0x7e, 0x7c, 0x7e, 0x7e, 0x7f, 0xfe, 0x7f, 0xfe };
|
||
const unsigned char c2[] PROGMEM = { 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x19, 0x90, 0x39, 0xb8, 0x31, 0x8c, 0x61, 0x8c, 0x61, 0x86, 0x60, 0x06, 0x60, 0x06, 0x60, 0x0e, 0x70, 0x0c, 0x30, 0x1c, 0x1c, 0x78, 0x0f, 0xf0, 0x03, 0xc0 };
|
||
const unsigned char c3[] PROGMEM = { 0x00, 0xe0, 0x03, 0xc0, 0x0f, 0x00, 0x1c, 0x38, 0x10, 0xf0, 0x03, 0xc0, 0x0f, 0x00, 0x1c, 0x38, 0x10, 0xf0, 0x03, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x03, 0x80 };
|
||
//c4用Lightning 替代
|
||
const unsigned char c5[] PROGMEM = { 0x0f, 0xe0, 0x1f, 0xf8, 0x3f, 0xfc, 0x7f, 0xfe, 0xff, 0xe6, 0xff, 0xce, 0xff, 0x9f, 0xf3, 0x3f, 0xf0, 0x7f, 0xf8, 0xff, 0xfd, 0xfe, 0x7f, 0xfe, 0x7f, 0xfc, 0x3f, 0xf8, 0x1f, 0xf0, 0x03, 0xc0 };
|
||
const unsigned char c6[] PROGMEM = { 0x04, 0x00, 0x06, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x0f, 0x80, 0x1f, 0x80, 0x3f, 0x90, 0x7f, 0x18, 0x7f, 0x1c, 0x7e, 0x3c, 0x7c, 0x3e, 0x78, 0x7e, 0x78, 0xfe, 0x31, 0xfe, 0x11, 0xfc, 0x09, 0xf8 };
|
||
const unsigned char c7[] PROGMEM = { 0x00, 0x00, 0x07, 0xe0, 0x1f, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x3f, 0xfc, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3e, 0x7c, 0x3e, 0x7c, 0x3f, 0xfc, 0x3f, 0xfc, 0x00, 0x00 };
|
||
// width: 48, height: 48
|
||
const unsigned char c_OK[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xc0, 0x03, 0xff, 0xfe, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x20, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x70, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0xf0, 0x00, 0x00, 0x01, 0xf8, 0x0f, 0xf0, 0x00, 0x00, 0x03, 0xf0, 0x0f, 0xf0, 0x00, 0x00, 0x07, 0xe0, 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0xc0, 0x0f, 0xe0, 0x00, 0x00, 0x1f, 0x80, 0x07, 0xe0, 0x01, 0x80, 0x3f, 0x00, 0x07, 0xe0, 0x03, 0xc0, 0x7e, 0x00, 0x07, 0xe0, 0x07, 0xe0, 0xfc, 0x00, 0x07, 0xe0, 0x03, 0xf1, 0xf8, 0x00, 0x07, 0xe0, 0x01, 0xff, 0xf0, 0x00, 0x07, 0xe0, 0x00, 0xff, 0xe0, 0x00, 0x07, 0xe0, 0x00, 0x7f, 0xc0, 0x00, 0x07, 0xf0, 0x00, 0x3f, 0x80, 0x00, 0x0f, 0xf0, 0x00, 0x1f, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x0e, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x04, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x7f, 0xff, 0xf0, 0x0f, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
// width: 48, height: 48
|
||
const unsigned char c_NO[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xc0, 0x01, 0xff, 0xfe, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x01, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x80, 0x00, 0x80, 0x1f, 0xf8, 0x01, 0xc0, 0x03, 0xc0, 0x1f, 0xf8, 0x03, 0xe0, 0x03, 0xe0, 0x1f, 0xf8, 0x03, 0xf0, 0x0f, 0xe0, 0x0f, 0xf0, 0x01, 0xf8, 0x0f, 0xc0, 0x07, 0xf0, 0x00, 0xfc, 0x1f, 0x80, 0x07, 0xf0, 0x00, 0x7e, 0x7f, 0x00, 0x07, 0xe0, 0x00, 0x3f, 0xfe, 0x00, 0x07, 0xe0, 0x00, 0x1f, 0xfc, 0x00, 0x07, 0xe0, 0x00, 0x0f, 0xf8, 0x00, 0x07, 0xe0, 0x00, 0x07, 0xf0, 0x00, 0x07, 0xe0, 0x00, 0x07, 0xf0, 0x00, 0x07, 0xe0, 0x00, 0x1f, 0xf8, 0x00, 0x07, 0xe0, 0x00, 0x1f, 0xfc, 0x00, 0x07, 0xe0, 0x00, 0x7f, 0xfe, 0x00, 0x07, 0xf0, 0x00, 0x7e, 0x3f, 0x00, 0x07, 0xf0, 0x01, 0xfc, 0x1f, 0x80, 0x07, 0xf0, 0x01, 0xf8, 0x0f, 0xc0, 0x0f, 0xf8, 0x03, 0xf0, 0x07, 0xe0, 0x0f, 0xf8, 0x03, 0xe0, 0x03, 0xe0, 0x1f, 0xf8, 0x01, 0xc0, 0x01, 0x80, 0x1f, 0xfe, 0x00, 0x80, 0x00, 0x80, 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0x7f, 0xff, 0xf0, 0x07, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char *C_table[] = {c1, c2, c3, Lightning, c5, c6, c7};
|
||
|
||
//设置(陈星汉认为语言是一种低像素的表85达方式,容易造成隔阂; 交互界面设计要尽可能少使用文字)
|
||
// width: 48, height: 48
|
||
const unsigned char Set_LANG[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xc0, 0x01, 0xff, 0xfe, 0x7f, 0xfe, 0x00, 0x00, 0x7f, 0xfe, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x40, 0x02, 0x03, 0xff, 0xff, 0x81, 0x80, 0x01, 0x81, 0xff, 0xff, 0x07, 0x84, 0x20, 0xe0, 0xff, 0xfe, 0x0f, 0x0c, 0x30, 0xf0, 0x7f, 0xfc, 0x1e, 0x0c, 0x38, 0x78, 0x3f, 0xf8, 0x3e, 0x1c, 0x38, 0x7c, 0x1f, 0xf8, 0x7c, 0x1c, 0x3c, 0x3e, 0x1f, 0xf0, 0x7c, 0x3c, 0x3c, 0x3f, 0x0f, 0xf0, 0xfc, 0x3c, 0x3e, 0x1f, 0x0f, 0xe1, 0xf8, 0x7c, 0x3e, 0x1f, 0x87, 0xe1, 0xf8, 0x7c, 0x3e, 0x1f, 0x87, 0xe1, 0xf8, 0x7c, 0x3f, 0x1f, 0xc7, 0xc3, 0xf8, 0xfc, 0x3f, 0x0f, 0xc3, 0xc3, 0xf0, 0xfc, 0x3f, 0x0f, 0xc3, 0xc3, 0xf0, 0xfc, 0x3f, 0x0f, 0xc3, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0xf0, 0xfc, 0x3f, 0x0f, 0xe3, 0xc3, 0xf0, 0xfc, 0x3f, 0x0f, 0xe3, 0xc3, 0xf0, 0xfc, 0x3f, 0x0f, 0xc3, 0xc3, 0xf0, 0xfc, 0x3f, 0x0f, 0xc3, 0xc3, 0xf0, 0xfc, 0x3f, 0x0f, 0xc3, 0xe1, 0xf8, 0xfc, 0x3f, 0x1f, 0xc7, 0xe1, 0xf8, 0x7c, 0x3e, 0x1f, 0x87, 0xe1, 0xf8, 0x7c, 0x3e, 0x1f, 0x87, 0xf0, 0xfc, 0x7c, 0x3e, 0x3f, 0x0f, 0xf0, 0x7c, 0x3c, 0x3c, 0x3e, 0x0f, 0xf8, 0x7c, 0x3c, 0x3c, 0x3e, 0x1f, 0xfc, 0x3e, 0x1c, 0x38, 0x7c, 0x3f, 0xfc, 0x1e, 0x0c, 0x30, 0x78, 0x3f, 0xfe, 0x0f, 0x0c, 0x30, 0xf0, 0x7f, 0xff, 0x03, 0x04, 0x20, 0xc0, 0xff, 0xff, 0x81, 0x80, 0x01, 0x81, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0x7f, 0xfe, 0x00, 0x00, 0x7f, 0xfe, 0x7f, 0xff, 0xc0, 0x03, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set0[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x00, 0x3f, 0xff, 0xff, 0xfe, 0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0x80, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xc0, 0x7f, 0xff, 0xff, 0xf0, 0x3f, 0xe0, 0x3f, 0xff, 0xff, 0xf0, 0x7f, 0xf0, 0x1f, 0xff, 0xff, 0xf0, 0x7f, 0xf0, 0x0f, 0xff, 0xff, 0xf0, 0x7f, 0xf0, 0x07, 0xff, 0xff, 0xf0, 0x7f, 0xf0, 0x03, 0xff, 0xff, 0xf0, 0x3f, 0xe0, 0x01, 0xff, 0xff, 0xf0, 0x3f, 0xe0, 0x00, 0xff, 0xff, 0xf0, 0x1f, 0xc0, 0x00, 0x7f, 0xff, 0xf0, 0x0f, 0x80, 0x00, 0x3f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x80, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x80, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0x7f, 0xff, 0xff, 0xf8, 0x7f, 0xfe, 0x7f, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set1[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xf8, 0x3f, 0xff, 0xfe, 0x7f, 0xff, 0xf0, 0x1f, 0xff, 0xfe, 0xff, 0xff, 0xe3, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0x7f, 0xff, 0xf0, 0x1f, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set2[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xc7, 0xff, 0xff, 0xf1, 0xfe, 0xff, 0x03, 0xff, 0xff, 0xe0, 0x7f, 0xfe, 0x03, 0xff, 0xff, 0xe0, 0x3f, 0xfc, 0x03, 0xff, 0xff, 0xe0, 0x1f, 0xf8, 0x07, 0xf0, 0x07, 0xf0, 0x0f, 0xf0, 0x0f, 0x80, 0x00, 0xf8, 0x07, 0xe0, 0x1e, 0x00, 0x00, 0x3c, 0x03, 0xe0, 0x3c, 0x00, 0x00, 0x1e, 0x03, 0xe0, 0x70, 0x00, 0x00, 0x07, 0x03, 0xe0, 0xe0, 0x00, 0x00, 0x03, 0x83, 0xf1, 0xc0, 0x01, 0xc0, 0x01, 0xc7, 0xff, 0x80, 0x03, 0xe0, 0x00, 0xff, 0xff, 0x80, 0x03, 0xe0, 0x00, 0xff, 0xff, 0x00, 0x03, 0xe0, 0x00, 0x7f, 0xff, 0x00, 0x03, 0xe0, 0x00, 0x7f, 0xfe, 0x00, 0x03, 0xe0, 0x00, 0x3f, 0xfe, 0x00, 0x03, 0xe0, 0x00, 0x3f, 0xfc, 0x00, 0x03, 0xe0, 0x00, 0x1f, 0xfc, 0x00, 0x03, 0xe0, 0x00, 0x1f, 0xfc, 0x00, 0x03, 0xe0, 0x00, 0x1f, 0xfc, 0x00, 0x03, 0xe0, 0x00, 0x1f, 0xfc, 0x00, 0x03, 0xe0, 0x00, 0x1f, 0xfc, 0x00, 0x03, 0xf0, 0x00, 0x1f, 0xfc, 0x00, 0x01, 0xf8, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x3e, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x0f, 0x80, 0x3f, 0xff, 0x00, 0x00, 0x07, 0x80, 0x3f, 0xff, 0x00, 0x00, 0x03, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x06, 0x00, 0x00, 0x30, 0x1f, 0xfc, 0x0f, 0x80, 0x00, 0xf8, 0x1f, 0xfe, 0x1f, 0xf0, 0x07, 0xfc, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set3[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0x80, 0x3f, 0xfe, 0x7f, 0xff, 0xff, 0x00, 0x3f, 0xfe, 0xff, 0xff, 0xfe, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xe7, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xc7, 0xff, 0xff, 0xc0, 0x07, 0xff, 0x87, 0xff, 0xff, 0xc0, 0x07, 0xff, 0x07, 0xff, 0xff, 0xc0, 0x07, 0xfe, 0x07, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xff, 0xff, 0x80, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x01, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xc3, 0x80, 0x3f, 0xff, 0xff, 0xff, 0x87, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0x87, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x87, 0xc1, 0xff, 0xff, 0xff, 0xff, 0x83, 0x83, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x78, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set4[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xf8, 0x88, 0x8f, 0xf1, 0xff, 0xff, 0xf8, 0x88, 0x8f, 0xf1, 0xff, 0xff, 0xf8, 0x88, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0x8f, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0x87, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xe3, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xf1, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xf0, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xf1, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xe3, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0x87, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0x8f, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xc0, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xc0, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xc0, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set4F[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0x03, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0x03, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0x03, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xe1, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xc7, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0x8f, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0x0f, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0x8f, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xc7, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xe1, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0x11, 0x1f, 0xff, 0xff, 0x8f, 0xf1, 0x11, 0x1f, 0xff, 0xff, 0x8f, 0xf1, 0x11, 0x1f, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set5[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xf0, 0x0f, 0xff, 0xfe, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xc3, 0xff, 0xff, 0xff, 0xff, 0x87, 0xe1, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xf8, 0x7f, 0xff, 0xff, 0xfc, 0x3f, 0xfc, 0x3f, 0xff, 0xff, 0xf8, 0x7f, 0xfe, 0x1f, 0xff, 0xff, 0xf0, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xe1, 0xff, 0xff, 0x87, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0x83, 0xff, 0xff, 0xc1, 0xff, 0xff, 0x07, 0xff, 0xff, 0xe0, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xf8, 0x7f, 0xfc, 0x3f, 0xff, 0xff, 0xfc, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0x7f, 0xff, 0xf8, 0x1f, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set5_1[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xf0, 0x0f, 0xff, 0xfe, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xbf, 0xff, 0xff, 0xc3, 0xc3, 0xff, 0x1f, 0xff, 0xff, 0x87, 0xe1, 0xfe, 0x0f, 0xff, 0xff, 0x0f, 0xf0, 0xfc, 0x1f, 0xff, 0xfe, 0x1f, 0xf8, 0x78, 0x3f, 0xff, 0xfc, 0x3f, 0xfc, 0xf0, 0x7f, 0xff, 0xf8, 0x7f, 0xff, 0xe0, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xe1, 0xff, 0xff, 0x83, 0xff, 0xff, 0xe3, 0xff, 0xff, 0x07, 0xff, 0xff, 0xe3, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xe3, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xe3, 0xff, 0xf8, 0x07, 0xff, 0xff, 0xe3, 0xff, 0xf0, 0x47, 0xff, 0xff, 0xe3, 0xff, 0xe0, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0xc1, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0x83, 0xc7, 0xff, 0xff, 0xe3, 0xff, 0x07, 0xc7, 0xff, 0xff, 0xe3, 0xfe, 0x0f, 0xc7, 0xff, 0xff, 0xe3, 0xfc, 0x1f, 0xc7, 0xff, 0xff, 0xe3, 0xf8, 0x3f, 0xc7, 0xff, 0xff, 0xe3, 0xf0, 0x7f, 0xc7, 0xff, 0xff, 0xe3, 0xe0, 0xff, 0xc7, 0xff, 0xff, 0xe3, 0xc1, 0xff, 0xc7, 0xff, 0xff, 0xe7, 0x83, 0xff, 0xc7, 0xff, 0xff, 0xef, 0x07, 0xff, 0xc7, 0xff, 0xff, 0xfe, 0x0f, 0xff, 0xc1, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xe0, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xf8, 0x7f, 0xff, 0xf0, 0x7f, 0xff, 0xfc, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0f, 0xc0, 0x03, 0xff, 0xff, 0xfc, 0x1f, 0xc0, 0x03, 0xff, 0xff, 0xfe, 0x3f, 0xe0, 0x07, 0xff, 0xff, 0xff, 0x7f, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0x7f, 0xff, 0xf8, 0x1f, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set6[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x07, 0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xfe, 0x0f, 0x87, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xc7, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xc7, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xf0, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xf8, 0x7c, 0x3f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set7[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xfe, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xf1, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xf1, 0xff, 0xff, 0xff, 0xe0, 0x7f, 0xf1, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xf1, 0xff, 0xff, 0xff, 0x81, 0xff, 0xf1, 0xff, 0xff, 0xff, 0x03, 0xff, 0xf1, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xf1, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xf1, 0xfe, 0x1f, 0xf8, 0x1f, 0xff, 0xf1, 0xfe, 0x0f, 0xf0, 0x3f, 0xff, 0xf1, 0xfe, 0x07, 0xe0, 0x7f, 0xff, 0xf1, 0xfe, 0x03, 0xc0, 0xff, 0xff, 0xf1, 0xff, 0x01, 0x81, 0xff, 0xff, 0xf1, 0xff, 0x80, 0x03, 0xff, 0xff, 0xf1, 0xff, 0xc0, 0x07, 0xfc, 0x7f, 0xf1, 0xff, 0xe0, 0x0f, 0xfc, 0x7f, 0xf1, 0xff, 0xf0, 0x1f, 0xfc, 0x7f, 0xf1, 0xff, 0xf8, 0x3f, 0xfc, 0x7f, 0xf1, 0xff, 0xfc, 0x7f, 0xfc, 0x7f, 0xf1, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xf1, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xf1, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xf1, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xf1, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xf1, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xf1, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xf1, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xf1, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set11[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xc1, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x01, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0x9f, 0xff, 0xff, 0xe0, 0x01, 0xfe, 0x0f, 0xff, 0xff, 0xc0, 0x07, 0xf8, 0x07, 0xff, 0xff, 0xc0, 0x1f, 0xe0, 0x07, 0xff, 0xff, 0xc0, 0x7f, 0x80, 0x07, 0xff, 0xff, 0xe1, 0xfe, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0xfe, 0x0f, 0xff, 0xff, 0xc0, 0x03, 0xfc, 0x07, 0xff, 0xff, 0xc0, 0x0f, 0xe0, 0x07, 0xff, 0xff, 0xc0, 0x3f, 0xc0, 0x07, 0xff, 0xff, 0xc0, 0xfe, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x01, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0x7f, 0xff, 0xe0, 0x1f, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set12[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set8[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe3, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xe3, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xe3, 0xff, 0xff, 0xff, 0x10, 0xff, 0xe3, 0xff, 0xff, 0xff, 0x10, 0xff, 0xe3, 0xff, 0xff, 0xff, 0x10, 0xff, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xff, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xff, 0xe3, 0xff, 0xff, 0xff, 0x18, 0x87, 0xe3, 0xff, 0xff, 0xff, 0x18, 0x87, 0xe3, 0xff, 0xff, 0xff, 0x18, 0x87, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe3, 0xff, 0xff, 0xff, 0x18, 0xc7, 0xe0, 0x00, 0x00, 0x00, 0x18, 0xc7, 0xe0, 0x00, 0x00, 0x00, 0x18, 0xc7, 0xe0, 0x00, 0x00, 0x00, 0x18, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc7, 0xff, 0x1f, 0xff, 0xff, 0xf8, 0xc7, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc7, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc7, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x07, 0x7f, 0xf8, 0x00, 0x00, 0x00, 0x06, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set9[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf8, 0x07, 0xf0, 0x0f, 0xff, 0xff, 0xf0, 0x3f, 0xfe, 0x07, 0xff, 0xff, 0xe0, 0xff, 0xff, 0x83, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xe1, 0xff, 0xff, 0x87, 0xff, 0xff, 0xf0, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0x0f, 0xff, 0xff, 0xfc, 0x7f, 0xfe, 0x1f, 0xff, 0xff, 0xfc, 0x3f, 0xfe, 0x3f, 0xff, 0xff, 0xfe, 0x3f, 0xfc, 0x3f, 0xf3, 0xfb, 0xfe, 0x1f, 0xfc, 0x7f, 0xe1, 0xf0, 0xff, 0x1f, 0xfc, 0x7f, 0xc0, 0xe0, 0x7f, 0x1f, 0xf8, 0x7f, 0x80, 0x40, 0x7f, 0x0f, 0xf8, 0xff, 0x00, 0x00, 0x3f, 0x8f, 0xf8, 0xff, 0x00, 0x00, 0x3f, 0x8f, 0xf8, 0xff, 0x00, 0x00, 0x1f, 0x8f, 0xf8, 0xfe, 0x00, 0x00, 0x1f, 0x8f, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set10[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xfe, 0x00, 0x00, 0x7f, 0xfc, 0x7f, 0xfe, 0x00, 0x00, 0x7f, 0xfe, 0x7f, 0xfc, 0x00, 0x00, 0x3f, 0xfe, 0xff, 0xfc, 0x7f, 0xfe, 0x3f, 0xff, 0xff, 0xfc, 0x7f, 0xfe, 0x3f, 0xff, 0xff, 0xfc, 0x7f, 0xfe, 0x3f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xff, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xff, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0x8f, 0xf8, 0xfe, 0x3f, 0xfc, 0x7f, 0xff, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xff, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xff, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xff, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xff, 0xff, 0xfe, 0x3f, 0xfc, 0x3f, 0xff, 0xff, 0xfc, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set13[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xfe, 0x3f, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xbe, 0x3d, 0xff, 0xff, 0xff, 0xfe, 0x3e, 0x3c, 0x7f, 0xff, 0xff, 0xfc, 0x3e, 0x3c, 0x3f, 0xff, 0xff, 0xf8, 0x3e, 0x3c, 0x1f, 0xff, 0xff, 0xf0, 0xfe, 0x3f, 0x0f, 0xff, 0xff, 0xe1, 0xfe, 0x3f, 0x87, 0xff, 0xff, 0xc3, 0xfe, 0x3f, 0xc3, 0xff, 0xff, 0x87, 0xfe, 0x3f, 0xe1, 0xff, 0xff, 0x8f, 0xfe, 0x3f, 0xf1, 0xff, 0xff, 0x0f, 0xfe, 0x3f, 0xf0, 0xff, 0xff, 0x1f, 0xfe, 0x3f, 0xf8, 0xff, 0xff, 0x1f, 0xfe, 0x3f, 0xf8, 0xff, 0xfe, 0x1f, 0xfe, 0x3f, 0xfc, 0x7f, 0xfe, 0x3f, 0xfe, 0x3f, 0xfc, 0x7f, 0xfe, 0x3f, 0xfe, 0x3f, 0xfc, 0x7f, 0xfe, 0x3f, 0xfe, 0x3f, 0xfc, 0x7f, 0xfe, 0x3f, 0xfe, 0x3f, 0xfc, 0x7f, 0xfe, 0x3f, 0xff, 0xff, 0xfc, 0x7f, 0xfe, 0x3f, 0xff, 0xff, 0xfc, 0x7f, 0xfe, 0x1f, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0x1f, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xf0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf1, 0xff, 0xff, 0x87, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xe1, 0xff, 0xff, 0x87, 0xff, 0xff, 0xf0, 0xff, 0xff, 0x07, 0xff, 0xff, 0xf8, 0x3f, 0xfc, 0x0f, 0xff, 0xff, 0xfc, 0x0f, 0xf0, 0x3f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x01, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set14[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, 0x7f, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x7e, 0xff, 0xff, 0xff, 0x00, 0x00, 0x7e, 0x7f, 0xff, 0xfe, 0x00, 0x00, 0xfe, 0x3f, 0xff, 0xfc, 0x00, 0x00, 0xff, 0x1f, 0xff, 0xfc, 0x00, 0x00, 0xfe, 0x0f, 0xff, 0xf8, 0x00, 0x01, 0xfe, 0x07, 0xff, 0xf8, 0x00, 0x01, 0xfe, 0x03, 0xff, 0xf0, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xf0, 0x00, 0x07, 0xfc, 0x01, 0xff, 0xf0, 0x00, 0x0f, 0xf8, 0x01, 0xff, 0xf0, 0x00, 0x1f, 0xf0, 0x00, 0xff, 0xf0, 0x00, 0x1f, 0xf0, 0x00, 0xff, 0xf0, 0x00, 0x3f, 0xe0, 0x00, 0x7f, 0xf8, 0x00, 0x7f, 0xc0, 0x00, 0x7f, 0xf8, 0x00, 0xff, 0x80, 0x00, 0x7f, 0xfc, 0x00, 0xff, 0x00, 0x00, 0x7f, 0xfc, 0x01, 0xff, 0x00, 0x00, 0x7f, 0xfe, 0x01, 0xfe, 0x00, 0x00, 0x7f, 0xfe, 0x03, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0x03, 0xf8, 0x00, 0x00, 0xff, 0xff, 0x83, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xc7, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xe3, 0xf0, 0x00, 0x01, 0xff, 0xff, 0xf3, 0xf0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set15[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xe7, 0xc0, 0x00, 0x03, 0xff, 0xf8, 0xe3, 0xc0, 0x00, 0x03, 0xff, 0xf8, 0xf3, 0xcf, 0xff, 0xff, 0xff, 0xf8, 0xf3, 0xcf, 0xff, 0xff, 0xff, 0xf8, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xf8, 0xf9, 0xcf, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xf8, 0xfc, 0x4f, 0xff, 0xff, 0xff, 0xf8, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xc8, 0x7f, 0xff, 0xff, 0xf8, 0x80, 0x0e, 0x1f, 0xff, 0xff, 0xf8, 0x80, 0x0f, 0x07, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xf8, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set16[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xe7, 0xff, 0xe1, 0xff, 0xff, 0xf8, 0xe3, 0xff, 0x00, 0x7f, 0xff, 0xf8, 0xf3, 0xfe, 0x0c, 0x1f, 0xff, 0xf8, 0xf3, 0xf8, 0x7f, 0x0f, 0xff, 0xf8, 0xf1, 0xf0, 0xff, 0xc7, 0xff, 0xf8, 0xf9, 0xe3, 0xff, 0xe3, 0xff, 0xf8, 0xf8, 0xe7, 0xff, 0xf1, 0xff, 0xf8, 0xfc, 0x47, 0xff, 0xf8, 0xff, 0xf8, 0xfe, 0x0f, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0xfe, 0x47, 0xff, 0xff, 0xff, 0xf8, 0xfc, 0x63, 0xff, 0xff, 0xff, 0xf8, 0xfc, 0xf0, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0x7f, 0xff, 0xff, 0xf8, 0xf9, 0xfe, 0x1f, 0xff, 0xff, 0xf8, 0xf1, 0xff, 0x07, 0xff, 0xff, 0xf8, 0xe3, 0xff, 0xc1, 0xff, 0xff, 0xf8, 0xc7, 0xff, 0xf0, 0x1f, 0xff, 0xf8, 0xc7, 0xff, 0xfc, 0x07, 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xc7, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set17[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xf8, 0x88, 0x8f, 0xf1, 0xff, 0xff, 0xf8, 0x88, 0x8f, 0xf1, 0xff, 0xff, 0xf8, 0x88, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0x80, 0xf0, 0x1f, 0x01, 0x8f, 0xf1, 0x80, 0xf0, 0x1f, 0x01, 0x8f, 0xf1, 0x9c, 0xf3, 0x9f, 0xf9, 0x8f, 0xf1, 0x9c, 0xf3, 0x9f, 0xf9, 0x8f, 0xf1, 0x9c, 0xf3, 0x9f, 0xf9, 0x8f, 0xf1, 0x9c, 0xf3, 0x9f, 0xf9, 0x8f, 0xf1, 0x80, 0xf0, 0x1c, 0x01, 0x8f, 0xf1, 0x80, 0xf0, 0x1c, 0x01, 0x8f, 0xf1, 0xfc, 0xff, 0x9c, 0xf9, 0x8f, 0xf1, 0xfc, 0xff, 0x9c, 0xf9, 0x8f, 0xf1, 0xfc, 0xff, 0x9c, 0xf9, 0x8f, 0xf1, 0xfc, 0xff, 0x9c, 0xf9, 0x8f, 0xf1, 0x00, 0xe0, 0x1c, 0x01, 0x8f, 0xf1, 0x00, 0xe0, 0x1c, 0x01, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Set18[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xf8, 0x88, 0x8f, 0xf1, 0xff, 0xff, 0xf8, 0x88, 0x8f, 0xf1, 0xff, 0xff, 0xf8, 0x88, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0x0d, 0xdd, 0xfe, 0x4a, 0x8f, 0xf1, 0x0a, 0xaa, 0xff, 0xcd, 0x8f, 0xf1, 0x08, 0x88, 0xfe, 0x5f, 0x8f, 0xf1, 0x1a, 0xaa, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0x00, 0x00, 0x8f, 0xf1, 0x0c, 0x01, 0x7f, 0xff, 0x8f, 0xf1, 0x6f, 0xff, 0x46, 0x31, 0x8f, 0xf1, 0x6c, 0x3f, 0x56, 0xb7, 0x8f, 0xf1, 0x1f, 0xff, 0x56, 0xb7, 0x8f, 0xf1, 0xff, 0xff, 0x46, 0x31, 0x8f, 0xf1, 0xff, 0xff, 0x77, 0xb5, 0x8f, 0xf1, 0xff, 0xff, 0x77, 0xb5, 0x8f, 0xf1, 0x0c, 0x01, 0x77, 0xb5, 0x8f, 0xf1, 0x6f, 0xff, 0x46, 0x31, 0x8f, 0xf1, 0x6c, 0x3f, 0x7f, 0xff, 0x8f, 0xf1, 0x1f, 0xff, 0x00, 0x00, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0x00, 0x00, 0x2a, 0xa4, 0x8f, 0xf1, 0x00, 0x00, 0x55, 0x22, 0x8f, 0xf1, 0xe0, 0x00, 0x2a, 0xa4, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Lang_CN[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xf1, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xf1, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xf1, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xf1, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xf1, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xf1, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xf1, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xf1, 0xff, 0xfe, 0x3f, 0xfc, 0x7f, 0xf1, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x3f, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Lang_EN[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x00, 0x1f, 0xc0, 0x0f, 0xff, 0xc7, 0x00, 0x1f, 0xc0, 0x0c, 0x1f, 0xc7, 0x00, 0x1f, 0xc0, 0x0c, 0x1f, 0xc7, 0x1f, 0xff, 0xc7, 0xfc, 0x0f, 0xc7, 0x1f, 0xff, 0xc7, 0xfc, 0x4f, 0xc7, 0x1f, 0xff, 0xc7, 0xfc, 0x4f, 0xc7, 0x1f, 0xff, 0xc7, 0xfc, 0x47, 0xc7, 0x1f, 0xff, 0xc7, 0xfc, 0x67, 0xc7, 0x1c, 0x01, 0xc0, 0x1c, 0x63, 0xc7, 0x1c, 0x01, 0xc0, 0x1c, 0x73, 0xc7, 0x1c, 0x01, 0xc0, 0x1c, 0x71, 0xc7, 0x1f, 0x8f, 0xc7, 0xfc, 0x79, 0xc7, 0x1f, 0x8f, 0xc7, 0xfc, 0x78, 0xc7, 0x1f, 0x8f, 0xc7, 0xfc, 0x7c, 0x07, 0x1f, 0x8f, 0xc7, 0xfc, 0x7c, 0x07, 0x00, 0x0f, 0xc0, 0x0c, 0x7e, 0x07, 0x00, 0x0f, 0xc0, 0x0f, 0xff, 0xff, 0x00, 0x0f, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char Save[] PROGMEM = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf1, 0xc0, 0x0f, 0xf8, 0xc3, 0xff, 0xf1, 0xc0, 0x0f, 0xf8, 0xe1, 0xff, 0xf1, 0xc0, 0x0f, 0xf8, 0xf0, 0xff, 0xf1, 0xc0, 0x0f, 0xf8, 0xf8, 0x7f, 0xf1, 0xc0, 0x0f, 0xf8, 0xfc, 0x3f, 0xf1, 0xc0, 0x0f, 0xf8, 0xfe, 0x1f, 0xf1, 0xc0, 0x00, 0x00, 0xff, 0x0f, 0xf1, 0xc0, 0x00, 0x00, 0xff, 0x8f, 0xf1, 0xc0, 0x00, 0x00, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf1, 0xc0, 0x00, 0x00, 0x03, 0x8f, 0xf1, 0xc0, 0x00, 0x00, 0x03, 0x8f, 0xf1, 0xc0, 0x00, 0x00, 0x03, 0x8f, 0xf1, 0xc7, 0xff, 0xff, 0xe3, 0x8f, 0xf1, 0xc7, 0xff, 0xff, 0xe3, 0x8f, 0xf1, 0xc6, 0x00, 0x00, 0xe3, 0x8f, 0xf1, 0xc6, 0x00, 0x00, 0xe3, 0x8f, 0xf1, 0xc6, 0x00, 0x00, 0xe3, 0x8f, 0xf1, 0xc7, 0xff, 0xff, 0xe3, 0x8f, 0xf1, 0xc7, 0xff, 0xff, 0xe3, 0x8f, 0xf1, 0xc6, 0x00, 0x00, 0xe3, 0x8f, 0xf1, 0xc6, 0x00, 0x00, 0xe3, 0x8f, 0xf1, 0xc6, 0x00, 0x00, 0xe3, 0x8f, 0xf1, 0xc7, 0xff, 0xff, 0xe3, 0x8f, 0xf1, 0xc7, 0xff, 0xff, 0xe3, 0x8f, 0xf1, 0xc7, 0xff, 0xff, 0xe3, 0x8f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0 };
|
||
const unsigned char *Ico_table[] = {
|
||
Set0, Set1, Set2, Set3, Set4, Set5, Set_LANG, Set6, Set7,
|
||
Set8, Set9, Set0, Set10, Set12, Save,
|
||
Set0, Set11, Set14, Save,
|
||
Set11, Set13, Set14, Save,
|
||
Set15, Set16,
|
||
Set17, Set18, //5
|
||
Set5_1, Set5,
|
||
c_NO, c_OK,
|
||
Lang_CN, Lang_EN, //8
|
||
c_NO, c_OK,
|
||
Set17, Set4F, Save,
|
||
};
|
||
const byte Menu_table[] = {9, 6, 4, 4, 2, 2, 2, 2, 2, 2, 3}; //菜单 标签 温控 定时 控制方式 首页 蜂鸣器 标签删除确认界面 语言菜单 翻转 显示
|
||
byte MenuLevel = 0; //菜单层级
|
||
|
||
/*
|
||
语言库
|
||
*/
|
||
// width: 36, height: 16 预设
|
||
const unsigned char t0[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x7f, 0x90, 0xf8, 0x00, 0x01, 0x08, 0x08, 0x88, 0x00, 0x0a, 0x10, 0x08, 0x88, 0x00, 0x04, 0x7f, 0x01, 0x07, 0x00, 0x1f, 0xc1, 0x3a, 0x00, 0x00, 0x05, 0x49, 0x09, 0xfc, 0x00, 0x04, 0x49, 0x08, 0x84, 0x00, 0x04, 0x49, 0x08, 0x88, 0x00, 0x04, 0x49, 0x08, 0x48, 0x00, 0x04, 0x49, 0x08, 0x50, 0x00, 0x04, 0x49, 0x0a, 0x20, 0x00, 0x04, 0x16, 0x0c, 0x58, 0x00, 0x14, 0x21, 0x89, 0x87, 0x00, 0x08, 0xc0, 0x86, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t1[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xfe, 0x08, 0x20, 0x00, 0x08, 0x82, 0x0b, 0xff, 0x00, 0x04, 0x82, 0x0a, 0x01, 0x00, 0x10, 0xfe, 0x3c, 0x51, 0x00, 0x08, 0x82, 0x08, 0x88, 0x00, 0x08, 0x82, 0x09, 0x04, 0x00, 0x02, 0xfe, 0x0c, 0x00, 0x00, 0x04, 0x00, 0x19, 0xfc, 0x00, 0x09, 0xff, 0x28, 0x20, 0x00, 0x19, 0x29, 0x08, 0x20, 0x00, 0x09, 0x29, 0x08, 0x20, 0x00, 0x09, 0x29, 0x08, 0x20, 0x00, 0x09, 0x29, 0x2b, 0xff, 0x00, 0x0b, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t2[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3e, 0x04, 0x00, 0x1f, 0xff, 0xa2, 0x04, 0x00, 0x10, 0x00, 0xa2, 0xff, 0x00, 0x00, 0x01, 0x22, 0x04, 0x00, 0x0f, 0xfe, 0x22, 0x04, 0x00, 0x00, 0x40, 0x3e, 0x44, 0x00, 0x00, 0x40, 0x22, 0x24, 0x00, 0x04, 0x40, 0x22, 0x24, 0x00, 0x04, 0x7c, 0x22, 0x04, 0x00, 0x04, 0x40, 0x22, 0x04, 0x00, 0x0a, 0x40, 0x3e, 0x04, 0x00, 0x09, 0x40, 0x22, 0x24, 0x00, 0x10, 0xff, 0x80, 0x14, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00 };
|
||
const unsigned char t3[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x12, 0x02, 0x00, 0x05, 0xff, 0x9f, 0xd2, 0x00, 0x05, 0x00, 0x92, 0x12, 0x00, 0x1e, 0x28, 0xa2, 0x12, 0x00, 0x04, 0x44, 0x3f, 0xf2, 0x00, 0x04, 0x82, 0x02, 0x12, 0x00, 0x06, 0x00, 0x02, 0x12, 0x00, 0x0c, 0xfe, 0x1f, 0xd2, 0x00, 0x14, 0x10, 0x12, 0x52, 0x00, 0x04, 0x10, 0x12, 0x42, 0x00, 0x04, 0x10, 0x13, 0x42, 0x00, 0x04, 0x10, 0x12, 0x82, 0x00, 0x15, 0xff, 0x82, 0x0a, 0x00, 0x08, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t4[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x0f, 0xf8, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x04, 0x02, 0x3f, 0xfe, 0x00, 0x04, 0x02, 0x00, 0x80, 0x00, 0x07, 0xfe, 0x00, 0x80, 0x00, 0x00, 0x90, 0x04, 0x90, 0x00, 0x08, 0x91, 0x0c, 0x88, 0x00, 0x06, 0x93, 0x10, 0x86, 0x00, 0x02, 0x94, 0x20, 0x82, 0x00, 0x00, 0x90, 0x00, 0x80, 0x00, 0x00, 0x90, 0x02, 0x80, 0x00, 0x1f, 0xff, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t5[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x1f, 0xff, 0x9f, 0xfc, 0x00, 0x00, 0x40, 0x04, 0x10, 0x00, 0x0f, 0xff, 0x02, 0x20, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x08, 0x42, 0x0f, 0xf8, 0x00, 0x08, 0x42, 0x08, 0x08, 0x00, 0x0f, 0xfe, 0x08, 0x08, 0x00, 0x08, 0x02, 0x0f, 0xf8, 0x00, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x00, 0x0f, 0xf8, 0x00, 0x10, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t6[] PROGMEM = { 0x09, 0xff, 0x00, 0x40, 0x00, 0x04, 0x20, 0x3f, 0xff, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x42, 0x0f, 0xfc, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00, 0x04, 0x00, 0x0f, 0xfc, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x04, 0x81, 0x00, 0x00, 0x00, 0x05, 0x81, 0x0f, 0xfc, 0x00, 0x06, 0x81, 0x08, 0x04, 0x00, 0x04, 0xff, 0x08, 0x04, 0x00, 0x00, 0x81, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t7[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x1f, 0xfc, 0x00, 0x00, 0x88, 0x00, 0x80, 0x00, 0x0f, 0xff, 0x00, 0x80, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x20, 0x3f, 0xff, 0x00, 0x1f, 0xff, 0x80, 0x80, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x50, 0x00, 0x80, 0x00, 0x00, 0x50, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x80, 0x00, 0x01, 0x04, 0x00, 0x80, 0x00, 0x06, 0x03, 0x82, 0x80, 0x00, 0x18, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char Back[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x3f, 0xfe, 0x00, 0x04, 0x80, 0x20, 0x02, 0x00, 0x00, 0x80, 0x20, 0x02, 0x00, 0x00, 0xbe, 0x23, 0xe2, 0x00, 0x1c, 0x82, 0x22, 0x22, 0x00, 0x04, 0xa4, 0x22, 0x22, 0x00, 0x04, 0x94, 0x22, 0x22, 0x00, 0x04, 0x88, 0x22, 0x22, 0x00, 0x04, 0x94, 0x23, 0xe2, 0x00, 0x05, 0x22, 0x20, 0x02, 0x00, 0x05, 0x42, 0x20, 0x02, 0x00, 0x0a, 0x00, 0x3f, 0xfe, 0x00, 0x11, 0xff, 0xa0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
|
||
const unsigned char t1_1[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x20, 0x90, 0x00, 0x02, 0x7f, 0x98, 0x90, 0x00, 0x1f, 0x80, 0x09, 0xff, 0x00, 0x02, 0x22, 0x01, 0x10, 0x00, 0x06, 0x21, 0x8b, 0x10, 0x00, 0x07, 0x62, 0x8d, 0xfe, 0x00, 0x0a, 0xa2, 0x09, 0x10, 0x00, 0x0a, 0x14, 0x11, 0x10, 0x00, 0x12, 0x14, 0x31, 0xfe, 0x00, 0x02, 0x08, 0x11, 0x10, 0x00, 0x02, 0x14, 0x11, 0x10, 0x00, 0x02, 0x22, 0x11, 0x10, 0x00, 0x02, 0x43, 0x91, 0xff, 0x00, 0x02, 0x81, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t1_2[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x50, 0x01, 0xfc, 0x00, 0x00, 0x88, 0x01, 0x04, 0x00, 0x01, 0x04, 0x03, 0x08, 0x00, 0x06, 0xfb, 0x04, 0x90, 0x00, 0x08, 0x00, 0xc0, 0x60, 0x00, 0x07, 0xdf, 0x01, 0x80, 0x00, 0x04, 0x51, 0x06, 0x00, 0x00, 0x04, 0x51, 0x1b, 0xfe, 0x00, 0x04, 0x51, 0x02, 0x02, 0x00, 0x07, 0xd9, 0x02, 0x02, 0x00, 0x04, 0x56, 0x02, 0x02, 0x00, 0x00, 0x10, 0x03, 0xfe, 0x00, 0x00, 0x10, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t1_3[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x78, 0xbc, 0x20, 0x00, 0x09, 0x48, 0xa4, 0x50, 0x00, 0x09, 0x4a, 0xa8, 0x50, 0x00, 0x09, 0x4a, 0xa8, 0x88, 0x00, 0x09, 0x4a, 0xb1, 0x04, 0x00, 0x1f, 0xfe, 0xaa, 0xfb, 0x00, 0x09, 0x4a, 0xa4, 0x20, 0x00, 0x09, 0x4a, 0xa4, 0x20, 0x00, 0x09, 0x4a, 0xa7, 0xfe, 0x00, 0x09, 0x4a, 0xb4, 0x20, 0x00, 0x09, 0x48, 0xa9, 0x24, 0x00, 0x0b, 0x48, 0xa2, 0x22, 0x00, 0x08, 0x8a, 0xa4, 0xa2, 0x00, 0x11, 0x19, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t1_4[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x10, 0x00, 0x1f, 0xdc, 0x3e, 0xfe, 0x00, 0x08, 0x90, 0x02, 0x12, 0x00, 0x05, 0x10, 0x04, 0xff, 0x00, 0x1f, 0xdf, 0x84, 0x12, 0x00, 0x02, 0x12, 0x0c, 0xfe, 0x00, 0x1f, 0xd2, 0x02, 0x10, 0x00, 0x02, 0x12, 0x22, 0xfe, 0x00, 0x0a, 0x92, 0x14, 0x10, 0x00, 0x0a, 0x52, 0x14, 0x10, 0x00, 0x12, 0x22, 0x0d, 0xff, 0x00, 0x02, 0x22, 0x08, 0x10, 0x00, 0x0a, 0x42, 0x14, 0x10, 0x00, 0x04, 0x02, 0x23, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
//默认
|
||
const unsigned char t2_0[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc8, 0x10, 0x20, 0x00, 0x12, 0x4a, 0x0c, 0x20, 0x00, 0x1a, 0xc9, 0x04, 0x20, 0x00, 0x17, 0x48, 0x00, 0x20, 0x00, 0x1f, 0xff, 0xb8, 0x20, 0x00, 0x02, 0x08, 0x08, 0x50, 0x00, 0x1f, 0xc8, 0x08, 0x50, 0x00, 0x02, 0x08, 0x08, 0x50, 0x00, 0x03, 0xc8, 0x08, 0x48, 0x00, 0x1e, 0x14, 0x08, 0x88, 0x00, 0x01, 0x54, 0x0a, 0x88, 0x00, 0x15, 0x22, 0x0c, 0x84, 0x00, 0x14, 0x43, 0x89, 0x07, 0x00, 0x00, 0x81, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
//休眠
|
||
const unsigned char t2_1[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x3d, 0xfc, 0x00, 0x02, 0x10, 0x25, 0x04, 0x00, 0x04, 0x10, 0x25, 0x04, 0x00, 0x05, 0xff, 0xbd, 0xfc, 0x00, 0x0c, 0x10, 0x25, 0x20, 0x00, 0x0c, 0x38, 0x25, 0x20, 0x00, 0x14, 0x38, 0x25, 0xfe, 0x00, 0x04, 0x54, 0x3d, 0x20, 0x00, 0x04, 0x54, 0x25, 0x10, 0x00, 0x04, 0x92, 0x25, 0x10, 0x00, 0x05, 0x11, 0xa5, 0x09, 0x00, 0x06, 0x11, 0x3d, 0x45, 0x00, 0x04, 0x10, 0x25, 0x83, 0x00, 0x04, 0x10, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
//提温
|
||
const unsigned char t2_2[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x7e, 0x21, 0xfc, 0x00, 0x04, 0x42, 0x11, 0x04, 0x00, 0x1f, 0x7e, 0x09, 0x04, 0x00, 0x04, 0x42, 0x21, 0xfc, 0x00, 0x05, 0x42, 0x11, 0x04, 0x00, 0x06, 0x7e, 0x11, 0x04, 0x00, 0x0c, 0x00, 0x05, 0xfc, 0x00, 0x15, 0xff, 0x88, 0x00, 0x00, 0x04, 0x08, 0x13, 0xfe, 0x00, 0x04, 0x48, 0x32, 0x52, 0x00, 0x04, 0x4f, 0x12, 0x52, 0x00, 0x04, 0x48, 0x12, 0x52, 0x00, 0x14, 0xa8, 0x12, 0x52, 0x00, 0x09, 0x1f, 0x97, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
//关机
|
||
const unsigned char t3_1[] PROGMEM = { 0x01, 0x04, 0x04, 0x7c, 0x00, 0x00, 0x88, 0x04, 0x44, 0x00, 0x0f, 0xff, 0x3f, 0x44, 0x00, 0x00, 0x20, 0x04, 0x44, 0x00, 0x00, 0x20, 0x0c, 0x44, 0x00, 0x00, 0x20, 0x0e, 0x44, 0x00, 0x1f, 0xff, 0x95, 0x44, 0x00, 0x00, 0x20, 0x14, 0x44, 0x00, 0x00, 0x50, 0x24, 0x44, 0x00, 0x00, 0x50, 0x04, 0x44, 0x00, 0x00, 0x88, 0x04, 0x45, 0x00, 0x01, 0x04, 0x04, 0x85, 0x00, 0x06, 0x03, 0x85, 0x03, 0x00, 0x18, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
|
||
const unsigned char t_4[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x20, 0x00, 0x0f, 0xff, 0x09, 0xfc, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x20, 0x3e, 0x88, 0x00, 0x03, 0xfe, 0x08, 0x50, 0x00, 0x02, 0x02, 0x0b, 0xfe, 0x00, 0x03, 0xfe, 0x0c, 0x40, 0x00, 0x02, 0x02, 0x18, 0x40, 0x00, 0x03, 0xfe, 0x2b, 0xfe, 0x00, 0x02, 0x02, 0x08, 0x48, 0x00, 0x03, 0xfe, 0x08, 0x88, 0x00, 0x02, 0x02, 0x08, 0x50, 0x00, 0x02, 0x02, 0x28, 0x30, 0x00, 0x1f, 0xff, 0x91, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t_PID[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc3, 0xf1, 0xe0, 0x00, 0x0f, 0xe3, 0xf1, 0xf8, 0x00, 0x0c, 0x70, 0xc1, 0x9e, 0x00, 0x0c, 0x30, 0xc1, 0x86, 0x00, 0x0c, 0x30, 0xc1, 0x83, 0x00, 0x0c, 0x30, 0xc1, 0x83, 0x00, 0x0c, 0x60, 0xc1, 0x83, 0x00, 0x0c, 0x60, 0xc1, 0x83, 0x00, 0x0f, 0xc0, 0xc1, 0x83, 0x00, 0x0f, 0xc0, 0xc1, 0x86, 0x00, 0x0c, 0x00, 0xc1, 0x86, 0x00, 0x0c, 0x00, 0xc1, 0x98, 0x00, 0x0c, 0x03, 0xf1, 0xf8, 0x00, 0x0c, 0x03, 0xf1, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
|
||
const unsigned char t5_0[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xdf, 0x88, 0x40, 0x00, 0x0a, 0x24, 0x10, 0x40, 0x00, 0x11, 0x42, 0x10, 0xfe, 0x00, 0x04, 0x00, 0x22, 0x82, 0x00, 0x02, 0xff, 0x3d, 0x02, 0x00, 0x08, 0x01, 0x0a, 0x42, 0x00, 0x09, 0xf9, 0x10, 0x32, 0x00, 0x09, 0x09, 0x20, 0x12, 0x00, 0x09, 0xf9, 0x3e, 0x02, 0x00, 0x09, 0x09, 0x00, 0x02, 0x00, 0x09, 0x09, 0x0e, 0x02, 0x00, 0x09, 0xf9, 0x30, 0x22, 0x00, 0x08, 0x05, 0x00, 0x14, 0x00, 0x08, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t5_1[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x44, 0x10, 0xfe, 0x00, 0x04, 0x28, 0x10, 0x92, 0x00, 0x05, 0xff, 0x22, 0x92, 0x00, 0x00, 0x10, 0x3c, 0x92, 0x00, 0x00, 0x10, 0x08, 0x92, 0x00, 0x1c, 0xfe, 0x10, 0x92, 0x00, 0x04, 0x10, 0x20, 0xfe, 0x00, 0x04, 0x10, 0x3e, 0x92, 0x00, 0x05, 0xff, 0x80, 0x92, 0x00, 0x04, 0x10, 0x00, 0x92, 0x00, 0x05, 0x10, 0x0e, 0x92, 0x00, 0x06, 0x10, 0x30, 0x92, 0x00, 0x04, 0x10, 0x00, 0xfe, 0x00, 0x00, 0x10, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t5_3[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x3f, 0xfe, 0x00, 0x1f, 0xff, 0x81, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x07, 0xfe, 0x0f, 0xf8, 0x00, 0x04, 0x02, 0x08, 0x08, 0x00, 0x04, 0x02, 0x08, 0x88, 0x00, 0x07, 0xfe, 0x08, 0x88, 0x00, 0x04, 0x02, 0x08, 0x88, 0x00, 0x04, 0x02, 0x08, 0x88, 0x00, 0x07, 0xfe, 0x08, 0x88, 0x00, 0x04, 0x02, 0x09, 0x48, 0x00, 0x04, 0x02, 0x02, 0x30, 0x00, 0x07, 0xfe, 0x04, 0x0c, 0x00, 0x04, 0x02, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
|
||
const unsigned char t_off[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x04, 0xff, 0x00, 0x00, 0x44, 0x02, 0x01, 0x00, 0x07, 0xff, 0x90, 0x21, 0x00, 0x00, 0x10, 0x10, 0x21, 0x00, 0x00, 0x10, 0x17, 0xfd, 0x00, 0x00, 0x10, 0x10, 0x21, 0x00, 0x0f, 0xff, 0xd0, 0x61, 0x00, 0x00, 0x10, 0x10, 0xa1, 0x00, 0x00, 0x28, 0x11, 0x21, 0x00, 0x00, 0x28, 0x12, 0x21, 0x00, 0x00, 0x44, 0x14, 0x21, 0x00, 0x00, 0x82, 0x10, 0xa1, 0x00, 0x03, 0x01, 0xd0, 0x45, 0x00, 0x0c, 0x00, 0x90, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t_on[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x20, 0x00, 0x00, 0x84, 0x07, 0xff, 0x00, 0x00, 0x84, 0x04, 0x01, 0x00, 0x00, 0x84, 0x04, 0x01, 0x00, 0x00, 0x84, 0x04, 0x01, 0x00, 0x0f, 0xff, 0xc7, 0xff, 0x00, 0x00, 0x84, 0x04, 0x00, 0x00, 0x00, 0x84, 0x04, 0x00, 0x00, 0x00, 0x84, 0x05, 0xff, 0x00, 0x00, 0x84, 0x05, 0x01, 0x00, 0x01, 0x04, 0x09, 0x01, 0x00, 0x01, 0x04, 0x09, 0x01, 0x00, 0x02, 0x04, 0x11, 0xff, 0x00, 0x04, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
|
||
const unsigned char t_NO[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x04, 0x91, 0x00, 0x04, 0x40, 0x02, 0x52, 0x00, 0x04, 0x7f, 0x90, 0x54, 0x00, 0x04, 0x50, 0x88, 0xff, 0x00, 0x07, 0xd0, 0x84, 0x81, 0x00, 0x04, 0x51, 0x00, 0x81, 0x00, 0x04, 0x49, 0x01, 0xff, 0x00, 0x07, 0xca, 0x02, 0x81, 0x00, 0x04, 0x44, 0x04, 0x81, 0x00, 0x04, 0x4a, 0x1c, 0xff, 0x00, 0x07, 0xea, 0x04, 0x81, 0x00, 0x0c, 0x51, 0x04, 0x81, 0x00, 0x00, 0x61, 0xc4, 0x85, 0x00, 0x00, 0x40, 0x80, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t_OK[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xdf, 0x10, 0x20, 0x00, 0x02, 0x12, 0x0c, 0x20, 0x00, 0x02, 0x24, 0x04, 0x20, 0x00, 0x04, 0x7f, 0x80, 0x20, 0x00, 0x04, 0x24, 0xb8, 0x20, 0x00, 0x0f, 0xa4, 0x88, 0x50, 0x00, 0x14, 0xbf, 0x88, 0x50, 0x00, 0x04, 0xa4, 0x88, 0x50, 0x00, 0x04, 0xa4, 0x88, 0x48, 0x00, 0x04, 0xbf, 0x88, 0x88, 0x00, 0x04, 0xa4, 0x8a, 0x88, 0x00, 0x07, 0xa4, 0x8c, 0x84, 0x00, 0x04, 0x44, 0x89, 0x07, 0x00, 0x00, 0x81, 0x86, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
|
||
const unsigned char t_CN_CN[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x0f, 0xff, 0x3f, 0xff, 0x00, 0x08, 0x41, 0x04, 0x08, 0x00, 0x08, 0x41, 0x04, 0x08, 0x00, 0x08, 0x41, 0x04, 0x10, 0x00, 0x08, 0x41, 0x02, 0x10, 0x00, 0x0f, 0xff, 0x02, 0x20, 0x00, 0x08, 0x41, 0x01, 0x20, 0x00, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x00, 0x40, 0x01, 0x30, 0x00, 0x00, 0x40, 0x02, 0x08, 0x00, 0x00, 0x40, 0x0c, 0x07, 0x00, 0x00, 0x40, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
const unsigned char t_CN_EN[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x80, 0x00, 0x01, 0x10, 0x3f, 0xff, 0x00, 0x00, 0x40, 0x04, 0x08, 0x00, 0x07, 0xfc, 0x04, 0x08, 0x00, 0x04, 0x44, 0x04, 0x10, 0x00, 0x04, 0x44, 0x02, 0x10, 0x00, 0x04, 0x44, 0x02, 0x20, 0x00, 0x1f, 0xff, 0x81, 0x20, 0x00, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x00, 0xa0, 0x01, 0x30, 0x00, 0x01, 0x10, 0x02, 0x08, 0x00, 0x06, 0x0c, 0x0c, 0x07, 0x00, 0x18, 0x03, 0xb0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
//翻转
|
||
const unsigned char t4f[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x1d, 0xc2, 0x08, 0x00, 0x05, 0x44, 0x42, 0x08, 0x00, 0x03, 0x84, 0x5f, 0xbf, 0x00, 0x0f, 0xe4, 0x44, 0x10, 0x00, 0x01, 0x15, 0x45, 0x10, 0x00, 0x05, 0x4c, 0xc9, 0x7f, 0x80, 0x09, 0x24, 0x4f, 0x90, 0x00, 0x07, 0xc4, 0xc1, 0x10, 0x00, 0x05, 0x4d, 0x41, 0x3f, 0x00, 0x05, 0x54, 0x43, 0x81, 0x00, 0x07, 0xc4, 0x4d, 0x02, 0x00, 0x05, 0x44, 0x41, 0x14, 0x00, 0x05, 0x55, 0x41, 0x08, 0x00, 0x07, 0xc8, 0x81, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
//保存
|
||
const unsigned char t_save[] PROGMEM = { 0x02, 0xfe, 0x01, 0x00, 0x00, 0x02, 0x82, 0x3f, 0xff, 0x00, 0x04, 0x82, 0x02, 0x00, 0x00, 0x04, 0xfe, 0x02, 0x00, 0x00, 0x0c, 0x10, 0x04, 0xfc, 0x00, 0x14, 0x10, 0x04, 0x08, 0x00, 0x05, 0xff, 0x8c, 0x10, 0x00, 0x04, 0x10, 0x14, 0x10, 0x00, 0x04, 0x38, 0x25, 0xff, 0x00, 0x04, 0x34, 0x04, 0x10, 0x00, 0x04, 0x52, 0x04, 0x10, 0x00, 0x04, 0x91, 0x84, 0x10, 0x00, 0x05, 0x10, 0x04, 0x50, 0x00, 0x04, 0x10, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||
|
||
const unsigned char *Txt_table[] = {
|
||
t0, t1, t2, t3, t4, t5, t6, t7, Back, //0
|
||
t0, t1_1, t1_2, t1_3, t1_4, t_save, //1
|
||
t2_0, t2_1, t2_2, t_save, //2
|
||
t2_1, t3_1, t2_2, t_save,//3
|
||
t_4, t_PID,//4
|
||
t5_0, t5_1,//5
|
||
t_off, t_on,//6
|
||
t_NO, t_OK,//7
|
||
t_CN_CN, t_CN_EN,//8
|
||
t_NO, t_OK,//9
|
||
t5_3, t4f, t_save, //10
|
||
};
|
||
|
||
bool lastbutton;
|
||
#include <Arduboy2.h> //注意 这里使用被阉割的图形库,只有绘图功能,并非通用的版本
|
||
Arduboy2 arduboy;
|
||
|
||
#include <EEPROM.h>
|
||
#include <PID_v1.h>
|
||
#include <avr/sleep.h>
|
||
|
||
// Firmware version
|
||
#define VERSION "v1.6L1"
|
||
|
||
// Type of rotary encoder
|
||
#define ROTARY_TYPE 1 // 0: 2 increments/step; 1: 4 increments/step
|
||
|
||
// Pins
|
||
#define SENSOR_PIN A0 // temperature sense
|
||
#define VIN_PIN A1 // input voltage sense
|
||
#define BUZZER_PIN 5 // buzzer
|
||
#define BUTTON_PIN 6 // rotary encoder switch
|
||
#define ROTARY_1_PIN 7 // rotary encoder 1
|
||
#define ROTARY_2_PIN 8 // rotary encoder 2
|
||
#define CONTROL_PIN 9 // heater MOSFET PWM control
|
||
#define SWITCH_PIN 10 // handle vibration switch
|
||
|
||
// Default temperature control values (recommended soldering temperature: 300-380°C)
|
||
#define TEMP_MIN 50 // min selectable temperature
|
||
#define TEMP_MAX 400 // max selectable temperature
|
||
#define TEMP_DEFAULT 320 // default start setpoint
|
||
#define TEMP_SLEEP 150 // temperature in sleep mode
|
||
#define TEMP_BOOST 60 // temperature increase in boost mode
|
||
#define TEMP_STEP 10 // rotary encoder temp change steps
|
||
|
||
// Default tip temperature calibration values
|
||
#define TEMP200 216 // temperature at ADC = 200
|
||
#define TEMP280 308 // temperature at ADC = 280
|
||
#define TEMP360 390 // temperature at ADC = 360
|
||
#define TEMPCHP 30 // chip temperature while calibration
|
||
#define TIPMAX 8 // max number of tips
|
||
#define TIPNAMELENGTH 6 // max length of tip names (including termination)
|
||
#define TIPNAME "BC1.5" // default tip name
|
||
|
||
// Default timer values (0 = disabled)
|
||
#define TIME2SLEEP 5 // time to enter sleep mode in minutes
|
||
#define TIME2OFF 15 // time to shut off heater in minutes
|
||
#define TIMEOFBOOST 40 // time to stay in boost mode in seconds
|
||
|
||
// Control values
|
||
#define TIME2SETTLE 950 // time in microseconds to allow OpAmp output to settle
|
||
#define SMOOTHIE 0.05 // OpAmp output smooth factor (1=no smoothing; 0.05 default)
|
||
#define PID_ENABLE true // enable PID control
|
||
#define BEEP_ENABLE true // enable/disable buzzer
|
||
#define MAINSCREEN 0 // type of main screen (0: big numbers; 1: more infos)
|
||
|
||
// EEPROM identifier
|
||
#define EEPROM_IDENT 0x080F // to identify if EEPROM was written by this program
|
||
|
||
// Define the aggressive and conservative PID tuning parameters
|
||
double aggKp = 11, aggKi = 0.5, aggKd = 1;
|
||
double consKp = 11, consKi = 3, consKd = 5;
|
||
|
||
// Default values that can be changed by the user and stored in the EEPROM
|
||
uint16_t DefaultTemp = TEMP_DEFAULT;
|
||
uint16_t SleepTemp = TEMP_SLEEP;
|
||
uint8_t BoostTemp = TEMP_BOOST;
|
||
uint8_t time2sleep = TIME2SLEEP;
|
||
uint8_t time2off = TIME2OFF;
|
||
uint8_t timeOfBoost = TIMEOFBOOST;
|
||
uint8_t MainScrType = MAINSCREEN;
|
||
bool PIDenable = PID_ENABLE;
|
||
bool beepEnable = BEEP_ENABLE;
|
||
// Default values for tips
|
||
uint16_t CalTemp[TIPMAX][4] = {TEMP200, TEMP280, TEMP360, TEMPCHP};
|
||
char TipName[TIPMAX][TIPNAMELENGTH] = {TIPNAME};
|
||
uint8_t CurrentTip = 0;
|
||
uint8_t NumberOfTips = 1;
|
||
|
||
// Menu items
|
||
/*
|
||
const char *SetupItems[] = { "Setup Menu", "Tip Settings", "Temp Settings",
|
||
"Timer Settings", "Control Type", "Main Screen",
|
||
"Buzzer", "Information", "Return"
|
||
};
|
||
const char *TipItems[] = { "Tip:", "Change Tip", "Calibrate Tip",
|
||
"Rename Tip", "Delete Tip", "Add new Tip", "Return"
|
||
};
|
||
const char *TempItems[] = { "Temp Settings", "Default Temp", "Sleep Temp",
|
||
"Boost Temp", "Return"
|
||
};
|
||
const char *TimerItems[] = { "Timer Settings", "Sleep Timer", "Off Timer",
|
||
"Boost Timer", "Return"
|
||
};
|
||
|
||
const char *ControlTypeItems[] = { "Control Type", "Direct", "PID" };
|
||
const char *MainScreenItems[] = { "Main Screen", "Big Numbers", "More Infos" };
|
||
const char *StoreItems[] = { "Store Settings ?", "No", "Yes" };
|
||
const char *SureItems[] = { "Are you sure ?", "No", "Yes" };
|
||
const char *BuzzerItems[] = { "Buzzer", "Disable", "Enable" };
|
||
|
||
const char *DefaultTempItems[] = { "Default Temp", "deg C" };
|
||
const char *SleepTempItems[] = { "Sleep Temp", "deg C" };
|
||
const char *BoostTempItems[] = { "Boost Temp", "deg C" };
|
||
const char *SleepTimerItems[] = { "Sleep Timer", "Minutes" };
|
||
const char *OffTimerItems[] = { "Off Timer", "Minutes" };
|
||
const char *BoostTimerItems[] = { "Boost Timer", "Seconds" };
|
||
*/
|
||
/*
|
||
这个可以选择进行界面美化
|
||
const char *DeleteMessage[] = { "Warning", "You cannot", "delete your", "last tip!" };
|
||
const char *MaxTipMessage[] = { "Warning", "You reached", "maximum number", "of tips!" };
|
||
*/
|
||
// Variables for pin change interrupt
|
||
volatile uint8_t a0, b0, c0, d0;
|
||
volatile bool ab0;
|
||
volatile int count, countMin, countMax, countStep;
|
||
volatile bool handleMoved;
|
||
|
||
// Variables for temperature control
|
||
uint16_t SetTemp, ShowTemp, gap, Step;
|
||
double Input, Output, Setpoint, RawTemp, CurrentTemp, ChipTemp;
|
||
|
||
// Variables for voltage readings
|
||
uint16_t Vcc, Vin;
|
||
|
||
// State variables
|
||
bool inSleepMode = false;
|
||
bool inOffMode = false;
|
||
bool inBoostMode = false;
|
||
bool inCalibMode = false;
|
||
bool isWorky = true;
|
||
bool beepIfWorky = true;
|
||
bool TipIsPresent = true;
|
||
bool FlipState = false;
|
||
// Timing variables
|
||
uint32_t sleepmillis;
|
||
uint32_t boostmillis;
|
||
uint32_t buttonmillis;
|
||
uint8_t goneMinutes;
|
||
uint8_t goneSeconds;
|
||
uint8_t SensorCounter = 255;
|
||
//串口助手
|
||
int x, y, a, b;
|
||
|
||
// Control variables
|
||
uint16_t time2settle = 300;
|
||
|
||
//模拟数字滚轮 Numerical scrolling effect
|
||
String value;
|
||
int LastValue[3];
|
||
float SlidingAnimationY[3];
|
||
|
||
// Specify the links and initial PID tuning parameters
|
||
PID ctrl(&Input, &Output, &Setpoint, aggKp, aggKi, aggKd, REVERSE);
|
||
|
||
|
||
|
||
//LANG 语言支持
|
||
/* 0 - ENGLISH
|
||
1 - 中文
|
||
*/
|
||
byte LANG = 0;
|
||
void Flip(bool Fmode) {
|
||
arduboy.flipVertical(Fmode);
|
||
arduboy.flipHorizontal(Fmode);
|
||
}
|
||
void setup() {
|
||
arduboy.begin();
|
||
arduboy.setFrameRate(15);
|
||
|
||
//Serial.begin(9600);
|
||
// set the pin modes
|
||
pinMode(SENSOR_PIN, INPUT);
|
||
pinMode(VIN_PIN, INPUT);
|
||
pinMode(BUZZER_PIN, OUTPUT);
|
||
pinMode(CONTROL_PIN, OUTPUT);
|
||
pinMode(ROTARY_1_PIN, INPUT_PULLUP);
|
||
pinMode(ROTARY_2_PIN, INPUT_PULLUP);
|
||
pinMode(BUTTON_PIN, INPUT_PULLUP);
|
||
pinMode(SWITCH_PIN, INPUT_PULLUP);
|
||
|
||
analogWrite(CONTROL_PIN, 255); // this shuts off the heater
|
||
digitalWrite(BUZZER_PIN, LOW); // must be LOW when buzzer not in use
|
||
|
||
// setup ADC
|
||
ADCSRA |= bit (ADPS0) | bit (ADPS1) | bit (ADPS2); // set ADC prescaler to 128
|
||
ADCSRA |= bit (ADIE); // enable ADC interrupt
|
||
interrupts (); // enable global interrupts
|
||
|
||
// setup pin change interrupt for rotary encoder
|
||
PCMSK0 = bit (PCINT0); // Configure pin change interrupt on Pin8
|
||
PCICR = bit (PCIE0); // Enable pin change interrupt
|
||
PCIFR = bit (PCIF0); // Clear interrupt flag
|
||
|
||
|
||
// get default values from EEPROM
|
||
getEEPROM();
|
||
//设置屏幕反转状态
|
||
Flip(FlipState);
|
||
// read supply voltages in mV
|
||
Vcc = getVCC(); Vin = getVIN();
|
||
|
||
// read and set current iron temperature
|
||
SetTemp = DefaultTemp;
|
||
RawTemp = denoiseAnalog(SENSOR_PIN);
|
||
ChipTemp = getChipTemp();
|
||
calculateTemp();
|
||
|
||
// turn on heater if iron temperature is well below setpoint
|
||
if ((CurrentTemp + 20) < DefaultTemp) analogWrite(CONTROL_PIN, 0);
|
||
|
||
// tell the PID to range between 0 and the full window size
|
||
ctrl.SetOutputLimits(0, 255);
|
||
|
||
// start PID
|
||
ctrl.SetMode(AUTOMATIC);
|
||
|
||
// set initial rotary encoder values
|
||
a0 = PINB & 1; b0 = PIND >> 7 & 1; ab0 = (a0 == b0);
|
||
setRotary(TEMP_MIN, TEMP_MAX, TEMP_STEP, DefaultTemp);
|
||
|
||
// reset sleep timer
|
||
sleepmillis = millis();
|
||
|
||
// long beep for setup completion
|
||
beep(); beep();
|
||
|
||
|
||
}
|
||
|
||
|
||
void loop() {
|
||
//HelpMeSerialer();
|
||
ROTARYCheck(); // check rotary encoder (temp/boost setting, enter setup menu)
|
||
SLEEPCheck(); // check and activate/deactivate sleep modes
|
||
SENSORCheck(); // reads temperature and vibration switch of the iron
|
||
Thermostat(); // heater control
|
||
MainScreen(); // updates the main page on the OLED
|
||
}
|
||
|
||
|
||
|
||
|
||
// check rotary encoder; set temperature, toggle boost mode, enter setup menu accordingly
|
||
void ROTARYCheck() {
|
||
// set working temperature according to rotary encoder value
|
||
SetTemp = getRotary();
|
||
|
||
// check rotary encoder switch
|
||
uint8_t c = digitalRead(BUTTON_PIN);
|
||
if ( !c && c0 ) {
|
||
beep();
|
||
buttonmillis = millis();
|
||
while ( (!digitalRead(BUTTON_PIN)) && ((millis() - buttonmillis) < 500) );
|
||
if ((millis() - buttonmillis) >= 500) SetupScreen();
|
||
else {
|
||
inBoostMode = !inBoostMode;
|
||
if (inBoostMode) boostmillis = millis();
|
||
handleMoved = true;
|
||
}
|
||
}
|
||
c0 = c;
|
||
|
||
// check timer when in boost mode
|
||
if (inBoostMode && timeOfBoost) {
|
||
goneSeconds = (millis() - boostmillis) / 1000;
|
||
if (goneSeconds >= timeOfBoost) {
|
||
inBoostMode = false; // stop boost mode
|
||
beep(); // beep if boost mode is over
|
||
beepIfWorky = true; // beep again when working temperature is reached
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
// check and activate/deactivate sleep modes
|
||
void SLEEPCheck() {
|
||
if (handleMoved) { // if handle was moved
|
||
if (inSleepMode) { // in sleep or off mode?
|
||
if ((CurrentTemp + 20) < SetTemp) // if temp is well below setpoint
|
||
analogWrite(CONTROL_PIN, 0); // then start the heater right now
|
||
beep(); // beep on wake-up
|
||
beepIfWorky = true; // beep again when working temperature is reached
|
||
}
|
||
handleMoved = false; // reset handleMoved flag
|
||
inSleepMode = false; // reset sleep flag
|
||
inOffMode = false; // reset off flag
|
||
sleepmillis = millis(); // reset sleep timer
|
||
}
|
||
|
||
// check time passed since the handle was moved
|
||
goneMinutes = (millis() - sleepmillis) / 60000;
|
||
if ( (!inSleepMode) && (time2sleep > 0) && (goneMinutes >= time2sleep) ) {
|
||
inSleepMode = true;
|
||
beep();
|
||
}
|
||
if ( (!inOffMode) && (time2off > 0) && (goneMinutes >= time2off ) ) {
|
||
inOffMode = true;
|
||
beep();
|
||
}
|
||
}
|
||
|
||
|
||
// reads temperature, vibration switch and supply voltages
|
||
void SENSORCheck() {
|
||
analogWrite(CONTROL_PIN, 255); // shut off heater in order to measure temperature
|
||
delayMicroseconds(time2settle); // wait for voltage to settle
|
||
|
||
uint16_t temp = denoiseAnalog(SENSOR_PIN); // read ADC value for temperature
|
||
uint8_t d = digitalRead(SWITCH_PIN); // check handle vibration switch
|
||
if (d != d0) {
|
||
handleMoved = true; // set flag if handle was moved
|
||
d0 = d;
|
||
}
|
||
if (! SensorCounter--) Vin = getVIN(); // get Vin every now and then
|
||
|
||
analogWrite(CONTROL_PIN, Output); // turn on again heater
|
||
|
||
RawTemp += (temp - RawTemp) * SMOOTHIE; // stabilize ADC temperature reading
|
||
calculateTemp();
|
||
|
||
// stabilize displayed temperature when around setpoint
|
||
if ((ShowTemp != Setpoint) || (abs(ShowTemp - CurrentTemp) > 5)) ShowTemp = CurrentTemp;
|
||
|
||
// set state variable if temperature is in working range; beep if working temperature was just reached
|
||
gap = abs(SetTemp - CurrentTemp);
|
||
if (gap < 5) {
|
||
if (!isWorky && beepIfWorky) beep();
|
||
isWorky = true;
|
||
beepIfWorky = false;
|
||
}
|
||
else isWorky = false;
|
||
// checks if tip is present or currently inserted
|
||
if (ShowTemp > 500) TipIsPresent = false; // tip removed ?
|
||
if (!TipIsPresent && (ShowTemp < 500)) { // new tip inserted ?
|
||
analogWrite(CONTROL_PIN, 255); // shut off heater
|
||
beep(); // beep for info
|
||
TipIsPresent = true; // tip is present now
|
||
ChangeTipScreen(); // show tip selection screen
|
||
updateEEPROM(); // update setting in EEPROM
|
||
handleMoved = true; // reset all timers
|
||
RawTemp = denoiseAnalog(SENSOR_PIN); // restart temp smooth algorithm
|
||
c0 = LOW; // switch must be released
|
||
setRotary(TEMP_MIN, TEMP_MAX, TEMP_STEP, SetTemp); // reset rotary encoder
|
||
}
|
||
}
|
||
|
||
|
||
// calculates real temperature value according to ADC reading and calibration values
|
||
void calculateTemp() {
|
||
if (RawTemp < 200) CurrentTemp = map (RawTemp, 0, 200, 21, CalTemp[CurrentTip][0]);
|
||
else if (RawTemp < 280) CurrentTemp = map (RawTemp, 200, 280, CalTemp[CurrentTip][0], CalTemp[CurrentTip][1]);
|
||
else CurrentTemp = map (RawTemp, 280, 360, CalTemp[CurrentTip][1], CalTemp[CurrentTip][2]);
|
||
}
|
||
|
||
|
||
//调温
|
||
void Thermostat() {
|
||
// define Setpoint acoording to current working mode
|
||
if (inOffMode) Setpoint = 0;
|
||
else if (inSleepMode) Setpoint = SleepTemp;
|
||
else if (inBoostMode) Setpoint = SetTemp + BoostTemp;
|
||
else Setpoint = SetTemp;
|
||
|
||
// control the heater (PID or direct)
|
||
gap = abs(Setpoint - CurrentTemp);
|
||
if (PIDenable) {
|
||
Input = CurrentTemp;
|
||
if (gap < 30) ctrl.SetTunings(consKp, consKi, consKd);
|
||
else ctrl.SetTunings(aggKp, aggKi, aggKd);
|
||
ctrl.Compute();
|
||
} else {
|
||
// turn on heater if current temperature is below setpoint
|
||
if ((CurrentTemp + 0.5) < Setpoint) Output = 0; else Output = 255;
|
||
}
|
||
analogWrite(CONTROL_PIN, Output); // set heater PWM
|
||
}
|
||
|
||
|
||
// creates a short beep on the buzzer
|
||
void beep() {
|
||
if (beepEnable) {
|
||
for (uint8_t i = 0; i < 255; i++) {
|
||
digitalWrite(BUZZER_PIN, HIGH);
|
||
delayMicroseconds(125);
|
||
digitalWrite(BUZZER_PIN, LOW);
|
||
delayMicroseconds(125);
|
||
}
|
||
}
|
||
}
|
||
|
||
//设置旋转编码器的起始值
|
||
// sets start values for rotary encoder
|
||
void setRotary(int rmin, int rmax, int rstep, int rvalue) {
|
||
countMin = rmin << ROTARY_TYPE;
|
||
countMax = rmax << ROTARY_TYPE;
|
||
countStep = rstep;
|
||
count = rvalue << ROTARY_TYPE;
|
||
}
|
||
|
||
|
||
// reads current rotary encoder value
|
||
int getRotary() {
|
||
return (count >> ROTARY_TYPE);
|
||
}
|
||
|
||
|
||
// reads user settings from EEPROM; if EEPROM values are invalid, write defaults
|
||
void getEEPROM() {
|
||
uint16_t identifier = (EEPROM.read(0) << 8) | EEPROM.read(1);
|
||
if (identifier == EEPROM_IDENT) {
|
||
DefaultTemp = (EEPROM.read(2) << 8) | EEPROM.read(3);
|
||
SleepTemp = (EEPROM.read(4) << 8) | EEPROM.read(5);
|
||
BoostTemp = EEPROM.read(6);
|
||
time2sleep = EEPROM.read(7);
|
||
time2off = EEPROM.read(8);
|
||
timeOfBoost = EEPROM.read(9);
|
||
MainScrType = EEPROM.read(10);
|
||
PIDenable = EEPROM.read(11);
|
||
beepEnable = EEPROM.read(12);
|
||
CurrentTip = EEPROM.read(13);
|
||
NumberOfTips = EEPROM.read(14);
|
||
LANG = EEPROM.read(15);
|
||
FlipState = EEPROM.read(16);
|
||
|
||
uint8_t i, j;
|
||
uint16_t counter = 17;
|
||
for (i = 0; i < NumberOfTips; i++) {
|
||
for (j = 0; j < TIPNAMELENGTH; j++) {
|
||
TipName[i][j] = EEPROM.read(counter++);
|
||
}
|
||
for (j = 0; j < 4; j++) {
|
||
CalTemp[i][j] = EEPROM.read(counter++) << 8;
|
||
CalTemp[i][j] |= EEPROM.read(counter++);
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
EEPROM.update(0, EEPROM_IDENT >> 8); EEPROM.update(1, EEPROM_IDENT & 0xFF);
|
||
updateEEPROM();
|
||
}
|
||
}
|
||
|
||
|
||
// writes user settings to EEPROM using updade function to minimize write cycles
|
||
void updateEEPROM() {
|
||
EEPROM.update( 2, DefaultTemp >> 8);
|
||
EEPROM.update( 3, DefaultTemp & 0xFF);
|
||
EEPROM.update( 4, SleepTemp >> 8);
|
||
EEPROM.update( 5, SleepTemp & 0xFF);
|
||
EEPROM.update( 6, BoostTemp);
|
||
EEPROM.update( 7, time2sleep);
|
||
EEPROM.update( 8, time2off);
|
||
EEPROM.update( 9, timeOfBoost);
|
||
EEPROM.update(10, MainScrType);
|
||
EEPROM.update(11, PIDenable);
|
||
EEPROM.update(12, beepEnable);
|
||
EEPROM.update(13, CurrentTip);
|
||
EEPROM.update(14, NumberOfTips);
|
||
EEPROM.update(15, LANG);
|
||
EEPROM.update(16, FlipState);
|
||
uint8_t i, j;
|
||
uint16_t counter = 17;
|
||
for (i = 0; i < NumberOfTips; i++) {
|
||
for (j = 0; j < TIPNAMELENGTH; j++) EEPROM.update(counter++, TipName[i][j]);
|
||
for (j = 0; j < 4; j++) {
|
||
EEPROM.update(counter++, CalTemp[i][j] >> 8);
|
||
EEPROM.update(counter++, CalTemp[i][j] & 0xFF);
|
||
}
|
||
}
|
||
}
|
||
//此片段用于DEBUG
|
||
void HelpMeSerialer() {
|
||
//串口助手
|
||
if (Serial.available()) {
|
||
char TmpChar = Serial.read();
|
||
switch (TmpChar) {
|
||
case 'x': x = Serial.parseInt();
|
||
case 'y': y = Serial.parseInt();
|
||
case 'a': a = Serial.parseInt();
|
||
case 'b': b = Serial.parseInt();
|
||
}
|
||
}
|
||
/*
|
||
Serial.println(String("X ->") + x);
|
||
Serial.println(String("Y ->") + y);
|
||
Serial.println(String("A ->") + a);
|
||
Serial.println(String("B ->") + b);
|
||
*/
|
||
}
|
||
// draws the main screen
|
||
void MainScreen() {
|
||
if (!(arduboy.nextFrame())) //帧率锁
|
||
return;
|
||
byte SysState;
|
||
if (MainScrType) {
|
||
arduboy.clear();
|
||
//详细信息页
|
||
arduboy.fillRect(0, 0, 128, 64, 1); //白底
|
||
arduboy.setTextSize(1);
|
||
SetTextColor(0);
|
||
//预设名
|
||
arduboy.drawSlowXYBitmap(0, 0, Tag, 16, 16, 0);
|
||
arduboy.setCursor(19, 4); arduboy.print(TipName[CurrentTip]);
|
||
//状态显示
|
||
if (ShowTemp > 500) SysState = 0;
|
||
else if (inOffMode) SysState = 1;
|
||
else if (inSleepMode) SysState = 2;
|
||
else if (inBoostMode) SysState = 3;
|
||
else if (isWorky) SysState = 4;
|
||
else if (Output < 180) SysState = 5;
|
||
else SysState = 6;
|
||
//显示状态
|
||
arduboy.setCursor(53, 1);
|
||
arduboy.setTextSize(2);
|
||
switch (LANG) {
|
||
case 0: arduboy.drawSlowXYBitmap(80, 1, S_table[SysState], 28, 14, 0); break; //中文 Chinese
|
||
default: //英文 English
|
||
switch (SysState) {
|
||
case 1: arduboy.print(F("OFF")); break;
|
||
case 2: arduboy.print(F("SLEEP")); break;
|
||
case 3: arduboy.print(F("BOOST")); break;
|
||
case 4: arduboy.print(F("WORKY")); break;
|
||
case 5: arduboy.print(F("HEAT")); break;
|
||
case 6: arduboy.print(F("HOLD")); break;
|
||
default: arduboy.print(F("ERROR")); break;
|
||
} break;
|
||
}
|
||
arduboy.drawSlowXYBitmap(112, 0, C_table[SysState], 16, 16, 0);
|
||
arduboy.setTextSize(1);
|
||
//芯片
|
||
//R1
|
||
arduboy.drawSlowXYBitmap(0, 16, Chip, 16, 16, 0);
|
||
//R2
|
||
arduboy.drawSlowXYBitmap(0, 32, Lightning, 16, 16, 0);
|
||
//R3
|
||
arduboy.setCursor(19, 16); arduboy.print(getChipTemp(), 1); arduboy.print((char)248); arduboy.print(F("C")); //芯片温度
|
||
arduboy.setCursor(19, 24); arduboy.print((float)getVCC() / 1000, 2); arduboy.print(F("V")); //芯片电压
|
||
arduboy.setCursor(19, 32); arduboy.print((float)Vin / 1000, 1); arduboy.print(F("V")); //输入电压
|
||
arduboy.setCursor(19, 40); arduboy.print(F(VERSION)); //固件
|
||
//显示探头温度
|
||
arduboy.setCursor(57, 18);
|
||
arduboy.setTextSize(4);
|
||
if (ShowTemp > 500) arduboy.print(F("000")); else arduboy.print(ShowTemp);
|
||
arduboy.drawRect(55, 16, 72, 32, 0);
|
||
arduboy.setTextSize(1);
|
||
|
||
//温度条
|
||
//框
|
||
arduboy.drawRect(1, 49, 102, 14, 0);
|
||
//条
|
||
if (ShowTemp <= 500) arduboy.fillRect(1, 49, map(ShowTemp, 0, 500, 2, 102), 14, 0);
|
||
//指示部分
|
||
arduboy.fillRect(map(Setpoint, 0, 500, 2, 102) - 2, 50, 3, 13, 0);
|
||
//先来个白底
|
||
arduboy.fillRect(map(Setpoint, 0, 500, 2, 102) - 3, 60, 5, 4, 0);
|
||
arduboy.drawLine(map(Setpoint, 0, 500, 2, 102) - 1, 60, map(Setpoint, 0, 500, 2, 102) - 1, 49);
|
||
|
||
//画指示针
|
||
arduboy.drawSlowXYBitmap(map(Setpoint, 0, 500, 2, 102) - 3, 59, Pointer, 5, 4, 1);
|
||
|
||
//功率条
|
||
arduboy.drawRect(104, 49, 23, 14, 0);
|
||
arduboy.fillRect(104, 49, map(Output, 255, 0, 0, 23), 14, 0);
|
||
|
||
SetTextColor(1);
|
||
//////////////进入反色////////////////////////////////
|
||
arduboy.setCursor(2, 55); arduboy.print(Setpoint, 0); arduboy.print((char)248); arduboy.print(F("C")); //探头预设温度
|
||
arduboy.setCursor(105, 55); arduboy.print(map(Output, 255, 0, 0, 100)); arduboy.print(F("%")); //功率百分比
|
||
arduboy.display();
|
||
} else {
|
||
|
||
if (ShowTemp > 500) DisplayNum(999); else DisplayNum(ShowTemp);;
|
||
arduboy.display();
|
||
}
|
||
|
||
}
|
||
//设置画笔颜色
|
||
void SetTextColor(bool color) {
|
||
arduboy.setTextBackground(!color);
|
||
arduboy.setTextColor(color);
|
||
}
|
||
// setup screen
|
||
void SetupScreen() {
|
||
analogWrite(CONTROL_PIN, 255); // shut off heater
|
||
beep();
|
||
uint16_t SaveSetTemp = SetTemp;
|
||
uint8_t selection = 0;
|
||
bool repeat = true;
|
||
|
||
while (repeat) {
|
||
MenuLevel = 0; //默认打开主菜单
|
||
selection = MenuScreen(selection);
|
||
switch (selection) {
|
||
case 0: MenuLevel = 1; TipScreen(); repeat = false; break;
|
||
case 1: MenuLevel = 2; TempScreen(); break;
|
||
case 2: MenuLevel = 3; TimerScreen(); break;
|
||
case 3: MenuLevel = 4; PIDenable = MenuScreen(PIDenable); break;
|
||
case 4: MenuLevel = 10; ScreenSet(); break;
|
||
case 5: MenuLevel = 6; beepEnable = MenuScreen(beepEnable); break;
|
||
case 6: MenuLevel = 8; LANG = MenuScreen(LANG); break;
|
||
case 7: InfoScreen(); break;
|
||
default: repeat = false; break;
|
||
}
|
||
}
|
||
updateEEPROM();
|
||
handleMoved = true;
|
||
SetTemp = SaveSetTemp;
|
||
setRotary(TEMP_MIN, TEMP_MAX, TEMP_STEP, SetTemp);
|
||
}
|
||
|
||
|
||
//显示设置菜单
|
||
// tip settings screen
|
||
void ScreenSet() {
|
||
uint8_t selection = 0;
|
||
bool repeat = true;
|
||
while (repeat) {
|
||
MenuLevel = 10;
|
||
selection = MenuScreen(selection);
|
||
switch (selection) {
|
||
case 0: MenuLevel = 5; MainScrType = MenuScreen(MainScrType); break;
|
||
case 1: MenuLevel = 9; FlipState = MenuScreen(FlipState); break;
|
||
default: repeat = false; break;
|
||
}
|
||
Flip(FlipState); //设置屏幕反转状态
|
||
}
|
||
updateEEPROM();
|
||
}
|
||
|
||
//预设设置菜单
|
||
// tip settings screen
|
||
void TipScreen() {
|
||
uint8_t selection = 0;
|
||
bool repeat = true;
|
||
while (repeat) {
|
||
MenuLevel = 1;
|
||
selection = MenuScreen(selection);
|
||
switch (selection) {
|
||
case 0: ChangeTipScreen(); break;
|
||
case 1: CalibrationScreen(); break;
|
||
case 2: InputNameScreen(); break;
|
||
case 3: DeleteTipScreen(); break;
|
||
case 4: AddTipScreen(); break;
|
||
default: repeat = false; break;
|
||
}
|
||
}
|
||
}
|
||
|
||
//温控设置菜单
|
||
// temperature settings screen
|
||
void TempScreen() {
|
||
uint8_t selection = 0;
|
||
bool repeat = true;
|
||
while (repeat) {
|
||
selection = MenuScreen(selection);
|
||
switch (selection) {
|
||
case 0: setRotary(TEMP_MIN, TEMP_MAX, TEMP_STEP, DefaultTemp);
|
||
DefaultTemp = InputScreen(); break;
|
||
case 1: setRotary(20, 200, TEMP_STEP, SleepTemp);
|
||
SleepTemp = InputScreen(); break;
|
||
case 2: setRotary(10, 100, TEMP_STEP, BoostTemp);
|
||
BoostTemp = InputScreen(); break;
|
||
default: repeat = false; break;
|
||
}
|
||
}
|
||
updateEEPROM();
|
||
}
|
||
|
||
//定时器设置菜单
|
||
// timer settings screen
|
||
void TimerScreen() {
|
||
uint8_t selection = 0;
|
||
bool repeat = true;
|
||
while (repeat) {
|
||
selection = MenuScreen(selection);
|
||
switch (selection) {
|
||
case 0: setRotary(0, 30, 1, time2sleep);
|
||
time2sleep = InputScreen(); break;
|
||
case 1: setRotary(0, 60, 5, time2off);
|
||
time2off = InputScreen(); break;
|
||
case 2: setRotary(0, 180, 10, timeOfBoost);
|
||
timeOfBoost = InputScreen(); break;
|
||
default: repeat = false; break;
|
||
}
|
||
}
|
||
updateEEPROM();
|
||
}
|
||
|
||
//菜单界面
|
||
// menu screen
|
||
uint8_t MenuScreen(uint8_t selected) {
|
||
int SlidingAnimationX;
|
||
uint8_t lastselected = selected;
|
||
setRotary(0, Menu_table[MenuLevel] - 1, 1, selected);
|
||
lastbutton = (!digitalRead(BUTTON_PIN));
|
||
do {
|
||
selected = getRotary();
|
||
//非线性滑动动画
|
||
SlidingAnimationX += (selected - lastselected) * 56;
|
||
if (SlidingAnimationX != 0) SlidingAnimationX += 0.5 * (-SlidingAnimationX);
|
||
lastselected = selected;
|
||
arduboy.clear();
|
||
//绘制图标 如果有指定的话
|
||
for (byte i = 0; i < 5; i++) if (selected - 2 + i >= 0 && selected - 2 + i < Menu_table[MenuLevel]) arduboy.drawSlowXYBitmap(-72 + i * 56 + SlidingAnimationX, 0, Ico_table[selected - 2 + i + QueryMenuObject()], 48, 48, 1);
|
||
|
||
arduboy.drawSlowXYBitmap(48, 48, Txt_table[selected + QueryMenuObject()], 36, 16, 1);
|
||
arduboy.display();
|
||
CheckLastButton();
|
||
} while (digitalRead(BUTTON_PIN) || lastbutton);
|
||
beep();
|
||
return selected;
|
||
}
|
||
//检查按键
|
||
void CheckLastButton() {
|
||
if (lastbutton && digitalRead(BUTTON_PIN)) {
|
||
delay(10);
|
||
lastbutton = false;
|
||
}
|
||
}
|
||
//返回对应层数的对象数
|
||
byte QueryMenuObject() {
|
||
int SUM = 0;
|
||
for (int i = 0; i < (MenuLevel); i++) SUM += Menu_table[i];
|
||
return SUM;
|
||
}
|
||
//信息窗
|
||
/*
|
||
void MessageScreen(const char *Items[], uint8_t numberOfItems) {
|
||
lastbutton = (!digitalRead(BUTTON_PIN));
|
||
|
||
//u8g.setFont(//u8g_font_9x15);
|
||
//u8g.setFontPosTop();
|
||
for (uint8_t i = 0; i < numberOfItems; i++) //u8g.drawStr( 0, i * 16, Items[i]);
|
||
|
||
do {
|
||
CheckLastButton();
|
||
} while (digitalRead(BUTTON_PIN) || lastbutton);
|
||
beep();
|
||
}
|
||
*/
|
||
/*
|
||
好看是好看,但是浪费内存
|
||
int wav(byte wavi, int num) {
|
||
return (wavi + byte(millis() / 100)) * (float(float(num - countMin) / float(countMax - countMin)) - 0.5) * 5;
|
||
}
|
||
*/
|
||
|
||
//模拟数字滚轮 Numerical scrolling effect
|
||
void DisplayNum(int Num) {
|
||
arduboy.clear();
|
||
arduboy.setTextSize(6);
|
||
SetTextColor(0);
|
||
//数字滚轮
|
||
for (byte i = 0; i < 3; i++) LastValue[i] = byte(value[i]);
|
||
value = Num;
|
||
for (byte i = 0; i < 3; i++) {
|
||
SlidingAnimationY[i] += (byte(value[i]) - LastValue[i]) * 50;
|
||
if (SlidingAnimationY[i] != 0) SlidingAnimationY[i] += 0.8 * (-SlidingAnimationY[i]);
|
||
arduboy.fillRect(0 + i * 44, 0, 38, 50, 1); //白底
|
||
for (int ii = -1; ii < 2; ii++) {
|
||
arduboy.setCursor(4 + i * 44, 4 - SlidingAnimationY[i] + ii * 50);
|
||
arduboy.print(LastValue[i] + ii - 48);
|
||
}
|
||
}
|
||
//刻度标
|
||
arduboy.fillRect(0, 0, 128, 2, 0); //上遮罩层
|
||
arduboy.fillRect(0, 51, 128, 13, 0); //下遮罩层
|
||
arduboy.display();
|
||
}
|
||
|
||
//数值输入界面
|
||
// input value screen
|
||
uint16_t InputScreen() {
|
||
lastbutton = (!digitalRead(BUTTON_PIN));
|
||
do {
|
||
DisplayNum(getRotary());
|
||
CheckLastButton();
|
||
} while (digitalRead(BUTTON_PIN) || lastbutton);
|
||
beep();
|
||
return value.toInt();
|
||
}
|
||
|
||
//关于界面
|
||
// information display screen
|
||
void InfoScreen() {
|
||
lastbutton = (!digitalRead(BUTTON_PIN));
|
||
arduboy.clear();
|
||
arduboy.drawSlowXYBitmap(32, 0, QRCode, 64, 64, 1);
|
||
arduboy.display();
|
||
do {
|
||
CheckLastButton();
|
||
} while (digitalRead(BUTTON_PIN) || lastbutton);
|
||
beep();
|
||
}
|
||
|
||
//更换预设界面
|
||
// change tip screen
|
||
void ChangeTipScreen() {
|
||
uint8_t selected = CurrentTip;
|
||
uint8_t lastselected = selected;
|
||
int8_t arrow = 0;
|
||
if (selected) arrow = 1;
|
||
setRotary(0, NumberOfTips - 1, 1, selected);
|
||
lastbutton = (!digitalRead(BUTTON_PIN));
|
||
do {
|
||
arduboy.clear();
|
||
selected = getRotary();
|
||
arrow = constrain(arrow + selected - lastselected, 0, 2);
|
||
lastselected = selected;
|
||
SetTextColor(0);
|
||
arduboy.setTextSize(2);
|
||
arduboy.setCursor(0, 0); arduboy.print(F("Select Tip"));
|
||
SetTextColor(1);
|
||
arduboy.setCursor(0, 16 * (arrow + 1)); arduboy.print(F(">"));
|
||
for (uint8_t i = 0; i < 3; i++) {
|
||
uint8_t drawnumber = selected + i - arrow;
|
||
if (drawnumber < NumberOfTips) {
|
||
arduboy.setCursor(12, 16 * (i + 1)); arduboy.print(TipName[selected + i - arrow]);
|
||
}
|
||
}
|
||
CheckLastButton();
|
||
arduboy.display();
|
||
} while (digitalRead(BUTTON_PIN) || lastbutton);
|
||
|
||
beep();
|
||
CurrentTip = selected;
|
||
}
|
||
|
||
//温度校准界面
|
||
// temperature calibration screen
|
||
void CalibrationScreen() {
|
||
uint16_t CalTempNew[4];
|
||
for (uint8_t CalStep = 0; CalStep < 3; CalStep++) {
|
||
SetTemp = CalTemp[CurrentTip][CalStep];
|
||
setRotary(100, 500, 1, SetTemp);
|
||
beepIfWorky = true;
|
||
lastbutton = (!digitalRead(BUTTON_PIN));
|
||
do {
|
||
arduboy.clear();
|
||
arduboy.setTextSize(2);
|
||
SENSORCheck(); // reads temperature and vibration switch of the iron
|
||
Thermostat(); // heater control
|
||
arduboy.setCursor(0, 0); arduboy.print(F("Step: ")); arduboy.print(CalStep + 1); arduboy.print("/3");
|
||
if (isWorky) {
|
||
arduboy.setCursor(0, 16); arduboy.print(F("Set measured"));
|
||
arduboy.setCursor(0, 32); arduboy.print(F("temp: ")); arduboy.print(getRotary());
|
||
} else {
|
||
arduboy.setCursor(0, 16); arduboy.print(F("ADC: ")); arduboy.print(uint16_t(RawTemp));
|
||
arduboy.setCursor(0, 32); arduboy.print(F("Please wait"));
|
||
}
|
||
CheckLastButton();
|
||
arduboy.display();
|
||
} while (digitalRead(BUTTON_PIN) || lastbutton);
|
||
|
||
CalTempNew[CalStep] = getRotary();
|
||
beep(); delay (10);
|
||
}
|
||
|
||
analogWrite(CONTROL_PIN, 255); // shut off heater
|
||
delayMicroseconds(time2settle); // wait for voltage to settle
|
||
CalTempNew[3] = getChipTemp(); // read chip temperature
|
||
if ((CalTempNew[0] + 30 < CalTempNew[1]) && (CalTempNew[1] + 30 < CalTempNew[2])) {
|
||
MenuLevel = 7;
|
||
if (MenuScreen(0)) {
|
||
for (uint8_t i = 0; i < 4; i++) CalTemp[CurrentTip][i] = CalTempNew[i];
|
||
}
|
||
}
|
||
}
|
||
|
||
//命名界面 文本输入界面
|
||
// input tip name screen
|
||
void InputNameScreen() {
|
||
uint8_t value;
|
||
for (uint8_t digit = 0; digit < (TIPNAMELENGTH - 1); digit++) {
|
||
lastbutton = (!digitalRead(BUTTON_PIN));
|
||
setRotary(31, 96, 1, 65);
|
||
do {
|
||
value = getRotary();
|
||
if (value == 31) {
|
||
value = 95;
|
||
setRotary(31, 96, 1, 95);
|
||
}
|
||
if (value == 96) {
|
||
value = 32;
|
||
setRotary(31, 96, 1, 32);
|
||
}
|
||
//arduboy.setCursor(0, 0);arduboy.print();
|
||
arduboy.clear();
|
||
arduboy.setTextSize(2);
|
||
arduboy.setCursor(16 * digit, 48); arduboy.print(char(94));
|
||
arduboy.setCursor(0, 32);
|
||
for (uint8_t i = 0; i < digit; i++) arduboy.print(TipName[CurrentTip][i]);
|
||
arduboy.setCursor(16 * digit, 32); arduboy.print(char(value));
|
||
CheckLastButton();
|
||
arduboy.display();
|
||
} while (digitalRead(BUTTON_PIN) || lastbutton);
|
||
TipName[CurrentTip][digit] = value;
|
||
beep(); delay (10);
|
||
}
|
||
TipName[CurrentTip][TIPNAMELENGTH - 1] = 0;
|
||
return value;
|
||
}
|
||
|
||
|
||
// delete tip screen
|
||
void DeleteTipScreen() {
|
||
MenuLevel = 7;
|
||
if (NumberOfTips == 1) {
|
||
//MessageScreen(DeleteMessage, sizeof(DeleteMessage));
|
||
}
|
||
else if (MenuScreen(0)) {
|
||
if (CurrentTip == (NumberOfTips - 1)) {
|
||
CurrentTip--;
|
||
}
|
||
else {
|
||
for (uint8_t i = CurrentTip; i < (NumberOfTips - 1); i++) {
|
||
for (uint8_t j = 0; j < TIPNAMELENGTH; j++) TipName[i][j] = TipName[i + 1][j];
|
||
for (uint8_t j = 0; j < 4; j++) CalTemp[i][j] = CalTemp[i + 1][j];
|
||
}
|
||
}
|
||
NumberOfTips--;
|
||
}
|
||
}
|
||
|
||
|
||
// add new tip screen
|
||
void AddTipScreen() {
|
||
if (NumberOfTips < TIPMAX) {
|
||
CurrentTip = NumberOfTips++; InputNameScreen();
|
||
CalTemp[CurrentTip][0] = TEMP200; CalTemp[CurrentTip][1] = TEMP280;
|
||
CalTemp[CurrentTip][2] = TEMP360; CalTemp[CurrentTip][3] = TEMPCHP;
|
||
} //MessageScreen(MaxTipMessage, sizeof(MaxTipMessage)); 信息窗
|
||
}
|
||
|
||
|
||
// average several ADC readings in sleep mode to denoise
|
||
uint16_t denoiseAnalog (byte port) {
|
||
uint16_t result = 0;
|
||
ADCSRA |= bit (ADEN) | bit (ADIF); // enable ADC, turn off any pending interrupt
|
||
if (port >= A0) port -= A0; // set port and
|
||
ADMUX = (0x0F & port) | bit(REFS0); // reference to AVcc
|
||
set_sleep_mode (SLEEP_MODE_ADC); // sleep during sample for noise reduction
|
||
for (uint8_t i = 0; i < 32; i++) { // get 32 readings
|
||
sleep_mode(); // go to sleep while taking ADC sample
|
||
while (bitRead(ADCSRA, ADSC)); // make sure sampling is completed
|
||
result += ADC; // add them up
|
||
}
|
||
bitClear (ADCSRA, ADEN); // disable ADC
|
||
return (result >> 5); // devide by 32 and return value
|
||
}
|
||
|
||
|
||
// get internal temperature by reading ADC channel 8 against 1.1V reference
|
||
double getChipTemp() {
|
||
uint16_t result = 0;
|
||
ADCSRA |= bit (ADEN) | bit (ADIF); // enable ADC, turn off any pending interrupt
|
||
ADMUX = bit (REFS1) | bit (REFS0) | bit (MUX3); // set reference and mux
|
||
delay(20); // wait for voltages to settle
|
||
set_sleep_mode (SLEEP_MODE_ADC); // sleep during sample for noise reduction
|
||
for (uint8_t i = 0; i < 32; i++) { // get 32 readings
|
||
sleep_mode(); // go to sleep while taking ADC sample
|
||
while (bitRead(ADCSRA, ADSC)); // make sure sampling is completed
|
||
result += ADC; // add them up
|
||
}
|
||
bitClear (ADCSRA, ADEN); // disable ADC
|
||
result >>= 2; // devide by 4
|
||
return ((result - 2594) / 9.76); // calculate internal temperature in degrees C
|
||
}
|
||
|
||
|
||
// get input voltage in mV by reading 1.1V reference against AVcc
|
||
uint16_t getVCC() {
|
||
uint16_t result = 0;
|
||
ADCSRA |= bit (ADEN) | bit (ADIF); // enable ADC, turn off any pending interrupt
|
||
// set Vcc measurement against 1.1V reference
|
||
ADMUX = bit (REFS0) | bit (MUX3) | bit (MUX2) | bit (MUX1);
|
||
delay(1); // wait for voltages to settle
|
||
set_sleep_mode (SLEEP_MODE_ADC); // sleep during sample for noise reduction
|
||
for (uint8_t i = 0; i < 16; i++) { // get 16 readings
|
||
sleep_mode(); // go to sleep while taking ADC sample
|
||
while (bitRead(ADCSRA, ADSC)); // make sure sampling is completed
|
||
result += ADC; // add them up
|
||
}
|
||
bitClear (ADCSRA, ADEN); // disable ADC
|
||
result >>= 4; // devide by 16
|
||
return (1125300L / result); // 1125300 = 1.1 * 1023 * 1000
|
||
}
|
||
|
||
|
||
// get supply voltage in mV
|
||
uint16_t getVIN() {
|
||
long result;
|
||
result = denoiseAnalog (VIN_PIN); // read supply voltage via voltage divider
|
||
return (result * Vcc / 179.474); // 179.474 = 1023 * R13 / (R12 + R13)
|
||
}
|
||
|
||
//ADC中断服务
|
||
// ADC interrupt service routine
|
||
EMPTY_INTERRUPT (ADC_vect); // nothing to be done here
|
||
|
||
//旋转编码器触发中断
|
||
// Pin change interrupt service routine for rotary encoder
|
||
ISR (PCINT0_vect) {
|
||
uint8_t a = PINB & 1;
|
||
uint8_t b = PIND >> 7 & 1;
|
||
if (a != a0) { // A changed
|
||
a0 = a;
|
||
if (b != b0) { // B changed
|
||
b0 = b;
|
||
count = constrain(count + ((a == b) ? countStep : -countStep), countMin, countMax);
|
||
if (ROTARY_TYPE && ((a == b) != ab0)) {
|
||
count = constrain(count + ((a == b) ? countStep : -countStep), countMin, countMax);;
|
||
}
|
||
ab0 = (a == b);
|
||
handleMoved = true;
|
||
}
|
||
}
|
||
}
|