diff --git a/flash.bat b/flash.bat new file mode 100644 index 0000000..49d8eaa --- /dev/null +++ b/flash.bat @@ -0,0 +1,9 @@ +@echo off +set AvrdudePath="D:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude" +set AvrConf="D:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf" +set HexPath="D:\文档\晶体管测试仪\TransistorTester.hex" +set eepPath="D:\文档\晶体管测试仪\TransistorTester.eep" +%AvrdudePath% -C %AvrConf% -v -V -patmega328p -cstk500v1 -PCOM11 -b19200 -Uflash:w:%HexPath%:i -Ueep:w:%eepPath%:i + + +pause \ No newline at end of file diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/.vscode/arduino.json b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/.vscode/arduino.json new file mode 100644 index 0000000..dee23d3 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/.vscode/arduino.json @@ -0,0 +1,6 @@ +{ + "board": "arduino:avr:uno", + "programmer": "Arduino as ISP", + "port": "COM3", + "sketch": "1.8t6.ino" +} \ No newline at end of file diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/.vscode/c_cpp_properties.json b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..42a0f21 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/.vscode/c_cpp_properties.json @@ -0,0 +1,25 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "D:/Program Files (x86)/Arduino/libraries", + "D:/Program Files (x86)/Arduino/hardware/arduino/avr/**", + "D:/Program Files (x86)/Arduino/hardware/tools/avr/avr/include", + "D:/Program Files (x86)/Arduino/hardware/tools/avr/lib/gcc/avr/7.3.0/include", + "D:/Program Files (x86)/Arduino/hardware/tools/avr/lib/gcc/avr/7.3.0/include-fixed", + "D:/Program Files (x86)/Arduino/tools/**", + "D:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\**", + "D:\\Program Files (x86)\\Arduino\\tools\\**" + ], + "forcedInclude": [ + "D:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino\\Arduino.h" + ], + "intelliSenseMode": "msvc-x64", + "compilerPath": "D:\\mingw64\\bin\\gcc.exe", + "cStandard": "gnu17", + "cppStandard": "gnu++14" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/.vscode/launch.json b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/.vscode/launch.json new file mode 100644 index 0000000..f2c6fe4 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/.vscode/launch.json @@ -0,0 +1,29 @@ +{ + // 浣跨敤 IntelliSense 浜嗚В鐩稿叧灞炴с + // 鎮仠浠ユ煡鐪嬬幇鏈夊睘鎬х殑鎻忚堪銆 + // 娆蹭簡瑙f洿澶氫俊鎭紝璇疯闂: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "g++.exe - 鐢熸垚鍜岃皟璇曟椿鍔ㄦ枃浠", + "type": "cppdbg", + "request": "launch", + "program": "${fileDirname}\\${fileBasenameNoExtension}.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "D:\\mingw64\\bin\\gdb.exe", + "setupCommands": [ + { + "description": "涓 gdb 鍚敤鏁撮綈鎵撳嵃", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "preLaunchTask": "C/C++: g++.exe build active file" + } + ] +} \ No newline at end of file diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/.vscode/tasks.json b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/.vscode/tasks.json new file mode 100644 index 0000000..abb1243 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/.vscode/tasks.json @@ -0,0 +1,27 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: g++.exe build active file", + "command": "D:\\mingw64\\bin\\g++.exe", + "args": [ + "-g", + "${file}", + "-o", + "${fileDirname}\\${fileBasenameNoExtension}.exe" + ], + "options": { + "cwd": "D:\\mingw64\\bin" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Generated task by Debugger" + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/1.8t6.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/1.8t6.ino new file mode 100644 index 0000000..c0d2ca8 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/1.8t6.ino @@ -0,0 +1,328 @@ +/*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. +// 姝1.8t6鐗堟湰鍔熻兘绠浠 +// This 1.8t5 version of the code implements: +// - 鐑欓搧澶存俯搴﹀疄鏃剁洃娴 +// - Temperature measurement of the tip +// - PID娓╁害鎺у埗 +// - 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 +// - 鍦∣LED涓婂疄鐜颁俊鎭樉绀 +// - Information display on OLED +// - 鏀寔鏃犳簮铚傞福鍣 +// - Buzzer +// - 鍏佽璁剧疆涓嶅悓鐑欓搧澶寸殑娓╁害鏍″噯鍊 +// - Calibrating and managing different soldering tips +// - 璁剧疆琚繚瀛樺湪EEPROM锛屾帀鐢典笉涓㈠け +// - Storing user settings into the EEPROM +// - 鍏佽鐑彃鎷旂儥閾佸ご锛屽苟寮瑰嚭鐑欓搧澶撮厤缃夋嫨鑿滃崟 +// - Tip change detection +// - 鑺墖杩囩儹浠ュ強浣庣數鍘嬫姤璀 +// - Chip overheating and low voltage alarm +// - 鏇村ソ鐨勫疄鏃舵俯搴︽潯浠ュ強瀹炴椂鍔熺巼鏉 +// - Better real-time temperature bar and real-time power bar +// - 鎷ユ湁杩囨浮鍔ㄧ敾 +// - Have transition animation +// - 鍐呯疆灞忓箷淇濇姢绋嬪簭 +// - Built in screen saver +// - 灞忓箷缈昏浆璁剧疆 +// - Screen flip settings +// - 鍐呯疆鑻辨枃銆佷腑鏂囥佹棩鏂囪瑷鍖 +// - Built in English, Chinese and Japanese language pack +// - 寮鏈哄瘑鐮佽缃 +// - System Password +// - 鍏佽璁剧疆鏃嬮挳鏂瑰悜 +// - Knob direction setting menu +// - 鍐呭祵鐪嬮棬鐙楋紝瀹曟満鑷姩閲嶅惎 +// - Watchdog timer automatic reset the MCU + +// 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 銆乴ihaoyun6 +// Project Page: https://easyeda.com/wagiminator + + +bool lastbutton; +#include //娉ㄦ剰 杩欓噷浣跨敤琚槈鍓茬殑鍥惧舰搴擄紝鍙湁缁樺浘鍔熻兘锛屽苟闈為氱敤鐨勭増鏈 +Arduboy2 arduboy; + +#include +#include +#include +// Firmware version +#define VERSION "v1.8t6" + +// 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 100 // 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 TEMPCHP 30 // chip temperature while calibration +#define TIPMAX 2 // max number of tips +#define TIPNAMELENGTH 6 // max length of tip names (including termination) +#define TIPNAME "SZtip" // 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 false // enable/disable buzzer +#define MAINSCREEN 1 // type of main screen (0: big numbers; 1: more infos) + +// EEPROM identifier +#define EEPROM_IDENT 0x140B // to identify if EEPROM was written by this program + +//Beep +#define SetBeepCoolTime 200 +unsigned long BeepCoolTime; + +// 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; + +//娓╁害鎷熷悎 +#define TempP1 10.2675914764 +#define TempP2 1.7323191166 +#define TempP3 -0.0033245713 +#define TempP4 0.0000045338 +float PTemp[TIPMAX][4] = {TempP1, TempP2, TempP3, TempP4}; //娓╁害鎷熷悎绯绘暟 +const uint16_t CalTemp[9] = {50,100,150,200,250,300,350,400,450}; +char TipName[TIPMAX][TIPNAMELENGTH] = {TIPNAME}; +uint8_t CurrentTip = 0; +uint8_t NumberOfTips = 1; + +// 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; +//娆犲帇鎶ヨ +byte UnderVoltage = 0; +// Control variables +uint16_t Time2settle = 300; + +//妯℃嫙鏁板瓧婊氳疆 Numerical scrolling effect +int Value; +int LastValue[3]; +int SlidingAnimationY[3]; + +//寮鏈哄瘑鐮 BootPassword +int Password = 0; + +//灞忓箷淇濇姢-涓婚锛氬瘑闆嗚繍绠 +byte Line[4]; + +//缂栫爜鍣ㄦ棆杞皟鏁存柟鍚戣瀹 +bool RotaryD = false; + +//寮鏈洪潪绾挎у姩鐢 +byte BootAnimationY=64; + +// Specify the links and initial PID tuning parameters +PID ctrl(&Input, &Output, &Setpoint, aggKp, aggKi, aggKd, REVERSE); + +//NMOS - PMOS杞欢鍒囨崲 +#define UsePMOS false + +//LANG 璇█鏀寔 +/* 0 - 涓枃 CHINESE + 1 - 鑻辨枃 ENGLISH + 2 - 鏃ヨ x (姝ょ増鏈笉鏀寔) +*/ +byte LANG = 0; + + + +void setup() { + //璁剧疆鐪嬮棬鐙楄嚜鍔ㄥ浣 + set_wdt_mod(3, 7); + + //鍚姩arduboy鍐呮牳 + arduboy.begin(); + arduboy.setFrameRate(30); + + //Serial.begin(115200); + + // set the pin modes + //璁剧疆IO + 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); +#if UsePMOS + analogWrite(CONTROL_PIN, 0); +#else + analogWrite(CONTROL_PIN, 255); // this shuts off the heater +#endif + digitalWrite(BUZZER_PIN, LOW); // must be LOW when buzzer not in use + + //鍒濆鍖朅DC + //setup ADC + ADCSRA |= bit (ADPS0) | bit (ADPS1) | bit (ADPS2); // set ADC prescaler to 128 + ADCSRA |= bit (ADIE); // enable ADC interrupt + interrupts (); // enable global interrupts + + //鍒濆鍖栫紪鐮佸櫒IO + // 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 + + //浠嶦EPROM璇诲彇璁剧疆 + // get default values from EEPROM + getEEPROM(); + + //璁剧疆灞忓箷鍙嶈浆鐘舵 + Flip(FlipState); + + //璁剧疆灞忓箷浜害 + SetOLEDLightLevel(32); //闄嶄綆灞忓箷浜害 寤堕暱OLED浣跨敤瀵垮懡 + + //鍒濆鍖栧睆骞曚繚鎶ゅ姩鐢 + for (byte a = 0; a < 4; a++) Line[a] = 32 * a; + + //瀵嗙爜淇濇姢 + BootPassword(); + // 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 UsePMOS + if ((CurrentTemp + 20) < DefaultTemp) analogWrite(CONTROL_PIN, 255); +#else + if ((CurrentTemp + 20) < DefaultTemp) analogWrite(CONTROL_PIN, 0); +#endif + // 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(); + ShowVersion(); +} + +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(0); // heater control + MainScreen(); // updates the main page on the OLED + //beep(0); +} diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/A-BitMap.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/A-BitMap.ino new file mode 100644 index 0000000..e968b8b --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/A-BitMap.ino @@ -0,0 +1,85 @@ + +//鍏充簬鐣岄潰-椤圭洰椤甸潰浜岀淮鐮 ->涓轰簡鍔犲叆娆犲帇鎶ヨ鍙兘闃夊壊鎺夊叧浜庨〉闈㈢殑浜岀淮鐮 +//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 }; +const unsigned char QRCode[] PROGMEM = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x03, 0x86, 0x70, 0x80, 0x03, 0x80, 0x03, 0x86, 0x70, 0x80, 0x03, 0x9f, 0xf3, 0xe1, 0x30, 0x9f, 0xf3, 0x9f, 0xf3, 0xe1, 0x30, 0x9f, 0xf3, 0x98, 0x33, 0x01, 0xcc, 0x98, 0x33, 0x98, 0x33, 0x01, 0xcc, 0x98, 0x33, 0x98, 0x33, 0x87, 0xc0, 0x98, 0x33, 0x98, 0x33, 0xe1, 0xc0, 0x98, 0x33, 0x98, 0x33, 0xe1, 0xc0, 0x98, 0x33, 0x9f, 0xf3, 0x98, 0xc0, 0x9f, 0xf3, 0x9f, 0xf3, 0x98, 0xc0, 0x9f, 0xf3, 0x80, 0x03, 0x66, 0xcc, 0x80, 0x03, 0x80, 0x03, 0x66, 0xcc, 0x80, 0x03, 0xff, 0xff, 0x01, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x1f, 0xff, 0x81, 0x00, 0x61, 0x30, 0x1f, 0x3f, 0x87, 0x3c, 0xe6, 0xfc, 0x87, 0x33, 0x87, 0x3c, 0xe6, 0xfc, 0x87, 0xf3, 0xf8, 0x03, 0x9e, 0x0f, 0x1f, 0x03, 0xf8, 0x03, 0x9e, 0x0f, 0x1f, 0x03, 0xe1, 0x3c, 0xfe, 0x0c, 0x07, 0xcf, 0xe1, 0x3c, 0xfe, 0x0c, 0x07, 0xcf, 0x99, 0x03, 0x3e, 0x30, 0x86, 0xc3, 0xe6, 0xcf, 0x38, 0x0f, 0x9e, 0xf3, 0xe6, 0xcf, 0x38, 0x0f, 0x9e, 0xf3, 0x9e, 0x03, 0x27, 0xcc, 0x81, 0x03, 0x9e, 0x03, 0x27, 0xcc, 0x81, 0x03, 0xe0, 0xff, 0xe1, 0x0c, 0xe6, 0xcf, 0xe0, 0xff, 0xe1, 0x0c, 0xe6, 0xcf, 0x98, 0x03, 0x06, 0x00, 0x00, 0xff, 0x98, 0x03, 0x06, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1e, 0xf0, 0xf8, 0x03, 0x80, 0x03, 0x66, 0x30, 0x99, 0xc3, 0x80, 0x03, 0x66, 0x30, 0x99, 0xc3, 0x9f, 0xf3, 0x01, 0x0c, 0xf8, 0xff, 0x9f, 0xf3, 0x01, 0x0c, 0xf8, 0xff, 0x98, 0x33, 0x39, 0x3c, 0x01, 0xcf, 0x98, 0x33, 0x39, 0x3c, 0x01, 0xcf, 0x98, 0x33, 0xff, 0x0c, 0x79, 0x3f, 0x98, 0x33, 0x3e, 0xcc, 0xe0, 0xf3, 0x98, 0x33, 0x3e, 0xcc, 0xe0, 0xf3, 0x9f, 0xf3, 0x3e, 0x00, 0x98, 0xcf, 0x9f, 0xf3, 0x3e, 0x00, 0x98, 0xcf, 0x80, 0x03, 0x3e, 0x30, 0xe7, 0xc3, 0x80, 0x03, 0x3e, 0x30, 0xe7, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; +//ICO +//width:16,height:16 +const unsigned char Tag[] PROGMEM = { 0x00, 0x00, 0x3b, 0xec, 0x7b, 0xee, 0x63, 0xe6, 0x63, 0xe6, 0x63, 0xe6, 0x63, 0xe6, 0x63, 0xe6, 0x63, 0xe6, 0x63, 0x66, 0x62, 0x26, 0x60, 0x06, 0x60, 0x06, 0x7f, 0xfe, 0x3f, 0xfc, 0x00, 0x00 }; +const unsigned char Chip[] PROGMEM = { 0x14, 0xa0, 0x3f, 0xf0, 0x7f, 0xf8, 0xe0, 0x1c, 0x6e, 0x18, 0xec, 0x1c, 0x68, 0x18, 0x60, 0x18, 0xe0, 0x1c, 0x60, 0x58, 0xe0, 0x1c, 0x7f, 0xf8, 0x3f, 0xf0, 0x14, 0xa0 }; +//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 = { 0x0f, 0xe0, 0x1f, 0xc0, 0x1f, 0xc0, 0x3f, 0x80, 0x3f, 0xf8, 0x7f, 0xf0, 0x7f, 0xe0, 0x07, 0xc0, 0x07, 0x80, 0x0f, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x10, 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:14,height:14 鍥炬爣搴 + +const unsigned char c1[] PROGMEM = { 0x03, 0x00, 0x07, 0x80, 0x0f, 0xc0, 0x0c, 0xc0, 0x1c, 0xe0, 0x1c, 0xe0, 0x3c, 0xf0, 0x3c, 0xf0, 0x7f, 0xf8, 0x7f, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xff, 0xfc, 0x7f, 0xf8 }; +const unsigned char c2[] PROGMEM = { 0x7f, 0xf8, 0xff, 0xfc, 0xc0, 0x0c, 0xc3, 0x0c, 0xcb, 0x4c, 0xdb, 0x6c, 0xdb, 0x6c, 0xd8, 0x6c, 0xdc, 0xec, 0xcf, 0xcc, 0xc7, 0x8c, 0xc0, 0x0c, 0xff, 0xfc, 0x7f, 0xf8 }; +const unsigned char c3[] PROGMEM = { 0x00, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x18, 0xf8, 0x38, 0xf0, 0x30, 0x30, 0x70, 0x60, 0x70, 0x78, 0x78, 0xf8, 0x78, 0x00, 0x3c, 0x02, 0x3f, 0x0c, 0x1f, 0xf8, 0x0f, 0xf0, 0x03, 0xc0, 0x00, 0x00 }; +const unsigned char c5[] PROGMEM = { 0x7f, 0xf0, 0xff, 0xe0, 0xc0, 0x08, 0xc0, 0x1c, 0xc0, 0x38, 0xc8, 0x70, 0xdc, 0xe4, 0xcf, 0xcc, 0xc7, 0x8c, 0xc3, 0x0c, 0xc0, 0x0c, 0xc0, 0x0c, 0xff, 0xfc, 0x7f, 0xf8 }; +const unsigned char c6[] PROGMEM = { 0x1e, 0x10, 0x33, 0x38, 0x2d, 0x7c, 0x25, 0x38, 0x2d, 0x38, 0x25, 0x38, 0x2d, 0x38, 0x6d, 0x80, 0xde, 0xc0, 0xbf, 0x40, 0xbf, 0x40, 0xde, 0xc0, 0x61, 0x80, 0x3f, 0x00 }; +const unsigned char c7[] PROGMEM = { 0x1f, 0xe0, 0x3f, 0xf0, 0x70, 0x38, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0xff, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xf8, 0x7c, 0xf8, 0x7c, 0xfc, 0xfc, 0x7f, 0xf8 }; +const unsigned char c_NO[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x37, 0xb0, 0x23, 0x10, 0x30, 0x30, 0x38, 0x70, 0x38, 0x70, 0x30, 0x30, 0x23, 0x10, 0x37, 0xb0, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char *C_table[] = {c1, c2, c3, Lightning, c5, c6, c7}; + +//璁剧疆锛堣瑷鏄竴绉嶄綆鍍忕礌鐨勮〃杈炬柟寮,瀹规槗閫犳垚闅旈槀; 浜や簰鐣岄潰璁捐灏藉彲鑳藉舰璞″寲锛 +// width: 14, height: 14 +const unsigned char QRC[] PROGMEM = { 0x05, 0x80, 0x74, 0xb8, 0x57, 0xa8, 0x76, 0xb8, 0x05, 0x80, 0xf9, 0x7c, 0x46, 0x94, 0xaa, 0xa8, 0xf9, 0x7c, 0x06, 0x88, 0x74, 0xa8, 0x57, 0x8c, 0x75, 0x74, 0x06, 0x98 }; +const unsigned char Set0[] PROGMEM = { 0x88, 0x24, 0x08, 0x20, 0x38, 0x30, 0x38, 0x30, 0x38, 0x30, 0x38, 0x30, 0x38, 0x30, 0x38, 0x30, 0x39, 0x30, 0x3b, 0xb0, 0x3f, 0xf0, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set1[] PROGMEM = { 0xf8, 0x7c, 0xf3, 0x3c, 0xf4, 0xbc, 0xf6, 0xbc, 0xf4, 0xbc, 0xf6, 0xbc, 0xf4, 0xbc, 0xe4, 0x9c, 0xc8, 0x4c, 0xd0, 0x2c, 0xd0, 0x2c, 0xc8, 0x4c, 0xe7, 0x9c, 0xf0, 0x3c }; +const unsigned char Set2[] PROGMEM = { 0x8f, 0xc4, 0x10, 0x20, 0x20, 0x10, 0x4c, 0xc8, 0x9f, 0xe4, 0x3d, 0xf0, 0x3d, 0xf0, 0x1d, 0xe0, 0x3e, 0xf0, 0x3f, 0x70, 0x9f, 0xe4, 0x8c, 0xc4, 0x00, 0x00, 0x30, 0x30 }; +const unsigned char Set3[] PROGMEM = { 0xc3, 0xfc, 0x18, 0x00, 0x18, 0x00, 0xc3, 0xfc, 0xff, 0xfc, 0xff, 0x0c, 0x00, 0x60, 0x00, 0x60, 0xff, 0x0c, 0xff, 0xfc, 0xf0, 0xfc, 0x06, 0x00, 0x06, 0x00, 0xf0, 0xfc }; +const unsigned char Set4[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set4F[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x38, 0x30, 0x33, 0x10, 0x3f, 0x90, 0x38, 0x10, 0x33, 0x90, 0x27, 0x90, 0x26, 0x10, 0x30, 0x90, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set4FF[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x24, 0x30, 0x21, 0x90, 0x27, 0x90, 0x27, 0x30, 0x20, 0x70, 0x27, 0xf0, 0x23, 0x30, 0x30, 0x70, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set5[] PROGMEM = { 0xfc, 0xfc, 0xf8, 0x7c, 0xe0, 0x1c, 0xc0, 0x0c, 0xc0, 0x0c, 0xc0, 0x0c, 0xc0, 0x0c, 0xc0, 0x0c, 0xc0, 0x0c, 0x80, 0x04, 0x80, 0x04, 0xff, 0xfc, 0xf8, 0x7c, 0xfc, 0xfc }; +const unsigned char Set5_1[] PROGMEM = { 0xfc, 0xf4, 0xf8, 0x60, 0xe0, 0x44, 0xc0, 0x8c, 0xc1, 0x1c, 0xc2, 0x2c, 0xc4, 0x4c, 0xc8, 0x8c, 0xd1, 0x0c, 0xa2, 0x04, 0xc4, 0x04, 0x8f, 0xfc, 0x18, 0x7c, 0xbc, 0xfc }; +const unsigned char Set6[] PROGMEM = { 0xf8,0x7c,0xc0,0x0c,0xc0,0x0c,0xcf,0xcc,0xcf,0xcc,0xcf,0xcc,0xcf,0xcc,0xcf,0xcc,0xcf,0xcc,0xc8,0x4c,0xc8,0x4c,0xcf,0xcc,0xc0,0x0c,0xc0,0x0c }; +const unsigned char Set_LANG[] PROGMEM = { 0xf0, 0x3c, 0xce, 0x4c, 0xbc, 0x34, 0xb8, 0x14, 0x18, 0x80, 0x10, 0x80, 0x42, 0x30, 0x60, 0x78, 0x60, 0xf8, 0x44, 0xc0, 0x80, 0x04, 0xb8, 0x84, 0xcf, 0xcc, 0xf0, 0x3c }; +const unsigned char Set7[] PROGMEM = { 0x80, 0x0c, 0x00, 0x1c, 0x3f, 0xf4, 0x3f, 0xe0, 0x3f, 0xc4, 0x37, 0x8c, 0x23, 0x18, 0x30, 0x30, 0x38, 0x70, 0x3c, 0xf0, 0x3f, 0xf0, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set11[] PROGMEM = { 0xf3, 0xfc, 0xe7, 0xfc, 0xce, 0x0c, 0x8e, 0x1c, 0x9f, 0x9c, 0x1f, 0x3c, 0x1f, 0x0c, 0x0e, 0x0c, 0x0f, 0xfc, 0x87, 0xf8, 0x81, 0xe4, 0xc0, 0x0c, 0xe0, 0x1c, 0xf8, 0x7c }; +const unsigned char Set8[] PROGMEM = { 0x81, 0xdc, 0x55, 0x9c, 0x29, 0x04, 0x55, 0x00, 0x29, 0x90, 0x55, 0xd0, 0x03, 0xfc, 0xff, 0x00, 0x2e, 0x00, 0x26, 0x70, 0x02, 0x50, 0x82, 0x70, 0xe6, 0x00, 0xee, 0x04 }; +const unsigned char Set9[] PROGMEM = { 0xf0, 0x3c, 0xce, 0x0c, 0xbf, 0x04, 0xb3, 0x04, 0x73, 0x00, 0x7f, 0x00, 0x7e, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x60, 0xbc, 0x64, 0xbe, 0x04, 0xcf, 0x0c, 0xf0, 0x3c }; +const unsigned char Set10[] PROGMEM = { 0xf8, 0x7c, 0xf7, 0xbc, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 0xbf, 0xf4, 0xab, 0x54, 0xab, 0x54, 0xab, 0x54, 0xab, 0x54, 0xab, 0x54, 0xab, 0x54, 0xbf, 0xf4, 0xc0, 0x0c }; +const unsigned char Set13[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x3c, 0xf0, 0x34, 0xb0, 0x24, 0x90, 0x24, 0x90, 0x27, 0x90, 0x23, 0x10, 0x30, 0x30, 0x38, 0x70, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set12[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x3c, 0xf0, 0x3c, 0xf0, 0x3c, 0xf0, 0x20, 0x10, 0x20, 0x10, 0x3c, 0xf0, 0x3c, 0xf0, 0x3c, 0xf0, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set14[] PROGMEM = { 0xff, 0x7c, 0xfe, 0x7c, 0xfc, 0xec, 0xe8, 0xdc, 0xc8, 0x4c, 0x98, 0x4c, 0x88, 0x24, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0xe0, 0x1c }; +const unsigned char Set15[] PROGMEM = { 0x15, 0x54, 0x3f, 0xfc, 0x15, 0x54, 0x3f, 0xfc, 0x15, 0x54, 0x3c, 0x04, 0x14, 0x04, 0x3c, 0xfc, 0x14, 0x54, 0x3c, 0xfc, 0x00, 0x54, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00 }; +const unsigned char Set16[] PROGMEM = { 0x15, 0x54, 0x3f, 0xf8, 0x15, 0x50, 0x3f, 0xf0, 0x15, 0x50, 0x38, 0x70, 0x10, 0x20, 0x31, 0x04, 0x13, 0x8c, 0x22, 0xa8, 0x17, 0xfc, 0x2a, 0xa8, 0x00, 0x00, 0x00, 0x00 }; +const unsigned char Set17[] PROGMEM = { 0x80, 0x00, 0xbf, 0xf8, 0x1f, 0xf8, 0xb0, 0x08, 0x18, 0x08, 0xb9, 0xe8, 0x19, 0xb8, 0xb8, 0x38, 0x18, 0x38, 0xb9, 0xb8, 0xb9, 0xf8, 0xb0, 0xf8, 0xbf, 0xf8, 0x80, 0x00 }; +const unsigned char Set18[] PROGMEM = { 0x80, 0x00, 0xbf, 0xf8, 0x1f, 0xf8, 0xb0, 0x28, 0x1f, 0xf8, 0xb4, 0x08, 0x1f, 0xf8, 0xb1, 0x08, 0x1f, 0xf8, 0xb0, 0x48, 0xbf, 0xf8, 0xb2, 0x88, 0xbf, 0xf8, 0x80, 0x00 }; +const unsigned char Lang_CN[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x3c, 0xf0, 0x3c, 0xf0, 0x20, 0x10, 0x24, 0x90, 0x24, 0x90, 0x20, 0x10, 0x3c, 0xf0, 0x3c, 0xf0, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Lang_EN[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x38, 0x70, 0x30, 0x30, 0x23, 0x10, 0x27, 0x90, 0x20, 0x10, 0x20, 0x10, 0x27, 0x90, 0x27, 0x90, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Lang_JP[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x3d, 0xf0, 0x20, 0x10, 0x3b, 0xf0, 0x3b, 0x70, 0x30, 0x30, 0x2b, 0x50, 0x2a, 0xd0, 0x31, 0xb0, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Save[] PROGMEM = { 0x00, 0x04, 0x58, 0x08, 0x58, 0x08, 0x58, 0x08, 0x40, 0x08, 0x7f, 0xf8, 0x60, 0x18, 0x5f, 0xe8, 0x5b, 0x68, 0x5f, 0xe8, 0x5b, 0x68, 0x1c, 0xe8, 0x5f, 0xe8, 0x00, 0x00 }; +const unsigned char Lock[] PROGMEM = { 0xe0, 0x1c, 0xc0, 0x0c, 0x8f, 0xc4, 0x9f, 0xe4, 0x9f, 0xe4, 0x9f, 0xe4, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x07, 0x80, 0x07, 0x80, 0x03, 0x00, 0x80, 0x04 }; +const unsigned char Set19[] PROGMEM = { 0xf8, 0x7c, 0x80, 0x04, 0xbc, 0xf4, 0x3f, 0xf0, 0x38, 0x70, 0xb7, 0xb4, 0xb6, 0xb4, 0xb5, 0xb4, 0xb7, 0xb4, 0x38, 0x70, 0x3f, 0xf0, 0xbc, 0xf4, 0x80, 0x04, 0xf8, 0x7c }; +#if LANG_JP_State +const unsigned char *Ico_table[] = { + Set0, Set1, Set2, Set3, Set4, Set5, Set19, Set6, Lock, Set_LANG, QRC, 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, Set7, + Lang_CN, Lang_EN, Lang_JP, //8 + Set4, Set4F, Save, +}; +#else +const unsigned char *Ico_table[] = { + Set0, Set1, Set2, Set3, Set4, Set5, Set19, Set6, Lock, Set_LANG, QRC, 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, Set7, + Lang_CN, Lang_EN,c_NO, //8 + Set4, Set4F, Save, +}; +#endif +const byte Menu_table[] = {12, 6, 4, 4, 2, 2, 2, 2, 3, 3}; //鑿滃崟 鏍囩 娓╂帶 瀹氭椂 鎺у埗鏂瑰紡 棣栭〉 铚傞福鍣 鏍囩鍒犻櫎纭鐣岄潰 璇█鑿滃崟 缈昏浆 鏄剧ず +byte MenuLevel = 0; //鑿滃崟灞傜骇 diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/B-Lang.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/B-Lang.ino new file mode 100644 index 0000000..02734b8 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/B-Lang.ino @@ -0,0 +1,824 @@ +#define LANG_JP_State false +/*//////////////////////////////////////////////////////////////////////////////////////////////////// + 澶氳瑷鏀寔 + Multilingual support + /////////////////////////////////////////////////////////////////////////////////////////////////// +*/ +/* + 鑻辫搴 ENGLISH +*/ +const char EN_0[] PROGMEM = "Tip"; +const char EN_1[] PROGMEM = "Temp"; +const char EN_2[] PROGMEM = "Timer"; +const char EN_3[] PROGMEM = "Control"; +const char EN_4[] PROGMEM = "Screen"; +const char EN_5[] PROGMEM = "Buzzer"; +const char EN_6[] PROGMEM = "LOW Vol"; +const char EN_7[] PROGMEM = "Lang"; +const char EN_8[] PROGMEM = "Return"; +const char EN_9[] PROGMEM = "Change"; +const char EN_10[] PROGMEM = "Calibrate"; +const char EN_11[] PROGMEM = "Rename"; +const char EN_12[] PROGMEM = "Delete"; +const char EN_13[] PROGMEM = "Add"; +const char EN_14[] PROGMEM = "Save"; +const char EN_15[] PROGMEM = "Default"; +const char EN_16[] PROGMEM = "Sleep"; +const char EN_17[] PROGMEM = "Boost"; +const char EN_18[] PROGMEM = "Save"; +const char EN_19[] PROGMEM = "Sleep"; +const char EN_20[] PROGMEM = "Off"; +const char EN_21[] PROGMEM = "Boost"; +const char EN_22[] PROGMEM = "Save"; +const char EN_23[] PROGMEM = "Direct"; +const char EN_24[] PROGMEM = "PID"; +const char EN_25[] PROGMEM = "Big"; +const char EN_26[] PROGMEM = "Infos"; +const char EN_27[] PROGMEM = "OFF"; +const char EN_28[] PROGMEM = "ON"; +const char EN_29[] PROGMEM = "NO"; +const char EN_30[] PROGMEM = "YES"; +const char EN_31[] PROGMEM = "CN"; +const char EN_32[] PROGMEM = "EN"; +const char EN_33[] PROGMEM = "NO"; +const char EN_34[] PROGMEM = "OK"; +const char EN_35[] PROGMEM = "Main Screen"; +const char EN_36[] PROGMEM = "Flip"; +const char EN_37[] PROGMEM = "Save"; +const char EN_38[] PROGMEM = "About"; +const char EN_39[] PROGMEM = "JP"; +const char EN_40[] PROGMEM = "Lock"; +const char EN_41[] PROGMEM = "Rotary"; + +const char *const EN_table[] PROGMEM = {EN_0, EN_1, EN_2, EN_3, EN_4, EN_5, EN_41, EN_6, EN_40, EN_7, EN_38, EN_8, EN_9, EN_10, EN_11, EN_12, EN_13, EN_14, EN_15, EN_16, EN_17, EN_18, EN_19, EN_20, EN_21, EN_22, EN_23, EN_24, EN_25, EN_26, EN_27, EN_28, EN_29, EN_30, EN_31, EN_32, EN_39, EN_35, EN_36, EN_37,}; + +/* + #!/usr/bin/python + # -*- coding: UTF-8 -*- + for num in range(0,38): + print("EN_",end="") + print(num,end='') + print(",",end="") +*/ + +/*//////////////////////////////////////////////////////////////////////////////////////////////////// + 澶氳瑷鏀寔 + Multilingual support + /////////////////////////////////////////////////////////////////////////////////////////////////// +*/ + +/* + 涓枃璇█搴 CHINESE + + //////////////////////////////////////////////////////////////////////////////////////////////////////// + 鏈湴鍖栨彁绀猴細浣犲彲浠ユ寜鐓т綅鍥剧殑澶у皬锛屾妸杩欓噷鐨勬枃瀛椾綅鍥炬浛鎹㈡垚浣犵殑璇█锛岀‘淇濅綅鍥惧垎杈ㄧ巼涓鑷村嵆鍙紝鎴戜滑娆㈣繋浣犳妸绋嬪簭缈昏瘧涓轰綘褰撳湴鐨勮瑷锛 + Localization tips: you can according to the size of the bitmap, + replace the text bitmap here with your language, + ensure that the bitmap resolution is consistent, + we welcome you to translate the program into your local language! + //////////////////////////////////////////////////////////////////////////////////////////////////////// +*/ +//width:28,height:14 涓荤晫闈腑鏂囨彁绀 +//Main Screen +//閿欒-ERROR +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 }; +//鍏虫満-OFF +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 }; +//浼戠湢-SLEEP +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 }; +//鎻愭俯-BOOST +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 }; +//姝e父宸ヤ綔-WORKY +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 }; +//鍔犵儹-HEAT +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 }; +//缁存寔-HOLD +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:36,height:16 +//MENU Oj +/* + The order here(鈫) can refer to EN_table(鈫戔啈鈫) +*/ +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, 0x00, 0x0f, 0xfe, 0x00, 0x01, 0x00, 0x08, 0x20, 0x00, 0x03, 0xff, 0x08, 0x20, 0x00, 0x02, 0x01, 0x08, 0x20, 0x00, 0x04, 0x22, 0x08, 0x20, 0x00, 0x08, 0x20, 0x0b, 0xfe, 0x00, 0x10, 0x20, 0x08, 0x20, 0x00, 0x00, 0x50, 0x08, 0x28, 0x00, 0x00, 0x50, 0x08, 0x24, 0x00, 0x00, 0x88, 0x08, 0x22, 0x00, 0x00, 0x88, 0x10, 0x20, 0x00, 0x01, 0x04, 0x10, 0x20, 0x00, 0x02, 0x03, 0xa7, 0xff, 0x00, 0x0c, 0x01, 0x00, 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 t_CN_JP[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x13, 0xfe, 0x00, 0x04, 0x02, 0x08, 0x40, 0x00, 0x04, 0x02, 0x08, 0x40, 0x00, 0x04, 0x02, 0x01, 0xfc, 0x00, 0x04, 0x02, 0x38, 0x84, 0x00, 0x04, 0x02, 0x08, 0x84, 0x00, 0x07, 0xfe, 0x0f, 0xff, 0x00, 0x04, 0x02, 0x08, 0x00, 0x00, 0x04, 0x02, 0x09, 0xfe, 0x00, 0x04, 0x02, 0x09, 0x02, 0x00, 0x04, 0x02, 0x0b, 0x02, 0x00, 0x04, 0x02, 0x0d, 0x02, 0x00, 0x07, 0xfe, 0x09, 0xfe, 0x00, 0x04, 0x02, 0x01, 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 tAbout[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x0f, 0xfe, 0x00, 0x00, 0x44, 0x00, 0x40, 0x00, 0x07, 0xff, 0x80, 0x40, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x10, 0x1f, 0xff, 0x80, 0x0f, 0xff, 0xc0, 0x40, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x28, 0x00, 0x40, 0x00, 0x00, 0x28, 0x00, 0x40, 0x00, 0x00, 0x44, 0x00, 0x40, 0x00, 0x00, 0x82, 0x00, 0x40, 0x00, 0x03, 0x01, 0xc1, 0x40, 0x00, 0x0c, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +const unsigned char tPassword[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1f, 0x7e, 0x00, 0x1f, 0xff, 0x84, 0x02, 0x00, 0x10, 0x80, 0x84, 0x42, 0x00, 0x0a, 0x4a, 0x04, 0x42, 0x00, 0x0a, 0x31, 0x08, 0x42, 0x00, 0x12, 0xc5, 0x0f, 0x42, 0x00, 0x03, 0x04, 0x19, 0x7f, 0x00, 0x1d, 0xf8, 0x29, 0x01, 0x00, 0x00, 0x40, 0x09, 0x01, 0x00, 0x08, 0x42, 0x09, 0xfd, 0x00, 0x08, 0x42, 0x09, 0x01, 0x00, 0x08, 0x42, 0x0f, 0x01, 0x00, 0x0f, 0xfe, 0x09, 0x05, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +const unsigned char t19[] PROGMEM = { 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x1f, 0x88, 0xfe, 0x00, 0x1f, 0xd0, 0x0e, 0x22, 0x00, 0x04, 0x20, 0x30, 0x22, 0x00, 0x04, 0x5f, 0x80, 0x22, 0x00, 0x07, 0x84, 0x9e, 0x22, 0x00, 0x04, 0x85, 0x08, 0x22, 0x00, 0x04, 0x94, 0x08, 0x22, 0x00, 0x04, 0x94, 0x28, 0xfe, 0x00, 0x04, 0x97, 0x1e, 0x42, 0x00, 0x04, 0x94, 0x08, 0x42, 0x00, 0x08, 0x94, 0x08, 0x42, 0x00, 0x0a, 0xac, 0x0a, 0x42, 0x00, 0x11, 0x44, 0x0c, 0x42, 0x00, 0x00, 0x83, 0x89, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +const unsigned char *CN_table[] = { + t0, t1, t2, t3, t4, t5, t19 , t7, tPassword, t6, tAbout, 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, t_CN_JP, //8 + t5_3, t4f, t_save, //9 +}; + +/* + 鏃ヨ Japanese +*/ +/* + 8x8 dot Japanese font for Arduboy + + Copyright (c) 2016 emutyworks + + Released under the MIT license + https://github.com/emutyworks/8x8DotJPFont/blob/master/LICENSE.txt +*/ + + +/* + 鍒╃敤銇椼仾銇勩儠銈┿兂銉堛儑銉笺偪銇儤銉冦儉銉曘偂銈ゃ儷銈掕銇胯炯銇俱仾銇勩倛銇嗐伀銇欍倠銇ㄣ儭銉€儶銇岀瘈绱勩仹銇嶃伨銇欍 + drawText() 瀹熻鏅傘伀銉曘偐銉炽儓銇岀劇銇勫牬鍚堛伅鍑︾悊銇屻偣銈儍銉椼仌銈屻伨銇欍 + + 渚) 8x8 dot 銇层倝銇屻仾銉汇偒銈裤偒銉娿兓瑷樺彿 銇伩鍒╃敤 + #include "misaki_font_f0.h" // 8x8 dot 銇层倝銇屻仾銉汇偒銈裤偒銉娿兓瑷樺彿 + //#include "misaki_font_f1.h" // 4x8 dot 鑻辫獮銉汇偒銈裤偒銉娿兓瑷樺彿 + //#include "misaki_font_f2.h" // 8x8 dot 婕㈠瓧 +*/ + +#if LANG_JP_State +#define MISAKI_FONT_H + +#define MISAKI_FONT_F0_PAGE 0xF0 +#define MISAKI_FONT_F1_PAGE 0xF1 +#define MISAKI_FONT_F2_PAGE 0xF2 + +#define MISAKI_FONT_F0_W 8 +#define MISAKI_FONT_F1_W 3 +#define MISAKI_FONT_F2_W 7 + +#define MISAKI_FONT_F0_SIZE 0xEF +#define MISAKI_FONT_F1_SIZE 0x9D +#define MISAKI_FONT_F2_SIZE 0x22 // misaki_font_f2.h 銇渶绲傝銇ゃ倰銇撱亾銇ō瀹氥仚銈嬨佹渶澶0xEF銇俱仹 +PROGMEM const uint8_t misaki_font_0x00[1] = { 0x00 }; +#define MISAKI_FONT_F0_H +PROGMEM const uint8_t misaki_font_f0[ MISAKI_FONT_F0_SIZE + 1 ][ MISAKI_FONT_F0_W ] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x00 銆 */ + { 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x01 銆 */ + { 0x20, 0x50, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x02 銆 */ + { 0x50, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x03 锛 */ + { 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x04 锛 */ + { 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 }, /* 0x05 銉 */ + { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00 }, /* 0x06 锛 */ + { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00, 0x00, 0x00 }, /* 0x07 锛 */ + { 0x00, 0x02, 0x01, 0x51, 0x09, 0x09, 0x06, 0x00 }, /* 0x08 锛 */ + { 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00 }, /* 0x09 锛 */ + { 0x00, 0x00, 0x00, 0x00, 0x7f, 0x41, 0x41, 0x00 }, /* 0x0A 锛 */ + { 0x41, 0x41, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x0B 锛 */ + { 0x00, 0x00, 0x00, 0x3f, 0x01, 0x01, 0x01, 0x00 }, /* 0x0C 銆 */ + { 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00 }, /* 0x0D 銆 */ + { 0x00, 0x00, 0x3f, 0x21, 0x3d, 0x05, 0x07, 0x00 }, /* 0x0E 銆 */ + { 0x70, 0x50, 0x5e, 0x42, 0x7e, 0x00, 0x00, 0x00 }, /* 0x0F 銆 */ + { 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63, 0x41, 0x00 }, /* 0x10 銆 */ + { 0x41, 0x63, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x11 銆 */ + { 0x08, 0x08, 0x08, 0x7f, 0x08, 0x08, 0x08, 0x00 }, /* 0x12 锛 */ + { 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }, /* 0x13 锛 */ + { 0x44, 0x44, 0x44, 0x5f, 0x44, 0x44, 0x44, 0x00 }, /* 0x14 卤 */ + { 0x41, 0x22, 0x14, 0x08, 0x14, 0x22, 0x41, 0x00 }, /* 0x15 脳 */ + { 0x08, 0x08, 0x08, 0x2a, 0x08, 0x08, 0x08, 0x00 }, /* 0x16 梅 */ + { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00 }, /* 0x17 锛 */ + { 0x14, 0x34, 0x14, 0x1c, 0x14, 0x16, 0x14, 0x00 }, /* 0x18 鈮 */ + { 0x08, 0x08, 0x14, 0x14, 0x14, 0x22, 0x22, 0x00 }, /* 0x19 锛 */ + { 0x22, 0x22, 0x14, 0x14, 0x14, 0x08, 0x08, 0x00 }, /* 0x1A 锛 */ + { 0x02, 0x05, 0x02, 0x3c, 0x42, 0x42, 0x24, 0x00 }, /* 0x1B 鈩 */ + { 0x00, 0x2b, 0x2c, 0x78, 0x2c, 0x2b, 0x00, 0x00 }, /* 0x1C 锟 */ + { 0x00, 0x24, 0x2a, 0x7a, 0x2f, 0x2a, 0x12, 0x00 }, /* 0x1D 锛 */ + { 0x00, 0x1c, 0x62, 0x32, 0x2e, 0x23, 0x14, 0x00 }, /* 0x1E 锟 */ + { 0x20, 0x54, 0x5e, 0x25, 0x41, 0x42, 0x20, 0x00 }, /* 0x1F 锟 */ + { 0x42, 0x25, 0x12, 0x08, 0x24, 0x52, 0x21, 0x00 }, /* 0x20 锛 */ + { 0x20, 0x62, 0x3e, 0x63, 0x3e, 0x23, 0x02, 0x00 }, /* 0x21 锛 */ + { 0x20, 0x56, 0x49, 0x55, 0x22, 0x58, 0x40, 0x00 }, /* 0x22 锛 */ + { 0x00, 0x22, 0x14, 0x7f, 0x14, 0x22, 0x00, 0x00 }, /* 0x23 锛 */ + { 0x1c, 0x22, 0x59, 0x55, 0x4d, 0x12, 0x0c, 0x00 }, /* 0x24 锛 */ + { 0x00, 0x00, 0x4a, 0x55, 0x55, 0x29, 0x00, 0x00 }, /* 0x25 搂 */ + { 0x04, 0x64, 0x3c, 0x17, 0x3c, 0x64, 0x04, 0x00 }, /* 0x26 鈽 */ + { 0x04, 0x64, 0x3c, 0x1f, 0x3c, 0x64, 0x04, 0x00 }, /* 0x27 鈽 */ + { 0x1c, 0x22, 0x41, 0x41, 0x41, 0x22, 0x1c, 0x00 }, /* 0x28 鈼 */ + { 0x1c, 0x3e, 0x7f, 0x7f, 0x7f, 0x3e, 0x1c, 0x00 }, /* 0x29 鈼 */ + { 0x1c, 0x22, 0x5d, 0x55, 0x5d, 0x22, 0x1c, 0x00 }, /* 0x2A 鈼 */ + { 0x08, 0x14, 0x22, 0x41, 0x22, 0x14, 0x08, 0x00 }, /* 0x2B 鈼 */ + { 0x08, 0x1c, 0x3e, 0x7f, 0x3e, 0x1c, 0x08, 0x00 }, /* 0x2C 鈼 */ + { 0x7f, 0x41, 0x41, 0x41, 0x41, 0x41, 0x7f, 0x00 }, /* 0x2D 鈻 */ + { 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x00 }, /* 0x2E 鈻 */ + { 0x40, 0x70, 0x4c, 0x43, 0x4c, 0x70, 0x40, 0x00 }, /* 0x2F 鈻 */ + { 0x40, 0x70, 0x7c, 0x7f, 0x7c, 0x70, 0x40, 0x00 }, /* 0x30 鈻 */ + { 0x01, 0x07, 0x19, 0x61, 0x19, 0x07, 0x01, 0x00 }, /* 0x31 鈻 */ + { 0x01, 0x07, 0x1f, 0x7f, 0x1f, 0x07, 0x01, 0x00 }, /* 0x32 鈻 */ + { 0x49, 0x22, 0x14, 0x49, 0x14, 0x22, 0x49, 0x00 }, /* 0x33 鈥 */ + { 0x05, 0x05, 0x05, 0x7d, 0x05, 0x05, 0x05, 0x00 }, /* 0x34 銆 */ + { 0x08, 0x08, 0x08, 0x08, 0x2a, 0x1c, 0x08, 0x00 }, /* 0x35 鈫 */ + { 0x08, 0x1c, 0x2a, 0x08, 0x08, 0x08, 0x08, 0x00 }, /* 0x36 鈫 */ + { 0x00, 0x04, 0x02, 0x7f, 0x02, 0x04, 0x00, 0x00 }, /* 0x37 鈫 */ + { 0x00, 0x10, 0x20, 0x7f, 0x20, 0x10, 0x00, 0x00 }, /* 0x38 鈫 */ + { 0x00, 0x3e, 0x41, 0x41, 0x41, 0x41, 0x3e, 0x00 }, /* 0x39 锛 */ + { 0x00, 0x00, 0x42, 0x7f, 0x40, 0x00, 0x00, 0x00 }, /* 0x3A 锛 */ + { 0x00, 0x62, 0x51, 0x51, 0x49, 0x49, 0x46, 0x00 }, /* 0x3B 锛 */ + { 0x00, 0x22, 0x41, 0x49, 0x49, 0x49, 0x36, 0x00 }, /* 0x3C 锛 */ + { 0x00, 0x30, 0x28, 0x24, 0x22, 0x7f, 0x20, 0x00 }, /* 0x3D 锛 */ + { 0x00, 0x2f, 0x45, 0x45, 0x45, 0x45, 0x39, 0x00 }, /* 0x3E 锛 */ + { 0x00, 0x3e, 0x49, 0x49, 0x49, 0x49, 0x32, 0x00 }, /* 0x3F 锛 */ + { 0x00, 0x01, 0x01, 0x61, 0x19, 0x05, 0x03, 0x00 }, /* 0x40 锛 */ + { 0x00, 0x36, 0x49, 0x49, 0x49, 0x49, 0x36, 0x00 }, /* 0x41 锛 */ + { 0x00, 0x26, 0x49, 0x49, 0x49, 0x49, 0x3e, 0x00 }, /* 0x42 锛 */ + { 0x00, 0x20, 0x54, 0x7e, 0x34, 0x14, 0x60, 0x00 }, /* 0x43 銇 */ + { 0x20, 0x52, 0x7f, 0x2a, 0x1a, 0x4a, 0x30, 0x00 }, /* 0x44 銇 */ + { 0x00, 0x3c, 0x40, 0x20, 0x04, 0x18, 0x00, 0x00 }, /* 0x45 銇 */ + { 0x1e, 0x20, 0x40, 0x20, 0x02, 0x04, 0x18, 0x00 }, /* 0x46 銇 */ + { 0x00, 0x10, 0x4a, 0x4a, 0x2a, 0x10, 0x00, 0x00 }, /* 0x47 銇 */ + { 0x00, 0x08, 0x45, 0x45, 0x45, 0x25, 0x18, 0x00 }, /* 0x48 銇 */ + { 0x00, 0x48, 0x2a, 0x3a, 0x4a, 0x40, 0x00, 0x00 }, /* 0x49 銇 */ + { 0x00, 0x44, 0x25, 0x15, 0x3d, 0x45, 0x40, 0x00 }, /* 0x4A 銇 */ + { 0x00, 0x24, 0x7e, 0x14, 0x50, 0x24, 0x00, 0x00 }, /* 0x4B 銇 */ + { 0x22, 0x52, 0x7f, 0x0a, 0x48, 0x4a, 0x34, 0x00 }, /* 0x4C 銇 */ + { 0x44, 0x34, 0x4f, 0x44, 0x38, 0x04, 0x18, 0x00 }, /* 0x4D 銇 */ + { 0x44, 0x34, 0x4f, 0x44, 0x39, 0x04, 0x19, 0x00 }, /* 0x4E 銇 */ + { 0x00, 0x2a, 0x5a, 0x4b, 0x4e, 0x5a, 0x08, 0x00 }, /* 0x4F 銇 */ + { 0x00, 0x2a, 0x5a, 0x4b, 0x4e, 0x5b, 0x08, 0x00 }, /* 0x50 銇 */ + { 0x00, 0x08, 0x14, 0x14, 0x22, 0x41, 0x00, 0x00 }, /* 0x51 銇 */ + { 0x00, 0x08, 0x14, 0x14, 0x22, 0x45, 0x04, 0x00 }, /* 0x52 銇 */ + { 0x3f, 0x00, 0x04, 0x44, 0x3f, 0x04, 0x04, 0x00 }, /* 0x53 銇 */ + { 0x3f, 0x00, 0x04, 0x44, 0x3f, 0x04, 0x05, 0x00 }, /* 0x54 銇 */ + { 0x00, 0x20, 0x52, 0x42, 0x42, 0x42, 0x40, 0x00 }, /* 0x55 銇 */ + { 0x00, 0x20, 0x52, 0x42, 0x43, 0x42, 0x41, 0x00 }, /* 0x56 銇 */ + { 0x00, 0x24, 0x54, 0x44, 0x47, 0x5c, 0x04, 0x00 }, /* 0x57 銇 */ + { 0x00, 0x24, 0x54, 0x44, 0x47, 0x5c, 0x05, 0x00 }, /* 0x58 銇 */ + { 0x00, 0x00, 0x3f, 0x40, 0x40, 0x40, 0x20, 0x00 }, /* 0x59 銇 */ + { 0x00, 0x00, 0x3f, 0x40, 0x41, 0x40, 0x21, 0x00 }, /* 0x5A 銇 */ + { 0x02, 0x02, 0x0a, 0x56, 0x3f, 0x02, 0x02, 0x00 }, /* 0x5B 銇 */ + { 0x02, 0x02, 0x0a, 0x56, 0x3f, 0x02, 0x03, 0x00 }, /* 0x5C 銇 */ + { 0x04, 0x04, 0x3f, 0x44, 0x54, 0x5f, 0x44, 0x00 }, /* 0x5D 銇 */ + { 0x04, 0x04, 0x3f, 0x44, 0x54, 0x5f, 0x45, 0x00 }, /* 0x5E 銇 */ + { 0x00, 0x08, 0x09, 0x3d, 0x4b, 0x49, 0x08, 0x00 }, /* 0x5F 銇 */ + { 0x00, 0x08, 0x09, 0x3d, 0x4b, 0x49, 0x0a, 0x00 }, /* 0x60 銇 */ + { 0x42, 0x3a, 0x07, 0x22, 0x54, 0x44, 0x44, 0x00 }, /* 0x61 銇 */ + { 0x42, 0x3a, 0x07, 0x22, 0x55, 0x44, 0x45, 0x00 }, /* 0x62 銇 */ + { 0x00, 0x02, 0x12, 0x4e, 0x4b, 0x4a, 0x32, 0x00 }, /* 0x63 銇 */ + { 0x00, 0x02, 0x12, 0x4e, 0x4b, 0x4a, 0x33, 0x00 }, /* 0x64 銇 */ + { 0x00, 0x10, 0x10, 0x48, 0x48, 0x30, 0x00, 0x00 }, /* 0x65 銇 */ + { 0x04, 0x04, 0x02, 0x22, 0x22, 0x22, 0x1c, 0x00 }, /* 0x66 銇 */ + { 0x04, 0x04, 0x02, 0x22, 0x23, 0x22, 0x1d, 0x00 }, /* 0x67 銇 */ + { 0x00, 0x02, 0x02, 0x1a, 0x25, 0x43, 0x41, 0x00 }, /* 0x68 銇 */ + { 0x00, 0x02, 0x02, 0x1a, 0x25, 0x43, 0x45, 0x00 }, /* 0x69 銇 */ + { 0x00, 0x20, 0x57, 0x48, 0x48, 0x44, 0x44, 0x00 }, /* 0x6A 銇 */ + { 0x00, 0x20, 0x57, 0x48, 0x49, 0x44, 0x45, 0x00 }, /* 0x6B 銇 */ + { 0x12, 0x0a, 0x27, 0x52, 0x50, 0x3a, 0x24, 0x00 }, /* 0x6C 銇 */ + { 0x7f, 0x00, 0x20, 0x52, 0x42, 0x42, 0x40, 0x00 }, /* 0x6D 銇 */ + { 0x30, 0x4e, 0x38, 0x54, 0x0f, 0x64, 0x78, 0x00 }, /* 0x6E 銇 */ + { 0x24, 0x14, 0x7f, 0x04, 0x22, 0x52, 0x3c, 0x00 }, /* 0x6F 銇 */ + { 0x18, 0x24, 0x12, 0x4e, 0x42, 0x24, 0x18, 0x00 }, /* 0x70 銇 */ + { 0x7f, 0x00, 0x24, 0x54, 0x54, 0x3f, 0x44, 0x00 }, /* 0x71 銇 */ + { 0x7f, 0x00, 0x24, 0x54, 0x54, 0x3f, 0x45, 0x00 }, /* 0x72 銇 */ + { 0x7f, 0x00, 0x24, 0x54, 0x56, 0x3d, 0x46, 0x00 }, /* 0x73 銇 */ + { 0x02, 0x3a, 0x47, 0x40, 0x41, 0x3e, 0x04, 0x00 }, /* 0x74 銇 */ + { 0x02, 0x3a, 0x47, 0x40, 0x41, 0x3e, 0x05, 0x00 }, /* 0x75 銇 */ + { 0x02, 0x3a, 0x47, 0x40, 0x43, 0x3d, 0x06, 0x00 }, /* 0x76 銇 */ + { 0x40, 0x30, 0x40, 0x4d, 0x32, 0x10, 0x60, 0x00 }, /* 0x77 銇 */ + { 0x40, 0x30, 0x40, 0x4d, 0x32, 0x11, 0x61, 0x00 }, /* 0x78 銇 */ + { 0x40, 0x30, 0x40, 0x4d, 0x32, 0x15, 0x62, 0x00 }, /* 0x79 銇 */ + { 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x00 }, /* 0x7A 銇 */ + { 0x08, 0x04, 0x02, 0x04, 0x09, 0x10, 0x11, 0x00 }, /* 0x7B 銇 */ + { 0x08, 0x04, 0x02, 0x04, 0x0a, 0x15, 0x12, 0x00 }, /* 0x7C 銇 */ + { 0x7f, 0x00, 0x6a, 0x6a, 0x7e, 0x2a, 0x4a, 0x00 }, /* 0x7D 銇 */ + { 0x7f, 0x00, 0x6a, 0x6a, 0x7f, 0x2a, 0x4b, 0x00 }, /* 0x7E 銇 */ + { 0x7f, 0x00, 0x6a, 0x6a, 0x7e, 0x2d, 0x4a, 0x00 }, /* 0x7F 銇 */ + { 0x00, 0x6a, 0x6a, 0x6a, 0x7f, 0x2a, 0x4a, 0x00 }, /* 0x80 銇 */ + { 0x30, 0x29, 0x1d, 0x4b, 0x48, 0x3c, 0x10, 0x00 }, /* 0x81 銇 */ + { 0x12, 0x2a, 0x7f, 0x42, 0x40, 0x42, 0x24, 0x00 }, /* 0x82 銈 */ + { 0x30, 0x4e, 0x38, 0x54, 0x0f, 0x44, 0x38, 0x00 }, /* 0x83 銈 */ + { 0x00, 0x0a, 0x3e, 0x4b, 0x4a, 0x4a, 0x30, 0x00 }, /* 0x84 銈 */ + { 0x00, 0x08, 0x0e, 0x38, 0x46, 0x14, 0x08, 0x00 }, /* 0x85 銈 */ + { 0x04, 0x07, 0x1c, 0x62, 0x03, 0x0a, 0x04, 0x00 }, /* 0x86 銈 */ + { 0x00, 0x1c, 0x48, 0x3e, 0x24, 0x18, 0x00, 0x00 }, /* 0x87 銈 */ + { 0x1e, 0x04, 0x52, 0x3f, 0x12, 0x12, 0x0c, 0x00 }, /* 0x88 銈 */ + { 0x00, 0x20, 0x50, 0x50, 0x3e, 0x48, 0x00, 0x00 }, /* 0x89 銈 */ + { 0x00, 0x20, 0x50, 0x50, 0x3f, 0x24, 0x44, 0x00 }, /* 0x8A 銈 */ + { 0x00, 0x1c, 0x51, 0x49, 0x4a, 0x48, 0x30, 0x00 }, /* 0x8B 銈 */ + { 0x00, 0x0f, 0x42, 0x41, 0x21, 0x1e, 0x00, 0x00 }, /* 0x8C 銈 */ + { 0x00, 0x10, 0x69, 0x6d, 0x4b, 0x49, 0x30, 0x00 }, /* 0x8D 銈 */ + { 0x24, 0x14, 0x7f, 0x04, 0x02, 0x3e, 0x40, 0x00 }, /* 0x8E 銈 */ + { 0x00, 0x10, 0x49, 0x4d, 0x4b, 0x49, 0x30, 0x00 }, /* 0x8F 銈 */ + { 0x00, 0x28, 0x18, 0x7e, 0x08, 0x44, 0x38, 0x00 }, /* 0x90 銈 */ + { 0x24, 0x14, 0x7f, 0x04, 0x42, 0x42, 0x3c, 0x00 }, /* 0x91 銈 */ + { 0x30, 0x49, 0x25, 0x1f, 0x24, 0x54, 0x38, 0x00 }, /* 0x92 銈 */ + { 0x40, 0x28, 0x25, 0x57, 0x35, 0x28, 0x40, 0x00 }, /* 0x93 銈 */ + { 0x10, 0x0a, 0x2e, 0x5b, 0x72, 0x4a, 0x48, 0x00 }, /* 0x94 銈 */ + { 0x40, 0x30, 0x0c, 0x33, 0x40, 0x40, 0x20, 0x00 }, /* 0x95 銈 */ + { 0x00, 0x04, 0x44, 0x3c, 0x14, 0x0c, 0x00, 0x00 }, /* 0x96 銈 */ + { 0x00, 0x01, 0x41, 0x3d, 0x09, 0x05, 0x03, 0x00 }, /* 0x97 銈 */ + { 0x00, 0x20, 0x20, 0x10, 0x78, 0x04, 0x00, 0x00 }, /* 0x98 銈 */ + { 0x00, 0x10, 0x10, 0x08, 0x7c, 0x02, 0x01, 0x00 }, /* 0x99 銈 */ + { 0x00, 0x18, 0x48, 0x4c, 0x28, 0x18, 0x00, 0x00 }, /* 0x9A 銈 */ + { 0x00, 0x06, 0x42, 0x43, 0x22, 0x12, 0x0e, 0x00 }, /* 0x9B 銈 */ + { 0x00, 0x40, 0x48, 0x78, 0x48, 0x40, 0x00, 0x00 }, /* 0x9C 銈 */ + { 0x20, 0x22, 0x22, 0x3e, 0x22, 0x22, 0x20, 0x00 }, /* 0x9D 銈 */ + { 0x00, 0x28, 0x28, 0x58, 0x7c, 0x08, 0x00, 0x00 }, /* 0x9E 銈 */ + { 0x22, 0x22, 0x12, 0x4a, 0x7f, 0x02, 0x02, 0x00 }, /* 0x9F 銈 */ + { 0x00, 0x42, 0x22, 0x1f, 0x02, 0x42, 0x7e, 0x00 }, /* 0xA0 銈 */ + { 0x00, 0x42, 0x22, 0x1f, 0x02, 0x42, 0x7f, 0x00 }, /* 0xA1 銈 */ + { 0x00, 0x12, 0x12, 0x1f, 0x72, 0x12, 0x10, 0x00 }, /* 0xA2 銈 */ + { 0x00, 0x12, 0x12, 0x1f, 0x72, 0x13, 0x10, 0x00 }, /* 0xA3 銈 */ + { 0x00, 0x08, 0x44, 0x43, 0x22, 0x12, 0x0e, 0x00 }, /* 0xA4 銈 */ + { 0x00, 0x08, 0x44, 0x43, 0x22, 0x12, 0x0f, 0x00 }, /* 0xA5 銈 */ + { 0x08, 0x07, 0x42, 0x22, 0x1e, 0x02, 0x02, 0x00 }, /* 0xA6 銈 */ + { 0x08, 0x07, 0x42, 0x22, 0x1f, 0x02, 0x03, 0x00 }, /* 0xA7 銈 */ + { 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7e, 0x00 }, /* 0xA8 銈 */ + { 0x00, 0x42, 0x42, 0x42, 0x43, 0x42, 0x7f, 0x00 }, /* 0xA9 銈 */ + { 0x02, 0x02, 0x4f, 0x42, 0x22, 0x1f, 0x02, 0x00 }, /* 0xAA 銈 */ + { 0x02, 0x02, 0x4f, 0x42, 0x23, 0x1e, 0x03, 0x00 }, /* 0xAB 銈 */ + { 0x00, 0x45, 0x4a, 0x40, 0x20, 0x10, 0x0c, 0x00 }, /* 0xAC 銈 */ + { 0x00, 0x45, 0x4a, 0x40, 0x21, 0x10, 0x0d, 0x00 }, /* 0xAD 銈 */ + { 0x40, 0x42, 0x22, 0x22, 0x1a, 0x26, 0x40, 0x00 }, /* 0xAE 銈 */ + { 0x40, 0x42, 0x22, 0x22, 0x1b, 0x26, 0x41, 0x00 }, /* 0xAF 銈 */ + { 0x04, 0x04, 0x3f, 0x44, 0x44, 0x54, 0x4c, 0x00 }, /* 0xB0 銈 */ + { 0x04, 0x04, 0x3f, 0x44, 0x45, 0x54, 0x4d, 0x00 }, /* 0xB1 銈 */ + { 0x00, 0x01, 0x46, 0x40, 0x20, 0x10, 0x0f, 0x00 }, /* 0xB2 銈 */ + { 0x00, 0x01, 0x46, 0x40, 0x20, 0x11, 0x0f, 0x00 }, /* 0xB3 銈 */ + { 0x00, 0x08, 0x44, 0x4b, 0x2a, 0x12, 0x0e, 0x00 }, /* 0xB4 銈 */ + { 0x00, 0x08, 0x44, 0x4b, 0x2a, 0x12, 0x0f, 0x00 }, /* 0xB5 銉 */ + { 0x08, 0x0a, 0x4a, 0x3e, 0x09, 0x09, 0x08, 0x00 }, /* 0xB6 銉 */ + { 0x08, 0x0a, 0x4a, 0x3e, 0x09, 0x08, 0x09, 0x00 }, /* 0xB7 銉 */ + { 0x00, 0x18, 0x40, 0x58, 0x20, 0x18, 0x00, 0x00 }, /* 0xB8 銉 */ + { 0x02, 0x0c, 0x42, 0x4c, 0x20, 0x10, 0x0e, 0x00 }, /* 0xB9 銉 */ + { 0x02, 0x0c, 0x42, 0x4c, 0x21, 0x10, 0x0d, 0x00 }, /* 0xBA 銉 */ + { 0x04, 0x05, 0x45, 0x3d, 0x05, 0x05, 0x04, 0x00 }, /* 0xBB 銉 */ + { 0x04, 0x05, 0x45, 0x3d, 0x05, 0x04, 0x05, 0x00 }, /* 0xBC 銉 */ + { 0x00, 0x00, 0x7f, 0x08, 0x08, 0x10, 0x00, 0x00 }, /* 0xBD 銉 */ + { 0x00, 0x00, 0x7f, 0x08, 0x09, 0x10, 0x01, 0x00 }, /* 0xBE 銉 */ + { 0x04, 0x44, 0x24, 0x1f, 0x04, 0x04, 0x04, 0x00 }, /* 0xBF 銉 */ + { 0x20, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x00 }, /* 0xC0 銉 */ + { 0x40, 0x41, 0x25, 0x15, 0x19, 0x27, 0x00, 0x00 }, /* 0xC1 銉 */ + { 0x20, 0x22, 0x12, 0x7b, 0x06, 0x12, 0x20, 0x00 }, /* 0xC2 銉 */ + { 0x40, 0x40, 0x20, 0x10, 0x08, 0x07, 0x00, 0x00 }, /* 0xC3 銉 */ + { 0x40, 0x30, 0x0e, 0x00, 0x02, 0x0c, 0x70, 0x00 }, /* 0xC4 銉 */ + { 0x40, 0x30, 0x0e, 0x00, 0x02, 0x0d, 0x71, 0x00 }, /* 0xC5 銉 */ + { 0x40, 0x30, 0x0e, 0x00, 0x02, 0x0d, 0x72, 0x00 }, /* 0xC6 銉 */ + { 0x00, 0x3f, 0x48, 0x48, 0x48, 0x44, 0x44, 0x00 }, /* 0xC7 銉 */ + { 0x00, 0x3f, 0x48, 0x48, 0x49, 0x44, 0x45, 0x00 }, /* 0xC8 銉 */ + { 0x00, 0x3f, 0x48, 0x48, 0x4a, 0x45, 0x46, 0x00 }, /* 0xC9 銉 */ + { 0x00, 0x02, 0x42, 0x42, 0x22, 0x12, 0x0e, 0x00 }, /* 0xCA 銉 */ + { 0x00, 0x02, 0x42, 0x42, 0x23, 0x12, 0x0f, 0x00 }, /* 0xCB 銉 */ + { 0x00, 0x02, 0x42, 0x42, 0x22, 0x15, 0x0e, 0x00 }, /* 0xCC 銉 */ + { 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00 }, /* 0xCD 銉 */ + { 0x08, 0x04, 0x02, 0x04, 0x09, 0x10, 0x21, 0x00 }, /* 0xCE 銉 */ + { 0x08, 0x04, 0x02, 0x04, 0x0a, 0x15, 0x22, 0x00 }, /* 0xCF 銉 */ + { 0x24, 0x14, 0x44, 0x7f, 0x04, 0x14, 0x24, 0x00 }, /* 0xD0 銉 */ + { 0x24, 0x14, 0x44, 0x7f, 0x05, 0x14, 0x25, 0x00 }, /* 0xD1 銉 */ + { 0x24, 0x14, 0x44, 0x7f, 0x06, 0x15, 0x22, 0x00 }, /* 0xD2 銉 */ + { 0x02, 0x02, 0x12, 0x22, 0x52, 0x0a, 0x06, 0x00 }, /* 0xD3 銉 */ + { 0x00, 0x21, 0x25, 0x29, 0x4a, 0x42, 0x00, 0x00 }, /* 0xD4 銉 */ + { 0x40, 0x70, 0x4c, 0x43, 0x50, 0x20, 0x40, 0x00 }, /* 0xD5 銉 */ + { 0x40, 0x44, 0x24, 0x14, 0x08, 0x37, 0x00, 0x00 }, /* 0xD6 銉 */ + { 0x00, 0x08, 0x09, 0x3f, 0x49, 0x49, 0x48, 0x00 }, /* 0xD7 銉 */ + { 0x00, 0x10, 0x1c, 0x68, 0x08, 0x18, 0x00, 0x00 }, /* 0xD8 銉 */ + { 0x04, 0x04, 0x0f, 0x74, 0x02, 0x0a, 0x06, 0x00 }, /* 0xD9 銉 */ + { 0x00, 0x40, 0x48, 0x48, 0x78, 0x40, 0x00, 0x00 }, /* 0xDA 銉 */ + { 0x20, 0x22, 0x22, 0x22, 0x3e, 0x20, 0x20, 0x00 }, /* 0xDB 銉 */ + { 0x00, 0x00, 0x44, 0x54, 0x54, 0x7c, 0x00, 0x00 }, /* 0xDC 銉 */ + { 0x00, 0x42, 0x4a, 0x4a, 0x4a, 0x4a, 0x7e, 0x00 }, /* 0xDD 銉 */ + { 0x00, 0x04, 0x45, 0x45, 0x25, 0x15, 0x0c, 0x00 }, /* 0xDE 銉 */ + { 0x00, 0x0f, 0x40, 0x40, 0x20, 0x1f, 0x00, 0x00 }, /* 0xDF 銉 */ + { 0x40, 0x20, 0x1e, 0x00, 0x7f, 0x20, 0x10, 0x00 }, /* 0xE0 銉 */ + { 0x00, 0x00, 0x7f, 0x40, 0x20, 0x10, 0x08, 0x00 }, /* 0xE1 銉 */ + { 0x00, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x7e, 0x00 }, /* 0xE2 銉 */ + { 0x00, 0x0c, 0x44, 0x44, 0x24, 0x1c, 0x00, 0x00 }, /* 0xE3 銉 */ + { 0x00, 0x06, 0x42, 0x42, 0x22, 0x12, 0x0e, 0x00 }, /* 0xE4 銉 */ + { 0x10, 0x12, 0x1e, 0x12, 0x12, 0x7f, 0x12, 0x00 }, /* 0xE5 銉 */ + { 0x20, 0x22, 0x22, 0x3a, 0x26, 0x22, 0x20, 0x00 }, /* 0xE6 銉 */ + { 0x00, 0x01, 0x45, 0x45, 0x25, 0x15, 0x0f, 0x00 }, /* 0xE7 銉 */ + { 0x00, 0x41, 0x42, 0x40, 0x20, 0x10, 0x0c, 0x00 }, /* 0xE8 銉 */ + { 0x00, 0x06, 0x42, 0x43, 0x22, 0x12, 0x0f, 0x00 }, /* 0xE9 銉 */ + { 0x00, 0x48, 0x28, 0x1c, 0x48, 0x78, 0x00, 0x00 }, /* 0xEA 銉 */ + { 0x00, 0x10, 0x0c, 0x48, 0x38, 0x08, 0x00, 0x00 }, /* 0xEB 銉 */ + { 0x08, 0x04, 0x04, 0x08, 0x10, 0x10, 0x08, 0x00 }, /* 0xEC 銆 */ + { 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00 }, /* 0xED 鈥 */ + { 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }, /* 0xEE 銉 */ + { 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 }, /* 0xEF 鈥 */ +}; + +#define MISAKI_FONT_F1_H +PROGMEM const uint8_t misaki_font_f1[ MISAKI_FONT_F1_SIZE + 1 ][ MISAKI_FONT_F1_W ] = +{ + { 0x00, 0x00, 0x00 }, /* 0x00 */ + { 0x00, 0x2f, 0x00 }, /* 0x01 ! */ + { 0x03, 0x00, 0x03 }, /* 0x02 " */ + { 0x3f, 0x12, 0x3f }, /* 0x03 # */ + { 0x16, 0x3f, 0x1a }, /* 0x04 $ */ + { 0x12, 0x08, 0x24 }, /* 0x05 % */ + { 0x32, 0x3d, 0x2a }, /* 0x06 & */ + { 0x02, 0x01, 0x00 }, /* 0x07 ' */ + { 0x00, 0x3e, 0x41 }, /* 0x08 ( */ + { 0x41, 0x3e, 0x00 }, /* 0x09 ) */ + { 0x0a, 0x07, 0x0a }, /* 0x0A * */ + { 0x08, 0x3e, 0x08 }, /* 0x0B + */ + { 0x40, 0x20, 0x00 }, /* 0x0C , */ + { 0x08, 0x08, 0x08 }, /* 0x0D - */ + { 0x00, 0x20, 0x00 }, /* 0x0E . */ + { 0x10, 0x08, 0x04 }, /* 0x0F / */ + { 0x1c, 0x2a, 0x1c }, /* 0x10 0 */ + { 0x24, 0x3e, 0x20 }, /* 0x11 1 */ + { 0x32, 0x2a, 0x24 }, /* 0x12 2 */ + { 0x22, 0x2a, 0x14 }, /* 0x13 3 */ + { 0x18, 0x14, 0x3e }, /* 0x14 4 */ + { 0x2e, 0x2a, 0x12 }, /* 0x15 5 */ + { 0x1c, 0x2a, 0x12 }, /* 0x16 6 */ + { 0x02, 0x3a, 0x06 }, /* 0x17 7 */ + { 0x14, 0x2a, 0x14 }, /* 0x18 8 */ + { 0x24, 0x2a, 0x1c }, /* 0x19 9 */ + { 0x00, 0x24, 0x00 }, /* 0x1A : */ + { 0x40, 0x24, 0x00 }, /* 0x1B ; */ + { 0x08, 0x14, 0x22 }, /* 0x1C < */ + { 0x14, 0x14, 0x14 }, /* 0x1D = */ + { 0x22, 0x14, 0x08 }, /* 0x1E > */ + { 0x02, 0x29, 0x06 }, /* 0x1F ? */ + { 0x12, 0x29, 0x1e }, /* 0x20 @ */ + { 0x3e, 0x09, 0x3e }, /* 0x21 A */ + { 0x3f, 0x25, 0x1a }, /* 0x22 B */ + { 0x1e, 0x21, 0x21 }, /* 0x23 C */ + { 0x3f, 0x21, 0x1e }, /* 0x24 D */ + { 0x3f, 0x25, 0x21 }, /* 0x25 E */ + { 0x3f, 0x05, 0x01 }, /* 0x26 F */ + { 0x1e, 0x21, 0x39 }, /* 0x27 G */ + { 0x3f, 0x08, 0x3f }, /* 0x28 H */ + { 0x21, 0x3f, 0x21 }, /* 0x29 I */ + { 0x10, 0x20, 0x1f }, /* 0x2A J */ + { 0x3f, 0x04, 0x3b }, /* 0x2B K */ + { 0x3f, 0x20, 0x20 }, /* 0x2C L */ + { 0x3f, 0x06, 0x3f }, /* 0x2D M */ + { 0x3f, 0x01, 0x3e }, /* 0x2E N */ + { 0x1e, 0x21, 0x1e }, /* 0x2F O */ + { 0x3f, 0x09, 0x06 }, /* 0x30 P */ + { 0x1e, 0x21, 0x5e }, /* 0x31 Q */ + { 0x3f, 0x09, 0x36 }, /* 0x32 R */ + { 0x22, 0x25, 0x19 }, /* 0x33 S */ + { 0x01, 0x3f, 0x01 }, /* 0x34 T */ + { 0x3f, 0x20, 0x3f }, /* 0x35 U */ + { 0x3f, 0x10, 0x0f }, /* 0x36 V */ + { 0x3f, 0x18, 0x3f }, /* 0x37 W */ + { 0x33, 0x0c, 0x33 }, /* 0x38 X */ + { 0x03, 0x3c, 0x03 }, /* 0x39 Y */ + { 0x31, 0x2d, 0x23 }, /* 0x3A Z */ + { 0x00, 0x7f, 0x41 }, /* 0x3B [ */ + { 0x15, 0x3e, 0x15 }, /* 0x3C \ */ + { 0x41, 0x7f, 0x00 }, /* 0x3D ] */ + { 0x02, 0x01, 0x02 }, /* 0x3E ^ */ + { 0x40, 0x40, 0x40 }, /* 0x3F _ */ + { 0x00, 0x01, 0x02 }, /* 0x40 ` */ + { 0x18, 0x24, 0x3c }, /* 0x41 a */ + { 0x3f, 0x24, 0x18 }, /* 0x42 b */ + { 0x18, 0x24, 0x24 }, /* 0x43 c */ + { 0x18, 0x24, 0x3f }, /* 0x44 d */ + { 0x18, 0x2c, 0x2c }, /* 0x45 e */ + { 0x04, 0x3f, 0x05 }, /* 0x46 f */ + { 0x48, 0x54, 0x3c }, /* 0x47 g */ + { 0x3f, 0x04, 0x38 }, /* 0x48 h */ + { 0x00, 0x3d, 0x00 }, /* 0x49 i */ + { 0x40, 0x3d, 0x00 }, /* 0x4A j */ + { 0x3f, 0x08, 0x34 }, /* 0x4B k */ + { 0x01, 0x3f, 0x00 }, /* 0x4C l */ + { 0x3c, 0x1c, 0x38 }, /* 0x4D m */ + { 0x3c, 0x04, 0x38 }, /* 0x4E n */ + { 0x18, 0x24, 0x18 }, /* 0x4F o */ + { 0x7c, 0x24, 0x18 }, /* 0x50 p */ + { 0x18, 0x24, 0x7c }, /* 0x51 q */ + { 0x3c, 0x08, 0x04 }, /* 0x52 r */ + { 0x28, 0x3c, 0x14 }, /* 0x53 s */ + { 0x04, 0x3e, 0x24 }, /* 0x54 t */ + { 0x3c, 0x20, 0x3c }, /* 0x55 u */ + { 0x3c, 0x10, 0x0c }, /* 0x56 v */ + { 0x3c, 0x30, 0x3c }, /* 0x57 w */ + { 0x24, 0x18, 0x24 }, /* 0x58 x */ + { 0x4c, 0x50, 0x3c }, /* 0x59 y */ + { 0x24, 0x34, 0x2c }, /* 0x5A z */ + { 0x08, 0x36, 0x41 }, /* 0x5B { */ + { 0x00, 0x7f, 0x00 }, /* 0x5C | */ + { 0x41, 0x36, 0x08 }, /* 0x5D } */ + { 0x01, 0x01, 0x01 }, /* 0x5E ~ */ + { 0x10, 0x28, 0x10 }, /* 0x5F 锝 */ + { 0x1f, 0x01, 0x01 }, /* 0x60 锝 */ + { 0x20, 0x20, 0x3e }, /* 0x61 锝 */ + { 0x10, 0x20, 0x00 }, /* 0x62 锝 */ + { 0x00, 0x08, 0x00 }, /* 0x63 锝 */ + { 0x25, 0x15, 0x0f }, /* 0x64 锝 */ + { 0x24, 0x1c, 0x0c }, /* 0x65 锝 */ + { 0x10, 0x38, 0x04 }, /* 0x66 锝 */ + { 0x18, 0x0c, 0x38 }, /* 0x67 锝 */ + { 0x28, 0x38, 0x28 }, /* 0x68 锝 */ + { 0x28, 0x18, 0x3c }, /* 0x69 锝 */ + { 0x08, 0x3c, 0x18 }, /* 0x6A 锝 */ + { 0x28, 0x38, 0x20 }, /* 0x6B 锝 */ + { 0x24, 0x2c, 0x3c }, /* 0x6C 锝 */ + { 0x2c, 0x2c, 0x1c }, /* 0x6D 锝 */ + { 0x04, 0x08, 0x08 }, /* 0x6E 锝 */ + { 0x21, 0x1d, 0x07 }, /* 0x6F 锝 */ + { 0x08, 0x3c, 0x03 }, /* 0x70 锝 */ + { 0x06, 0x23, 0x1e }, /* 0x71 锝 */ + { 0x22, 0x3e, 0x22 }, /* 0x72 锝 */ + { 0x12, 0x0a, 0x3f }, /* 0x73 锝 */ + { 0x32, 0x0f, 0x3e }, /* 0x74 锝 */ + { 0x0a, 0x3f, 0x0a }, /* 0x75 锝 */ + { 0x24, 0x13, 0x0e }, /* 0x76 锝 */ + { 0x27, 0x1e, 0x02 }, /* 0x77 锝 */ + { 0x22, 0x22, 0x3e }, /* 0x78 锝 */ + { 0x27, 0x12, 0x0f }, /* 0x79 锝 */ + { 0x25, 0x25, 0x10 }, /* 0x7A 锝 */ + { 0x21, 0x19, 0x27 }, /* 0x7B 锝 */ + { 0x3f, 0x22, 0x2e }, /* 0x7C 锝 */ + { 0x21, 0x16, 0x0f }, /* 0x7D 锝 */ + { 0x24, 0x1b, 0x0e }, /* 0x7E 锞 */ + { 0x25, 0x1f, 0x05 }, /* 0x7F 锞 */ + { 0x26, 0x26, 0x1e }, /* 0x80 锞 */ + { 0x25, 0x1d, 0x05 }, /* 0x81 锞 */ + { 0x3f, 0x04, 0x08 }, /* 0x82 锞 */ + { 0x24, 0x1f, 0x04 }, /* 0x83 锞 */ + { 0x20, 0x22, 0x22 }, /* 0x84 锞 */ + { 0x25, 0x19, 0x27 }, /* 0x85 锞 */ + { 0x12, 0x3b, 0x16 }, /* 0x86 锞 */ + { 0x20, 0x10, 0x0f }, /* 0x87 锞 */ + { 0x3c, 0x01, 0x3e }, /* 0x88 锞 */ + { 0x1f, 0x24, 0x24 }, /* 0x89 锞 */ + { 0x21, 0x11, 0x0f }, /* 0x8A 锞 */ + { 0x0c, 0x03, 0x1c }, /* 0x8B 锞 */ + { 0x1a, 0x3f, 0x1a }, /* 0x8C 锞 */ + { 0x09, 0x19, 0x27 }, /* 0x8D 锞 */ + { 0x22, 0x2a, 0x2a }, /* 0x8E 锞 */ + { 0x38, 0x27, 0x30 }, /* 0x8F 锞 */ + { 0x32, 0x0c, 0x13 }, /* 0x90 锞 */ + { 0x05, 0x3f, 0x25 }, /* 0x91 锞 */ + { 0x02, 0x3f, 0x0e }, /* 0x92 锞 */ + { 0x21, 0x3f, 0x20 }, /* 0x93 锞 */ + { 0x25, 0x25, 0x3f }, /* 0x94 锞 */ + { 0x25, 0x25, 0x1d }, /* 0x95 锞 */ + { 0x07, 0x20, 0x1f }, /* 0x96 锞 */ + { 0x3c, 0x3f, 0x20 }, /* 0x97 锞 */ + { 0x3f, 0x20, 0x10 }, /* 0x98 锞 */ + { 0x3e, 0x22, 0x3e }, /* 0x99 锞 */ + { 0x23, 0x11, 0x0f }, /* 0x9A 锞 */ + { 0x21, 0x21, 0x18 }, /* 0x9B 锞 */ + { 0x01, 0x00, 0x01 }, /* 0x9C 锞 */ + { 0x02, 0x05, 0x02 }, /* 0x9D 锞 */ +}; +#define MISAKI_FONT_F2_H +PROGMEM const uint8_t misaki_font_f2[ MISAKI_FONT_F2_SIZE + 1 ][ MISAKI_FONT_F2_W ] = +{ + { 0x75, 0x40, 0x77, 0x55, 0x75, 0x77, 0x40 }, /* 0x00 娓 */ + { 0x40, 0x3e, 0x4a, 0x5e, 0x2b, 0x5e, 0x4a }, /* 0x01 搴 */ + { 0x6b, 0x62, 0x7f, 0x35, 0x2f, 0x35, 0x7f }, /* 0x02 瑾 */ + { 0x7c, 0x5b, 0x5e, 0x24, 0x7b, 0x0e, 0x3a }, /* 0x03 绡 */ + { 0x04, 0x7e, 0x01, 0x7e, 0x4a, 0x5e, 0x69 }, /* 0x04 浣 */ + { 0x06, 0x3a, 0x2f, 0x3f, 0x6b, 0x7e, 0x46 }, /* 0x05 闆 */ + { 0x40, 0x3f, 0x41, 0x49, 0x7f, 0x49, 0x41 }, /* 0x06 鍦 */ + { 0x02, 0x62, 0x6b, 0x6b, 0x6b, 0x62, 0x02 }, /* 0x07 瑷 */ + { 0x6a, 0x6b, 0x14, 0x7d, 0x57, 0x7d, 0x10 }, /* 0x08 瑾 */ + { 0x41, 0x3f, 0x55, 0x55, 0x3d, 0x57, 0x51 }, /* 0x09 鎴 */ + { 0x21, 0x3f, 0x2d, 0x7f, 0x2a, 0x12, 0x2e }, /* 0x0A 鍙 */ + { 0x0a, 0x77, 0x5a, 0x50, 0x5a, 0x77, 0x0a }, /* 0x0B 鏇 */ + { 0x20, 0x24, 0x13, 0x7d, 0x55, 0x53, 0x70 }, /* 0x0C 鍚 */ + { 0x7a, 0x2a, 0x7b, 0x02, 0x1a, 0x43, 0x7a }, /* 0x0D 鍓 */ + { 0x4a, 0x52, 0x5e, 0x2b, 0x5e, 0x42, 0x4a }, /* 0x0E 澶 */ + { 0x41, 0x5f, 0x35, 0x3f, 0x55, 0x5f, 0x41 }, /* 0x0F 鏇 */ + { 0x7d, 0x14, 0x57, 0x7d, 0x0e, 0x40, 0x7f }, /* 0x10 鍓 */ + { 0x7f, 0x1b, 0x54, 0x16, 0x7d, 0x16, 0x54 }, /* 0x11 闄 */ + { 0x49, 0x3a, 0x40, 0x7e, 0x57, 0x56, 0x76 }, /* 0x12 杩 */ + { 0x42, 0x3f, 0x42, 0x7e, 0x7e, 0x42, 0x7e }, /* 0x13 鍔 */ + { 0x04, 0x7e, 0x51, 0x37, 0x7d, 0x37, 0x50 }, /* 0x14 淇 */ + { 0x12, 0x7a, 0x17, 0x52, 0x76, 0x1e, 0x12 }, /* 0x15 瀛 */ + { 0x7f, 0x55, 0x7f, 0x14, 0x5d, 0x7f, 0x55 }, /* 0x16 鐫 */ + { 0x7f, 0x55, 0x7f, 0x7f, 0x55, 0x3d, 0x57 }, /* 0x17 鐪 */ + { 0x7f, 0x55, 0x37, 0x78, 0x17, 0x45, 0x7f }, /* 0x18 闁 */ + { 0x7f, 0x2b, 0x7b, 0x28, 0x7b, 0x2b, 0x7f }, /* 0x19 闁 */ + { 0x1e, 0x12, 0x12, 0x7f, 0x12, 0x12, 0x1e }, /* 0x1A 涓 */ + { 0x7f, 0x41, 0x6b, 0x7f, 0x6b, 0x51, 0x7f }, /* 0x1B 鍥 */ + { 0x52, 0x5a, 0x57, 0x3a, 0x57, 0x5a, 0x52 }, /* 0x1C 鑻 */ + { 0x00, 0x7f, 0x49, 0x49, 0x49, 0x49, 0x7f }, /* 0x1D 鏃 */ + { 0x22, 0x12, 0x2a, 0x7f, 0x2a, 0x12, 0x22 }, /* 0x1E 鏈 */ + { 0x16, 0x6a, 0x5e, 0x73, 0x56, 0x62, 0x16 }, /* 0x1F 瀵 */ + { 0x09, 0x37, 0x31, 0x5f, 0x15, 0x5f, 0x75 }, /* 0x20 纰 */ + { 0x42, 0x22, 0x1e, 0x0b, 0x4a, 0x7a, 0x02 }, /* 0x21 鏂 */ + { 0x7e, 0x02, 0x3a, 0x2b, 0x3a, 0x42, 0x7e }, /* 0x22 鍚 */ +}; +/* + 銉椼儶銈汇儍銉 + 娓╁害瑾跨瘈 + 銈裤偆銉炪兗 + 銈炽兂銉堛儹銉笺儷 + 銈广偗銉兗銉 + 銉栥偠銉 + 浣庨浕鍦с偄銉┿兗銉 + 瑷瑾 + 鎴汇倠 + 鍙栥倞鏇裤亪銈 + 銈儯銉儢銉兗銈枫儳銉 + 鍚嶅墠銈掑鏇 + 鍓婇櫎 + 杩藉姞 + 淇濆瓨 + 銉囥儠銈┿儷銉 + 鐫$湢 + 銉栥兗銈广儓 + 淇濆瓨 + 鐫$湢 + 闁夈仒銈 + 銉栥兗銈广儓 + 淇濆瓨 + 銉銈ゃ儸銈儓 + PID + 銉撱儍銈 + 銉嬨儱銉笺偣 + 闁夈仒銈 + 闁嬨亸 + 銇勩亜銇堛 + 銇亜銆 + 涓浗瑾 + 鑻辫獮 + 銇勩亜銇堛 + 銇亜銆 + 銉°偆銉炽偣銈儶銉笺兂 + 銉曘儶銉冦儣 + 淇濆瓨 + 銈€儛銈︺儓 + 鏃ユ湰瑾 + 銇ゃ伨銇挎柟鍚 + + 姹夊瓧杞崲琛:娓╁害瑾跨瘈浣庨浕鍦ц█瑾炴埢鍙栨浛鍚嶅墠澶夋洿鍓婇櫎杩藉姞淇濆瓨鐫$湢闁夐枊涓浗鑻辨棩鏈瘑纰 +*/ +const char JP_0[] PROGMEM = { 0xf0, 0xcc, 0xdf, 0xb0, 0xb8, 0xbd, }; +const char JP_1[] PROGMEM = { 0xf2, 0x00, 0x01, 0x02, 0x03, }; +const char JP_2[] PROGMEM = { 0xf0, 0xb4, 0x99, 0xd3, 0xee, }; +const char JP_3[] PROGMEM = { 0xf0, 0xa8, 0xe8, 0xbd, 0xe2, 0xee, 0xe0, }; +const char JP_4[] PROGMEM = { 0xf0, 0xae, 0xa4, 0xdf, 0xee, 0xe8, }; +const char JP_5[] PROGMEM = { 0xf0, 0xcb, 0xab, 0xee, }; +const char JP_6[] PROGMEM = { 0xf2, 0x04, 0x05, 0x06, 0xf0, 0x97, 0xde, 0xee, 0xd5, }; +const char JP_7[] PROGMEM = { 0xf2, 0x07, 0x08, }; +const char JP_8[] PROGMEM = { 0xf2, 0x09, 0xf0, 0x8d, }; +const char JP_9[] PROGMEM = { 0xf2, 0x0a, 0xf0, 0x8c, 0xf2, 0x0b, 0xf0, 0x4a, 0x8d, }; +const char JP_10[] PROGMEM = { 0xf0, 0xa2, 0xd8, 0xdf, 0xcb, 0xe1, 0xee, 0xac, 0xdc, 0xe8, }; +const char JP_11[] PROGMEM = { 0xf2, 0x0c, 0x0d, 0xf0, 0x94, 0xf2, 0x0e, 0x0f, }; +const char JP_12[] PROGMEM = { 0xf2, 0x10, 0x11, }; +const char JP_13[] PROGMEM = { 0xf2, 0x12, 0x13, }; +const char JP_14[] PROGMEM = { 0xf2, 0x14, 0x15, }; +const char JP_15[] PROGMEM = { 0xf0, 0xbc, 0xca, 0x9e, 0xe0, 0xbd, }; +const char JP_16[] PROGMEM = { 0xf2, 0x16, 0x17, }; +const char JP_17[] PROGMEM = { 0xf0, 0xcb, 0xee, 0xae, 0xbd, }; +const char JP_18[] PROGMEM = { 0xf2, 0x14, 0x15, }; +const char JP_19[] PROGMEM = { 0xf2, 0x16, 0x17, }; +const char JP_20[] PROGMEM = { 0xf2, 0x18, 0xf0, 0x5a, 0x8d, }; +const char JP_21[] PROGMEM = { 0xf0, 0xcb, 0xee, 0xae, 0xbd, }; +const char JP_22[] PROGMEM = { 0xf2, 0x14, 0x15, }; +const char JP_23[] PROGMEM = { 0xf0, 0xb5, 0x99, 0xe1, 0xa4, 0xbd, }; +const char JP_24[] PROGMEM = { 0xf1, 0x30, 0x29, 0x24, }; +const char JP_25[] PROGMEM = { 0xf0, 0xc8, 0xb8, 0xa5, }; +const char JP_26[] PROGMEM = { 0xf0, 0xc0, 0xda, 0xee, 0xae, }; +const char JP_27[] PROGMEM = { 0xf2, 0x18, 0xf0, 0x5a, 0x8d, }; +const char JP_28[] PROGMEM = { 0xf2, 0x19, 0xf0, 0x51, }; +const char JP_29[] PROGMEM = { 0xf0, 0x46, 0x46, 0x4a, 0x01, }; +const char JP_30[] PROGMEM = { 0xf0, 0x71, 0x46, 0x01, }; +const char JP_31[] PROGMEM = { 0xf2, 0x1a, 0x1b, 0x08, }; +const char JP_32[] PROGMEM = { 0xf2, 0x1c, 0x08, }; +const char JP_33[] PROGMEM = { 0xf0, 0x46, 0x46, 0x4a, 0x01, }; +const char JP_34[] PROGMEM = { 0xf0, 0x71, 0x46, 0x01, }; +const char JP_35[] PROGMEM = { 0xf0, 0xd6, 0x99, 0xe8, 0xae, 0xa4, 0xdf, 0xee, 0xe8, }; +const char JP_36[] PROGMEM = { 0xf0, 0xca, 0xdf, 0xb8, 0xcc, }; +const char JP_37[] PROGMEM = { 0xf2, 0x14, 0x15, }; +const char JP_38[] PROGMEM = { 0xf0, 0x97, 0xc5, 0x9b, 0xbd, }; +const char JP_39[] PROGMEM = { 0xf2, 0x1d, 0x1e, 0x08, }; +const char JP_40[] PROGMEM = { 0xf2, 0x1f, 0x20, }; //瀵嗙爜 +const char JP_41[] PROGMEM = { 0xf0, 0x66, 0x80, 0x81, 0xf2, 0x21, 0x22, }; //銇ゃ伨銇挎柟鍚 +const char *const JP_table[] = {JP_0, JP_1, JP_2, JP_3, JP_4, JP_5, JP_41, JP_6, JP_40, JP_7, JP_38, JP_8, JP_9, JP_10, JP_11, JP_12, JP_13, JP_14, JP_15, JP_16, JP_17, JP_18, JP_19, JP_20, JP_21, JP_22, JP_23, JP_24, JP_25, JP_26, JP_27, JP_28, JP_29, JP_30, JP_31, JP_32, JP_39, JP_35, JP_36, JP_37,}; +const char JP_Length_table[] PROGMEM = {6, 5, 5, 7, 6, 4, 7, 9, 3, 3 , 5, 4, 9, 10, 8, 3, 3, 3, 6, 3, 5, 3, 3, 5, 5, 3, 6, 4, 4, 5, 5, 4, 5, 4, 4, 3, 4, 9, 5, 3,}; +#endif + +/* + 8x8 dot Japanese font for Arduboy + + Copyright (c) 2016 emutyworks + + Released under the MIT license + https://github.com/emutyworks/8x8DotJPFont/blob/master/LICENSE.txt +*/ +#if LANG_JP_State +void drawText(uint8_t x, uint8_t y, const uint8_t *mes, uint8_t cnt) +{ + uint8_t pb; + uint8_t page; + uint8_t screen_start = 0; + uint8_t screen_end = 128; + + if (x < screen_start) { + x = screen_start; + } + + for (uint8_t i = 0; i < cnt; i++) { + pb = pgm_read_byte_near(mes + i); + + switch (pb) { + case MISAKI_FONT_F0_PAGE: + page = MISAKI_FONT_F0_PAGE; + continue; + case MISAKI_FONT_F1_PAGE: + page = MISAKI_FONT_F1_PAGE; + continue; + case MISAKI_FONT_F2_PAGE: + page = MISAKI_FONT_F2_PAGE; + continue; + } + + if (!page) { + continue; + } + + switch (page) { +#ifdef MISAKI_FONT_F0_H + case MISAKI_FONT_F0_PAGE: + if (pb > MISAKI_FONT_F0_SIZE) { + continue; + } + if ((x + 8) > screen_end) { + x = screen_start; + y = y + 8; + } + arduboy.drawBitmap(x, y, misaki_font_f0[ pb ], MISAKI_FONT_F0_W, 8, WHITE); + x = x + 8; + break; +#endif +#ifdef MISAKI_FONT_F1_H + case MISAKI_FONT_F1_PAGE: + if (pb > MISAKI_FONT_F1_SIZE) { + continue; + } + if ((x + 4) > screen_end) { + x = screen_start; + y = y + 8; + } + arduboy.drawBitmap(x, y, misaki_font_f1[ pb ], MISAKI_FONT_F1_W, 8, WHITE); + arduboy.drawBitmap(x + 3, y, misaki_font_0x00, 1, 8, WHITE); + x = x + 4; + break; +#endif +#ifdef MISAKI_FONT_F2_H + case MISAKI_FONT_F2_PAGE: + if (pb > MISAKI_FONT_F2_SIZE) { + continue; + } + if ((x + 8) > screen_end) { + x = screen_start; + y = y + 8; + } + arduboy.drawBitmap(x, y, misaki_font_f2[ pb ], MISAKI_FONT_F2_W, 8, WHITE); + arduboy.drawBitmap(x + 7, y, misaki_font_0x00, 1, 8, WHITE); + x = x + 8; + break; +#endif + } + } +} +#endif diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/C-Debug.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/C-Debug.ino new file mode 100644 index 0000000..5518d73 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/C-Debug.ino @@ -0,0 +1,21 @@ +/* +//姝ょ墖娈电敤浜嶥EBUG +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); + +} +*/ diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/CurveFitting.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/CurveFitting.ino new file mode 100644 index 0000000..2979e6c --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/CurveFitting.ino @@ -0,0 +1,103 @@ +//********** 鏇茬嚎鎷熷悎绋嬪簭 ********** +//鏇茬嚎鎷熷悎绠楁硶鏉ヨ嚦https://blog.csdn.net/m0_37362454/article/details/82456616 by娆ч槼灏忎繆 + +/*==================polyfit(n,x,y,poly_n,a)===================*/ +/*=======鎷熷悎y=a0+a1*x+a2*x^2+鈥︹+apoly_n*x^poly_n========*/ +/*=====n鏄暟鎹釜鏁 xy鏄暟鎹 poly_n鏄椤瑰紡鐨勯」鏁======*/ +/*===杩斿洖a0,a1,a2,鈥︹[poly_n]锛岀郴鏁版瘮椤规暟澶氫竴锛堝父鏁伴」锛=====*/ +void polyfit(int n, int x[], int y[], int poly_n, float p[]) +{ + int i, j; + float *tempx, *tempy, *sumxx, *sumxy, *ata; + + tempx = (float *)calloc(n , sizeof(float)); + sumxx = (float *)calloc((poly_n * 2 + 1) , sizeof(float)); + tempy = (float *)calloc(n , sizeof(float)); + sumxy = (float *)calloc((poly_n + 1) , sizeof(float)); + ata = (float *)calloc( (poly_n + 1) * (poly_n + 1) , sizeof(float) ); + for (i = 0; i < n; i++) + { + tempx[i] = 1; + tempy[i] = y[i]; + } + for (i = 0; i < 2 * poly_n + 1; i++) + { + for (sumxx[i] = 0, j = 0; j < n; j++) + { + sumxx[i] += tempx[j]; + tempx[j] *= x[j]; + } + } + for (i = 0; i < poly_n + 1; i++) + { + for (sumxy[i] = 0, j = 0; j < n; j++) + { + sumxy[i] += tempy[j]; + tempy[j] *= x[j]; + } + } + for (i = 0; i < poly_n + 1; i++) + { + for (j = 0; j < poly_n + 1; j++) + { + ata[i * (poly_n + 1) + j] = sumxx[i + j]; + } + } + gauss_solve(poly_n + 1, ata, p, sumxy); + + free(tempx); + free(sumxx); + free(tempy); + free(sumxy); + free(ata); +} +/*============================================================ + 楂樻柉娑堝厓娉曡绠楀緱鍒 n 娆″椤瑰紡鐨勭郴鏁 + n: 绯绘暟鐨勪釜鏁 + ata: 绾挎х煩闃 + sumxy: 绾挎ф柟绋嬬粍鐨刌鍊 + p: 杩斿洖鎷熷悎鐨勭粨鏋 + ============================================================*/ +void gauss_solve(int n, float A[], float x[], float b[]) +{ + int i, j, k, r; + float max; + for (k = 0; k < n - 1; k++) + { + max = fabs(A[k * n + k]); // find maxmum + r = k; + for (i = k + 1; i < n - 1; i++) + { + if (max < fabs(A[i * n + i])) + { + max = fabs(A[i * n + i]); + r = i; + } + } + if (r != k) + { + for (i = 0; i < n; i++) //change array:A[k]&A[r] + { + max = A[k * n + i]; + A[k * n + i] = A[r * n + i]; + A[r * n + i] = max; + } + max = b[k]; //change array:b[k]&b[r] + b[k] = b[r]; + b[r] = max; + } + + for (i = k + 1; i < n; i++) + { + for (j = k + 1; j < n; j++) + A[i * n + j] -= A[i * n + k] * A[k * n + j] / A[k * n + k]; + b[i] -= A[i * n + k] * b[k] / A[k * n + k]; + } + } + + for (i = n - 1; i >= 0; x[i] /= A[i * n + i], i--) + { + for (j = i + 1, x[i] = b[i]; j < n; j++) + x[i] -= A[i * n + j] * x[j]; + } +} diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/D-EEProm.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/D-EEProm.ino new file mode 100644 index 0000000..22afbc7 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/D-EEProm.ino @@ -0,0 +1,69 @@ + +// 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); + UnderVoltage = EEPROM.read(17); + Password = (EEPROM.read(18) << 8) | EEPROM.read(19); + RotaryD = EEPROM.read(20); + uint8_t i, j; + uint16_t Counter = 21; + for (i = 0; i < NumberOfTips; i++) { + for (j = 0; j < TIPNAMELENGTH; j++) { + TipName[i][j] = EEPROM.read(Counter++); + } + //0 8 16 24 + for (j = 0; j < 4; j++) { + EEPROM.get(Counter+=4,PTemp[i][j]); + } + } + } + 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); + EEPROM.update(17, UnderVoltage); + EEPROM.update(18, Password >> 8); + EEPROM.update(19, Password & 0xFF); + EEPROM.update(20, RotaryD); + + uint8_t i, j; + uint16_t Counter = 21; + 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.put(Counter+=4, PTemp[i][j]); + } +} diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/F.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/F.ino new file mode 100644 index 0000000..4fab96a --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/F.ino @@ -0,0 +1,315 @@ + +// reads current rotary encoder value +int getRotary() { + return (Count >> ROTARY_TYPE); +} + +//妫鏌ユ寜閿 +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; +} + + +// 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 +float 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(10); // 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); { + if (result < 540) return (result * Vcc / 184.416 + 86.987); + else if (result < 660) return (result * Vcc / 173.204 - 878.29); + else if (result < 745) return (result * Vcc / 143.579 - 4875); + else if (result < 781) return (result * Vcc / 119.109 - 10260); + else if (result < 800) return (result * Vcc / 86.178 - 23013); + else return (result * Vcc / 86.178 - 23113); + } // 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; + } + } +} + +//璁$畻瀹為檯娓╁害 +// calculates real temperature value according to ADC reading and calibration values +void calculateTemp() { + CurrentTemp = PTemp[CurrentTip][0] + RawTemp * PTemp[CurrentTip][1] + RawTemp * RawTemp * PTemp[CurrentTip][2] + RawTemp * RawTemp * RawTemp * PTemp[CurrentTip][3]; +} + +/* + * 娓╁害鎺у埗 + * mode-> 0:浠ュ疄闄呮俯搴︽暟鍊间负鍩哄噯 1:浠DC鏁板间负鍩哄噯(闈濸ID妯″紡) +*/ +void Thermostat(bool mode) { + // 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) + if (!mode) { + 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; + } + } else { + gap = 0; //姝ゆā寮忎笅涓嶈绠楁俯搴﹀樊 + if ((RawTemp + 0.5) < Setpoint) Output = 0; else Output = 255; + } + // set heater PWM +#if UsePMOS + analogWrite(CONTROL_PIN, 255 - Output); +#else + analogWrite(CONTROL_PIN, Output); +#endif +} + + +// creates a short beep on the buzzer +void beep() { + //浣撹皡涓涓嬶紝娌″唴瀛樹簡锛屽彧鑳界敤鍘熷鐨勫姙娉曢┍鍔ㄦ棤婧愯渹楦e櫒锛屽惁鍒欐垜涔熶笉鎯崇壓鐗插疂璐靛搷搴旇祫婧愭崲鍐呭瓨 + 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; + if (RotaryD) CountStep = rstep; else CountStep = -rstep; + Count = rvalue << ROTARY_TYPE; +} + +// reads temperature, vibration switch and supply voltages +void SENSORCheck() { + // shut off heater in order to measure temperature +#if UsePMOS + analogWrite(CONTROL_PIN, 0); +#else + analogWrite(CONTROL_PIN, 255); +#endif + 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 + + // turn on again heater + +#if UsePMOS + analogWrite(CONTROL_PIN, 255 - Output); +#else + analogWrite(CONTROL_PIN, Output); +#endif + + + RawTemp += (temp - RawTemp) * SMOOTHIE; // stabilize ADC temperature reading + calculateTemp(); + + // stabilize displayed temperature when around setpoint + if ((ShowTemp != Setpoint) || (abs(ShowTemp - CurrentTemp) > 5)) ShowTemp = CurrentTemp; + if (abs(ShowTemp - Setpoint) <= 1) ShowTemp = Setpoint; + // set state variable if temperature is in working range; beep if working temperature was just reached + gap = abs(SetTemp - CurrentTemp); + if (gap < 10) { + if (!IsWorky && BeepIfWorky) beep(); + IsWorky = true; + BeepIfWorky = false; + } else { + IsWorky = false; + BeepIfWorky = true; + } + // checks if tip is present or currently inserted + if (ShowTemp > 500) TipIsPresent = false; // tip removed ? + if (!TipIsPresent && (ShowTemp < 500)) { // new tip inserted ? + //鍏抽棴鍔犵儹 +#if UsePMOS + analogWrite(CONTROL_PIN, 0); +#else + analogWrite(CONTROL_PIN, 255); +#endif + 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 + } +} + + + +// 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 + + // then start the heater right now + +#if UsePMOS + analogWrite(CONTROL_PIN, 255); +#else + analogWrite(CONTROL_PIN, 0); +#endif + + 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(); + } +} + +void SetOLEDLightLevel(uint8_t level) { + arduboy.sendLCDCommand(0x81); //鍚慡SD1306鍙戦佹寚浠わ細璁剧疆鍐呴儴鐢甸樆寰皟 + arduboy.sendLCDCommand(level); //寰皟鑼冨洿锛0-255锛 +} + +ISR(WDT_vect) //WDT涓柇锛8绉掍竴娆 +{ + WDTCSR |= _BV(WDIE); +} diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/GUI.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/GUI.ino new file mode 100644 index 0000000..9f43ad5 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/GUI.ino @@ -0,0 +1,710 @@ + +// draws the main screen +void MainScreen() { + if (!(arduboy.nextFrame())) //甯х巼閿 + return; + //鐘舵 + byte SysState; + if (ShowTemp > 500) SysState = 0; + else if (InOffMode) { + SysState = 1; + DrawIntensiveComputing(); + } else if (InSleepMode) SysState = 2; + else if (InBoostMode) SysState = 3; + else if (IsWorky) SysState = 4; + else if (Output < 180) SysState = 5; + else SysState = 6; + if (SysState != 1) { + if (MainScrType) { + //arduboy.invert(0); + arduboy.clear(); + //璇︾粏淇℃伅椤 + arduboy.fillRect(0, 0, 128, 64, 1); //鐧藉簳 + arduboy.setTextSize(1); + SetTextColor(0); + //棰勮鍚 + //arduboy.drawSlowXYBitmap(0, 0, Tag, 16, 16, 0); + arduboy.setCursor(7, 4); arduboy.print(TipName[CurrentTip]); + //鏄剧ず鐘舵 + arduboy.setCursor(53, 1); + arduboy.setTextSize(2); + switch (LANG) { + case 0: arduboy.drawSlowXYBitmap(95, 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(74, 1, C_table[SysState], 14, 14, 0); + arduboy.setTextSize(1); + + //鏄剧ず鎺㈠ご娓╁害 + DrawNumRect(0, 15, 5, ShowTemp); + + //鐘舵佹潯 + DrawStatusBar(0); + + //鐘舵佸浘鏍 浠ュ強 淇℃伅 + //鑷姩鎶ヨ-鍥炬爣闂儊 + if (getChipTemp() < 80 || ((millis() * 4) / 1000) % 2) { + arduboy.setCursor(91, 20); arduboy.print(getChipTemp(), 1); arduboy.print((char)248); arduboy.print(F("C")); //鑺墖娓╁害 + arduboy.drawSlowXYBitmap(42, 1, Chip, 14, 14, 0); + } + if ((float)Vin / 100 > UnderVoltage || ((millis() * 4) / 1000) % 2) { + arduboy.setCursor(91, 28); arduboy.print((float)getVIN() / 1000, 2); arduboy.print(F("V")); //杈撳叆鐢靛帇 + arduboy.drawSlowXYBitmap(58, 1, Lightning, 14, 14, 0); + } + arduboy.setCursor(91, 36); arduboy.print((float)getVCC() / 1000, 3); arduboy.print(F("V")); //鑺墖鐢靛帇 + arduboy.setCursor(91, 44); arduboy.print(RawTemp, 0); //鐑欓搧澶寸儹鍋跺師濮嬫暟鎹 + + + + + arduboy.display(); + //璀︽姤澹 + if (getChipTemp() > 80 && ((millis() * 4) / 1000) % 2 || (float)Vin / 100 < UnderVoltage && ((millis() * 4) / 1000) % 2) beep(); + } else { + //arduboy.invert(1); + arduboy.setTextSize(6); + SetTextColor(1); + arduboy.clear(); + if (getChipTemp() > 80 && ((millis() * 4) / 1000) % 2) beep(); + if ((float)Vin / 100 < UnderVoltage && ((millis() * 4) / 1000) % 2) beep(); + arduboy.setCursor(12, 2); + + if (ShowTemp > 500) arduboy.print(999); else arduboy.print(ShowTemp); + DrawStatusBar(1); + arduboy.display(); + } + } +} +void DrawNumRect(byte x, byte y, byte size, int n) { + arduboy.setCursor(3 + x, 3 + y); + arduboy.setTextSize(size); + if (ShowTemp > 500) arduboy.print(F("000")); else arduboy.print(n); + arduboy.drawRect(1 + x, 1 + y, 89, 39, 0); +} + +//缁樺埗鐘舵佹潯 +void DrawStatusBar(bool color) { + SetTextColor(color); + arduboy.setTextSize(1); + //娓╁害鏉 + //妗 + arduboy.drawRect(1, 54, 102, 9, color); + //鏉 + if (ShowTemp <= 500) arduboy.fillRect(1, 54, map(ShowTemp, 0, 500, 2, 102), 9, color); + //鎸囩ず閮ㄥ垎 + arduboy.fillRect(map(Setpoint, 0, 500, 2, 102) - 2, 55, 3, 7, color); + //鍏堟潵涓櫧搴 + arduboy.fillRect(map(Setpoint, 0, 500, 2, 102) - 3, 63, 5, 1, color); + arduboy.drawLine(map(Setpoint, 0, 500, 2, 102) - 1, 63, map(Setpoint, 0, 500, 2, 102) - 1, 54, !color); + + //鐢绘寚绀洪拡 + arduboy.drawSlowXYBitmap(map(Setpoint, 0, 500, 2, 102) - 3, 59, Pointer, 5, 4, !color); + + //鍔熺巼鏉 + arduboy.drawRect(104, 54, 23, 9, color); + arduboy.fillRect(104, 54, map(Output, 255, 0, 0, 23), 9, color); + + SetTextColor(!color); + //////////////杩涘叆鍙嶈壊//////////////////////////////// + arduboy.setCursor(2, 55); arduboy.print(Setpoint, 0);//鎺㈠ご棰勮娓╁害 + arduboy.setCursor(105, 55); arduboy.print(map(Output, 255, 0, 0, 100)); arduboy.print(F("%")); //鍔熺巼鐧惧垎姣 + SetTextColor(color); +} + +//璁剧疆鐢荤瑪棰滆壊 +void SetTextColor(bool color) { + arduboy.setTextBackground(!color); + arduboy.setTextColor(color); +} + + +// setup screen +void SetupScreen() { + //鍏抽棴鍔犵儹 +#if UsePMOS + analogWrite(CONTROL_PIN, 0); +#else + analogWrite(CONTROL_PIN, 255); +#endif + beep(); + uint16_t SaveSetTemp = SetTemp; + uint8_t selection = 0; + bool repeat = true; + + while (repeat) { + //arduboy.invert(0); + 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: ScreenSet(); break; + case 5: MenuLevel = 6; BeepEnable = MenuScreen(BeepEnable); break; + case 6: RotarySet(); break; + case 7: UnderVoltageSet(); break; + case 8: PasswordSet(); break; + case 9: MenuLevel = 8; LANG = MenuScreen(LANG); if (LANG == 2 && !LANG_JP_State) LANG = 1; break; + case 10: QRcodeScreen(); break; + default: repeat = false; break; + } + } + updateEEPROM(); + handleMoved = true; + SetTemp = SaveSetTemp; + setRotary(TEMP_MIN, TEMP_MAX, TEMP_STEP, SetTemp); +} + +//璁剧疆婊氳疆鏂瑰悜 +void RotarySet() { + bool Exit = false; + float rad; + byte ExitBar = 0; + bool color = 0; + SetTextColor(!color); + lastbutton = (!digitalRead(BUTTON_PIN)); + setRotary(60, 420, 18, 240); + do { + arduboy.setTextSize(1); + Setpoint = getRotary(); + ShowTemp = Setpoint; + + arduboy.clear(); + + arduboy.fillRect(0, 0, 128, 64, color); + + //浠〃鐩 + arduboy.fillCircle(24 + 12 * cos(rad), 24 - 12 * sin(rad), 5, !color); + arduboy.drawCircle(24, 24, 20, !color); + + //鍙充笂瑙掔殑妯″紡鎻愮ず鏂囨湰 + arduboy.setCursor(55, 1); + arduboy.setTextSize(2); + arduboy.print(F("MODE ")); + if (RotaryD) { + arduboy.print(F("-")); + rad = ((Setpoint - 60) / 360.0) * (2 * PI) - PI / 2; + } else { + arduboy.print(F("+")); + rad = ((-Setpoint - 60) / 360.0) * (2 * PI) + PI * 1 / 6; + } + //鍙充晶鏁板瓧鏄剧ず + DrawNumRect(55, 18, 4, ShowTemp); + //涓嬬鐨勭姸鎬佹潯 + DrawStatusBar(!color); + //閫鍑烘潯 + arduboy.fillRect(0, 0, ExitBar, 4, !color); + arduboy.display(); + CheckLastButton(); + if (!digitalRead(BUTTON_PIN) && !lastbutton) { + ExitBar += 8; + arduboy.display(); + if (ExitBar > 127) Exit = true; + } else { + if (ExitBar > 1 && ExitBar < 64) { + RotaryD = !RotaryD; + setRotary(60, 420, 18, 240); + beep(); + } + ExitBar = 0; + } + + } while (!Exit); + beep(); beep(); +} +//鏄剧ず璁剧疆鑿滃崟 +// tip settings screen +void ScreenSet() { + uint8_t selection = 0; + bool repeat = true; + while (repeat) { + MenuLevel = 9; + selection = MenuScreen(selection); + switch (selection) { + case 0: MenuLevel = 5; MainScrType = MenuScreen(MainScrType); break; + case 1: FlipState = !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(18); break; + case 1: setRotary(20, 200, TEMP_STEP, SleepTemp); + SleepTemp = InputScreen(19); break; + case 2: setRotary(10, 100, TEMP_STEP, BoostTemp); + BoostTemp = InputScreen(20); 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(22); break; + case 1: setRotary(0, 60, 5, Time2off); + Time2off = InputScreen(23); break; + case 2: setRotary(0, 180, 10, TimeOfBoost); + TimeOfBoost = InputScreen(24); break; + default: repeat = false; break; + } + } + updateEEPROM(); +} +//鑻辫鏀寔 +//i-鏂囨湰id c-灞呬腑 +void Print_EN(byte i) { + char buffer[11]; + byte a = 0; + strcpy_P(buffer, (char *)pgm_read_word(&(EN_table[i]))); + while (1) { + if (buffer[a] != '\0') a++; else break; + } + arduboy.setCursor((128 - a * 6) / 2, 52); + arduboy.print(buffer); +} +//鑿滃崟鐣岄潰 +// 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)); + SetTextColor(1); + do { + selected = getRotary(); + //闈炵嚎鎬ф粦鍔ㄥ姩鐢 + SlidingAnimationX += (selected - lastselected) * 56; + if (SlidingAnimationX != 0) SlidingAnimationX += 0.55 * (-SlidingAnimationX); + lastselected = selected; + arduboy.clear(); + //缁樺埗鍥炬爣 濡傛灉鏈夋寚瀹氱殑璇 + for (byte i = 0; i < 5; i++) if (selected - 2 + i >= 0 && selected - 2 + i < Menu_table[MenuLevel]) DrawApp(-72 + i * 56 + SlidingAnimationX, selected - 2 + i + QueryMenuObject()); + DrawAppText(selected + QueryMenuObject()); + + arduboy.display(); + CheckLastButton(); + //beep(0); + } while (digitalRead(BUTTON_PIN) || lastbutton); + beep(); + return selected; +} + +//鏄剧ずAPP鍥炬爣 +void DrawApp(int x, byte appID) { + DrawUIFrame(x, 0, 1); + drawSlowXYBitmapResize(x + 3, 3, Ico_table[appID], 14, 14, 3, 1); +} + +//鏄剧ずAPP瀵瑰簲鐨勬枃鏈 +void DrawAppText(byte appID) { + // arduboy.setCursor(0, 55); arduboy.print(appID); + if (LANG == 0) arduboy.drawSlowXYBitmap(48, 48, CN_table[appID], 36, 16, 1); else if (LANG == 2 && LANG_JP_State) { +#if LANG_JP_State + drawText(48, 52, JP_table[appID], pgm_read_byte(&(JP_Length_table[appID]))); +#endif + } else { + arduboy.setCursor(48, 52); + arduboy.setTextSize(1); + Print_EN(appID); + } +} + +void DrawUIFrame(int x, int y, bool color) { + arduboy.fillRect(x, y, 48, 48, color); + arduboy.fillRect(x + 3, y + 3, 42, 42, !color); //闆曠┖ + DrawPoint(x, y, 0); + DrawPoint(x + 47, y, 0); + DrawPoint(x, y + 47, 0); + DrawPoint(x + 47, y + 47, 0); +} + +void DrawPoint(int x, int y, bool color) { + arduboy.drawPixel(x + 1, y, color); + arduboy.drawPixel(x - 1, y, color); + arduboy.drawPixel(x, y + 1, color); + arduboy.drawPixel(x, y - 1, color); + arduboy.drawPixel(x, y, color); +} + +//FP 瀵嗛泦杩愮畻灞忎繚 +void DrawIntensiveComputing() { + //鍏抽棴鍔犵儹 +#if UsePMOS + analogWrite(CONTROL_PIN, 0); +#else + analogWrite(CONTROL_PIN, 255); +#endif + float calculate; + // while (1) { + arduboy.clear(); + + //闅忔満绾挎潯 + DrawIntensiveComputingLine(); + + calculate = sin(millis() / 4000.0); + //妯℃嫙鍣偣 + for (int i = 0; i < calculate * 256 + 256; i++) arduboy.drawPixel(random(0, 128), random(0, 64), 1); + //澹版晥 + if ((BeepEnable)) analogWrite(BUZZER_PIN, 64 + calculate * 64 + random(-8, 8)); + //if ((BeepEnable)) tone(BUZZER_PIN, int(calculate * 300) + 500 + random(-50, 50)); //娌″繀瑕佹氮璐瑰唴瀛 + + arduboy.display(); + //delay(60-calculate*30); + //} +} +//缁樺埗灞忎繚-瀵嗛泦杩愮畻绾挎潯 +void DrawIntensiveComputingLine() { + for (byte a = 0; a < 4; a++) { + Line[a] += random(-1, 1); + if (Line[a] > 128) Line[a] -= 128; + for (byte b = 0; b < random(3, 6); b++) { + arduboy.drawFastHLine(0, Line[a] + random(-10, 10), 128, 1); //姘村钩绾 + arduboy.drawFastVLine(Line[a] + random(-10, 10), 0, 64, 1); //鍨傜洿绾 + } + } +} +//妯℃嫙鏁板瓧婊氳疆 Numerical scrolling effect +void DisplayNum(int Num) { + arduboy.setTextSize(6); + SetTextColor(0); + //鏁板瓧婊氳疆 + for (byte i = 0; i < 3; i++) LastValue[i] = int(Value / pow(10, 2 - i)) % 10; + Value = Num; + for (byte i = 0; i < 3; i++) { + SlidingAnimationY[i] += ((int(Value / pow(10, 2 - i)) % 10) - 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); + } + } + //鍒诲害鏍 + arduboy.fillRect(0, 0, 128, 2, 0); //涓婇伄缃╁眰 + arduboy.fillRect(0, 48, 128, 16, 0); //涓嬮伄缃╁眰 +} + +//鏁板艰緭鍏ョ晫闈 +// input value screen +uint16_t InputScreen(byte appID) { + lastbutton = (!digitalRead(BUTTON_PIN)); + do { + arduboy.clear(); + DisplayNum(getRotary()); + DrawAppText(appID); + arduboy.display(); + CheckLastButton(); + } while (digitalRead(BUTTON_PIN) || lastbutton); + beep(); + return Value; +} + +//璁剧疆寮鏈哄瘑鐮 +void PasswordSet() { + Password = InputBigNum(Password, 8); + beep(); +} + +void BootPassword() { + if (Password != 0) { + do { + arduboy.clear(); + DrawApp(40, 8); + DrawAppText(8); + arduboy.display(); + delay(1000); + beep(); beep(); beep(); + } while (InputBigNum(0, 8) != Password); + } +} + +//娆犲帇鎶ヨ璁剧疆 +// information display screen +void UnderVoltageSet() { + setRotary(0, 250, 1, UnderVoltage); + UnderVoltage = InputScreen(7); + 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 { + //beep(0); + 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; + beep(); + ShowPTemp(&PTemp[CurrentTip][0]); + + +} + +//娓╁害鏍″噯鐣岄潰 +// temperature calibration screen +void CalibrationScreen() { + float P[4]; + int xx[9]; + for (int CalStep = 0; CalStep < 9; CalStep++) { + if (CalStep != 0) setRotary(0, 1023, 1, xx[CalStep - 1]); else setRotary(0, 1023, 1, 0); + BeepIfWorky = true; + lastbutton = (!digitalRead(BUTTON_PIN)); + do { + arduboy.clear(); + arduboy.setTextSize(1); + SENSORCheck(); //璇诲彇浼犳劅鍣 + SetTemp = getRotary(); + Thermostat(1); //鍔犵儹鎺у埗 - ADC鏁板间负鍩哄噯 + + arduboy.setCursor(8, 0); + arduboy.print(F("Cal ADC-> ")); + arduboy.print(RawTemp); + + for (byte y = 0; y < 5; y++) { + for (byte x = 0; x < 2; x++) { + if (2 * y + x > CalStep) break; + arduboy.setCursor(x * 64 + 4, y * 8 + 16); + arduboy.print(CalTemp[2 * y + x]); + arduboy.print(F(" - ")); + if (2 * y + x == CalStep) arduboy.print(getRotary()); + else arduboy.print(xx[2 * y + x]); + } + } + + CheckLastButton(); + arduboy.display(); + } while (digitalRead(BUTTON_PIN) || lastbutton); + xx[CalStep] = getRotary(); + beep(); delay (10); + } + + //鍏抽棴鍔犵儹 +#if UsePMOS + analogWrite(CONTROL_PIN, 0); +#else + analogWrite(CONTROL_PIN, 255); +#endif + delayMicroseconds(Time2settle); // wait for voltage to settle + bool pass = true; + for (int i = 0; i < 8; i++) if (xx[i] + 5 >= xx[i + 1]) pass = false; + if (pass) { + MenuLevel = 7; + free(&pass); + polyfit(9, xx, CalTemp, 3, P); //鎷熷悎绋嬪簭 + free(xx); + ShowPTemp(&P[0]); + if (MenuScreen(0)) { + for (uint8_t i = 0; i < 4; i++) PTemp[CurrentTip][i] = P[i]; //鍐欏叆鎷熷悎绯绘暟 + free(P); + } + } else { + arduboy.clear(); + arduboy.setCursor(0, 24); arduboy.print(F("ERROR")); + arduboy.display(); + delay(5000); + } +} +//鏄剧ず榛樿鐑欓搧澶存俯搴︽洸绾跨郴鏁 +void ShowPTemp(float *p) { + arduboy.clear(); + arduboy.setTextSize(1); + for (int i = 0; i < 4; i++) { + arduboy.setCursor(12, i * 8 + 16); + arduboy.print(F("P[")); + arduboy.print(i, 7); + arduboy.print(F("] = ")); + arduboy.print(*p, 7); + p++; + } + arduboy.display(); + lastbutton = (!digitalRead(BUTTON_PIN)); + while (digitalRead(BUTTON_PIN) || lastbutton) CheckLastButton(); + +} +//鍛藉悕鐣岄潰 鏂囨湰杈撳叆鐣岄潰 +// 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]; + } + } + NumberOfTips--; + } +} + +//鏂板缓鐑欓搧 棰勮 +// add new tip screen +void AddTipScreen() { + if (NumberOfTips < TIPMAX) { + CurrentTip = NumberOfTips++; InputNameScreen(); + PTemp[CurrentTip][0] = TempP1; + PTemp[CurrentTip][1] = TempP2; + PTemp[CurrentTip][2] = TempP3; + PTemp[CurrentTip][3] = TempP4; + } +} + +int InputBigNum(int InputPW, byte appID) { + setRotary(0, 900, 100, InputPW); + InputPW = InputScreen(appID); + setRotary(InputPW, InputPW + 90, 10, InputPW); + InputPW = InputScreen(appID); + setRotary(InputPW, InputPW + 9, 1, InputPW); + InputPW = InputScreen(appID); + return InputPW; +} +void QRcodeScreen() { + arduboy.clear(); + arduboy.drawSlowXYBitmap(40, 0, QRCode, 48, 48, 1); + arduboy.display(); + delay(100); + do { + } while (digitalRead(BUTTON_PIN) || lastbutton); + beep(); +} + +//浣嶅浘缂╂斁 浠g爜鐗囨鏀硅嚜arduboy2 +void drawSlowXYBitmapResize(int x, int y, const uint8_t *bitmap, uint8_t w, uint8_t h, uint8_t size, uint8_t color) { + int16_t xi, yi, byteWidth = (w + 7) / 8; + for (yi = 0; yi < h; yi ++) { + for (xi = 0; xi < w; xi ++) { + if (pgm_read_byte(bitmap + yi * byteWidth + xi / 8) & (128 >> (xi & 7))) { + arduboy.fillRect(x + xi * size, y + yi * size, size, size, color); + } + } + } +} + +//缈昏浆 +void Flip(bool Fmode) { + arduboy.flipVertical(Fmode); + arduboy.flipHorizontal(Fmode); +} + +//灞曠ず鐗堟湰鍙 +void ShowVersion() { + arduboy.clear(); + arduboy.setCursor(43, 28); + arduboy.print(F(VERSION)); + arduboy.display(); + delay(1000); +} diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/WDT.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/WDT.ino new file mode 100644 index 0000000..6fd9c38 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t6/WDT.ino @@ -0,0 +1,54 @@ +//********** 鐪嬮棬鐙楀嚱鏁 ********** +void set_wdt_mod(uint8_t mod, uint8_t ii) //妯″紡锛岃秴鏃舵椂闂 +{ + /* + WDCE + 璇ヤ綅鍦ㄥ畾鏃跺簭鍒椾腑鐢ㄤ簬鏇存敼WDE鍜岄鍒嗛鍣ㄤ綅 + 瑕佹竻闄DE浣嶆垨鏇存敼棰勫垎棰戝櫒浣嶏紝蹇呴』灏哤DCE缃1銆 + 涓鏃﹀啓鍏1锛岀‖浠跺皢鍦ㄥ洓涓椂閽熷懆鏈熷悗娓呴櫎WDCE銆 + 0=16ms,1=32ms,2=64ms,3=128ms,4=250ms + 5=500ms,6=1s,7=2s,8=4s,9=8s + */ + if (ii > 9 ) ii = 9; + byte bb; + bb = ii & 7; + if (ii > 7) bb |= (1 << 5); + bb |= (1 << WDCE); + + switch (mod) { + case 0: //鍏抽棴鐪嬮棬鐙 + __asm__ __volatile__ ("wdr"); //鐪嬮棬鐙楀浣 + MCUSR = 0x00; //鐪嬮棬鐙楀浣嶆爣蹇楁竻闆 + WDTCSR = (1 << WDCE) | (1 << WDE); //鎵撳紑鍏佽淇敼浣胯兘锛屽苟WDE缃1 + WDTCSR = 0x00; //娓呴櫎鎵鏈夐鍒嗛浣 + break; + + case 1: //鎵撳紑鐪嬮棬鐙楋紝璁剧疆澶嶄綅妯″紡 + __asm__ __volatile__ ("wdr"); //鐪嬮棬鐙楀浣 + MCUSR &= ~(1 << WDRF); //MUUSR涓殑WDRF娓呴浂锛屾竻闄ゅ浣嶆爣蹇 + WDTCSR |= (1 << WDCE) | (1 << WDE); //鎵撳紑鍏佽淇敼浣胯兘锛屽苟WDE缃1 + //璁剧疆鏂扮殑鐪嬮棬鐙楄秴鏃跺糱b + WDTCSR = bb; //8绉掓椂bb=0011 0001 + WDTCSR |= _BV(WDE); //璁剧疆澶嶄綅妯″紡 + break; + + case 2: //鎵撳紑鐪嬮棬鐙楋紝璁剧疆涓柇妯″紡 + __asm__ __volatile__ ("wdr"); //鐪嬮棬鐙楀浣 + MCUSR &= ~(1 << WDRF); //MUUSR涓殑WDRF娓呴浂锛屾竻闄ゅ浣嶆爣蹇 + WDTCSR |= (1 << WDCE) | (1 << WDE); //鎵撳紑鍏佽淇敼浣胯兘锛屽苟WDE缃1 + //璁剧疆鏂扮殑鐪嬮棬鐙楄秴鏃跺糱b + WDTCSR = bb; //8绉掓椂bb=0011 0001 + WDTCSR |= _BV(WDIE); //璁剧疆涓柇妯″紡 + break; + + case 3: //鎵撳紑鐪嬮棬鐙楋紝璁剧疆涓柇鍜屽浣嶆ā寮 + __asm__ __volatile__ ("wdr"); //鐪嬮棬鐙楀浣 + MCUSR &= ~(1 << WDRF); //MUUSR涓殑WDRF娓呴浂锛屾竻闄ゅ浣嶆爣蹇 + WDTCSR |= (1 << WDCE) | (1 << WDE); //鎵撳紑鍏佽淇敼浣胯兘锛屽苟WDE缃1 + //璁剧疆鏂扮殑鐪嬮棬鐙楄秴鏃跺糱b + WDTCSR = bb; //8绉掓椂bb=0011 0001 + WDTCSR |= _BV(WDIE); //璁剧疆涓柇妯″紡 + WDTCSR |= _BV(WDE); //璁剧疆澶嶄綅妯″紡 + break; + } +} diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/.vscode/arduino.json b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/.vscode/arduino.json new file mode 100644 index 0000000..dee23d3 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/.vscode/arduino.json @@ -0,0 +1,6 @@ +{ + "board": "arduino:avr:uno", + "programmer": "Arduino as ISP", + "port": "COM3", + "sketch": "1.8t6.ino" +} \ No newline at end of file diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/.vscode/c_cpp_properties.json b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..42a0f21 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/.vscode/c_cpp_properties.json @@ -0,0 +1,25 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "D:/Program Files (x86)/Arduino/libraries", + "D:/Program Files (x86)/Arduino/hardware/arduino/avr/**", + "D:/Program Files (x86)/Arduino/hardware/tools/avr/avr/include", + "D:/Program Files (x86)/Arduino/hardware/tools/avr/lib/gcc/avr/7.3.0/include", + "D:/Program Files (x86)/Arduino/hardware/tools/avr/lib/gcc/avr/7.3.0/include-fixed", + "D:/Program Files (x86)/Arduino/tools/**", + "D:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\**", + "D:\\Program Files (x86)\\Arduino\\tools\\**" + ], + "forcedInclude": [ + "D:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino\\Arduino.h" + ], + "intelliSenseMode": "msvc-x64", + "compilerPath": "D:\\mingw64\\bin\\gcc.exe", + "cStandard": "gnu17", + "cppStandard": "gnu++14" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/.vscode/launch.json b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/.vscode/launch.json new file mode 100644 index 0000000..f2c6fe4 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/.vscode/launch.json @@ -0,0 +1,29 @@ +{ + // 浣跨敤 IntelliSense 浜嗚В鐩稿叧灞炴с + // 鎮仠浠ユ煡鐪嬬幇鏈夊睘鎬х殑鎻忚堪銆 + // 娆蹭簡瑙f洿澶氫俊鎭紝璇疯闂: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "g++.exe - 鐢熸垚鍜岃皟璇曟椿鍔ㄦ枃浠", + "type": "cppdbg", + "request": "launch", + "program": "${fileDirname}\\${fileBasenameNoExtension}.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "D:\\mingw64\\bin\\gdb.exe", + "setupCommands": [ + { + "description": "涓 gdb 鍚敤鏁撮綈鎵撳嵃", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "preLaunchTask": "C/C++: g++.exe build active file" + } + ] +} \ No newline at end of file diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/.vscode/tasks.json b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/.vscode/tasks.json new file mode 100644 index 0000000..abb1243 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/.vscode/tasks.json @@ -0,0 +1,27 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: g++.exe build active file", + "command": "D:\\mingw64\\bin\\g++.exe", + "args": [ + "-g", + "${file}", + "-o", + "${fileDirname}\\${fileBasenameNoExtension}.exe" + ], + "options": { + "cwd": "D:\\mingw64\\bin" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Generated task by Debugger" + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/1.8t7.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/1.8t7.ino new file mode 100644 index 0000000..2751cd2 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/1.8t7.ino @@ -0,0 +1,328 @@ +/*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. +// 姝1.8t6鐗堟湰鍔熻兘绠浠 +// This 1.8t5 version of the code implements: +// - 鐑欓搧澶存俯搴﹀疄鏃剁洃娴 +// - Temperature measurement of the tip +// - PID娓╁害鎺у埗 +// - 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 +// - 鍦∣LED涓婂疄鐜颁俊鎭樉绀 +// - Information display on OLED +// - 鏀寔鏃犳簮铚傞福鍣 +// - Buzzer +// - 鍏佽璁剧疆涓嶅悓鐑欓搧澶寸殑娓╁害鏍″噯鍊 +// - Calibrating and managing different soldering tips +// - 璁剧疆琚繚瀛樺湪EEPROM锛屾帀鐢典笉涓㈠け +// - Storing user settings into the EEPROM +// - 鍏佽鐑彃鎷旂儥閾佸ご锛屽苟寮瑰嚭鐑欓搧澶撮厤缃夋嫨鑿滃崟 +// - Tip change detection +// - 鑺墖杩囩儹浠ュ強浣庣數鍘嬫姤璀 +// - Chip overheating and low voltage alarm +// - 鏇村ソ鐨勫疄鏃舵俯搴︽潯浠ュ強瀹炴椂鍔熺巼鏉 +// - Better real-time temperature bar and real-time power bar +// - 鎷ユ湁杩囨浮鍔ㄧ敾 +// - Have transition animation +// - 鍐呯疆灞忓箷淇濇姢绋嬪簭 +// - Built in screen saver +// - 灞忓箷缈昏浆璁剧疆 +// - Screen flip settings +// - 鍐呯疆鑻辨枃銆佷腑鏂囥佹棩鏂囪瑷鍖 +// - Built in English, Chinese and Japanese language pack +// - 寮鏈哄瘑鐮佽缃 +// - System Password +// - 鍏佽璁剧疆鏃嬮挳鏂瑰悜 +// - Knob direction setting menu +// - 鍐呭祵鐪嬮棬鐙楋紝瀹曟満鑷姩閲嶅惎 +// - Watchdog timer automatic reset the MCU + +// 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 銆乴ihaoyun6 +// Project Page: https://easyeda.com/wagiminator + + +bool lastbutton; +#include //娉ㄦ剰 杩欓噷浣跨敤琚槈鍓茬殑鍥惧舰搴擄紝鍙湁缁樺浘鍔熻兘锛屽苟闈為氱敤鐨勭増鏈 +Arduboy2 arduboy; + +#include +#include +#include +// Firmware version +#define VERSION "v1.8t7" + +// 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 100 // 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 TEMPCHP 30 // chip temperature while calibration +#define TIPMAX 30 // max number of tips +#define TIPNAMELENGTH 6 // max length of tip names (including termination) +#define TIPNAME "SZtip" // 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 false // enable/disable buzzer +#define MAINSCREEN 1 // type of main screen (0: big numbers; 1: more infos) + +// EEPROM identifier +#define EEPROM_IDENT 0x140B // to identify if EEPROM was written by this program + +//Beep +#define SetBeepCoolTime 200 +unsigned long BeepCoolTime; + +// 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; + +//娓╁害鎷熷悎 +#define TempP1 10.2675914764 +#define TempP2 1.7323191166 +#define TempP3 -0.0033245713 +#define TempP4 0.0000045338 +float PTemp[4] = {TempP1, TempP2, TempP3, TempP4}; //娓╁害鎷熷悎绯绘暟 +const uint16_t CalTemp[9] = {50,100,150,200,250,300,350,400,450}; +char TipName[TIPNAMELENGTH] = {TIPNAME}; +uint8_t CurrentTip = 0; +uint8_t NumberOfTips = 1; + +// 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; +//娆犲帇鎶ヨ +byte UnderVoltage = 0; +// Control variables +uint16_t Time2settle = 300; + +//妯℃嫙鏁板瓧婊氳疆 Numerical scrolling effect +int Value; +int LastValue[3]; +int SlidingAnimationY[3]; + +//寮鏈哄瘑鐮 BootPassword +int Password = 0; + +//灞忓箷淇濇姢-涓婚锛氬瘑闆嗚繍绠 +byte Line[4]; + +//缂栫爜鍣ㄦ棆杞皟鏁存柟鍚戣瀹 +bool RotaryD = false; + +//寮鏈洪潪绾挎у姩鐢 +byte BootAnimationY=64; + +// Specify the links and initial PID tuning parameters +PID ctrl(&Input, &Output, &Setpoint, aggKp, aggKi, aggKd, REVERSE); + +//NMOS - PMOS杞欢鍒囨崲 +#define UsePMOS false + +//LANG 璇█鏀寔 +/* 0 - 涓枃 CHINESE + 1 - 鑻辨枃 ENGLISH + 2 - 鏃ヨ x (姝ょ増鏈笉鏀寔) +*/ +byte LANG = 0; + + + +void setup() { + //璁剧疆鐪嬮棬鐙楄嚜鍔ㄥ浣 + set_wdt_mod(3, 7); + + //鍚姩arduboy鍐呮牳 + arduboy.begin(); + arduboy.setFrameRate(30); + + //Serial.begin(115200); + + // set the pin modes + //璁剧疆IO + 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); +#if UsePMOS + analogWrite(CONTROL_PIN, 0); +#else + analogWrite(CONTROL_PIN, 255); // this shuts off the heater +#endif + digitalWrite(BUZZER_PIN, LOW); // must be LOW when buzzer not in use + + //鍒濆鍖朅DC + //setup ADC + ADCSRA |= bit (ADPS0) | bit (ADPS1) | bit (ADPS2); // set ADC prescaler to 128 + ADCSRA |= bit (ADIE); // enable ADC interrupt + interrupts (); // enable global interrupts + + //鍒濆鍖栫紪鐮佸櫒IO + // 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 + + //浠嶦EPROM璇诲彇璁剧疆 + // get default values from EEPROM + GetEEPROM(); + + //璁剧疆灞忓箷鍙嶈浆鐘舵 + Flip(FlipState); + + //璁剧疆灞忓箷浜害 + SetOLEDLightLevel(32); //闄嶄綆灞忓箷浜害 寤堕暱OLED浣跨敤瀵垮懡 + + //鍒濆鍖栧睆骞曚繚鎶ゅ姩鐢 + for (byte a = 0; a < 4; a++) Line[a] = 32 * a; + + //瀵嗙爜淇濇姢 + BootPassword(); + // 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 UsePMOS + if ((CurrentTemp + 20) < DefaultTemp) analogWrite(CONTROL_PIN, 255); +#else + if ((CurrentTemp + 20) < DefaultTemp) analogWrite(CONTROL_PIN, 0); +#endif + // 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(); + ShowVersion(); +} + +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(0); // heater control + MainScreen(); // updates the main page on the OLED + //beep(0); +} diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/A-BitMap.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/A-BitMap.ino new file mode 100644 index 0000000..6b763e9 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/A-BitMap.ino @@ -0,0 +1,85 @@ + +//鍏充簬鐣岄潰-椤圭洰椤甸潰浜岀淮鐮 ->涓轰簡鍔犲叆娆犲帇鎶ヨ鍙兘闃夊壊鎺夊叧浜庨〉闈㈢殑浜岀淮鐮 +//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 }; +const unsigned char QRCode[] PROGMEM = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x03, 0x86, 0x70, 0x80, 0x03, 0x80, 0x03, 0x86, 0x70, 0x80, 0x03, 0x9f, 0xf3, 0xe1, 0x30, 0x9f, 0xf3, 0x9f, 0xf3, 0xe1, 0x30, 0x9f, 0xf3, 0x98, 0x33, 0x01, 0xcc, 0x98, 0x33, 0x98, 0x33, 0x01, 0xcc, 0x98, 0x33, 0x98, 0x33, 0x87, 0xc0, 0x98, 0x33, 0x98, 0x33, 0xe1, 0xc0, 0x98, 0x33, 0x98, 0x33, 0xe1, 0xc0, 0x98, 0x33, 0x9f, 0xf3, 0x98, 0xc0, 0x9f, 0xf3, 0x9f, 0xf3, 0x98, 0xc0, 0x9f, 0xf3, 0x80, 0x03, 0x66, 0xcc, 0x80, 0x03, 0x80, 0x03, 0x66, 0xcc, 0x80, 0x03, 0xff, 0xff, 0x01, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x1f, 0xff, 0x81, 0x00, 0x61, 0x30, 0x1f, 0x3f, 0x87, 0x3c, 0xe6, 0xfc, 0x87, 0x33, 0x87, 0x3c, 0xe6, 0xfc, 0x87, 0xf3, 0xf8, 0x03, 0x9e, 0x0f, 0x1f, 0x03, 0xf8, 0x03, 0x9e, 0x0f, 0x1f, 0x03, 0xe1, 0x3c, 0xfe, 0x0c, 0x07, 0xcf, 0xe1, 0x3c, 0xfe, 0x0c, 0x07, 0xcf, 0x99, 0x03, 0x3e, 0x30, 0x86, 0xc3, 0xe6, 0xcf, 0x38, 0x0f, 0x9e, 0xf3, 0xe6, 0xcf, 0x38, 0x0f, 0x9e, 0xf3, 0x9e, 0x03, 0x27, 0xcc, 0x81, 0x03, 0x9e, 0x03, 0x27, 0xcc, 0x81, 0x03, 0xe0, 0xff, 0xe1, 0x0c, 0xe6, 0xcf, 0xe0, 0xff, 0xe1, 0x0c, 0xe6, 0xcf, 0x98, 0x03, 0x06, 0x00, 0x00, 0xff, 0x98, 0x03, 0x06, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1e, 0xf0, 0xf8, 0x03, 0x80, 0x03, 0x66, 0x30, 0x99, 0xc3, 0x80, 0x03, 0x66, 0x30, 0x99, 0xc3, 0x9f, 0xf3, 0x01, 0x0c, 0xf8, 0xff, 0x9f, 0xf3, 0x01, 0x0c, 0xf8, 0xff, 0x98, 0x33, 0x39, 0x3c, 0x01, 0xcf, 0x98, 0x33, 0x39, 0x3c, 0x01, 0xcf, 0x98, 0x33, 0xff, 0x0c, 0x79, 0x3f, 0x98, 0x33, 0x3e, 0xcc, 0xe0, 0xf3, 0x98, 0x33, 0x3e, 0xcc, 0xe0, 0xf3, 0x9f, 0xf3, 0x3e, 0x00, 0x98, 0xcf, 0x9f, 0xf3, 0x3e, 0x00, 0x98, 0xcf, 0x80, 0x03, 0x3e, 0x30, 0xe7, 0xc3, 0x80, 0x03, 0x3e, 0x30, 0xe7, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; +//ICO +//width:16,height:16 +const unsigned char Tag[] PROGMEM = { 0x00, 0x00, 0x3b, 0xec, 0x7b, 0xee, 0x63, 0xe6, 0x63, 0xe6, 0x63, 0xe6, 0x63, 0xe6, 0x63, 0xe6, 0x63, 0xe6, 0x63, 0x66, 0x62, 0x26, 0x60, 0x06, 0x60, 0x06, 0x7f, 0xfe, 0x3f, 0xfc, 0x00, 0x00 }; +const unsigned char Chip[] PROGMEM = { 0x14, 0xa0, 0x3f, 0xf0, 0x7f, 0xf8, 0xe0, 0x1c, 0x6e, 0x18, 0xec, 0x1c, 0x68, 0x18, 0x60, 0x18, 0xe0, 0x1c, 0x60, 0x58, 0xe0, 0x1c, 0x7f, 0xf8, 0x3f, 0xf0, 0x14, 0xa0 }; +//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 = { 0x0f, 0xe0, 0x1f, 0xc0, 0x1f, 0xc0, 0x3f, 0x80, 0x3f, 0xf8, 0x7f, 0xf0, 0x7f, 0xe0, 0x07, 0xc0, 0x07, 0x80, 0x0f, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x10, 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:14,height:14 鍥炬爣搴 + +const unsigned char c1[] PROGMEM = { 0x03, 0x00, 0x07, 0x80, 0x0f, 0xc0, 0x0c, 0xc0, 0x1c, 0xe0, 0x1c, 0xe0, 0x3c, 0xf0, 0x3c, 0xf0, 0x7f, 0xf8, 0x7f, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xff, 0xfc, 0x7f, 0xf8 }; +const unsigned char c2[] PROGMEM = { 0x7f, 0xf8, 0xff, 0xfc, 0xc0, 0x0c, 0xc3, 0x0c, 0xcb, 0x4c, 0xdb, 0x6c, 0xdb, 0x6c, 0xd8, 0x6c, 0xdc, 0xec, 0xcf, 0xcc, 0xc7, 0x8c, 0xc0, 0x0c, 0xff, 0xfc, 0x7f, 0xf8 }; +const unsigned char c3[] PROGMEM = { 0x00, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x18, 0xf8, 0x38, 0xf0, 0x30, 0x30, 0x70, 0x60, 0x70, 0x78, 0x78, 0xf8, 0x78, 0x00, 0x3c, 0x02, 0x3f, 0x0c, 0x1f, 0xf8, 0x0f, 0xf0, 0x03, 0xc0, 0x00, 0x00 }; +const unsigned char c5[] PROGMEM = { 0x7f, 0xf0, 0xff, 0xe0, 0xc0, 0x08, 0xc0, 0x1c, 0xc0, 0x38, 0xc8, 0x70, 0xdc, 0xe4, 0xcf, 0xcc, 0xc7, 0x8c, 0xc3, 0x0c, 0xc0, 0x0c, 0xc0, 0x0c, 0xff, 0xfc, 0x7f, 0xf8 }; +const unsigned char c6[] PROGMEM = { 0x1e, 0x10, 0x33, 0x38, 0x2d, 0x7c, 0x25, 0x38, 0x2d, 0x38, 0x25, 0x38, 0x2d, 0x38, 0x6d, 0x80, 0xde, 0xc0, 0xbf, 0x40, 0xbf, 0x40, 0xde, 0xc0, 0x61, 0x80, 0x3f, 0x00 }; +const unsigned char c7[] PROGMEM = { 0x1f, 0xe0, 0x3f, 0xf0, 0x70, 0x38, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0xff, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xf8, 0x7c, 0xf8, 0x7c, 0xfc, 0xfc, 0x7f, 0xf8 }; +const unsigned char c_NO[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x37, 0xb0, 0x23, 0x10, 0x30, 0x30, 0x38, 0x70, 0x38, 0x70, 0x30, 0x30, 0x23, 0x10, 0x37, 0xb0, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char *C_table[] = {c1, c2, c3, Lightning, c5, c6, c7}; + +//璁剧疆锛堣瑷鏄竴绉嶄綆鍍忕礌鐨勮〃杈炬柟寮,瀹规槗閫犳垚闅旈槀; 浜や簰鐣岄潰璁捐灏藉彲鑳藉舰璞″寲锛 +// width: 14, height: 14 +const unsigned char QRC[] PROGMEM = { 0x05, 0x80, 0x74, 0xb8, 0x57, 0xa8, 0x76, 0xb8, 0x05, 0x80, 0xf9, 0x7c, 0x46, 0x94, 0xaa, 0xa8, 0xf9, 0x7c, 0x06, 0x88, 0x74, 0xa8, 0x57, 0x8c, 0x75, 0x74, 0x06, 0x98 }; +const unsigned char Set0[] PROGMEM = { 0x88, 0x24, 0x08, 0x20, 0x38, 0x30, 0x38, 0x30, 0x38, 0x30, 0x38, 0x30, 0x38, 0x30, 0x38, 0x30, 0x39, 0x30, 0x3b, 0xb0, 0x3f, 0xf0, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set1[] PROGMEM = { 0xf8, 0x7c, 0xf3, 0x3c, 0xf4, 0xbc, 0xf6, 0xbc, 0xf4, 0xbc, 0xf6, 0xbc, 0xf4, 0xbc, 0xe4, 0x9c, 0xc8, 0x4c, 0xd0, 0x2c, 0xd0, 0x2c, 0xc8, 0x4c, 0xe7, 0x9c, 0xf0, 0x3c }; +const unsigned char Set2[] PROGMEM = { 0x8f, 0xc4, 0x10, 0x20, 0x20, 0x10, 0x4c, 0xc8, 0x9f, 0xe4, 0x3d, 0xf0, 0x3d, 0xf0, 0x1d, 0xe0, 0x3e, 0xf0, 0x3f, 0x70, 0x9f, 0xe4, 0x8c, 0xc4, 0x00, 0x00, 0x30, 0x30 }; +const unsigned char Set3[] PROGMEM = { 0xc3, 0xfc, 0x18, 0x00, 0x18, 0x00, 0xc3, 0xfc, 0xff, 0xfc, 0xff, 0x0c, 0x00, 0x60, 0x00, 0x60, 0xff, 0x0c, 0xff, 0xfc, 0xf0, 0xfc, 0x06, 0x00, 0x06, 0x00, 0xf0, 0xfc }; +const unsigned char Set4[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set4F[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x38, 0x30, 0x33, 0x10, 0x3f, 0x90, 0x38, 0x10, 0x33, 0x90, 0x27, 0x90, 0x26, 0x10, 0x30, 0x90, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set4FF[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x24, 0x30, 0x21, 0x90, 0x27, 0x90, 0x27, 0x30, 0x20, 0x70, 0x27, 0xf0, 0x23, 0x30, 0x30, 0x70, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set5[] PROGMEM = { 0xfc, 0xfc, 0xf8, 0x7c, 0xe0, 0x1c, 0xc0, 0x0c, 0xc0, 0x0c, 0xc0, 0x0c, 0xc0, 0x0c, 0xc0, 0x0c, 0xc0, 0x0c, 0x80, 0x04, 0x80, 0x04, 0xff, 0xfc, 0xf8, 0x7c, 0xfc, 0xfc }; +const unsigned char Set5_1[] PROGMEM = { 0xfc, 0xf4, 0xf8, 0x60, 0xe0, 0x44, 0xc0, 0x8c, 0xc1, 0x1c, 0xc2, 0x2c, 0xc4, 0x4c, 0xc8, 0x8c, 0xd1, 0x0c, 0xa2, 0x04, 0xc4, 0x04, 0x8f, 0xfc, 0x18, 0x7c, 0xbc, 0xfc }; +const unsigned char Set6[] PROGMEM = { 0xf8,0x7c,0xc0,0x0c,0xc0,0x0c,0xcf,0xcc,0xcf,0xcc,0xcf,0xcc,0xcf,0xcc,0xcf,0xcc,0xcf,0xcc,0xc8,0x4c,0xc8,0x4c,0xcf,0xcc,0xc0,0x0c,0xc0,0x0c }; +const unsigned char Set_LANG[] PROGMEM = { 0xf0, 0x3c, 0xce, 0x4c, 0xbc, 0x34, 0xb8, 0x14, 0x18, 0x80, 0x10, 0x80, 0x42, 0x30, 0x60, 0x78, 0x60, 0xf8, 0x44, 0xc0, 0x80, 0x04, 0xb8, 0x84, 0xcf, 0xcc, 0xf0, 0x3c }; +const unsigned char Set7[] PROGMEM = { 0x80, 0x0c, 0x00, 0x1c, 0x3f, 0xf4, 0x3f, 0xe0, 0x3f, 0xc4, 0x37, 0x8c, 0x23, 0x18, 0x30, 0x30, 0x38, 0x70, 0x3c, 0xf0, 0x3f, 0xf0, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set11[] PROGMEM = { 0xf3, 0xfc, 0xe7, 0xfc, 0xce, 0x0c, 0x8e, 0x1c, 0x9f, 0x9c, 0x1f, 0x3c, 0x1f, 0x0c, 0x0e, 0x0c, 0x0f, 0xfc, 0x87, 0xf8, 0x81, 0xe4, 0xc0, 0x0c, 0xe0, 0x1c, 0xf8, 0x7c }; +const unsigned char Set8[] PROGMEM = { 0x81, 0xdc, 0x55, 0x9c, 0x29, 0x04, 0x55, 0x00, 0x29, 0x90, 0x55, 0xd0, 0x03, 0xfc, 0xff, 0x00, 0x2e, 0x00, 0x26, 0x70, 0x02, 0x50, 0x82, 0x70, 0xe6, 0x00, 0xee, 0x04 }; +const unsigned char Set9[] PROGMEM = { 0xf0, 0x3c, 0xce, 0x0c, 0xbf, 0x04, 0xb3, 0x04, 0x73, 0x00, 0x7f, 0x00, 0x7e, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x60, 0xbc, 0x64, 0xbe, 0x04, 0xcf, 0x0c, 0xf0, 0x3c }; +const unsigned char Set10[] PROGMEM = { 0xf8, 0x7c, 0xf7, 0xbc, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 0xbf, 0xf4, 0xab, 0x54, 0xab, 0x54, 0xab, 0x54, 0xab, 0x54, 0xab, 0x54, 0xab, 0x54, 0xbf, 0xf4, 0xc0, 0x0c }; +const unsigned char Set13[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x3c, 0xf0, 0x34, 0xb0, 0x24, 0x90, 0x24, 0x90, 0x27, 0x90, 0x23, 0x10, 0x30, 0x30, 0x38, 0x70, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set12[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x3c, 0xf0, 0x3c, 0xf0, 0x3c, 0xf0, 0x20, 0x10, 0x20, 0x10, 0x3c, 0xf0, 0x3c, 0xf0, 0x3c, 0xf0, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Set14[] PROGMEM = { 0xff, 0x7c, 0xfe, 0x7c, 0xfc, 0xec, 0xe8, 0xdc, 0xc8, 0x4c, 0x98, 0x4c, 0x88, 0x24, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0xe0, 0x1c }; +const unsigned char Set15[] PROGMEM = { 0x15, 0x54, 0x3f, 0xfc, 0x15, 0x54, 0x3f, 0xfc, 0x15, 0x54, 0x3c, 0x04, 0x14, 0x04, 0x3c, 0xfc, 0x14, 0x54, 0x3c, 0xfc, 0x00, 0x54, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00 }; +const unsigned char Set16[] PROGMEM = { 0x15, 0x54, 0x3f, 0xf8, 0x15, 0x50, 0x3f, 0xf0, 0x15, 0x50, 0x38, 0x70, 0x10, 0x20, 0x31, 0x04, 0x13, 0x8c, 0x22, 0xa8, 0x17, 0xfc, 0x2a, 0xa8, 0x00, 0x00, 0x00, 0x00 }; +const unsigned char Set17[] PROGMEM = { 0x80, 0x00, 0xbf, 0xf8, 0x1f, 0xf8, 0xb0, 0x08, 0x18, 0x08, 0xb9, 0xe8, 0x19, 0xb8, 0xb8, 0x38, 0x18, 0x38, 0xb9, 0xb8, 0xb9, 0xf8, 0xb0, 0xf8, 0xbf, 0xf8, 0x80, 0x00 }; +const unsigned char Set18[] PROGMEM = { 0x80, 0x00, 0xbf, 0xf8, 0x1f, 0xf8, 0xb0, 0x28, 0x1f, 0xf8, 0xb4, 0x08, 0x1f, 0xf8, 0xb1, 0x08, 0x1f, 0xf8, 0xb0, 0x48, 0xbf, 0xf8, 0xb2, 0x88, 0xbf, 0xf8, 0x80, 0x00 }; +const unsigned char Lang_CN[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x3c, 0xf0, 0x3c, 0xf0, 0x20, 0x10, 0x24, 0x90, 0x24, 0x90, 0x20, 0x10, 0x3c, 0xf0, 0x3c, 0xf0, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Lang_EN[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x38, 0x70, 0x30, 0x30, 0x23, 0x10, 0x27, 0x90, 0x20, 0x10, 0x20, 0x10, 0x27, 0x90, 0x27, 0x90, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Lang_JP[] PROGMEM = { 0x80, 0x04, 0x00, 0x00, 0x3f, 0xf0, 0x3d, 0xf0, 0x20, 0x10, 0x3b, 0xf0, 0x3b, 0x70, 0x30, 0x30, 0x2b, 0x50, 0x2a, 0xd0, 0x31, 0xb0, 0x3f, 0xf0, 0x00, 0x00, 0x80, 0x04 }; +const unsigned char Save[] PROGMEM = { 0x00, 0x04, 0x58, 0x08, 0x58, 0x08, 0x58, 0x08, 0x40, 0x08, 0x7f, 0xf8, 0x60, 0x18, 0x5f, 0xe8, 0x5b, 0x68, 0x5f, 0xe8, 0x5b, 0x68, 0x1c, 0xe8, 0x5f, 0xe8, 0x00, 0x00 }; +const unsigned char Lock[] PROGMEM = { 0xe0, 0x1c, 0xc0, 0x0c, 0x8f, 0xc4, 0x9f, 0xe4, 0x9f, 0xe4, 0x9f, 0xe4, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x07, 0x80, 0x07, 0x80, 0x03, 0x00, 0x80, 0x04 }; +const unsigned char Set19[] PROGMEM = { 0xf8, 0x7c, 0x80, 0x04, 0xbc, 0xf4, 0x3f, 0xf0, 0x38, 0x70, 0xb7, 0xb4, 0xb6, 0xb4, 0xb5, 0xb4, 0xb7, 0xb4, 0x38, 0x70, 0x3f, 0xf0, 0xbc, 0xf4, 0x80, 0x04, 0xf8, 0x7c }; +#if LANG_JP_State +const unsigned char *Ico_table[] = { + Set0, Set1, Set2, Set3, Set4, Set5, Set19, Set6, Lock, Set_LANG, QRC, Set7, + Set8, Set9, Set0, Set10, Set12, Set7, + Set0, Set11, Set14, Save, + Set11, Set13, Set14, Save, + Set15, Set16, + Set17, Set18, //5 + Set5_1, Set5, + c_NO, Set7, + Lang_CN, Lang_EN, Lang_JP, //8 + Set4, Set4F, Save, +}; +#else +const unsigned char *Ico_table[] = { + Set0, Set1, Set2, Set3, Set4, Set5, Set19, Set6, Lock, Set_LANG, QRC, 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, Set7, + Lang_CN, Lang_EN,c_NO, //8 + Set4, Set4F, Save, +}; +#endif +const byte Menu_table[] = {12, 6, 4, 4, 2, 2, 2, 2, 3, 3}; //鑿滃崟 鏍囩 娓╂帶 瀹氭椂 鎺у埗鏂瑰紡 棣栭〉 铚傞福鍣 鏍囩鍒犻櫎纭鐣岄潰 璇█鑿滃崟 缈昏浆 鏄剧ず +byte MenuLevel = 0; //鑿滃崟灞傜骇 diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/B-Lang.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/B-Lang.ino new file mode 100644 index 0000000..7944797 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/B-Lang.ino @@ -0,0 +1,824 @@ +#define LANG_JP_State false +/*//////////////////////////////////////////////////////////////////////////////////////////////////// + 澶氳瑷鏀寔 + Multilingual support + /////////////////////////////////////////////////////////////////////////////////////////////////// +*/ +/* + 鑻辫搴 ENGLISH +*/ +const char EN_0[] PROGMEM = "Tip"; +const char EN_1[] PROGMEM = "Temp"; +const char EN_2[] PROGMEM = "Timer"; +const char EN_3[] PROGMEM = "Control"; +const char EN_4[] PROGMEM = "Screen"; +const char EN_5[] PROGMEM = "Buzzer"; +const char EN_6[] PROGMEM = "LOW Vol"; +const char EN_7[] PROGMEM = "Lang"; +const char EN_8[] PROGMEM = "Return"; +const char EN_9[] PROGMEM = "Change"; +const char EN_10[] PROGMEM = "Calibrate"; +const char EN_11[] PROGMEM = "Rename"; +const char EN_12[] PROGMEM = "Delete"; +const char EN_13[] PROGMEM = "Add"; +const char EN_14[] PROGMEM = "Save"; +const char EN_15[] PROGMEM = "Default"; +const char EN_16[] PROGMEM = "Sleep"; +const char EN_17[] PROGMEM = "Boost"; +const char EN_18[] PROGMEM = "Save"; +const char EN_19[] PROGMEM = "Sleep"; +const char EN_20[] PROGMEM = "Off"; +const char EN_21[] PROGMEM = "Boost"; +const char EN_22[] PROGMEM = "Save"; +const char EN_23[] PROGMEM = "Direct"; +const char EN_24[] PROGMEM = "PID"; +const char EN_25[] PROGMEM = "Big"; +const char EN_26[] PROGMEM = "Infos"; +const char EN_27[] PROGMEM = "OFF"; +const char EN_28[] PROGMEM = "ON"; +const char EN_29[] PROGMEM = "NO"; +const char EN_30[] PROGMEM = "YES"; +const char EN_31[] PROGMEM = "CN"; +const char EN_32[] PROGMEM = "EN"; +const char EN_33[] PROGMEM = "NO"; +const char EN_34[] PROGMEM = "OK"; +const char EN_35[] PROGMEM = "Main Screen"; +const char EN_36[] PROGMEM = "Flip"; +const char EN_37[] PROGMEM = "Save"; +const char EN_38[] PROGMEM = "About"; +const char EN_39[] PROGMEM = "JP"; +const char EN_40[] PROGMEM = "Lock"; +const char EN_41[] PROGMEM = "Rotary"; + +const char *const EN_table[] PROGMEM = {EN_0, EN_1, EN_2, EN_3, EN_4, EN_5, EN_41, EN_6, EN_40, EN_7, EN_38, EN_8, EN_9, EN_10, EN_11, EN_12, EN_13, EN_8, EN_15, EN_16, EN_17, EN_18, EN_19, EN_20, EN_21, EN_22, EN_23, EN_24, EN_25, EN_26, EN_27, EN_28, EN_29, EN_30, EN_31, EN_32, EN_39, EN_35, EN_36, EN_37,}; + +/* + #!/usr/bin/python + # -*- coding: UTF-8 -*- + for num in range(0,38): + print("EN_",end="") + print(num,end='') + print(",",end="") +*/ + +/*//////////////////////////////////////////////////////////////////////////////////////////////////// + 澶氳瑷鏀寔 + Multilingual support + /////////////////////////////////////////////////////////////////////////////////////////////////// +*/ + +/* + 涓枃璇█搴 CHINESE + + //////////////////////////////////////////////////////////////////////////////////////////////////////// + 鏈湴鍖栨彁绀猴細浣犲彲浠ユ寜鐓т綅鍥剧殑澶у皬锛屾妸杩欓噷鐨勬枃瀛椾綅鍥炬浛鎹㈡垚浣犵殑璇█锛岀‘淇濅綅鍥惧垎杈ㄧ巼涓鑷村嵆鍙紝鎴戜滑娆㈣繋浣犳妸绋嬪簭缈昏瘧涓轰綘褰撳湴鐨勮瑷锛 + Localization tips: you can according to the size of the bitmap, + replace the text bitmap here with your language, + ensure that the bitmap resolution is consistent, + we welcome you to translate the program into your local language! + //////////////////////////////////////////////////////////////////////////////////////////////////////// +*/ +//width:28,height:14 涓荤晫闈腑鏂囨彁绀 +//Main Screen +//閿欒-ERROR +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 }; +//鍏虫満-OFF +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 }; +//浼戠湢-SLEEP +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 }; +//鎻愭俯-BOOST +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 }; +//姝e父宸ヤ綔-WORKY +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 }; +//鍔犵儹-HEAT +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 }; +//缁存寔-HOLD +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:36,height:16 +//MENU Oj +/* + The order here(鈫) can refer to EN_table(鈫戔啈鈫) +*/ +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, 0x00, 0x0f, 0xfe, 0x00, 0x01, 0x00, 0x08, 0x20, 0x00, 0x03, 0xff, 0x08, 0x20, 0x00, 0x02, 0x01, 0x08, 0x20, 0x00, 0x04, 0x22, 0x08, 0x20, 0x00, 0x08, 0x20, 0x0b, 0xfe, 0x00, 0x10, 0x20, 0x08, 0x20, 0x00, 0x00, 0x50, 0x08, 0x28, 0x00, 0x00, 0x50, 0x08, 0x24, 0x00, 0x00, 0x88, 0x08, 0x22, 0x00, 0x00, 0x88, 0x10, 0x20, 0x00, 0x01, 0x04, 0x10, 0x20, 0x00, 0x02, 0x03, 0xa7, 0xff, 0x00, 0x0c, 0x01, 0x00, 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 t_CN_JP[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x13, 0xfe, 0x00, 0x04, 0x02, 0x08, 0x40, 0x00, 0x04, 0x02, 0x08, 0x40, 0x00, 0x04, 0x02, 0x01, 0xfc, 0x00, 0x04, 0x02, 0x38, 0x84, 0x00, 0x04, 0x02, 0x08, 0x84, 0x00, 0x07, 0xfe, 0x0f, 0xff, 0x00, 0x04, 0x02, 0x08, 0x00, 0x00, 0x04, 0x02, 0x09, 0xfe, 0x00, 0x04, 0x02, 0x09, 0x02, 0x00, 0x04, 0x02, 0x0b, 0x02, 0x00, 0x04, 0x02, 0x0d, 0x02, 0x00, 0x07, 0xfe, 0x09, 0xfe, 0x00, 0x04, 0x02, 0x01, 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 tAbout[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x0f, 0xfe, 0x00, 0x00, 0x44, 0x00, 0x40, 0x00, 0x07, 0xff, 0x80, 0x40, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x10, 0x1f, 0xff, 0x80, 0x0f, 0xff, 0xc0, 0x40, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x28, 0x00, 0x40, 0x00, 0x00, 0x28, 0x00, 0x40, 0x00, 0x00, 0x44, 0x00, 0x40, 0x00, 0x00, 0x82, 0x00, 0x40, 0x00, 0x03, 0x01, 0xc1, 0x40, 0x00, 0x0c, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +const unsigned char tPassword[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1f, 0x7e, 0x00, 0x1f, 0xff, 0x84, 0x02, 0x00, 0x10, 0x80, 0x84, 0x42, 0x00, 0x0a, 0x4a, 0x04, 0x42, 0x00, 0x0a, 0x31, 0x08, 0x42, 0x00, 0x12, 0xc5, 0x0f, 0x42, 0x00, 0x03, 0x04, 0x19, 0x7f, 0x00, 0x1d, 0xf8, 0x29, 0x01, 0x00, 0x00, 0x40, 0x09, 0x01, 0x00, 0x08, 0x42, 0x09, 0xfd, 0x00, 0x08, 0x42, 0x09, 0x01, 0x00, 0x08, 0x42, 0x0f, 0x01, 0x00, 0x0f, 0xfe, 0x09, 0x05, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +const unsigned char t19[] PROGMEM = { 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x1f, 0x88, 0xfe, 0x00, 0x1f, 0xd0, 0x0e, 0x22, 0x00, 0x04, 0x20, 0x30, 0x22, 0x00, 0x04, 0x5f, 0x80, 0x22, 0x00, 0x07, 0x84, 0x9e, 0x22, 0x00, 0x04, 0x85, 0x08, 0x22, 0x00, 0x04, 0x94, 0x08, 0x22, 0x00, 0x04, 0x94, 0x28, 0xfe, 0x00, 0x04, 0x97, 0x1e, 0x42, 0x00, 0x04, 0x94, 0x08, 0x42, 0x00, 0x08, 0x94, 0x08, 0x42, 0x00, 0x0a, 0xac, 0x0a, 0x42, 0x00, 0x11, 0x44, 0x0c, 0x42, 0x00, 0x00, 0x83, 0x89, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +const unsigned char *CN_table[] = { + t0, t1, t2, t3, t4, t5, t19 , t7, tPassword, t6, tAbout, Back, //0 + t0, t1_1, t1_2, t1_3, t1_4, Back, //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, t_CN_JP, //8 + t5_3, t4f, t_save, //9 +}; + +/* + 鏃ヨ Japanese +*/ +/* + 8x8 dot Japanese font for Arduboy + + Copyright (c) 2016 emutyworks + + Released under the MIT license + https://github.com/emutyworks/8x8DotJPFont/blob/master/LICENSE.txt +*/ + + +/* + 鍒╃敤銇椼仾銇勩儠銈┿兂銉堛儑銉笺偪銇儤銉冦儉銉曘偂銈ゃ儷銈掕銇胯炯銇俱仾銇勩倛銇嗐伀銇欍倠銇ㄣ儭銉€儶銇岀瘈绱勩仹銇嶃伨銇欍 + drawText() 瀹熻鏅傘伀銉曘偐銉炽儓銇岀劇銇勫牬鍚堛伅鍑︾悊銇屻偣銈儍銉椼仌銈屻伨銇欍 + + 渚) 8x8 dot 銇层倝銇屻仾銉汇偒銈裤偒銉娿兓瑷樺彿 銇伩鍒╃敤 + #include "misaki_font_f0.h" // 8x8 dot 銇层倝銇屻仾銉汇偒銈裤偒銉娿兓瑷樺彿 + //#include "misaki_font_f1.h" // 4x8 dot 鑻辫獮銉汇偒銈裤偒銉娿兓瑷樺彿 + //#include "misaki_font_f2.h" // 8x8 dot 婕㈠瓧 +*/ + +#if LANG_JP_State +#define MISAKI_FONT_H + +#define MISAKI_FONT_F0_PAGE 0xF0 +#define MISAKI_FONT_F1_PAGE 0xF1 +#define MISAKI_FONT_F2_PAGE 0xF2 + +#define MISAKI_FONT_F0_W 8 +#define MISAKI_FONT_F1_W 3 +#define MISAKI_FONT_F2_W 7 + +#define MISAKI_FONT_F0_SIZE 0xEF +#define MISAKI_FONT_F1_SIZE 0x9D +#define MISAKI_FONT_F2_SIZE 0x22 // misaki_font_f2.h 銇渶绲傝銇ゃ倰銇撱亾銇ō瀹氥仚銈嬨佹渶澶0xEF銇俱仹 +PROGMEM const uint8_t misaki_font_0x00[1] = { 0x00 }; +#define MISAKI_FONT_F0_H +PROGMEM const uint8_t misaki_font_f0[ MISAKI_FONT_F0_SIZE + 1 ][ MISAKI_FONT_F0_W ] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x00 銆 */ + { 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x01 銆 */ + { 0x20, 0x50, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x02 銆 */ + { 0x50, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x03 锛 */ + { 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x04 锛 */ + { 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 }, /* 0x05 銉 */ + { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00 }, /* 0x06 锛 */ + { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00, 0x00, 0x00 }, /* 0x07 锛 */ + { 0x00, 0x02, 0x01, 0x51, 0x09, 0x09, 0x06, 0x00 }, /* 0x08 锛 */ + { 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00 }, /* 0x09 锛 */ + { 0x00, 0x00, 0x00, 0x00, 0x7f, 0x41, 0x41, 0x00 }, /* 0x0A 锛 */ + { 0x41, 0x41, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x0B 锛 */ + { 0x00, 0x00, 0x00, 0x3f, 0x01, 0x01, 0x01, 0x00 }, /* 0x0C 銆 */ + { 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00 }, /* 0x0D 銆 */ + { 0x00, 0x00, 0x3f, 0x21, 0x3d, 0x05, 0x07, 0x00 }, /* 0x0E 銆 */ + { 0x70, 0x50, 0x5e, 0x42, 0x7e, 0x00, 0x00, 0x00 }, /* 0x0F 銆 */ + { 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63, 0x41, 0x00 }, /* 0x10 銆 */ + { 0x41, 0x63, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* 0x11 銆 */ + { 0x08, 0x08, 0x08, 0x7f, 0x08, 0x08, 0x08, 0x00 }, /* 0x12 锛 */ + { 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }, /* 0x13 锛 */ + { 0x44, 0x44, 0x44, 0x5f, 0x44, 0x44, 0x44, 0x00 }, /* 0x14 卤 */ + { 0x41, 0x22, 0x14, 0x08, 0x14, 0x22, 0x41, 0x00 }, /* 0x15 脳 */ + { 0x08, 0x08, 0x08, 0x2a, 0x08, 0x08, 0x08, 0x00 }, /* 0x16 梅 */ + { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00 }, /* 0x17 锛 */ + { 0x14, 0x34, 0x14, 0x1c, 0x14, 0x16, 0x14, 0x00 }, /* 0x18 鈮 */ + { 0x08, 0x08, 0x14, 0x14, 0x14, 0x22, 0x22, 0x00 }, /* 0x19 锛 */ + { 0x22, 0x22, 0x14, 0x14, 0x14, 0x08, 0x08, 0x00 }, /* 0x1A 锛 */ + { 0x02, 0x05, 0x02, 0x3c, 0x42, 0x42, 0x24, 0x00 }, /* 0x1B 鈩 */ + { 0x00, 0x2b, 0x2c, 0x78, 0x2c, 0x2b, 0x00, 0x00 }, /* 0x1C 锟 */ + { 0x00, 0x24, 0x2a, 0x7a, 0x2f, 0x2a, 0x12, 0x00 }, /* 0x1D 锛 */ + { 0x00, 0x1c, 0x62, 0x32, 0x2e, 0x23, 0x14, 0x00 }, /* 0x1E 锟 */ + { 0x20, 0x54, 0x5e, 0x25, 0x41, 0x42, 0x20, 0x00 }, /* 0x1F 锟 */ + { 0x42, 0x25, 0x12, 0x08, 0x24, 0x52, 0x21, 0x00 }, /* 0x20 锛 */ + { 0x20, 0x62, 0x3e, 0x63, 0x3e, 0x23, 0x02, 0x00 }, /* 0x21 锛 */ + { 0x20, 0x56, 0x49, 0x55, 0x22, 0x58, 0x40, 0x00 }, /* 0x22 锛 */ + { 0x00, 0x22, 0x14, 0x7f, 0x14, 0x22, 0x00, 0x00 }, /* 0x23 锛 */ + { 0x1c, 0x22, 0x59, 0x55, 0x4d, 0x12, 0x0c, 0x00 }, /* 0x24 锛 */ + { 0x00, 0x00, 0x4a, 0x55, 0x55, 0x29, 0x00, 0x00 }, /* 0x25 搂 */ + { 0x04, 0x64, 0x3c, 0x17, 0x3c, 0x64, 0x04, 0x00 }, /* 0x26 鈽 */ + { 0x04, 0x64, 0x3c, 0x1f, 0x3c, 0x64, 0x04, 0x00 }, /* 0x27 鈽 */ + { 0x1c, 0x22, 0x41, 0x41, 0x41, 0x22, 0x1c, 0x00 }, /* 0x28 鈼 */ + { 0x1c, 0x3e, 0x7f, 0x7f, 0x7f, 0x3e, 0x1c, 0x00 }, /* 0x29 鈼 */ + { 0x1c, 0x22, 0x5d, 0x55, 0x5d, 0x22, 0x1c, 0x00 }, /* 0x2A 鈼 */ + { 0x08, 0x14, 0x22, 0x41, 0x22, 0x14, 0x08, 0x00 }, /* 0x2B 鈼 */ + { 0x08, 0x1c, 0x3e, 0x7f, 0x3e, 0x1c, 0x08, 0x00 }, /* 0x2C 鈼 */ + { 0x7f, 0x41, 0x41, 0x41, 0x41, 0x41, 0x7f, 0x00 }, /* 0x2D 鈻 */ + { 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x00 }, /* 0x2E 鈻 */ + { 0x40, 0x70, 0x4c, 0x43, 0x4c, 0x70, 0x40, 0x00 }, /* 0x2F 鈻 */ + { 0x40, 0x70, 0x7c, 0x7f, 0x7c, 0x70, 0x40, 0x00 }, /* 0x30 鈻 */ + { 0x01, 0x07, 0x19, 0x61, 0x19, 0x07, 0x01, 0x00 }, /* 0x31 鈻 */ + { 0x01, 0x07, 0x1f, 0x7f, 0x1f, 0x07, 0x01, 0x00 }, /* 0x32 鈻 */ + { 0x49, 0x22, 0x14, 0x49, 0x14, 0x22, 0x49, 0x00 }, /* 0x33 鈥 */ + { 0x05, 0x05, 0x05, 0x7d, 0x05, 0x05, 0x05, 0x00 }, /* 0x34 銆 */ + { 0x08, 0x08, 0x08, 0x08, 0x2a, 0x1c, 0x08, 0x00 }, /* 0x35 鈫 */ + { 0x08, 0x1c, 0x2a, 0x08, 0x08, 0x08, 0x08, 0x00 }, /* 0x36 鈫 */ + { 0x00, 0x04, 0x02, 0x7f, 0x02, 0x04, 0x00, 0x00 }, /* 0x37 鈫 */ + { 0x00, 0x10, 0x20, 0x7f, 0x20, 0x10, 0x00, 0x00 }, /* 0x38 鈫 */ + { 0x00, 0x3e, 0x41, 0x41, 0x41, 0x41, 0x3e, 0x00 }, /* 0x39 锛 */ + { 0x00, 0x00, 0x42, 0x7f, 0x40, 0x00, 0x00, 0x00 }, /* 0x3A 锛 */ + { 0x00, 0x62, 0x51, 0x51, 0x49, 0x49, 0x46, 0x00 }, /* 0x3B 锛 */ + { 0x00, 0x22, 0x41, 0x49, 0x49, 0x49, 0x36, 0x00 }, /* 0x3C 锛 */ + { 0x00, 0x30, 0x28, 0x24, 0x22, 0x7f, 0x20, 0x00 }, /* 0x3D 锛 */ + { 0x00, 0x2f, 0x45, 0x45, 0x45, 0x45, 0x39, 0x00 }, /* 0x3E 锛 */ + { 0x00, 0x3e, 0x49, 0x49, 0x49, 0x49, 0x32, 0x00 }, /* 0x3F 锛 */ + { 0x00, 0x01, 0x01, 0x61, 0x19, 0x05, 0x03, 0x00 }, /* 0x40 锛 */ + { 0x00, 0x36, 0x49, 0x49, 0x49, 0x49, 0x36, 0x00 }, /* 0x41 锛 */ + { 0x00, 0x26, 0x49, 0x49, 0x49, 0x49, 0x3e, 0x00 }, /* 0x42 锛 */ + { 0x00, 0x20, 0x54, 0x7e, 0x34, 0x14, 0x60, 0x00 }, /* 0x43 銇 */ + { 0x20, 0x52, 0x7f, 0x2a, 0x1a, 0x4a, 0x30, 0x00 }, /* 0x44 銇 */ + { 0x00, 0x3c, 0x40, 0x20, 0x04, 0x18, 0x00, 0x00 }, /* 0x45 銇 */ + { 0x1e, 0x20, 0x40, 0x20, 0x02, 0x04, 0x18, 0x00 }, /* 0x46 銇 */ + { 0x00, 0x10, 0x4a, 0x4a, 0x2a, 0x10, 0x00, 0x00 }, /* 0x47 銇 */ + { 0x00, 0x08, 0x45, 0x45, 0x45, 0x25, 0x18, 0x00 }, /* 0x48 銇 */ + { 0x00, 0x48, 0x2a, 0x3a, 0x4a, 0x40, 0x00, 0x00 }, /* 0x49 銇 */ + { 0x00, 0x44, 0x25, 0x15, 0x3d, 0x45, 0x40, 0x00 }, /* 0x4A 銇 */ + { 0x00, 0x24, 0x7e, 0x14, 0x50, 0x24, 0x00, 0x00 }, /* 0x4B 銇 */ + { 0x22, 0x52, 0x7f, 0x0a, 0x48, 0x4a, 0x34, 0x00 }, /* 0x4C 銇 */ + { 0x44, 0x34, 0x4f, 0x44, 0x38, 0x04, 0x18, 0x00 }, /* 0x4D 銇 */ + { 0x44, 0x34, 0x4f, 0x44, 0x39, 0x04, 0x19, 0x00 }, /* 0x4E 銇 */ + { 0x00, 0x2a, 0x5a, 0x4b, 0x4e, 0x5a, 0x08, 0x00 }, /* 0x4F 銇 */ + { 0x00, 0x2a, 0x5a, 0x4b, 0x4e, 0x5b, 0x08, 0x00 }, /* 0x50 銇 */ + { 0x00, 0x08, 0x14, 0x14, 0x22, 0x41, 0x00, 0x00 }, /* 0x51 銇 */ + { 0x00, 0x08, 0x14, 0x14, 0x22, 0x45, 0x04, 0x00 }, /* 0x52 銇 */ + { 0x3f, 0x00, 0x04, 0x44, 0x3f, 0x04, 0x04, 0x00 }, /* 0x53 銇 */ + { 0x3f, 0x00, 0x04, 0x44, 0x3f, 0x04, 0x05, 0x00 }, /* 0x54 銇 */ + { 0x00, 0x20, 0x52, 0x42, 0x42, 0x42, 0x40, 0x00 }, /* 0x55 銇 */ + { 0x00, 0x20, 0x52, 0x42, 0x43, 0x42, 0x41, 0x00 }, /* 0x56 銇 */ + { 0x00, 0x24, 0x54, 0x44, 0x47, 0x5c, 0x04, 0x00 }, /* 0x57 銇 */ + { 0x00, 0x24, 0x54, 0x44, 0x47, 0x5c, 0x05, 0x00 }, /* 0x58 銇 */ + { 0x00, 0x00, 0x3f, 0x40, 0x40, 0x40, 0x20, 0x00 }, /* 0x59 銇 */ + { 0x00, 0x00, 0x3f, 0x40, 0x41, 0x40, 0x21, 0x00 }, /* 0x5A 銇 */ + { 0x02, 0x02, 0x0a, 0x56, 0x3f, 0x02, 0x02, 0x00 }, /* 0x5B 銇 */ + { 0x02, 0x02, 0x0a, 0x56, 0x3f, 0x02, 0x03, 0x00 }, /* 0x5C 銇 */ + { 0x04, 0x04, 0x3f, 0x44, 0x54, 0x5f, 0x44, 0x00 }, /* 0x5D 銇 */ + { 0x04, 0x04, 0x3f, 0x44, 0x54, 0x5f, 0x45, 0x00 }, /* 0x5E 銇 */ + { 0x00, 0x08, 0x09, 0x3d, 0x4b, 0x49, 0x08, 0x00 }, /* 0x5F 銇 */ + { 0x00, 0x08, 0x09, 0x3d, 0x4b, 0x49, 0x0a, 0x00 }, /* 0x60 銇 */ + { 0x42, 0x3a, 0x07, 0x22, 0x54, 0x44, 0x44, 0x00 }, /* 0x61 銇 */ + { 0x42, 0x3a, 0x07, 0x22, 0x55, 0x44, 0x45, 0x00 }, /* 0x62 銇 */ + { 0x00, 0x02, 0x12, 0x4e, 0x4b, 0x4a, 0x32, 0x00 }, /* 0x63 銇 */ + { 0x00, 0x02, 0x12, 0x4e, 0x4b, 0x4a, 0x33, 0x00 }, /* 0x64 銇 */ + { 0x00, 0x10, 0x10, 0x48, 0x48, 0x30, 0x00, 0x00 }, /* 0x65 銇 */ + { 0x04, 0x04, 0x02, 0x22, 0x22, 0x22, 0x1c, 0x00 }, /* 0x66 銇 */ + { 0x04, 0x04, 0x02, 0x22, 0x23, 0x22, 0x1d, 0x00 }, /* 0x67 銇 */ + { 0x00, 0x02, 0x02, 0x1a, 0x25, 0x43, 0x41, 0x00 }, /* 0x68 銇 */ + { 0x00, 0x02, 0x02, 0x1a, 0x25, 0x43, 0x45, 0x00 }, /* 0x69 銇 */ + { 0x00, 0x20, 0x57, 0x48, 0x48, 0x44, 0x44, 0x00 }, /* 0x6A 銇 */ + { 0x00, 0x20, 0x57, 0x48, 0x49, 0x44, 0x45, 0x00 }, /* 0x6B 銇 */ + { 0x12, 0x0a, 0x27, 0x52, 0x50, 0x3a, 0x24, 0x00 }, /* 0x6C 銇 */ + { 0x7f, 0x00, 0x20, 0x52, 0x42, 0x42, 0x40, 0x00 }, /* 0x6D 銇 */ + { 0x30, 0x4e, 0x38, 0x54, 0x0f, 0x64, 0x78, 0x00 }, /* 0x6E 銇 */ + { 0x24, 0x14, 0x7f, 0x04, 0x22, 0x52, 0x3c, 0x00 }, /* 0x6F 銇 */ + { 0x18, 0x24, 0x12, 0x4e, 0x42, 0x24, 0x18, 0x00 }, /* 0x70 銇 */ + { 0x7f, 0x00, 0x24, 0x54, 0x54, 0x3f, 0x44, 0x00 }, /* 0x71 銇 */ + { 0x7f, 0x00, 0x24, 0x54, 0x54, 0x3f, 0x45, 0x00 }, /* 0x72 銇 */ + { 0x7f, 0x00, 0x24, 0x54, 0x56, 0x3d, 0x46, 0x00 }, /* 0x73 銇 */ + { 0x02, 0x3a, 0x47, 0x40, 0x41, 0x3e, 0x04, 0x00 }, /* 0x74 銇 */ + { 0x02, 0x3a, 0x47, 0x40, 0x41, 0x3e, 0x05, 0x00 }, /* 0x75 銇 */ + { 0x02, 0x3a, 0x47, 0x40, 0x43, 0x3d, 0x06, 0x00 }, /* 0x76 銇 */ + { 0x40, 0x30, 0x40, 0x4d, 0x32, 0x10, 0x60, 0x00 }, /* 0x77 銇 */ + { 0x40, 0x30, 0x40, 0x4d, 0x32, 0x11, 0x61, 0x00 }, /* 0x78 銇 */ + { 0x40, 0x30, 0x40, 0x4d, 0x32, 0x15, 0x62, 0x00 }, /* 0x79 銇 */ + { 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x00 }, /* 0x7A 銇 */ + { 0x08, 0x04, 0x02, 0x04, 0x09, 0x10, 0x11, 0x00 }, /* 0x7B 銇 */ + { 0x08, 0x04, 0x02, 0x04, 0x0a, 0x15, 0x12, 0x00 }, /* 0x7C 銇 */ + { 0x7f, 0x00, 0x6a, 0x6a, 0x7e, 0x2a, 0x4a, 0x00 }, /* 0x7D 銇 */ + { 0x7f, 0x00, 0x6a, 0x6a, 0x7f, 0x2a, 0x4b, 0x00 }, /* 0x7E 銇 */ + { 0x7f, 0x00, 0x6a, 0x6a, 0x7e, 0x2d, 0x4a, 0x00 }, /* 0x7F 銇 */ + { 0x00, 0x6a, 0x6a, 0x6a, 0x7f, 0x2a, 0x4a, 0x00 }, /* 0x80 銇 */ + { 0x30, 0x29, 0x1d, 0x4b, 0x48, 0x3c, 0x10, 0x00 }, /* 0x81 銇 */ + { 0x12, 0x2a, 0x7f, 0x42, 0x40, 0x42, 0x24, 0x00 }, /* 0x82 銈 */ + { 0x30, 0x4e, 0x38, 0x54, 0x0f, 0x44, 0x38, 0x00 }, /* 0x83 銈 */ + { 0x00, 0x0a, 0x3e, 0x4b, 0x4a, 0x4a, 0x30, 0x00 }, /* 0x84 銈 */ + { 0x00, 0x08, 0x0e, 0x38, 0x46, 0x14, 0x08, 0x00 }, /* 0x85 銈 */ + { 0x04, 0x07, 0x1c, 0x62, 0x03, 0x0a, 0x04, 0x00 }, /* 0x86 銈 */ + { 0x00, 0x1c, 0x48, 0x3e, 0x24, 0x18, 0x00, 0x00 }, /* 0x87 銈 */ + { 0x1e, 0x04, 0x52, 0x3f, 0x12, 0x12, 0x0c, 0x00 }, /* 0x88 銈 */ + { 0x00, 0x20, 0x50, 0x50, 0x3e, 0x48, 0x00, 0x00 }, /* 0x89 銈 */ + { 0x00, 0x20, 0x50, 0x50, 0x3f, 0x24, 0x44, 0x00 }, /* 0x8A 銈 */ + { 0x00, 0x1c, 0x51, 0x49, 0x4a, 0x48, 0x30, 0x00 }, /* 0x8B 銈 */ + { 0x00, 0x0f, 0x42, 0x41, 0x21, 0x1e, 0x00, 0x00 }, /* 0x8C 銈 */ + { 0x00, 0x10, 0x69, 0x6d, 0x4b, 0x49, 0x30, 0x00 }, /* 0x8D 銈 */ + { 0x24, 0x14, 0x7f, 0x04, 0x02, 0x3e, 0x40, 0x00 }, /* 0x8E 銈 */ + { 0x00, 0x10, 0x49, 0x4d, 0x4b, 0x49, 0x30, 0x00 }, /* 0x8F 銈 */ + { 0x00, 0x28, 0x18, 0x7e, 0x08, 0x44, 0x38, 0x00 }, /* 0x90 銈 */ + { 0x24, 0x14, 0x7f, 0x04, 0x42, 0x42, 0x3c, 0x00 }, /* 0x91 銈 */ + { 0x30, 0x49, 0x25, 0x1f, 0x24, 0x54, 0x38, 0x00 }, /* 0x92 銈 */ + { 0x40, 0x28, 0x25, 0x57, 0x35, 0x28, 0x40, 0x00 }, /* 0x93 銈 */ + { 0x10, 0x0a, 0x2e, 0x5b, 0x72, 0x4a, 0x48, 0x00 }, /* 0x94 銈 */ + { 0x40, 0x30, 0x0c, 0x33, 0x40, 0x40, 0x20, 0x00 }, /* 0x95 銈 */ + { 0x00, 0x04, 0x44, 0x3c, 0x14, 0x0c, 0x00, 0x00 }, /* 0x96 銈 */ + { 0x00, 0x01, 0x41, 0x3d, 0x09, 0x05, 0x03, 0x00 }, /* 0x97 銈 */ + { 0x00, 0x20, 0x20, 0x10, 0x78, 0x04, 0x00, 0x00 }, /* 0x98 銈 */ + { 0x00, 0x10, 0x10, 0x08, 0x7c, 0x02, 0x01, 0x00 }, /* 0x99 銈 */ + { 0x00, 0x18, 0x48, 0x4c, 0x28, 0x18, 0x00, 0x00 }, /* 0x9A 銈 */ + { 0x00, 0x06, 0x42, 0x43, 0x22, 0x12, 0x0e, 0x00 }, /* 0x9B 銈 */ + { 0x00, 0x40, 0x48, 0x78, 0x48, 0x40, 0x00, 0x00 }, /* 0x9C 銈 */ + { 0x20, 0x22, 0x22, 0x3e, 0x22, 0x22, 0x20, 0x00 }, /* 0x9D 銈 */ + { 0x00, 0x28, 0x28, 0x58, 0x7c, 0x08, 0x00, 0x00 }, /* 0x9E 銈 */ + { 0x22, 0x22, 0x12, 0x4a, 0x7f, 0x02, 0x02, 0x00 }, /* 0x9F 銈 */ + { 0x00, 0x42, 0x22, 0x1f, 0x02, 0x42, 0x7e, 0x00 }, /* 0xA0 銈 */ + { 0x00, 0x42, 0x22, 0x1f, 0x02, 0x42, 0x7f, 0x00 }, /* 0xA1 銈 */ + { 0x00, 0x12, 0x12, 0x1f, 0x72, 0x12, 0x10, 0x00 }, /* 0xA2 銈 */ + { 0x00, 0x12, 0x12, 0x1f, 0x72, 0x13, 0x10, 0x00 }, /* 0xA3 銈 */ + { 0x00, 0x08, 0x44, 0x43, 0x22, 0x12, 0x0e, 0x00 }, /* 0xA4 銈 */ + { 0x00, 0x08, 0x44, 0x43, 0x22, 0x12, 0x0f, 0x00 }, /* 0xA5 銈 */ + { 0x08, 0x07, 0x42, 0x22, 0x1e, 0x02, 0x02, 0x00 }, /* 0xA6 銈 */ + { 0x08, 0x07, 0x42, 0x22, 0x1f, 0x02, 0x03, 0x00 }, /* 0xA7 銈 */ + { 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7e, 0x00 }, /* 0xA8 銈 */ + { 0x00, 0x42, 0x42, 0x42, 0x43, 0x42, 0x7f, 0x00 }, /* 0xA9 銈 */ + { 0x02, 0x02, 0x4f, 0x42, 0x22, 0x1f, 0x02, 0x00 }, /* 0xAA 銈 */ + { 0x02, 0x02, 0x4f, 0x42, 0x23, 0x1e, 0x03, 0x00 }, /* 0xAB 銈 */ + { 0x00, 0x45, 0x4a, 0x40, 0x20, 0x10, 0x0c, 0x00 }, /* 0xAC 銈 */ + { 0x00, 0x45, 0x4a, 0x40, 0x21, 0x10, 0x0d, 0x00 }, /* 0xAD 銈 */ + { 0x40, 0x42, 0x22, 0x22, 0x1a, 0x26, 0x40, 0x00 }, /* 0xAE 銈 */ + { 0x40, 0x42, 0x22, 0x22, 0x1b, 0x26, 0x41, 0x00 }, /* 0xAF 銈 */ + { 0x04, 0x04, 0x3f, 0x44, 0x44, 0x54, 0x4c, 0x00 }, /* 0xB0 銈 */ + { 0x04, 0x04, 0x3f, 0x44, 0x45, 0x54, 0x4d, 0x00 }, /* 0xB1 銈 */ + { 0x00, 0x01, 0x46, 0x40, 0x20, 0x10, 0x0f, 0x00 }, /* 0xB2 銈 */ + { 0x00, 0x01, 0x46, 0x40, 0x20, 0x11, 0x0f, 0x00 }, /* 0xB3 銈 */ + { 0x00, 0x08, 0x44, 0x4b, 0x2a, 0x12, 0x0e, 0x00 }, /* 0xB4 銈 */ + { 0x00, 0x08, 0x44, 0x4b, 0x2a, 0x12, 0x0f, 0x00 }, /* 0xB5 銉 */ + { 0x08, 0x0a, 0x4a, 0x3e, 0x09, 0x09, 0x08, 0x00 }, /* 0xB6 銉 */ + { 0x08, 0x0a, 0x4a, 0x3e, 0x09, 0x08, 0x09, 0x00 }, /* 0xB7 銉 */ + { 0x00, 0x18, 0x40, 0x58, 0x20, 0x18, 0x00, 0x00 }, /* 0xB8 銉 */ + { 0x02, 0x0c, 0x42, 0x4c, 0x20, 0x10, 0x0e, 0x00 }, /* 0xB9 銉 */ + { 0x02, 0x0c, 0x42, 0x4c, 0x21, 0x10, 0x0d, 0x00 }, /* 0xBA 銉 */ + { 0x04, 0x05, 0x45, 0x3d, 0x05, 0x05, 0x04, 0x00 }, /* 0xBB 銉 */ + { 0x04, 0x05, 0x45, 0x3d, 0x05, 0x04, 0x05, 0x00 }, /* 0xBC 銉 */ + { 0x00, 0x00, 0x7f, 0x08, 0x08, 0x10, 0x00, 0x00 }, /* 0xBD 銉 */ + { 0x00, 0x00, 0x7f, 0x08, 0x09, 0x10, 0x01, 0x00 }, /* 0xBE 銉 */ + { 0x04, 0x44, 0x24, 0x1f, 0x04, 0x04, 0x04, 0x00 }, /* 0xBF 銉 */ + { 0x20, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x00 }, /* 0xC0 銉 */ + { 0x40, 0x41, 0x25, 0x15, 0x19, 0x27, 0x00, 0x00 }, /* 0xC1 銉 */ + { 0x20, 0x22, 0x12, 0x7b, 0x06, 0x12, 0x20, 0x00 }, /* 0xC2 銉 */ + { 0x40, 0x40, 0x20, 0x10, 0x08, 0x07, 0x00, 0x00 }, /* 0xC3 銉 */ + { 0x40, 0x30, 0x0e, 0x00, 0x02, 0x0c, 0x70, 0x00 }, /* 0xC4 銉 */ + { 0x40, 0x30, 0x0e, 0x00, 0x02, 0x0d, 0x71, 0x00 }, /* 0xC5 銉 */ + { 0x40, 0x30, 0x0e, 0x00, 0x02, 0x0d, 0x72, 0x00 }, /* 0xC6 銉 */ + { 0x00, 0x3f, 0x48, 0x48, 0x48, 0x44, 0x44, 0x00 }, /* 0xC7 銉 */ + { 0x00, 0x3f, 0x48, 0x48, 0x49, 0x44, 0x45, 0x00 }, /* 0xC8 銉 */ + { 0x00, 0x3f, 0x48, 0x48, 0x4a, 0x45, 0x46, 0x00 }, /* 0xC9 銉 */ + { 0x00, 0x02, 0x42, 0x42, 0x22, 0x12, 0x0e, 0x00 }, /* 0xCA 銉 */ + { 0x00, 0x02, 0x42, 0x42, 0x23, 0x12, 0x0f, 0x00 }, /* 0xCB 銉 */ + { 0x00, 0x02, 0x42, 0x42, 0x22, 0x15, 0x0e, 0x00 }, /* 0xCC 銉 */ + { 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00 }, /* 0xCD 銉 */ + { 0x08, 0x04, 0x02, 0x04, 0x09, 0x10, 0x21, 0x00 }, /* 0xCE 銉 */ + { 0x08, 0x04, 0x02, 0x04, 0x0a, 0x15, 0x22, 0x00 }, /* 0xCF 銉 */ + { 0x24, 0x14, 0x44, 0x7f, 0x04, 0x14, 0x24, 0x00 }, /* 0xD0 銉 */ + { 0x24, 0x14, 0x44, 0x7f, 0x05, 0x14, 0x25, 0x00 }, /* 0xD1 銉 */ + { 0x24, 0x14, 0x44, 0x7f, 0x06, 0x15, 0x22, 0x00 }, /* 0xD2 銉 */ + { 0x02, 0x02, 0x12, 0x22, 0x52, 0x0a, 0x06, 0x00 }, /* 0xD3 銉 */ + { 0x00, 0x21, 0x25, 0x29, 0x4a, 0x42, 0x00, 0x00 }, /* 0xD4 銉 */ + { 0x40, 0x70, 0x4c, 0x43, 0x50, 0x20, 0x40, 0x00 }, /* 0xD5 銉 */ + { 0x40, 0x44, 0x24, 0x14, 0x08, 0x37, 0x00, 0x00 }, /* 0xD6 銉 */ + { 0x00, 0x08, 0x09, 0x3f, 0x49, 0x49, 0x48, 0x00 }, /* 0xD7 銉 */ + { 0x00, 0x10, 0x1c, 0x68, 0x08, 0x18, 0x00, 0x00 }, /* 0xD8 銉 */ + { 0x04, 0x04, 0x0f, 0x74, 0x02, 0x0a, 0x06, 0x00 }, /* 0xD9 銉 */ + { 0x00, 0x40, 0x48, 0x48, 0x78, 0x40, 0x00, 0x00 }, /* 0xDA 銉 */ + { 0x20, 0x22, 0x22, 0x22, 0x3e, 0x20, 0x20, 0x00 }, /* 0xDB 銉 */ + { 0x00, 0x00, 0x44, 0x54, 0x54, 0x7c, 0x00, 0x00 }, /* 0xDC 銉 */ + { 0x00, 0x42, 0x4a, 0x4a, 0x4a, 0x4a, 0x7e, 0x00 }, /* 0xDD 銉 */ + { 0x00, 0x04, 0x45, 0x45, 0x25, 0x15, 0x0c, 0x00 }, /* 0xDE 銉 */ + { 0x00, 0x0f, 0x40, 0x40, 0x20, 0x1f, 0x00, 0x00 }, /* 0xDF 銉 */ + { 0x40, 0x20, 0x1e, 0x00, 0x7f, 0x20, 0x10, 0x00 }, /* 0xE0 銉 */ + { 0x00, 0x00, 0x7f, 0x40, 0x20, 0x10, 0x08, 0x00 }, /* 0xE1 銉 */ + { 0x00, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x7e, 0x00 }, /* 0xE2 銉 */ + { 0x00, 0x0c, 0x44, 0x44, 0x24, 0x1c, 0x00, 0x00 }, /* 0xE3 銉 */ + { 0x00, 0x06, 0x42, 0x42, 0x22, 0x12, 0x0e, 0x00 }, /* 0xE4 銉 */ + { 0x10, 0x12, 0x1e, 0x12, 0x12, 0x7f, 0x12, 0x00 }, /* 0xE5 銉 */ + { 0x20, 0x22, 0x22, 0x3a, 0x26, 0x22, 0x20, 0x00 }, /* 0xE6 銉 */ + { 0x00, 0x01, 0x45, 0x45, 0x25, 0x15, 0x0f, 0x00 }, /* 0xE7 銉 */ + { 0x00, 0x41, 0x42, 0x40, 0x20, 0x10, 0x0c, 0x00 }, /* 0xE8 銉 */ + { 0x00, 0x06, 0x42, 0x43, 0x22, 0x12, 0x0f, 0x00 }, /* 0xE9 銉 */ + { 0x00, 0x48, 0x28, 0x1c, 0x48, 0x78, 0x00, 0x00 }, /* 0xEA 銉 */ + { 0x00, 0x10, 0x0c, 0x48, 0x38, 0x08, 0x00, 0x00 }, /* 0xEB 銉 */ + { 0x08, 0x04, 0x04, 0x08, 0x10, 0x10, 0x08, 0x00 }, /* 0xEC 銆 */ + { 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00 }, /* 0xED 鈥 */ + { 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }, /* 0xEE 銉 */ + { 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 }, /* 0xEF 鈥 */ +}; + +#define MISAKI_FONT_F1_H +PROGMEM const uint8_t misaki_font_f1[ MISAKI_FONT_F1_SIZE + 1 ][ MISAKI_FONT_F1_W ] = +{ + { 0x00, 0x00, 0x00 }, /* 0x00 */ + { 0x00, 0x2f, 0x00 }, /* 0x01 ! */ + { 0x03, 0x00, 0x03 }, /* 0x02 " */ + { 0x3f, 0x12, 0x3f }, /* 0x03 # */ + { 0x16, 0x3f, 0x1a }, /* 0x04 $ */ + { 0x12, 0x08, 0x24 }, /* 0x05 % */ + { 0x32, 0x3d, 0x2a }, /* 0x06 & */ + { 0x02, 0x01, 0x00 }, /* 0x07 ' */ + { 0x00, 0x3e, 0x41 }, /* 0x08 ( */ + { 0x41, 0x3e, 0x00 }, /* 0x09 ) */ + { 0x0a, 0x07, 0x0a }, /* 0x0A * */ + { 0x08, 0x3e, 0x08 }, /* 0x0B + */ + { 0x40, 0x20, 0x00 }, /* 0x0C , */ + { 0x08, 0x08, 0x08 }, /* 0x0D - */ + { 0x00, 0x20, 0x00 }, /* 0x0E . */ + { 0x10, 0x08, 0x04 }, /* 0x0F / */ + { 0x1c, 0x2a, 0x1c }, /* 0x10 0 */ + { 0x24, 0x3e, 0x20 }, /* 0x11 1 */ + { 0x32, 0x2a, 0x24 }, /* 0x12 2 */ + { 0x22, 0x2a, 0x14 }, /* 0x13 3 */ + { 0x18, 0x14, 0x3e }, /* 0x14 4 */ + { 0x2e, 0x2a, 0x12 }, /* 0x15 5 */ + { 0x1c, 0x2a, 0x12 }, /* 0x16 6 */ + { 0x02, 0x3a, 0x06 }, /* 0x17 7 */ + { 0x14, 0x2a, 0x14 }, /* 0x18 8 */ + { 0x24, 0x2a, 0x1c }, /* 0x19 9 */ + { 0x00, 0x24, 0x00 }, /* 0x1A : */ + { 0x40, 0x24, 0x00 }, /* 0x1B ; */ + { 0x08, 0x14, 0x22 }, /* 0x1C < */ + { 0x14, 0x14, 0x14 }, /* 0x1D = */ + { 0x22, 0x14, 0x08 }, /* 0x1E > */ + { 0x02, 0x29, 0x06 }, /* 0x1F ? */ + { 0x12, 0x29, 0x1e }, /* 0x20 @ */ + { 0x3e, 0x09, 0x3e }, /* 0x21 A */ + { 0x3f, 0x25, 0x1a }, /* 0x22 B */ + { 0x1e, 0x21, 0x21 }, /* 0x23 C */ + { 0x3f, 0x21, 0x1e }, /* 0x24 D */ + { 0x3f, 0x25, 0x21 }, /* 0x25 E */ + { 0x3f, 0x05, 0x01 }, /* 0x26 F */ + { 0x1e, 0x21, 0x39 }, /* 0x27 G */ + { 0x3f, 0x08, 0x3f }, /* 0x28 H */ + { 0x21, 0x3f, 0x21 }, /* 0x29 I */ + { 0x10, 0x20, 0x1f }, /* 0x2A J */ + { 0x3f, 0x04, 0x3b }, /* 0x2B K */ + { 0x3f, 0x20, 0x20 }, /* 0x2C L */ + { 0x3f, 0x06, 0x3f }, /* 0x2D M */ + { 0x3f, 0x01, 0x3e }, /* 0x2E N */ + { 0x1e, 0x21, 0x1e }, /* 0x2F O */ + { 0x3f, 0x09, 0x06 }, /* 0x30 P */ + { 0x1e, 0x21, 0x5e }, /* 0x31 Q */ + { 0x3f, 0x09, 0x36 }, /* 0x32 R */ + { 0x22, 0x25, 0x19 }, /* 0x33 S */ + { 0x01, 0x3f, 0x01 }, /* 0x34 T */ + { 0x3f, 0x20, 0x3f }, /* 0x35 U */ + { 0x3f, 0x10, 0x0f }, /* 0x36 V */ + { 0x3f, 0x18, 0x3f }, /* 0x37 W */ + { 0x33, 0x0c, 0x33 }, /* 0x38 X */ + { 0x03, 0x3c, 0x03 }, /* 0x39 Y */ + { 0x31, 0x2d, 0x23 }, /* 0x3A Z */ + { 0x00, 0x7f, 0x41 }, /* 0x3B [ */ + { 0x15, 0x3e, 0x15 }, /* 0x3C \ */ + { 0x41, 0x7f, 0x00 }, /* 0x3D ] */ + { 0x02, 0x01, 0x02 }, /* 0x3E ^ */ + { 0x40, 0x40, 0x40 }, /* 0x3F _ */ + { 0x00, 0x01, 0x02 }, /* 0x40 ` */ + { 0x18, 0x24, 0x3c }, /* 0x41 a */ + { 0x3f, 0x24, 0x18 }, /* 0x42 b */ + { 0x18, 0x24, 0x24 }, /* 0x43 c */ + { 0x18, 0x24, 0x3f }, /* 0x44 d */ + { 0x18, 0x2c, 0x2c }, /* 0x45 e */ + { 0x04, 0x3f, 0x05 }, /* 0x46 f */ + { 0x48, 0x54, 0x3c }, /* 0x47 g */ + { 0x3f, 0x04, 0x38 }, /* 0x48 h */ + { 0x00, 0x3d, 0x00 }, /* 0x49 i */ + { 0x40, 0x3d, 0x00 }, /* 0x4A j */ + { 0x3f, 0x08, 0x34 }, /* 0x4B k */ + { 0x01, 0x3f, 0x00 }, /* 0x4C l */ + { 0x3c, 0x1c, 0x38 }, /* 0x4D m */ + { 0x3c, 0x04, 0x38 }, /* 0x4E n */ + { 0x18, 0x24, 0x18 }, /* 0x4F o */ + { 0x7c, 0x24, 0x18 }, /* 0x50 p */ + { 0x18, 0x24, 0x7c }, /* 0x51 q */ + { 0x3c, 0x08, 0x04 }, /* 0x52 r */ + { 0x28, 0x3c, 0x14 }, /* 0x53 s */ + { 0x04, 0x3e, 0x24 }, /* 0x54 t */ + { 0x3c, 0x20, 0x3c }, /* 0x55 u */ + { 0x3c, 0x10, 0x0c }, /* 0x56 v */ + { 0x3c, 0x30, 0x3c }, /* 0x57 w */ + { 0x24, 0x18, 0x24 }, /* 0x58 x */ + { 0x4c, 0x50, 0x3c }, /* 0x59 y */ + { 0x24, 0x34, 0x2c }, /* 0x5A z */ + { 0x08, 0x36, 0x41 }, /* 0x5B { */ + { 0x00, 0x7f, 0x00 }, /* 0x5C | */ + { 0x41, 0x36, 0x08 }, /* 0x5D } */ + { 0x01, 0x01, 0x01 }, /* 0x5E ~ */ + { 0x10, 0x28, 0x10 }, /* 0x5F 锝 */ + { 0x1f, 0x01, 0x01 }, /* 0x60 锝 */ + { 0x20, 0x20, 0x3e }, /* 0x61 锝 */ + { 0x10, 0x20, 0x00 }, /* 0x62 锝 */ + { 0x00, 0x08, 0x00 }, /* 0x63 锝 */ + { 0x25, 0x15, 0x0f }, /* 0x64 锝 */ + { 0x24, 0x1c, 0x0c }, /* 0x65 锝 */ + { 0x10, 0x38, 0x04 }, /* 0x66 锝 */ + { 0x18, 0x0c, 0x38 }, /* 0x67 锝 */ + { 0x28, 0x38, 0x28 }, /* 0x68 锝 */ + { 0x28, 0x18, 0x3c }, /* 0x69 锝 */ + { 0x08, 0x3c, 0x18 }, /* 0x6A 锝 */ + { 0x28, 0x38, 0x20 }, /* 0x6B 锝 */ + { 0x24, 0x2c, 0x3c }, /* 0x6C 锝 */ + { 0x2c, 0x2c, 0x1c }, /* 0x6D 锝 */ + { 0x04, 0x08, 0x08 }, /* 0x6E 锝 */ + { 0x21, 0x1d, 0x07 }, /* 0x6F 锝 */ + { 0x08, 0x3c, 0x03 }, /* 0x70 锝 */ + { 0x06, 0x23, 0x1e }, /* 0x71 锝 */ + { 0x22, 0x3e, 0x22 }, /* 0x72 锝 */ + { 0x12, 0x0a, 0x3f }, /* 0x73 锝 */ + { 0x32, 0x0f, 0x3e }, /* 0x74 锝 */ + { 0x0a, 0x3f, 0x0a }, /* 0x75 锝 */ + { 0x24, 0x13, 0x0e }, /* 0x76 锝 */ + { 0x27, 0x1e, 0x02 }, /* 0x77 锝 */ + { 0x22, 0x22, 0x3e }, /* 0x78 锝 */ + { 0x27, 0x12, 0x0f }, /* 0x79 锝 */ + { 0x25, 0x25, 0x10 }, /* 0x7A 锝 */ + { 0x21, 0x19, 0x27 }, /* 0x7B 锝 */ + { 0x3f, 0x22, 0x2e }, /* 0x7C 锝 */ + { 0x21, 0x16, 0x0f }, /* 0x7D 锝 */ + { 0x24, 0x1b, 0x0e }, /* 0x7E 锞 */ + { 0x25, 0x1f, 0x05 }, /* 0x7F 锞 */ + { 0x26, 0x26, 0x1e }, /* 0x80 锞 */ + { 0x25, 0x1d, 0x05 }, /* 0x81 锞 */ + { 0x3f, 0x04, 0x08 }, /* 0x82 锞 */ + { 0x24, 0x1f, 0x04 }, /* 0x83 锞 */ + { 0x20, 0x22, 0x22 }, /* 0x84 锞 */ + { 0x25, 0x19, 0x27 }, /* 0x85 锞 */ + { 0x12, 0x3b, 0x16 }, /* 0x86 锞 */ + { 0x20, 0x10, 0x0f }, /* 0x87 锞 */ + { 0x3c, 0x01, 0x3e }, /* 0x88 锞 */ + { 0x1f, 0x24, 0x24 }, /* 0x89 锞 */ + { 0x21, 0x11, 0x0f }, /* 0x8A 锞 */ + { 0x0c, 0x03, 0x1c }, /* 0x8B 锞 */ + { 0x1a, 0x3f, 0x1a }, /* 0x8C 锞 */ + { 0x09, 0x19, 0x27 }, /* 0x8D 锞 */ + { 0x22, 0x2a, 0x2a }, /* 0x8E 锞 */ + { 0x38, 0x27, 0x30 }, /* 0x8F 锞 */ + { 0x32, 0x0c, 0x13 }, /* 0x90 锞 */ + { 0x05, 0x3f, 0x25 }, /* 0x91 锞 */ + { 0x02, 0x3f, 0x0e }, /* 0x92 锞 */ + { 0x21, 0x3f, 0x20 }, /* 0x93 锞 */ + { 0x25, 0x25, 0x3f }, /* 0x94 锞 */ + { 0x25, 0x25, 0x1d }, /* 0x95 锞 */ + { 0x07, 0x20, 0x1f }, /* 0x96 锞 */ + { 0x3c, 0x3f, 0x20 }, /* 0x97 锞 */ + { 0x3f, 0x20, 0x10 }, /* 0x98 锞 */ + { 0x3e, 0x22, 0x3e }, /* 0x99 锞 */ + { 0x23, 0x11, 0x0f }, /* 0x9A 锞 */ + { 0x21, 0x21, 0x18 }, /* 0x9B 锞 */ + { 0x01, 0x00, 0x01 }, /* 0x9C 锞 */ + { 0x02, 0x05, 0x02 }, /* 0x9D 锞 */ +}; +#define MISAKI_FONT_F2_H +PROGMEM const uint8_t misaki_font_f2[ MISAKI_FONT_F2_SIZE + 1 ][ MISAKI_FONT_F2_W ] = +{ + { 0x75, 0x40, 0x77, 0x55, 0x75, 0x77, 0x40 }, /* 0x00 娓 */ + { 0x40, 0x3e, 0x4a, 0x5e, 0x2b, 0x5e, 0x4a }, /* 0x01 搴 */ + { 0x6b, 0x62, 0x7f, 0x35, 0x2f, 0x35, 0x7f }, /* 0x02 瑾 */ + { 0x7c, 0x5b, 0x5e, 0x24, 0x7b, 0x0e, 0x3a }, /* 0x03 绡 */ + { 0x04, 0x7e, 0x01, 0x7e, 0x4a, 0x5e, 0x69 }, /* 0x04 浣 */ + { 0x06, 0x3a, 0x2f, 0x3f, 0x6b, 0x7e, 0x46 }, /* 0x05 闆 */ + { 0x40, 0x3f, 0x41, 0x49, 0x7f, 0x49, 0x41 }, /* 0x06 鍦 */ + { 0x02, 0x62, 0x6b, 0x6b, 0x6b, 0x62, 0x02 }, /* 0x07 瑷 */ + { 0x6a, 0x6b, 0x14, 0x7d, 0x57, 0x7d, 0x10 }, /* 0x08 瑾 */ + { 0x41, 0x3f, 0x55, 0x55, 0x3d, 0x57, 0x51 }, /* 0x09 鎴 */ + { 0x21, 0x3f, 0x2d, 0x7f, 0x2a, 0x12, 0x2e }, /* 0x0A 鍙 */ + { 0x0a, 0x77, 0x5a, 0x50, 0x5a, 0x77, 0x0a }, /* 0x0B 鏇 */ + { 0x20, 0x24, 0x13, 0x7d, 0x55, 0x53, 0x70 }, /* 0x0C 鍚 */ + { 0x7a, 0x2a, 0x7b, 0x02, 0x1a, 0x43, 0x7a }, /* 0x0D 鍓 */ + { 0x4a, 0x52, 0x5e, 0x2b, 0x5e, 0x42, 0x4a }, /* 0x0E 澶 */ + { 0x41, 0x5f, 0x35, 0x3f, 0x55, 0x5f, 0x41 }, /* 0x0F 鏇 */ + { 0x7d, 0x14, 0x57, 0x7d, 0x0e, 0x40, 0x7f }, /* 0x10 鍓 */ + { 0x7f, 0x1b, 0x54, 0x16, 0x7d, 0x16, 0x54 }, /* 0x11 闄 */ + { 0x49, 0x3a, 0x40, 0x7e, 0x57, 0x56, 0x76 }, /* 0x12 杩 */ + { 0x42, 0x3f, 0x42, 0x7e, 0x7e, 0x42, 0x7e }, /* 0x13 鍔 */ + { 0x04, 0x7e, 0x51, 0x37, 0x7d, 0x37, 0x50 }, /* 0x14 淇 */ + { 0x12, 0x7a, 0x17, 0x52, 0x76, 0x1e, 0x12 }, /* 0x15 瀛 */ + { 0x7f, 0x55, 0x7f, 0x14, 0x5d, 0x7f, 0x55 }, /* 0x16 鐫 */ + { 0x7f, 0x55, 0x7f, 0x7f, 0x55, 0x3d, 0x57 }, /* 0x17 鐪 */ + { 0x7f, 0x55, 0x37, 0x78, 0x17, 0x45, 0x7f }, /* 0x18 闁 */ + { 0x7f, 0x2b, 0x7b, 0x28, 0x7b, 0x2b, 0x7f }, /* 0x19 闁 */ + { 0x1e, 0x12, 0x12, 0x7f, 0x12, 0x12, 0x1e }, /* 0x1A 涓 */ + { 0x7f, 0x41, 0x6b, 0x7f, 0x6b, 0x51, 0x7f }, /* 0x1B 鍥 */ + { 0x52, 0x5a, 0x57, 0x3a, 0x57, 0x5a, 0x52 }, /* 0x1C 鑻 */ + { 0x00, 0x7f, 0x49, 0x49, 0x49, 0x49, 0x7f }, /* 0x1D 鏃 */ + { 0x22, 0x12, 0x2a, 0x7f, 0x2a, 0x12, 0x22 }, /* 0x1E 鏈 */ + { 0x16, 0x6a, 0x5e, 0x73, 0x56, 0x62, 0x16 }, /* 0x1F 瀵 */ + { 0x09, 0x37, 0x31, 0x5f, 0x15, 0x5f, 0x75 }, /* 0x20 纰 */ + { 0x42, 0x22, 0x1e, 0x0b, 0x4a, 0x7a, 0x02 }, /* 0x21 鏂 */ + { 0x7e, 0x02, 0x3a, 0x2b, 0x3a, 0x42, 0x7e }, /* 0x22 鍚 */ +}; +/* + 銉椼儶銈汇儍銉 + 娓╁害瑾跨瘈 + 銈裤偆銉炪兗 + 銈炽兂銉堛儹銉笺儷 + 銈广偗銉兗銉 + 銉栥偠銉 + 浣庨浕鍦с偄銉┿兗銉 + 瑷瑾 + 鎴汇倠 + 鍙栥倞鏇裤亪銈 + 銈儯銉儢銉兗銈枫儳銉 + 鍚嶅墠銈掑鏇 + 鍓婇櫎 + 杩藉姞 + 淇濆瓨 + 銉囥儠銈┿儷銉 + 鐫$湢 + 銉栥兗銈广儓 + 淇濆瓨 + 鐫$湢 + 闁夈仒銈 + 銉栥兗銈广儓 + 淇濆瓨 + 銉銈ゃ儸銈儓 + PID + 銉撱儍銈 + 銉嬨儱銉笺偣 + 闁夈仒銈 + 闁嬨亸 + 銇勩亜銇堛 + 銇亜銆 + 涓浗瑾 + 鑻辫獮 + 銇勩亜銇堛 + 銇亜銆 + 銉°偆銉炽偣銈儶銉笺兂 + 銉曘儶銉冦儣 + 淇濆瓨 + 銈€儛銈︺儓 + 鏃ユ湰瑾 + 銇ゃ伨銇挎柟鍚 + + 姹夊瓧杞崲琛:娓╁害瑾跨瘈浣庨浕鍦ц█瑾炴埢鍙栨浛鍚嶅墠澶夋洿鍓婇櫎杩藉姞淇濆瓨鐫$湢闁夐枊涓浗鑻辨棩鏈瘑纰 +*/ +const char JP_0[] PROGMEM = { 0xf0, 0xcc, 0xdf, 0xb0, 0xb8, 0xbd, }; +const char JP_1[] PROGMEM = { 0xf2, 0x00, 0x01, 0x02, 0x03, }; +const char JP_2[] PROGMEM = { 0xf0, 0xb4, 0x99, 0xd3, 0xee, }; +const char JP_3[] PROGMEM = { 0xf0, 0xa8, 0xe8, 0xbd, 0xe2, 0xee, 0xe0, }; +const char JP_4[] PROGMEM = { 0xf0, 0xae, 0xa4, 0xdf, 0xee, 0xe8, }; +const char JP_5[] PROGMEM = { 0xf0, 0xcb, 0xab, 0xee, }; +const char JP_6[] PROGMEM = { 0xf2, 0x04, 0x05, 0x06, 0xf0, 0x97, 0xde, 0xee, 0xd5, }; +const char JP_7[] PROGMEM = { 0xf2, 0x07, 0x08, }; +const char JP_8[] PROGMEM = { 0xf2, 0x09, 0xf0, 0x8d, }; +const char JP_9[] PROGMEM = { 0xf2, 0x0a, 0xf0, 0x8c, 0xf2, 0x0b, 0xf0, 0x4a, 0x8d, }; +const char JP_10[] PROGMEM = { 0xf0, 0xa2, 0xd8, 0xdf, 0xcb, 0xe1, 0xee, 0xac, 0xdc, 0xe8, }; +const char JP_11[] PROGMEM = { 0xf2, 0x0c, 0x0d, 0xf0, 0x94, 0xf2, 0x0e, 0x0f, }; +const char JP_12[] PROGMEM = { 0xf2, 0x10, 0x11, }; +const char JP_13[] PROGMEM = { 0xf2, 0x12, 0x13, }; +const char JP_14[] PROGMEM = { 0xf2, 0x14, 0x15, }; +const char JP_15[] PROGMEM = { 0xf0, 0xbc, 0xca, 0x9e, 0xe0, 0xbd, }; +const char JP_16[] PROGMEM = { 0xf2, 0x16, 0x17, }; +const char JP_17[] PROGMEM = { 0xf0, 0xcb, 0xee, 0xae, 0xbd, }; +const char JP_18[] PROGMEM = { 0xf2, 0x14, 0x15, }; +const char JP_19[] PROGMEM = { 0xf2, 0x16, 0x17, }; +const char JP_20[] PROGMEM = { 0xf2, 0x18, 0xf0, 0x5a, 0x8d, }; +const char JP_21[] PROGMEM = { 0xf0, 0xcb, 0xee, 0xae, 0xbd, }; +const char JP_22[] PROGMEM = { 0xf2, 0x14, 0x15, }; +const char JP_23[] PROGMEM = { 0xf0, 0xb5, 0x99, 0xe1, 0xa4, 0xbd, }; +const char JP_24[] PROGMEM = { 0xf1, 0x30, 0x29, 0x24, }; +const char JP_25[] PROGMEM = { 0xf0, 0xc8, 0xb8, 0xa5, }; +const char JP_26[] PROGMEM = { 0xf0, 0xc0, 0xda, 0xee, 0xae, }; +const char JP_27[] PROGMEM = { 0xf2, 0x18, 0xf0, 0x5a, 0x8d, }; +const char JP_28[] PROGMEM = { 0xf2, 0x19, 0xf0, 0x51, }; +const char JP_29[] PROGMEM = { 0xf0, 0x46, 0x46, 0x4a, 0x01, }; +const char JP_30[] PROGMEM = { 0xf0, 0x71, 0x46, 0x01, }; +const char JP_31[] PROGMEM = { 0xf2, 0x1a, 0x1b, 0x08, }; +const char JP_32[] PROGMEM = { 0xf2, 0x1c, 0x08, }; +const char JP_33[] PROGMEM = { 0xf0, 0x46, 0x46, 0x4a, 0x01, }; +const char JP_34[] PROGMEM = { 0xf0, 0x71, 0x46, 0x01, }; +const char JP_35[] PROGMEM = { 0xf0, 0xd6, 0x99, 0xe8, 0xae, 0xa4, 0xdf, 0xee, 0xe8, }; +const char JP_36[] PROGMEM = { 0xf0, 0xca, 0xdf, 0xb8, 0xcc, }; +const char JP_37[] PROGMEM = { 0xf2, 0x14, 0x15, }; +const char JP_38[] PROGMEM = { 0xf0, 0x97, 0xc5, 0x9b, 0xbd, }; +const char JP_39[] PROGMEM = { 0xf2, 0x1d, 0x1e, 0x08, }; +const char JP_40[] PROGMEM = { 0xf2, 0x1f, 0x20, }; //瀵嗙爜 +const char JP_41[] PROGMEM = { 0xf0, 0x66, 0x80, 0x81, 0xf2, 0x21, 0x22, }; //銇ゃ伨銇挎柟鍚 +const char *const JP_table[] = {JP_0, JP_1, JP_2, JP_3, JP_4, JP_5, JP_41, JP_6, JP_40, JP_7, JP_38, JP_8, JP_9, JP_10, JP_11, JP_12, JP_13, JP_14, JP_15, JP_16, JP_17, JP_18, JP_19, JP_20, JP_21, JP_22, JP_23, JP_24, JP_25, JP_26, JP_27, JP_28, JP_29, JP_30, JP_31, JP_32, JP_39, JP_35, JP_36, JP_37,}; +const char JP_Length_table[] PROGMEM = {6, 5, 5, 7, 6, 4, 7, 9, 3, 3 , 5, 4, 9, 10, 8, 3, 3, 3, 6, 3, 5, 3, 3, 5, 5, 3, 6, 4, 4, 5, 5, 4, 5, 4, 4, 3, 4, 9, 5, 3,}; +#endif + +/* + 8x8 dot Japanese font for Arduboy + + Copyright (c) 2016 emutyworks + + Released under the MIT license + https://github.com/emutyworks/8x8DotJPFont/blob/master/LICENSE.txt +*/ +#if LANG_JP_State +void drawText(uint8_t x, uint8_t y, const uint8_t *mes, uint8_t cnt) +{ + uint8_t pb; + uint8_t page; + uint8_t screen_start = 0; + uint8_t screen_end = 128; + + if (x < screen_start) { + x = screen_start; + } + + for (uint8_t i = 0; i < cnt; i++) { + pb = pgm_read_byte_near(mes + i); + + switch (pb) { + case MISAKI_FONT_F0_PAGE: + page = MISAKI_FONT_F0_PAGE; + continue; + case MISAKI_FONT_F1_PAGE: + page = MISAKI_FONT_F1_PAGE; + continue; + case MISAKI_FONT_F2_PAGE: + page = MISAKI_FONT_F2_PAGE; + continue; + } + + if (!page) { + continue; + } + + switch (page) { +#ifdef MISAKI_FONT_F0_H + case MISAKI_FONT_F0_PAGE: + if (pb > MISAKI_FONT_F0_SIZE) { + continue; + } + if ((x + 8) > screen_end) { + x = screen_start; + y = y + 8; + } + arduboy.drawBitmap(x, y, misaki_font_f0[ pb ], MISAKI_FONT_F0_W, 8, WHITE); + x = x + 8; + break; +#endif +#ifdef MISAKI_FONT_F1_H + case MISAKI_FONT_F1_PAGE: + if (pb > MISAKI_FONT_F1_SIZE) { + continue; + } + if ((x + 4) > screen_end) { + x = screen_start; + y = y + 8; + } + arduboy.drawBitmap(x, y, misaki_font_f1[ pb ], MISAKI_FONT_F1_W, 8, WHITE); + arduboy.drawBitmap(x + 3, y, misaki_font_0x00, 1, 8, WHITE); + x = x + 4; + break; +#endif +#ifdef MISAKI_FONT_F2_H + case MISAKI_FONT_F2_PAGE: + if (pb > MISAKI_FONT_F2_SIZE) { + continue; + } + if ((x + 8) > screen_end) { + x = screen_start; + y = y + 8; + } + arduboy.drawBitmap(x, y, misaki_font_f2[ pb ], MISAKI_FONT_F2_W, 8, WHITE); + arduboy.drawBitmap(x + 7, y, misaki_font_0x00, 1, 8, WHITE); + x = x + 8; + break; +#endif + } + } +} +#endif diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/C-Debug.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/C-Debug.ino new file mode 100644 index 0000000..5518d73 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/C-Debug.ino @@ -0,0 +1,21 @@ +/* +//姝ょ墖娈电敤浜嶥EBUG +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); + +} +*/ diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/CurveFitting.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/CurveFitting.ino new file mode 100644 index 0000000..2979e6c --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/CurveFitting.ino @@ -0,0 +1,103 @@ +//********** 鏇茬嚎鎷熷悎绋嬪簭 ********** +//鏇茬嚎鎷熷悎绠楁硶鏉ヨ嚦https://blog.csdn.net/m0_37362454/article/details/82456616 by娆ч槼灏忎繆 + +/*==================polyfit(n,x,y,poly_n,a)===================*/ +/*=======鎷熷悎y=a0+a1*x+a2*x^2+鈥︹+apoly_n*x^poly_n========*/ +/*=====n鏄暟鎹釜鏁 xy鏄暟鎹 poly_n鏄椤瑰紡鐨勯」鏁======*/ +/*===杩斿洖a0,a1,a2,鈥︹[poly_n]锛岀郴鏁版瘮椤规暟澶氫竴锛堝父鏁伴」锛=====*/ +void polyfit(int n, int x[], int y[], int poly_n, float p[]) +{ + int i, j; + float *tempx, *tempy, *sumxx, *sumxy, *ata; + + tempx = (float *)calloc(n , sizeof(float)); + sumxx = (float *)calloc((poly_n * 2 + 1) , sizeof(float)); + tempy = (float *)calloc(n , sizeof(float)); + sumxy = (float *)calloc((poly_n + 1) , sizeof(float)); + ata = (float *)calloc( (poly_n + 1) * (poly_n + 1) , sizeof(float) ); + for (i = 0; i < n; i++) + { + tempx[i] = 1; + tempy[i] = y[i]; + } + for (i = 0; i < 2 * poly_n + 1; i++) + { + for (sumxx[i] = 0, j = 0; j < n; j++) + { + sumxx[i] += tempx[j]; + tempx[j] *= x[j]; + } + } + for (i = 0; i < poly_n + 1; i++) + { + for (sumxy[i] = 0, j = 0; j < n; j++) + { + sumxy[i] += tempy[j]; + tempy[j] *= x[j]; + } + } + for (i = 0; i < poly_n + 1; i++) + { + for (j = 0; j < poly_n + 1; j++) + { + ata[i * (poly_n + 1) + j] = sumxx[i + j]; + } + } + gauss_solve(poly_n + 1, ata, p, sumxy); + + free(tempx); + free(sumxx); + free(tempy); + free(sumxy); + free(ata); +} +/*============================================================ + 楂樻柉娑堝厓娉曡绠楀緱鍒 n 娆″椤瑰紡鐨勭郴鏁 + n: 绯绘暟鐨勪釜鏁 + ata: 绾挎х煩闃 + sumxy: 绾挎ф柟绋嬬粍鐨刌鍊 + p: 杩斿洖鎷熷悎鐨勭粨鏋 + ============================================================*/ +void gauss_solve(int n, float A[], float x[], float b[]) +{ + int i, j, k, r; + float max; + for (k = 0; k < n - 1; k++) + { + max = fabs(A[k * n + k]); // find maxmum + r = k; + for (i = k + 1; i < n - 1; i++) + { + if (max < fabs(A[i * n + i])) + { + max = fabs(A[i * n + i]); + r = i; + } + } + if (r != k) + { + for (i = 0; i < n; i++) //change array:A[k]&A[r] + { + max = A[k * n + i]; + A[k * n + i] = A[r * n + i]; + A[r * n + i] = max; + } + max = b[k]; //change array:b[k]&b[r] + b[k] = b[r]; + b[r] = max; + } + + for (i = k + 1; i < n; i++) + { + for (j = k + 1; j < n; j++) + A[i * n + j] -= A[i * n + k] * A[k * n + j] / A[k * n + k]; + b[i] -= A[i * n + k] * b[k] / A[k * n + k]; + } + } + + for (i = n - 1; i >= 0; x[i] /= A[i * n + i], i--) + { + for (j = i + 1, x[i] = b[i]; j < n; j++) + x[i] -= A[i * n + j] * x[j]; + } +} diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/D-EEProm.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/D-EEProm.ino new file mode 100644 index 0000000..59cf39d --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/D-EEProm.ino @@ -0,0 +1,130 @@ +void ViewEEPRom() { + setRotary(0, 1023, 16, 0); + lastbutton = (!digitalRead(BUTTON_PIN)); + arduboy.setTextSize(1); + do { + arduboy.clear(); + for (byte y = 0; y < 8; y++) { + for (byte x = 0; x < 2; x++) { + if (2 * y + x > 1024) break; + arduboy.setCursor(x * 64, y * 8); + arduboy.print(2 * y + x + getRotary()); + arduboy.print(F("->")); + arduboy.print(EEPROM[2 * y + x + getRotary()]); + arduboy.setCursor(x * 64 + 48, y * 8); + arduboy.print((char)EEPROM[2 * y + x + getRotary()]); + } + } + CheckLastButton(); + arduboy.display(); + } while (digitalRead(BUTTON_PIN) || lastbutton); +} +/* 浠嶦EPROM璇诲彇鐑欓搧澶村弬鏁 + 浼犲叆锛氱儥閾佸ご鐨勫簭鍙 + 浣滅敤锛氭妸瀵瑰簲搴忓彿鐨勭儥閾佸ご鍙傛暟鐩存帴杞藉叆鍐呭瓨 + 鍘熺悊锛 + 1 璁$畻鍦板潃 + 2 璇诲彇鏁版嵁 +*/ +void GetEEPRomTip(byte n) { + if (n <= TIPMAX) { + uint16_t Counter = 21; + //璺宠浆鍒扮洰鏍囧湴鍧 + Counter += (TIPNAMELENGTH + 1) * n; + Counter += 5 * 4 * n; + //浠嶦EPRom璇诲彇鏁版嵁骞惰浇鍏ュ唴瀛 + for (int i = 0; i < (TIPNAMELENGTH + 1); i++) TipName[i] = EEPROM.read(Counter++); + for (int i = 0; i < 4; i++) EEPROM.get(Counter += 4, PTemp[i]); + } +} + +/* 鎶婄儥閾佸ご鍙傛暟鍐欏叆EEPRom + 浼犲叆锛氱儥閾佸ご鐨勫簭鍙 + 浣滅敤锛氭妸瀵瑰簲搴忓彿鐨勭儥閾佸ご鍙傛暟浠庤繍琛屽唴瀛樿浇鍏ュ埌EEPRom + 鍘熺悊锛 + 1 璁$畻鍦板潃 + 2 鍐欏叆EEProm +*/ +void PutEEPRomTip(byte n) { + if (n <= TIPMAX) { + uint16_t Counter = 21; + //璺宠浆鍒扮洰鏍囧湴鍧 + Counter += (TIPNAMELENGTH + 1) * n; + Counter += 5 * 4 * n; + //浠嶦EPRom璇诲彇鏁版嵁骞惰浇鍏ュ唴瀛 + for (int i = 0; i < (TIPNAMELENGTH + 1); i++) EEPROM.update(Counter++, TipName[i]); + for (int i = 0; i < 4; i++) EEPROM.put(Counter += 4, PTemp[i]); + } +} + +/* 浠嶦EPROM鍒犻櫎鏌愪竴椤圭儥閾佸ご鍙傛暟 + 浼犲叆锛氱儥閾佸ご搴忓彿 + 浣滅敤锛氭妸搴忓彿鍚庣殑鐑欓搧澶存暟鎹綅瑕嗙洊绉诲埌搴忓彿鐨勪綅缃紝瀹炵幇鍒犻櫎鏁版嵁鐨勭洰鐨 +*/ +void DelEEPRomTip(byte n) { + if (n <= TIPMAX) { + uint16_t Counter = 21; + //璺宠浆鍒扮洰鏍囧湴鍧 + Counter += (TIPNAMELENGTH + 1) * n; + Counter += 5 * 4 * n; + //寮濮嬭鐩栫Щ鍔ㄥ悗闈㈢殑鏁版嵁 + byte moveN = NumberOfTips - n - 1; + while (moveN--) { + for (int i = Counter; i < Counter + (TIPNAMELENGTH + 1) + 4 * 5; i++) EEPROM[i] = EEPROM[i + (TIPNAMELENGTH + 1) + 4 * 5]; + Counter += (TIPNAMELENGTH + 1) + 4 * 5; + } + } +} + +// 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); + UnderVoltage = EEPROM.read(17); + Password = (EEPROM.read(18) << 8) | EEPROM.read(19); + RotaryD = EEPROM.read(20); + } + else { + EEPROM.update(0, EEPROM_IDENT >> 8); EEPROM.update(1, EEPROM_IDENT & 0xFF); + UpdateEEPROM(); + } + GetEEPRomTip(CurrentTip); +} + + +// 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); + EEPROM.update(17, UnderVoltage); + EEPROM.update(18, Password >> 8); + EEPROM.update(19, Password & 0xFF); + EEPROM.update(20, RotaryD); + PutEEPRomTip(CurrentTip); +} diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/F.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/F.ino new file mode 100644 index 0000000..873b2ee --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/F.ino @@ -0,0 +1,315 @@ + +// reads current rotary encoder value +int getRotary() { + return (Count >> ROTARY_TYPE); +} + +//妫鏌ユ寜閿 +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; +} + + +// 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 +float 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(10); // 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); { + if (result < 540) return (result * Vcc / 184.416 + 86.987); + else if (result < 660) return (result * Vcc / 173.204 - 878.29); + else if (result < 745) return (result * Vcc / 143.579 - 4875); + else if (result < 781) return (result * Vcc / 119.109 - 10260); + else if (result < 800) return (result * Vcc / 86.178 - 23013); + else return (result * Vcc / 86.178 - 23113); + } // 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; + } + } +} + +//璁$畻瀹為檯娓╁害 +// calculates real temperature value according to ADC reading and calibration values +void calculateTemp() { + CurrentTemp = PTemp[0] + RawTemp * PTemp[1] + RawTemp * RawTemp * PTemp[2] + RawTemp * RawTemp * RawTemp * PTemp[3]; +} + +/* + * 娓╁害鎺у埗 + * mode-> 0:浠ュ疄闄呮俯搴︽暟鍊间负鍩哄噯 1:浠DC鏁板间负鍩哄噯(闈濸ID妯″紡) +*/ +void Thermostat(bool mode) { + // 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) + if (!mode) { + 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; + } + } else { + gap = 0; //姝ゆā寮忎笅涓嶈绠楁俯搴﹀樊 + if ((RawTemp + 0.5) < Setpoint) Output = 0; else Output = 255; + } + // set heater PWM +#if UsePMOS + analogWrite(CONTROL_PIN, 255 - Output); +#else + analogWrite(CONTROL_PIN, Output); +#endif +} + + +// creates a short beep on the buzzer +void beep() { + //浣撹皡涓涓嬶紝娌″唴瀛樹簡锛屽彧鑳界敤鍘熷鐨勫姙娉曢┍鍔ㄦ棤婧愯渹楦e櫒锛屽惁鍒欐垜涔熶笉鎯崇壓鐗插疂璐靛搷搴旇祫婧愭崲鍐呭瓨 + 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; + if (RotaryD) CountStep = rstep; else CountStep = -rstep; + Count = rvalue << ROTARY_TYPE; +} + +// reads temperature, vibration switch and supply voltages +void SENSORCheck() { + // shut off heater in order to measure temperature +#if UsePMOS + analogWrite(CONTROL_PIN, 0); +#else + analogWrite(CONTROL_PIN, 255); +#endif + 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 + + // turn on again heater + +#if UsePMOS + analogWrite(CONTROL_PIN, 255 - Output); +#else + analogWrite(CONTROL_PIN, Output); +#endif + + + RawTemp += (temp - RawTemp) * SMOOTHIE; // stabilize ADC temperature reading + calculateTemp(); + + // stabilize displayed temperature when around setpoint + if ((ShowTemp != Setpoint) || (abs(ShowTemp - CurrentTemp) > 5)) ShowTemp = CurrentTemp; + if (abs(ShowTemp - Setpoint) <= 1) ShowTemp = Setpoint; + // set state variable if temperature is in working range; beep if working temperature was just reached + gap = abs(SetTemp - CurrentTemp); + if (gap < 10) { + if (!IsWorky && BeepIfWorky) beep(); + IsWorky = true; + BeepIfWorky = false; + } else { + IsWorky = false; + BeepIfWorky = true; + } + // checks if tip is present or currently inserted + if (ShowTemp > 500) TipIsPresent = false; // tip removed ? + if (!TipIsPresent && (ShowTemp < 500)) { // new tip inserted ? + //鍏抽棴鍔犵儹 +#if UsePMOS + analogWrite(CONTROL_PIN, 0); +#else + analogWrite(CONTROL_PIN, 255); +#endif + 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 + } +} + + + +// 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 + + // then start the heater right now + +#if UsePMOS + analogWrite(CONTROL_PIN, 255); +#else + analogWrite(CONTROL_PIN, 0); +#endif + + 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(); + } +} + +void SetOLEDLightLevel(uint8_t level) { + arduboy.sendLCDCommand(0x81); //鍚慡SD1306鍙戦佹寚浠わ細璁剧疆鍐呴儴鐢甸樆寰皟 + arduboy.sendLCDCommand(level); //寰皟鑼冨洿锛0-255锛 +} + +ISR(WDT_vect) //WDT涓柇锛8绉掍竴娆 +{ + WDTCSR |= _BV(WDIE); +} diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/GUI.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/GUI.ino new file mode 100644 index 0000000..3571071 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/GUI.ino @@ -0,0 +1,714 @@ + +// draws the main screen +void MainScreen() { + if (!(arduboy.nextFrame())) //甯х巼閿 + return; + //鐘舵 + byte SysState; + if (ShowTemp > 500) SysState = 0; + else if (InOffMode) { + SysState = 1; + DrawIntensiveComputing(); + } else if (InSleepMode) SysState = 2; + else if (InBoostMode) SysState = 3; + else if (IsWorky) SysState = 4; + else if (Output < 180) SysState = 5; + else SysState = 6; + if (SysState != 1) { + if (MainScrType) { + //arduboy.invert(0); + arduboy.clear(); + //璇︾粏淇℃伅椤 + arduboy.fillRect(0, 0, 128, 64, 1); //鐧藉簳 + arduboy.setTextSize(1); + SetTextColor(0); + //棰勮鍚 + //arduboy.drawSlowXYBitmap(0, 0, Tag, 16, 16, 0); + arduboy.setCursor(7, 4); arduboy.print(TipName); + //鏄剧ず鐘舵 + arduboy.setCursor(53, 1); + arduboy.setTextSize(2); + switch (LANG) { + case 0: arduboy.drawSlowXYBitmap(95, 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(74, 1, C_table[SysState], 14, 14, 0); + arduboy.setTextSize(1); + + //鏄剧ず鎺㈠ご娓╁害 + DrawNumRect(0, 15, 5, ShowTemp); + + //鐘舵佹潯 + DrawStatusBar(0); + + //鐘舵佸浘鏍 浠ュ強 淇℃伅 + //鑷姩鎶ヨ-鍥炬爣闂儊 + if (getChipTemp() < 80 || ((millis() * 4) / 1000) % 2) { + arduboy.setCursor(91, 20); arduboy.print(getChipTemp(), 1); arduboy.print((char)248); arduboy.print(F("C")); //鑺墖娓╁害 + arduboy.drawSlowXYBitmap(42, 1, Chip, 14, 14, 0); + } + if ((float)Vin / 100 > UnderVoltage || ((millis() * 4) / 1000) % 2) { + arduboy.setCursor(91, 28); arduboy.print((float)getVIN() / 1000, 2); arduboy.print(F("V")); //杈撳叆鐢靛帇 + arduboy.drawSlowXYBitmap(58, 1, Lightning, 14, 14, 0); + } + arduboy.setCursor(91, 36); arduboy.print((float)getVCC() / 1000, 3); arduboy.print(F("V")); //鑺墖鐢靛帇 + arduboy.setCursor(91, 44); arduboy.print(RawTemp, 0); //鐑欓搧澶寸儹鍋跺師濮嬫暟鎹 + + + + + arduboy.display(); + //璀︽姤澹 + if (getChipTemp() > 80 && ((millis() * 4) / 1000) % 2 || (float)Vin / 100 < UnderVoltage && ((millis() * 4) / 1000) % 2) beep(); + } else { + //arduboy.invert(1); + arduboy.setTextSize(6); + SetTextColor(1); + arduboy.clear(); + if (getChipTemp() > 80 && ((millis() * 4) / 1000) % 2) beep(); + if ((float)Vin / 100 < UnderVoltage && ((millis() * 4) / 1000) % 2) beep(); + arduboy.setCursor(12, 2); + + if (ShowTemp > 500) arduboy.print(999); else arduboy.print(ShowTemp); + DrawStatusBar(1); + arduboy.display(); + } + } +} +void DrawNumRect(byte x, byte y, byte size, int n) { + arduboy.setCursor(3 + x, 3 + y); + arduboy.setTextSize(size); + if (ShowTemp > 500) arduboy.print(F("000")); else arduboy.print(n); + arduboy.drawRect(1 + x, 1 + y, 89, 39, 0); +} + +//缁樺埗鐘舵佹潯 +void DrawStatusBar(bool color) { + SetTextColor(color); + arduboy.setTextSize(1); + //娓╁害鏉 + //妗 + arduboy.drawRect(1, 54, 102, 9, color); + //鏉 + if (ShowTemp <= 500) arduboy.fillRect(1, 54, map(ShowTemp, 0, 500, 2, 102), 9, color); + //鎸囩ず閮ㄥ垎 + arduboy.fillRect(map(Setpoint, 0, 500, 2, 102) - 2, 55, 3, 7, color); + //鍏堟潵涓櫧搴 + arduboy.fillRect(map(Setpoint, 0, 500, 2, 102) - 3, 63, 5, 1, color); + arduboy.drawLine(map(Setpoint, 0, 500, 2, 102) - 1, 63, map(Setpoint, 0, 500, 2, 102) - 1, 54, !color); + + //鐢绘寚绀洪拡 + arduboy.drawSlowXYBitmap(map(Setpoint, 0, 500, 2, 102) - 3, 59, Pointer, 5, 4, !color); + + //鍔熺巼鏉 + arduboy.drawRect(104, 54, 23, 9, color); + arduboy.fillRect(104, 54, map(Output, 255, 0, 0, 23), 9, color); + + SetTextColor(!color); + //////////////杩涘叆鍙嶈壊//////////////////////////////// + arduboy.setCursor(2, 55); arduboy.print(Setpoint, 0);//鎺㈠ご棰勮娓╁害 + arduboy.setCursor(105, 55); arduboy.print(map(Output, 255, 0, 0, 100)); arduboy.print(F("%")); //鍔熺巼鐧惧垎姣 + SetTextColor(color); +} + +//璁剧疆鐢荤瑪棰滆壊 +void SetTextColor(bool color) { + arduboy.setTextBackground(!color); + arduboy.setTextColor(color); +} + + +// setup screen +void SetupScreen() { + //鍏抽棴鍔犵儹 +#if UsePMOS + analogWrite(CONTROL_PIN, 0); +#else + analogWrite(CONTROL_PIN, 255); +#endif + beep(); + uint16_t SaveSetTemp = SetTemp; + uint8_t selection = 0; + bool repeat = true; + + while (repeat) { + //arduboy.invert(0); + 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: ScreenSet(); break; + case 5: MenuLevel = 6; BeepEnable = MenuScreen(BeepEnable); break; + case 6: RotarySet(); break; + case 7: UnderVoltageSet(); break; + case 8: PasswordSet(); break; + case 9: MenuLevel = 8; LANG = MenuScreen(LANG); if (LANG == 2 && !LANG_JP_State) LANG = 1; break; + case 10: QRcodeScreen(); break; + default: repeat = false; break; + } + } + UpdateEEPROM(); + handleMoved = true; + SetTemp = SaveSetTemp; + setRotary(TEMP_MIN, TEMP_MAX, TEMP_STEP, SetTemp); +} + +//璁剧疆婊氳疆鏂瑰悜 +void RotarySet() { + bool Exit = false; + float rad; + byte ExitBar = 0; + bool color = 0; + SetTextColor(!color); + lastbutton = (!digitalRead(BUTTON_PIN)); + setRotary(60, 420, 18, 240); + do { + arduboy.setTextSize(1); + Setpoint = getRotary(); + ShowTemp = Setpoint; + + arduboy.clear(); + + arduboy.fillRect(0, 0, 128, 64, color); + + //浠〃鐩 + arduboy.fillCircle(24 + 12 * cos(rad), 24 - 12 * sin(rad), 5, !color); + arduboy.drawCircle(24, 24, 20, !color); + + //鍙充笂瑙掔殑妯″紡鎻愮ず鏂囨湰 + arduboy.setCursor(55, 1); + arduboy.setTextSize(2); + arduboy.print(F("MODE ")); + if (RotaryD) { + arduboy.print(F("-")); + rad = ((Setpoint - 60) / 360.0) * (2 * PI) - PI / 2; + } else { + arduboy.print(F("+")); + rad = ((-Setpoint - 60) / 360.0) * (2 * PI) + PI * 1 / 6; + } + //鍙充晶鏁板瓧鏄剧ず + DrawNumRect(55, 18, 4, ShowTemp); + //涓嬬鐨勭姸鎬佹潯 + DrawStatusBar(!color); + //閫鍑烘潯 + arduboy.fillRect(0, 0, ExitBar, 4, !color); + arduboy.display(); + CheckLastButton(); + if (!digitalRead(BUTTON_PIN) && !lastbutton) { + ExitBar += 8; + arduboy.display(); + if (ExitBar > 127) Exit = true; + } else { + if (ExitBar > 1 && ExitBar < 64) { + RotaryD = !RotaryD; + setRotary(60, 420, 18, 240); + beep(); + } + ExitBar = 0; + } + + } while (!Exit); + beep(); beep(); +} +//鏄剧ず璁剧疆鑿滃崟 +// tip settings screen +void ScreenSet() { + uint8_t selection = 0; + bool repeat = true; + while (repeat) { + MenuLevel = 9; + selection = MenuScreen(selection); + switch (selection) { + case 0: MenuLevel = 5; MainScrType = MenuScreen(MainScrType); break; + case 1: FlipState = !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; + } + } + //ViewEEPRom(); +} + +//娓╂帶璁剧疆鑿滃崟 +// 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(18); break; + case 1: setRotary(20, 200, TEMP_STEP, SleepTemp); + SleepTemp = InputScreen(19); break; + case 2: setRotary(10, 100, TEMP_STEP, BoostTemp); + BoostTemp = InputScreen(20); 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(22); break; + case 1: setRotary(0, 60, 5, Time2off); + Time2off = InputScreen(23); break; + case 2: setRotary(0, 180, 10, TimeOfBoost); + TimeOfBoost = InputScreen(24); break; + default: repeat = false; break; + } + } + UpdateEEPROM(); +} +//鑻辫鏀寔 +//i-鏂囨湰id c-灞呬腑 +void Print_EN(byte i) { + char buffer[11]; + byte a = 0; + strcpy_P(buffer, (char *)pgm_read_word(&(EN_table[i]))); + while (1) { + if (buffer[a] != '\0') a++; else break; + } + arduboy.setCursor((128 - a * 6) / 2, 52); + arduboy.print(buffer); +} +//鑿滃崟鐣岄潰 +// 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)); + SetTextColor(1); + do { + selected = getRotary(); + //闈炵嚎鎬ф粦鍔ㄥ姩鐢 + SlidingAnimationX += (selected - lastselected) * 56; + if (SlidingAnimationX != 0) SlidingAnimationX += 0.55 * (-SlidingAnimationX); + lastselected = selected; + arduboy.clear(); + //缁樺埗鍥炬爣 濡傛灉鏈夋寚瀹氱殑璇 + for (byte i = 0; i < 5; i++) if (selected - 2 + i >= 0 && selected - 2 + i < Menu_table[MenuLevel]) DrawApp(-72 + i * 56 + SlidingAnimationX, selected - 2 + i + QueryMenuObject()); + DrawAppText(selected + QueryMenuObject()); + + arduboy.display(); + CheckLastButton(); + //beep(0); + } while (digitalRead(BUTTON_PIN) || lastbutton); + beep(); + return selected; +} + +//鏄剧ずAPP鍥炬爣 +void DrawApp(int x, byte appID) { + DrawUIFrame(x, 0, 1); + drawSlowXYBitmapResize(x + 3, 3, Ico_table[appID], 14, 14, 3, 1); +} + +//鏄剧ずAPP瀵瑰簲鐨勬枃鏈 +void DrawAppText(byte appID) { + // arduboy.setCursor(0, 55); arduboy.print(appID); + if (LANG == 0) arduboy.drawSlowXYBitmap(48, 48, CN_table[appID], 36, 16, 1); else if (LANG == 2 && LANG_JP_State) { +#if LANG_JP_State + drawText(48, 52, JP_table[appID], pgm_read_byte(&(JP_Length_table[appID]))); +#endif + } else { + arduboy.setCursor(48, 52); + arduboy.setTextSize(1); + Print_EN(appID); + } +} + +void DrawUIFrame(int x, int y, bool color) { + arduboy.fillRect(x, y, 48, 48, color); + arduboy.fillRect(x + 3, y + 3, 42, 42, !color); //闆曠┖ + DrawPoint(x, y, 0); + DrawPoint(x + 47, y, 0); + DrawPoint(x, y + 47, 0); + DrawPoint(x + 47, y + 47, 0); +} + +void DrawPoint(int x, int y, bool color) { + arduboy.drawPixel(x + 1, y, color); + arduboy.drawPixel(x - 1, y, color); + arduboy.drawPixel(x, y + 1, color); + arduboy.drawPixel(x, y - 1, color); + arduboy.drawPixel(x, y, color); +} + +//FP 瀵嗛泦杩愮畻灞忎繚 +void DrawIntensiveComputing() { + //鍏抽棴鍔犵儹 +#if UsePMOS + analogWrite(CONTROL_PIN, 0); +#else + analogWrite(CONTROL_PIN, 255); +#endif + float calculate; + // while (1) { + arduboy.clear(); + + //闅忔満绾挎潯 + DrawIntensiveComputingLine(); + + calculate = sin(millis() / 4000.0); + //妯℃嫙鍣偣 + for (int i = 0; i < calculate * 256 + 256; i++) arduboy.drawPixel(random(0, 128), random(0, 64), 1); + //澹版晥 + if ((BeepEnable)) analogWrite(BUZZER_PIN, 64 + calculate * 64 + random(-8, 8)); + //if ((BeepEnable)) tone(BUZZER_PIN, int(calculate * 300) + 500 + random(-50, 50)); //娌″繀瑕佹氮璐瑰唴瀛 + + arduboy.display(); + //delay(60-calculate*30); + //} +} +//缁樺埗灞忎繚-瀵嗛泦杩愮畻绾挎潯 +void DrawIntensiveComputingLine() { + for (byte a = 0; a < 4; a++) { + Line[a] += random(-1, 1); + if (Line[a] > 128) Line[a] -= 128; + for (byte b = 0; b < random(3, 6); b++) { + arduboy.drawFastHLine(0, Line[a] + random(-10, 10), 128, 1); //姘村钩绾 + arduboy.drawFastVLine(Line[a] + random(-10, 10), 0, 64, 1); //鍨傜洿绾 + } + } +} +//妯℃嫙鏁板瓧婊氳疆 Numerical scrolling effect +void DisplayNum(int Num) { + arduboy.setTextSize(6); + SetTextColor(0); + //鏁板瓧婊氳疆 + for (byte i = 0; i < 3; i++) LastValue[i] = int(Value / pow(10, 2 - i)) % 10; + Value = Num; + for (byte i = 0; i < 3; i++) { + SlidingAnimationY[i] += ((int(Value / pow(10, 2 - i)) % 10) - 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); + } + } + //鍒诲害鏍 + arduboy.fillRect(0, 0, 128, 2, 0); //涓婇伄缃╁眰 + arduboy.fillRect(0, 48, 128, 16, 0); //涓嬮伄缃╁眰 +} + +//鏁板艰緭鍏ョ晫闈 +// input value screen +uint16_t InputScreen(byte appID) { + lastbutton = (!digitalRead(BUTTON_PIN)); + do { + arduboy.clear(); + DisplayNum(getRotary()); + DrawAppText(appID); + arduboy.display(); + CheckLastButton(); + } while (digitalRead(BUTTON_PIN) || lastbutton); + beep(); + return Value; +} + +//璁剧疆寮鏈哄瘑鐮 +void PasswordSet() { + Password = InputBigNum(Password, 8); + beep(); +} + +void BootPassword() { + if (Password != 0) { + do { + arduboy.clear(); + DrawApp(40, 8); + DrawAppText(8); + arduboy.display(); + delay(1000); + beep(); beep(); beep(); + } while (InputBigNum(0, 8) != Password); + } +} + +//娆犲帇鎶ヨ璁剧疆 +// information display screen +void UnderVoltageSet() { + setRotary(0, 250, 1, UnderVoltage); + UnderVoltage = InputScreen(7); + 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 { + //beep(0); + 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)); + GetEEPRomTip(selected + i - arrow); + arduboy.print(TipName); + } + } + CheckLastButton(); + arduboy.display(); + } while (digitalRead(BUTTON_PIN) || lastbutton); + + beep(); + CurrentTip = selected; + GetEEPRomTip(CurrentTip); + beep(); + ShowPTemp(&PTemp[0]); + + +} + +//娓╁害鏍″噯鐣岄潰 +// temperature calibration screen +void CalibrationScreen() { + float P[4]; + int xx[9]; + for (int CalStep = 0; CalStep < 9; CalStep++) { + if (CalStep != 0) setRotary(0, 1023, 1, xx[CalStep - 1]); else setRotary(0, 1023, 1, 0); + BeepIfWorky = true; + lastbutton = (!digitalRead(BUTTON_PIN)); + do { + arduboy.clear(); + arduboy.setTextSize(1); + SENSORCheck(); //璇诲彇浼犳劅鍣 + SetTemp = getRotary(); + Thermostat(1); //鍔犵儹鎺у埗 - ADC鏁板间负鍩哄噯 + + arduboy.setCursor(8, 0); + arduboy.print(F("Cal ADC-> ")); + arduboy.print(RawTemp); + + for (byte y = 0; y < 5; y++) { + for (byte x = 0; x < 2; x++) { + if (2 * y + x > CalStep) break; + arduboy.setCursor(x * 64 + 4, y * 8 + 16); + arduboy.print(CalTemp[2 * y + x]); + arduboy.print(F(" - ")); + if (2 * y + x == CalStep) arduboy.print(getRotary()); + else arduboy.print(xx[2 * y + x]); + } + } + + CheckLastButton(); + arduboy.display(); + } while (digitalRead(BUTTON_PIN) || lastbutton); + xx[CalStep] = getRotary(); + beep(); delay (10); + } + + //鍏抽棴鍔犵儹 +#if UsePMOS + analogWrite(CONTROL_PIN, 0); +#else + analogWrite(CONTROL_PIN, 255); +#endif + delayMicroseconds(Time2settle); // wait for voltage to settle + bool pass = true; + for (int i = 0; i < 8; i++) if (xx[i] + 5 >= xx[i + 1]) pass = false; + if (pass) { + MenuLevel = 7; + free(&pass); + polyfit(9, xx, CalTemp, 3, P); //鎷熷悎绋嬪簭 + free(xx); + ShowPTemp(&P[0]); + if (MenuScreen(0)) { + for (uint8_t i = 0; i < 4; i++) PTemp[i] = P[i]; //鍐欏叆鎷熷悎绯绘暟 + free(P); + UpdateEEPROM(); + } + } else { + arduboy.clear(); + arduboy.setCursor(0, 24); arduboy.print(F("ERROR")); + arduboy.display(); + delay(5000); + } +} +//鏄剧ず榛樿鐑欓搧澶存俯搴︽洸绾跨郴鏁 +void ShowPTemp(float *p) { + arduboy.clear(); + arduboy.setTextSize(1); + for (int i = 0; i < 4; i++) { + arduboy.setCursor(12, i * 8 + 16); + arduboy.print(F("P[")); + arduboy.print(i, 7); + arduboy.print(F("] = ")); + arduboy.print(*p, 7); + p++; + } + arduboy.display(); + lastbutton = (!digitalRead(BUTTON_PIN)); + while (digitalRead(BUTTON_PIN) || lastbutton) CheckLastButton(); + +} +//鍛藉悕鐣岄潰 鏂囨湰杈撳叆鐣岄潰 +// 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[i]); + arduboy.setCursor(16 * digit, 32); arduboy.print(char(value)); + CheckLastButton(); + arduboy.display(); + } while (digitalRead(BUTTON_PIN) || lastbutton); + TipName[digit] = value; + beep(); delay (10); + } + TipName[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 { + DelEEPRomTip(CurrentTip); + } + NumberOfTips--; + } +} + +//鏂板缓鐑欓搧 棰勮 +// add new tip screen +void AddTipScreen() { + if (NumberOfTips < TIPMAX) { + CurrentTip = NumberOfTips++; InputNameScreen(); + PTemp[0] = TempP1; + PTemp[1] = TempP2; + PTemp[2] = TempP3; + PTemp[3] = TempP4; + } + UpdateEEPROM(); +} + +int InputBigNum(int InputPW, byte appID) { + setRotary(0, 900, 100, InputPW); + InputPW = InputScreen(appID); + setRotary(InputPW, InputPW + 90, 10, InputPW); + InputPW = InputScreen(appID); + setRotary(InputPW, InputPW + 9, 1, InputPW); + InputPW = InputScreen(appID); + return InputPW; +} +void QRcodeScreen() { + arduboy.clear(); + arduboy.drawSlowXYBitmap(40, 0, QRCode, 48, 48, 1); + arduboy.display(); + delay(100); + do { + } while (digitalRead(BUTTON_PIN) || lastbutton); + beep(); +} + +//浣嶅浘缂╂斁 浠g爜鐗囨鏀硅嚜arduboy2 +void drawSlowXYBitmapResize(int x, int y, const uint8_t *bitmap, uint8_t w, uint8_t h, uint8_t size, uint8_t color) { + int16_t xi, yi, byteWidth = (w + 7) / 8; + for (yi = 0; yi < h; yi ++) { + for (xi = 0; xi < w; xi ++) { + if (pgm_read_byte(bitmap + yi * byteWidth + xi / 8) & (128 >> (xi & 7))) { + arduboy.fillRect(x + xi * size, y + yi * size, size, size, color); + } + } + } +} + +//缈昏浆 +void Flip(bool Fmode) { + arduboy.flipVertical(Fmode); + arduboy.flipHorizontal(Fmode); +} + +//灞曠ず鐗堟湰鍙 +void ShowVersion() { + arduboy.clear(); + arduboy.setCursor(43, 28); + arduboy.print(F(VERSION)); + arduboy.display(); + delay(1000); +} diff --git a/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/WDT.ino b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/WDT.ino new file mode 100644 index 0000000..6fd9c38 --- /dev/null +++ b/software/UI_upgrade_by_createskyblue/Program/1.8/1.8t7/WDT.ino @@ -0,0 +1,54 @@ +//********** 鐪嬮棬鐙楀嚱鏁 ********** +void set_wdt_mod(uint8_t mod, uint8_t ii) //妯″紡锛岃秴鏃舵椂闂 +{ + /* + WDCE + 璇ヤ綅鍦ㄥ畾鏃跺簭鍒椾腑鐢ㄤ簬鏇存敼WDE鍜岄鍒嗛鍣ㄤ綅 + 瑕佹竻闄DE浣嶆垨鏇存敼棰勫垎棰戝櫒浣嶏紝蹇呴』灏哤DCE缃1銆 + 涓鏃﹀啓鍏1锛岀‖浠跺皢鍦ㄥ洓涓椂閽熷懆鏈熷悗娓呴櫎WDCE銆 + 0=16ms,1=32ms,2=64ms,3=128ms,4=250ms + 5=500ms,6=1s,7=2s,8=4s,9=8s + */ + if (ii > 9 ) ii = 9; + byte bb; + bb = ii & 7; + if (ii > 7) bb |= (1 << 5); + bb |= (1 << WDCE); + + switch (mod) { + case 0: //鍏抽棴鐪嬮棬鐙 + __asm__ __volatile__ ("wdr"); //鐪嬮棬鐙楀浣 + MCUSR = 0x00; //鐪嬮棬鐙楀浣嶆爣蹇楁竻闆 + WDTCSR = (1 << WDCE) | (1 << WDE); //鎵撳紑鍏佽淇敼浣胯兘锛屽苟WDE缃1 + WDTCSR = 0x00; //娓呴櫎鎵鏈夐鍒嗛浣 + break; + + case 1: //鎵撳紑鐪嬮棬鐙楋紝璁剧疆澶嶄綅妯″紡 + __asm__ __volatile__ ("wdr"); //鐪嬮棬鐙楀浣 + MCUSR &= ~(1 << WDRF); //MUUSR涓殑WDRF娓呴浂锛屾竻闄ゅ浣嶆爣蹇 + WDTCSR |= (1 << WDCE) | (1 << WDE); //鎵撳紑鍏佽淇敼浣胯兘锛屽苟WDE缃1 + //璁剧疆鏂扮殑鐪嬮棬鐙楄秴鏃跺糱b + WDTCSR = bb; //8绉掓椂bb=0011 0001 + WDTCSR |= _BV(WDE); //璁剧疆澶嶄綅妯″紡 + break; + + case 2: //鎵撳紑鐪嬮棬鐙楋紝璁剧疆涓柇妯″紡 + __asm__ __volatile__ ("wdr"); //鐪嬮棬鐙楀浣 + MCUSR &= ~(1 << WDRF); //MUUSR涓殑WDRF娓呴浂锛屾竻闄ゅ浣嶆爣蹇 + WDTCSR |= (1 << WDCE) | (1 << WDE); //鎵撳紑鍏佽淇敼浣胯兘锛屽苟WDE缃1 + //璁剧疆鏂扮殑鐪嬮棬鐙楄秴鏃跺糱b + WDTCSR = bb; //8绉掓椂bb=0011 0001 + WDTCSR |= _BV(WDIE); //璁剧疆涓柇妯″紡 + break; + + case 3: //鎵撳紑鐪嬮棬鐙楋紝璁剧疆涓柇鍜屽浣嶆ā寮 + __asm__ __volatile__ ("wdr"); //鐪嬮棬鐙楀浣 + MCUSR &= ~(1 << WDRF); //MUUSR涓殑WDRF娓呴浂锛屾竻闄ゅ浣嶆爣蹇 + WDTCSR |= (1 << WDCE) | (1 << WDE); //鎵撳紑鍏佽淇敼浣胯兘锛屽苟WDE缃1 + //璁剧疆鏂扮殑鐪嬮棬鐙楄秴鏃跺糱b + WDTCSR = bb; //8绉掓椂bb=0011 0001 + WDTCSR |= _BV(WDIE); //璁剧疆涓柇妯″紡 + WDTCSR |= _BV(WDE); //璁剧疆澶嶄綅妯″紡 + break; + } +} diff --git a/software/UI_upgrade_by_createskyblue/img/璁剧疆/Set6.png b/software/UI_upgrade_by_createskyblue/img/璁剧疆/Set6.png index 1b8b15a..4fcade3 100644 Binary files a/software/UI_upgrade_by_createskyblue/img/璁剧疆/Set6.png and b/software/UI_upgrade_by_createskyblue/img/璁剧疆/Set6.png differ