├── MatrixClock.jpg ├── ESP8266_LED_Matrix_Clock.gif ├── README.md ├── .github └── stale.yml └── MatrixClock.ino /MatrixClock.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schreibfaul1/ESP8266-LED-Matrix-Clock/HEAD/MatrixClock.jpg -------------------------------------------------------------------------------- /ESP8266_LED_Matrix_Clock.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schreibfaul1/ESP8266-LED-Matrix-Clock/HEAD/ESP8266_LED_Matrix_Clock.gif -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ESP8266-LED-Matrix-Clock 2 | 3 | https://www.youtube.com/watch?v=mea5-qX4O54 4 | 5 | Are required: 6 | - 6 MAX7219 incl 8x LED-Matrix8x8 7 | - one ESP8266 Board 8 | 9 | Brief description: 10 | During setup, the current time is obtained from an NTP via WLAN. If the clock is in operation, this process is repeated daily 11 | 12 | ![MatrixClock](https://github.com/schreibfaul1/ESP8266-LED-Matrix-Clock/blob/master/ESP8266_LED_Matrix_Clock.gif) 13 | 14 | 15 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 60 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 7 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - pinned 8 | - security 9 | # Label to use when marking an issue as stale 10 | staleLabel: wontfix 11 | # Comment to post when marking an issue as stale. Set to `false` to disable 12 | markComment: > 13 | This issue has been automatically marked as stale because it has not had 14 | recent activity. It will be closed if no further activity occurs. Thank you 15 | for your contributions. 16 | # Comment to post when closing a stale issue. Set to `false` to disable 17 | closeComment: false 18 | -------------------------------------------------------------------------------- /MatrixClock.ino: -------------------------------------------------------------------------------- 1 | //********************************************************************************************************* 2 | //* ESP8266 MatrixClock * 3 | //********************************************************************************************************* 4 | // 5 | // first release on 26.02.2017 6 | // updated on 30.11.2020 7 | // Version 2.0.2 8 | // 9 | // 10 | // THE SOFTWARE IS PROVIDED "AS IS" FOR PRIVATE USE ONLY, IT IS NOT FOR COMMERCIAL USE IN WHOLE OR PART OR CONCEPT. 11 | // FOR PERSONAL USE IT IS SUPPLIED WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 12 | // WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR 13 | // OR COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 14 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE 15 | // 16 | // 17 | 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | 24 | struct tm tm; // http://www.cplusplus.com/reference/ctime/tm/ 25 | 26 | // Digital I/O used 27 | #define MAX_CS 15 // Pin cs (SPI) 28 | 29 | // Credentials ---------------------------------------- 30 | const char* SSID = "******"; // "mySSID"; 31 | const char* PW = "******"; // "myWiFiPassword"; 32 | 33 | // Timezone ------------------------------------------- 34 | #define TZName "CET-1CEST,M3.5.0,M10.5.0/3" // Berlin (examples see at the bottom) 35 | //#define TZName "GMT0BST,M3.5.0/1,M10.5.0" // London 36 | //#define TZName "IST-5:30" // New Delhi 37 | 38 | // User defined text ---------------------------------- 39 | //#define UDTXT " Добрый день! ΕΠΙΧΡΥΣΟ " 40 | 41 | // other defines -------------------------------------- 42 | #define BRIGHTNESS 0 // values can be 0...15 43 | #define anzMAX 6 // number of cascaded MAX7219 44 | #define FORMAT24H // if not defined time will be displayed in 12h fromat 45 | #define SCROLLDOWN // if not defined it scrolls up 46 | 47 | // other displays ------------------------------------- 48 | //#define REVERSE_HORIZONTAL // Parola, Generic and IC-Station 49 | //#define REVERSE_VERTICAL // IC-Station display 50 | //#define ROTATE_90 // Generic display 51 | 52 | /* 53 | p A B C D E F G 7 6 5 4 3 2 1 0 G F E D C B A p G F E D C B A p 54 | ------------------------ ------------------------ ------------------------ ------------------------ 55 | 0 |o o o o o o o o| p |o o o o o o o o| 0 |o o o o o o o o| 7 |o o o o o o o o| 56 | 1 |o o o o o o o o| A |o o o o o o o o| 1 |o o o o o o o o| 6 |o o o o o o o o| 57 | 2 |o o o o o o o o| B |o o o o o o o o| 2 |o o o o o o o o| 5 |o o o o o o o o| 58 | 3 |o o o o| C |o o o o| 3 |o o o o| 4 |o o o o| 59 | 4 |o o FC-16 o o| D |o o Generic o o| 4 |o o Parola o o| 3 |o o IC-Station o o| 60 | 5 |o o o o| E |o o o o| 5 |o o o o| 2 |o o o o| 61 | 6 |o o o o o o o o| F |o o o o o o o o| 6 |o o o o o o o o| 1 |o o o o o o o o| 62 | 7 |o o o o o o o o| G |o o o o o o o o| 7 |o o o o o o o o| 0 |o o o o o o o o| 63 | ------------------------ ------------------------ ------------------------ ------------------------ 64 | */ 65 | 66 | unsigned short _maxPosX = anzMAX * 8 - 1; // calculated maxpos 67 | unsigned short _LEDarr[anzMAX][8]; // character matrix to display (40*8) 68 | unsigned short _helpArrMAX[anzMAX * 8]; // helperarray for chardecoding 69 | unsigned short _helpArrPos[anzMAX * 8]; // helperarray pos of chardecoding 70 | unsigned int _zPosX = 0; // xPos for time 71 | unsigned int _dPosX = 0; // xPos for date 72 | bool _f_tckr50ms = false; // flag, set every 50msec 73 | boolean _f_updown = false; //scroll direction 74 | uint16_t _chbuf[256]; 75 | 76 | const char* NTP_SERVER[] = {"de.pool.ntp.org", "at.pool.ntp.org", "europe.pool.ntp.org"}; 77 | 78 | // The object for the Ticker 79 | Ticker tckr; 80 | 81 | String M_arr[12] = {"Jan.", "Feb.", "Mar.", "Apr.", "May", "June", "July", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."}; 82 | String WD_arr[7] = {"Sun,", "Mon,", "Tue,", "Wed,", "Thu,", "Fri,", "Sat,"}; 83 | 84 | // Font 5x8 for 8x8 matrix, 0,0 is above right 85 | const uint8_t font_t[96][9] = { // monospace font only for the time 86 | { 0x07, 0x1c, 0x22, 0x26, 0x2a, 0x32, 0x22, 0x1c, 0x00 }, // 0x30, 0 87 | { 0x07, 0x08, 0x18, 0x08, 0x08, 0x08, 0x08, 0x1c, 0x00 }, // 0x31, 1 88 | { 0x07, 0x1c, 0x22, 0x02, 0x04, 0x08, 0x10, 0x3e, 0x00 }, // 0x32, 2 89 | { 0x07, 0x1c, 0x22, 0x02, 0x0c, 0x02, 0x22, 0x1c, 0x00 }, // 0x33, 3 90 | { 0x07, 0x04, 0x0c, 0x14, 0x24, 0x3e, 0x04, 0x04, 0x00 }, // 0x34, 4 91 | { 0x07, 0x3e, 0x20, 0x3c, 0x02, 0x02, 0x22, 0x1c, 0x00 }, // 0x35, 5 92 | { 0x07, 0x0c, 0x10, 0x20, 0x3c, 0x22, 0x22, 0x1c, 0x00 }, // 0x36, 6 93 | { 0x07, 0x3e, 0x02, 0x04, 0x08, 0x10, 0x10, 0x10, 0x00 }, // 0x37, 7 94 | { 0x07, 0x1c, 0x22, 0x22, 0x1c, 0x22, 0x22, 0x1c, 0x00 }, // 0x38, 8 95 | { 0x07, 0x1c, 0x22, 0x22, 0x1e, 0x02, 0x04, 0x18, 0x00 }, // 0x39, 9 96 | { 0x04, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x00 }, // 0x3a, : 97 | }; 98 | 99 | const uint8_t font_p[346][9] = { // proportional font 100 | /*POS. LEN 1 2 3 4 5 6 7 8 UTF-8 CH NAME */ 101 | /*0000*/ { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x0020, SPACE 1 PIXEL 102 | /*0001*/ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00 }, // 0x0021, ! EXCLAMATION MARK 103 | /*0002*/ { 0x05, 0x09, 0x09, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x0022, " QUOTATION MARK 104 | /*0003*/ { 0x05, 0x0a, 0x0a, 0x1f, 0x0a, 0x1f, 0x0a, 0x0a, 0x00 }, // 0x0023, # NUMBER SIGN 105 | /*0004*/ { 0x05, 0x04, 0x0f, 0x14, 0x0e, 0x05, 0x1e, 0x04, 0x00 }, // 0x0024, $ DOLLAR SIGN 106 | /*0005*/ { 0x05, 0x19, 0x19, 0x02, 0x04, 0x08, 0x13, 0x13, 0x00 }, // 0x0025, % PERCENT SIGN 107 | /*0006*/ { 0x06, 0x0c, 0x22, 0x14, 0x18, 0x25, 0x22, 0x1d, 0x00 }, // 0x0026, & AMPERSAND 108 | /*0007*/ { 0x02, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x0027, ' APOSTROPHE 109 | /*0008*/ { 0x03, 0x01, 0x02, 0x04, 0x04, 0x04, 0x02, 0x01, 0x00 }, // 0x0028, ( LEFT PARENTHESIS 110 | /*0009*/ { 0x03, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x04, 0x00 }, // 0x0029, ) RIGHT PARENTHESIS 111 | /*0010*/ { 0x05, 0x04, 0x15, 0x0e, 0x1f, 0x0e, 0x15, 0x04, 0x00 }, // 0x002a, * ASTERISK 112 | /*0011*/ { 0x05, 0x00, 0x04, 0x04, 0x1f, 0x04, 0x04, 0x00, 0x00 }, // 0x002b, + PLUS SIGN 113 | /*0012*/ { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02 }, // 0x022c, , COMMA 114 | /*0013*/ { 0x05, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00 }, // 0x002d, - HYPHEN-MINUS 115 | /*0014*/ { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00 }, // 0x002e, . FULL STOP 116 | /*0015*/ { 0x05, 0x01, 0x01, 0x02, 0x04, 0x08, 0x10, 0x10, 0x00 }, // 0x002f, / SOLIDUS 117 | /*0016*/ { 0x05, 0x0e, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0e, 0x00 }, // 0x0030, 0 DIGIT ZERO 118 | /*0017*/ { 0x03, 0x02, 0x06, 0x02, 0x02, 0x02, 0x02, 0x07, 0x00 }, // 0x0031, 1 DIGIT ONE 119 | /*0018*/ { 0x05, 0x0e, 0x11, 0x01, 0x02, 0x04, 0x08, 0x1f, 0x00 }, // 0x0032, 2 DIGIT TWO 120 | /*0019*/ { 0x05, 0x0e, 0x11, 0x01, 0x06, 0x01, 0x11, 0x0e, 0x00 }, // 0x0033, 3 DIGIT THREE 121 | /*0020*/ { 0x05, 0x02, 0x06, 0x0a, 0x12, 0x1f, 0x02, 0x02, 0x00 }, // 0x0034, 4 DIGIT FOUR 122 | /*0021*/ { 0x05, 0x1f, 0x10, 0x1e, 0x01, 0x01, 0x11, 0x0e, 0x00 }, // 0x0035, 5 DIGIT FIVE 123 | /*0022*/ { 0x05, 0x06, 0x08, 0x10, 0x1e, 0x11, 0x11, 0x0e, 0x00 }, // 0x0036, 6 DIGIT SIX 124 | /*0023*/ { 0x05, 0x1f, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08, 0x00 }, // 0x0037, 7 DIGIT SEVEN 125 | /*0024*/ { 0x05, 0x0e, 0x11, 0x11, 0x0e, 0x11, 0x11, 0x0e, 0x00 }, // 0x0038, 8 DIGIT EIGHT 126 | /*0025*/ { 0x05, 0x0e, 0x11, 0x11, 0x0f, 0x01, 0x02, 0x0c, 0x00 }, // 0x0039, 9 DIGIT NINE 127 | /*0026*/ { 0x02, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x00, 0x00 }, // 0x003a, : COLON 128 | /*0027*/ { 0x02, 0x00, 0x00, 0x03, 0x03, 0x00, 0x03, 0x01, 0x02 }, // 0x023b, ; SEMICOLON 129 | /*0028*/ { 0x04, 0x01, 0x02, 0x04, 0x08, 0x04, 0x02, 0x01, 0x00 }, // 0x003c, < LESS-THAN SIGN 130 | /*0029*/ { 0x05, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00 }, // 0x003d, = EQUALS SIGN 131 | /*0030*/ { 0x04, 0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x00 }, // 0x003e, > GREATER-THAN SIGN 132 | /*0031*/ { 0x05, 0x0e, 0x11, 0x01, 0x02, 0x04, 0x00, 0x04, 0x00 }, // 0x003f, ? QUESTION MARK 133 | /*0032*/ { 0x05, 0x0e, 0x11, 0x17, 0x15, 0x17, 0x10, 0x0f, 0x00 }, // 0x0040, @ COMMERCIAL AT 134 | /*0033*/ { 0x05, 0x04, 0x0a, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x00 }, // 0x0041, A LATIN CAPITAL LETTER A 135 | /*0034*/ { 0x05, 0x1e, 0x11, 0x11, 0x1e, 0x11, 0x11, 0x1e, 0x00 }, // 0x0042, B LATIN CAPITAL LETTER B 136 | /*0035*/ { 0x05, 0x0e, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0e, 0x00 }, // 0x0043, C LATIN CAPITAL LETTER C 137 | /*0036*/ { 0x05, 0x1e, 0x09, 0x09, 0x09, 0x09, 0x09, 0x1e, 0x00 }, // 0x0044, D LATIN CAPITAL LETTER D 138 | /*0037*/ { 0x05, 0x1f, 0x10, 0x10, 0x1c, 0x10, 0x10, 0x1f, 0x00 }, // 0x0045, E LATIN CAPITAL LETTER E 139 | /*0038*/ { 0x05, 0x1f, 0x10, 0x10, 0x1f, 0x10, 0x10, 0x10, 0x00 }, // 0x0046, F LATIN CAPITAL LETTER F 140 | /*0039*/ { 0x05, 0x0e, 0x11, 0x10, 0x17, 0x11, 0x11, 0x0f, 0x00 }, // 0x0037, G LATIN CAPITAL LETTER G 141 | /*0040*/ { 0x05, 0x11, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x11, 0x00 }, // 0x0048, H LATIN CAPITAL LETTER H 142 | /*0041*/ { 0x05, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x00 }, // 0x0049, I LATIN CAPITAL LETTER I 143 | /*0042*/ { 0x05, 0x1f, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0c, 0x00 }, // 0x004a, J LATIN CAPITAL LETTER J 144 | /*0043*/ { 0x05, 0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11, 0x00 }, // 0x004b, K LATIN CAPITAL LETTER K 145 | /*0044*/ { 0x05, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00 }, // 0x004c, L LATIN CAPITAL LETTER L 146 | /*0045*/ { 0x05, 0x11, 0x1b, 0x15, 0x11, 0x11, 0x11, 0x11, 0x00 }, // 0x004d, M LATIN CAPITAL LETTER M 147 | /*0046*/ { 0x05, 0x11, 0x11, 0x19, 0x15, 0x13, 0x11, 0x11, 0x00 }, // 0x004e, N LATIN CAPITAL LETTER N 148 | /*0047*/ { 0x05, 0x0e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00 }, // 0x004f, O LATIN CAPITAL LETTER O 149 | /*0048*/ { 0x05, 0x1e, 0x11, 0x11, 0x1e, 0x10, 0x10, 0x10, 0x00 }, // 0x0050, P LATIN CAPITAL LETTER P 150 | /*0049*/ { 0x05, 0x0e, 0x11, 0x11, 0x11, 0x15, 0x12, 0x0d, 0x00 }, // 0x0051, Q LATIN CAPITAL LETTER Q 151 | /*0050*/ { 0x05, 0x1e, 0x11, 0x11, 0x1e, 0x14, 0x12, 0x11, 0x00 }, // 0x0052, R LATIN CAPITAL LETTER R 152 | /*0051*/ { 0x05, 0x0e, 0x11, 0x10, 0x0e, 0x01, 0x11, 0x0e, 0x00 }, // 0x0053, S LATIN CAPITAL LETTER S 153 | /*0052*/ { 0x05, 0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00 }, // 0x0054, T LATIN CAPITAL LETTER T 154 | /*0053*/ { 0x05, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00 }, // 0x0055, U LATIN CAPITAL LETTER U 155 | /*0054*/ { 0x05, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0a, 0x04, 0x00 }, // 0x0056, V LATIN CAPITAL LETTER V 156 | /*0055*/ { 0x05, 0x11, 0x11, 0x11, 0x15, 0x15, 0x1b, 0x11, 0x00 }, // 0x0057, W LATIN CAPITAL LETTER W 157 | /*0056*/ { 0x05, 0x11, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x11, 0x00 }, // 0x0058, X LATIN CAPITAL LETTER X 158 | /*0057*/ { 0x05, 0x11, 0x11, 0x0a, 0x04, 0x04, 0x04, 0x04, 0x00 }, // 0x0059, Y LATIN CAPITAL LETTER Y 159 | /*0058*/ { 0x05, 0x1f, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1f, 0x00 }, // 0x005a, Z LATIN CAPITAL LETTER Z 160 | /*0059*/ { 0x03, 0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x00 }, // 0x005b, [ LEFT SQUARE BRACKET 161 | /*0060*/ { 0x05, 0x10, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x00 }, // 0x005c, '\' REVERSE SOLIDUS 162 | /*0061*/ { 0x03, 0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x00 }, // 0x005d, ] RIGHT SQUARE BRACKET 163 | /*0062*/ { 0x05, 0x04, 0x0a, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x005e, ^ CIRCUMFLEX ACCENT 164 | /*0063*/ { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00 }, // 0x005f, _ LOW LINE 165 | /*0064*/ { 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x0060, ` GRAVE ACCENT 166 | /*0065*/ { 0x05, 0x00, 0x0e, 0x01, 0x0d, 0x13, 0x13, 0x0d, 0x00 }, // 0x0061, a LATIN SMALL LETTER A 167 | /*0066*/ { 0x05, 0x10, 0x10, 0x16, 0x19, 0x11, 0x19, 0x16, 0x00 }, // 0x0062, b LATIN SMALL LETTER B 168 | /*0067*/ { 0x05, 0x00, 0x00, 0x07, 0x08, 0x08, 0x08, 0x07, 0x00 }, // 0x0063, c LATIN SMALL LETTER C 169 | /*0068*/ { 0x05, 0x01, 0x01, 0x0d, 0x13, 0x11, 0x13, 0x0d, 0x00 }, // 0x0064, d LATIN SMALL LETTER D 170 | /*0069*/ { 0x05, 0x00, 0x00, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00 }, // 0x0065, e LATIN SMALL LETTER E 171 | /*0070*/ { 0x05, 0x06, 0x09, 0x08, 0x1c, 0x08, 0x08, 0x08, 0x00 }, // 0x0066, f LATIN SMALL LETTER F 172 | /*0071*/ { 0x05, 0x00, 0x0e, 0x0f, 0x11, 0x11, 0x0f, 0x01, 0x0e }, // 0x0067, g LATIN SMALL LETTER G 173 | /*0072*/ { 0x05, 0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x11, 0x00 }, // 0x0068, h LATIN SMALL LETTER H 174 | /*0073*/ { 0x03, 0x00, 0x02, 0x00, 0x06, 0x02, 0x02, 0x07, 0x00 }, // 0x0069, i LATIN SMALL LETTER I 175 | /*0074*/ { 0x04, 0x00, 0x01, 0x00, 0x03, 0x01, 0x01, 0x09, 0x06 }, // 0x006a, j LATIN SMALL LETTER J 176 | /*0075*/ { 0x04, 0x08, 0x08, 0x09, 0x0a, 0x0c, 0x0a, 0x09, 0x00 }, // 0x006b, k LATIN SMALL LETTER K 177 | /*0076*/ { 0x03, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x00 }, // 0x006c, l LATIN SMALL LETTER L 178 | /*0077*/ { 0x05, 0x00, 0x00, 0x1a, 0x15, 0x15, 0x11, 0x11, 0x00 }, // 0x006d, m LATIN SMALL LETTER M 179 | /*0078*/ { 0x05, 0x00, 0x00, 0x16, 0x19, 0x11, 0x11, 0x11, 0x00 }, // 0x006e, n LATIN SMALL LETTER N 180 | /*0079*/ { 0x05, 0x00, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00 }, // 0x006f, o LATIN SMALL LETTER O 181 | /*0080*/ { 0x04, 0x00, 0x00, 0x0e, 0x09, 0x09, 0x0e, 0x08, 0x08 }, // 0x0070, p LATIN SMALL LETTER P 182 | /*0081*/ { 0x04, 0x00, 0x00, 0x07, 0x09, 0x09, 0x07, 0x01, 0x01 }, // 0x0071, q LATIN SMALL LETTER Q 183 | /*0082*/ { 0x05, 0x00, 0x00, 0x16, 0x19, 0x10, 0x10, 0x10, 0x00 }, // 0x0072, r LATIN SMALL LETTER R 184 | /*0083*/ { 0x05, 0x00, 0x00, 0x0e, 0x10, 0x0e, 0x01, 0x1e, 0x00 }, // 0x0073, s LATIN SMALL LETTER S 185 | /*0084*/ { 0x05, 0x08, 0x08, 0x1c, 0x08, 0x08, 0x09, 0x06, 0x00 }, // 0x0074, t LATIN SMALL LETTER T 186 | /*0085*/ { 0x05, 0x00, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0d, 0x00 }, // 0x0075, u LATIN SMALL LETTER U 187 | /*0086*/ { 0x05, 0x00, 0x00, 0x11, 0x11, 0x11, 0x0a, 0x04, 0x00 }, // 0x0076, v LATIN SMALL LETTER V 188 | /*0087*/ { 0x05, 0x00, 0x00, 0x11, 0x11, 0x15, 0x15, 0x0a, 0x00 }, // 0x0077, w LATIN SMALL LETTER W 189 | /*0088*/ { 0x05, 0x00, 0x00, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x00 }, // 0x0078, x LATIN SMALL LETTER X 190 | /*0089*/ { 0x05, 0x00, 0x00, 0x11, 0x11, 0x0f, 0x01, 0x11, 0x0e }, // 0x0079, y LATIN SMALL LETTER Y 191 | /*0090*/ { 0x05, 0x00, 0x00, 0x1f, 0x02, 0x04, 0x08, 0x1f, 0x00 }, // 0x007a, z LATIN SMALL LETTER Z 192 | /*0091*/ { 0x04, 0x03, 0x04, 0x04, 0x08, 0x04, 0x04, 0x03, 0x00 }, // 0x007b, { LEFT CURLY BRACKET 193 | /*0092*/ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 }, // 0x007c, | VERTICAL LINE 194 | /*0093*/ { 0x04, 0x0c, 0x02, 0x02, 0x01, 0x02, 0x02, 0x0c, 0x00 }, // 0x007d, } RIGHT CURLY BRACKET 195 | /*0094*/ { 0x05, 0x00, 0x00, 0x08, 0x15, 0x02, 0x00, 0x00, 0x00 }, // 0x007e, ~ TILDE 196 | /*0095*/ { 0x05, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00 }, // 0x007f, DEL 197 | 198 | /*0096*/ { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0xc2a0 NO-BREAK SPACE 199 | /*0097*/ { 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 }, // 0xc2a1 ¡ INVERTED EXCLAMATION MARK 200 | /*0098*/ { 0x04, 0x00, 0x02, 0x07, 0x0A, 0x0A, 0x07, 0x02, 0x00 }, // 0xc2a2 ¢ CENT SIGN 201 | /*0099*/ { 0x05, 0x06, 0x09, 0x08, 0x1E, 0x08, 0x08, 0x1F, 0x00 }, // 0xc2a3 £ POUND SIGN 202 | /*0100*/ { 0x06, 0x00, 0x21, 0x1e, 0x12, 0x12, 0x1e, 0x21, 0x00 }, // 0xc2a4 ¤ CURRENCY SIGN 203 | /*0101*/ { 0x05, 0x11, 0x0A, 0x04, 0x1F, 0x04, 0x1F, 0x04, 0x00 }, // 0xc2a5 ¥ YEN SIGN 204 | /*0102*/ { 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00 }, // 0xc2a6 ¦ BROKEN BAR 205 | /*0103*/ { 0x05, 0x0F, 0x10, 0x1E, 0x11, 0x11, 0x0F, 0x01, 0x1E }, // 0xc2a7 § PARAGRAPH SIGN 206 | /*0104*/ { 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0xc2a8 ¨ DIAERESIS 207 | /*0105*/ { 0x08, 0x3C, 0x42, 0x9D, 0xA1, 0xA1, 0x9D, 0x42, 0x3C }, // 0xc1a9 © COPYRIGHT SIGN 208 | /*0106*/ { 0x05, 0x0E, 0x01, 0x0D, 0x13, 0x0D, 0x00, 0x00, 0x00 }, // 0xc2aa ª FEMININE ORDINAL INDICATOR 209 | /*0107*/ { 0x06, 0x00, 0x00, 0x09, 0x12, 0x24, 0x12, 0x09, 0x00 }, // 0xc2ab « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 210 | /*0108*/ { 0x05, 0x00, 0x00, 0x00, 0x1F, 0x01, 0x00, 0x00, 0x00 }, // 0xc2ac ¬ NOT SIGN 211 | /*0109*/ { 0x07, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00 }, // 0xc2ad ­ SOFT HYPHEN 212 | /*0110*/ { 0x08, 0x3C, 0x42, 0xB9, 0xA5, 0xB9, 0xA5, 0x42, 0x3C }, // 0xc2ae ® REGISTERED TRADE MARK SIGN 213 | /*0111*/ { 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0xc2af ¯ MACRON 214 | /*0112*/ { 0x04, 0x06, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00 }, // 0xc2b0 ° DEGREE SIGN 215 | /*0113*/ { 0x05, 0x00, 0x04, 0x04, 0x1F, 0x04, 0x04, 0x1F, 0x00 }, // 0xc2b1 ± PLUS-MINUS SIGN 216 | /*0114*/ { 0x03, 0x07, 0x01, 0x06, 0x04, 0x07, 0x00, 0x00, 0x00 }, // 0xc2b2 ² SUPERSCRIPT TWO 217 | /*0115*/ { 0x03, 0x07, 0x01, 0x03, 0x01, 0x07, 0x00, 0x00, 0x00 }, // 0xc2b3 ³ SUPERSCRIPT THREE 218 | /*0116*/ { 0x02, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0xc2b4 ´ ACUTE ACCENT 219 | /*0117*/ { 0x04, 0x00, 0x00, 0x00, 0x09, 0x09, 0x09, 0x0E, 0x08 }, // 0xc2b5 µ MICRO SIGN 220 | /*0118*/ { 0x05, 0x0F, 0x15, 0x15, 0x0D, 0x05, 0x05, 0x05, 0x00 }, // 0xc2b6 ¶ PILCROW SIGN 221 | /*0119*/ { 0x06, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00 }, // 0xc2b7 · MIDDLE DOT 222 | /*0120*/ { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x02 }, // 0xc2b8 ¸ CEDILLA 223 | /*0121*/ { 0x02, 0x01, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00 }, // 0xc2b9 ¹ SUPERSCRIPT ONE 224 | /*0122*/ { 0x03, 0x02, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0xc2ba º MASCULINE ORDINAL INDICATOR 225 | /*0123*/ { 0x06, 0x00, 0x00, 0x24, 0x12, 0x09, 0x12, 0x24, 0x00 }, // 0xc2bb » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 226 | /*0124*/ { 0x08, 0x41, 0xc2, 0x44, 0x49, 0x13, 0x25, 0x47, 0x81 }, // 0xc2bc ¼ VULGAR FRACTION ONE QUARTER 227 | /*0125*/ { 0x08, 0x41, 0xc2, 0x44, 0x48, 0x13, 0x21, 0x42, 0x83 }, // 0xc2bd ½ VULGAR FRACTION ONE HALF 228 | /*0126*/ { 0x08, 0xc1, 0x22, 0xc4, 0x29, 0xd3, 0x25, 0x47, 0x81 }, // 0xc2be ¾ VULGAR FRACTION THREE QUARTERS 229 | /*0127*/ { 0x05, 0x04, 0x00, 0x04, 0x08, 0x10, 0x11, 0x0e, 0x00 }, // 0xc2bf ¿ INVERTED QUESTION MARK 230 | 231 | /*0128*/ { 0x05, 0x08, 0x04, 0x00, 0x04, 0x0A, 0x11, 0x1F, 0x11 }, // 0xc380 À LATIN CAPITAL LETTER A WITH GRAVE 232 | /*0129*/ { 0x05, 0x02, 0x04, 0x00, 0x04, 0x0A, 0x11, 0x1F, 0x11 }, // 0xc381 Á LATIN CAPITAL LETTER A WITH ACUTE 233 | /*0130*/ { 0x05, 0x04, 0x0A, 0x00, 0x04, 0x0A, 0x11, 0x1F, 0x11 }, // 0xc382 Â LATIN CAPITAL LETTER A WITH CIRCUMFLEX 234 | /*0131*/ { 0x05, 0x05, 0x0A, 0x00, 0x04, 0x0A, 0x11, 0x1F, 0x11 }, // 0xc383 Ã LATIN CAPITAL LETTER A WITH TILDE 235 | /*0132*/ { 0x05, 0x11, 0x04, 0x0A, 0x11, 0x1F, 0x11, 0x11, 0x00 }, // 0xc384 Ä LATIN CAPITAL LETTER A WITH DIAERESIS 236 | /*0133*/ { 0x05, 0x04, 0x00, 0x04, 0x0A, 0x11, 0x1F, 0x11, 0x00 }, // 0xc385 Å LATIN CAPITAL LETTER A WITH RING ABOVE 237 | /*0134*/ { 0x08, 0x1F, 0x28, 0x48, 0xFF, 0x88, 0x88, 0x8F, 0x00 }, // 0xc386 Æ LATIN CAPITAL LETTER AE 238 | /*0135*/ { 0x05, 0x0E, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0E, 0x04 }, // 0xc387 Ç LATIN CAPITAL LETTER C WITH CEDILLA 239 | /*0136*/ { 0x04, 0x04, 0x02, 0x00, 0x0F, 0x08, 0x0F, 0x08, 0x0F }, // 0xc388 È LATIN CAPITAL LETTER E WITH GRAVE 240 | /*0137*/ { 0x04, 0x01, 0x02, 0x00, 0x0F, 0x08, 0x0F, 0x08, 0x0F }, // 0xc389 É LATIN CAPITAL LETTER E WITH ACUTE 241 | /*0138*/ { 0x04, 0x02, 0x05, 0x00, 0x0F, 0x08, 0x0F, 0x08, 0x0F }, // 0xc38a Ê LATIN CAPITAL LETTER E WITH CIRCUMFLEX 242 | /*0139*/ { 0x04, 0x0A, 0x00, 0x0F, 0x08, 0x0E, 0x08, 0x0F, 0x00 }, // 0xc38b Ë LATIN CAPITAL LETTER E WITH DIAERESIS 243 | /*0140*/ { 0x02, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00 }, // 0xc38c Ì LATIN CAPITAL LETTER I WITH GRAVE 244 | /*0141*/ { 0x02, 0x01, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00 }, // 0xc38d Í LATIN CAPITAL LETTER I WITH ACUTE 245 | /*0142*/ { 0x03, 0x02, 0x05, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00 }, // 0xc38e Î LATIN CAPITAL LETTER I WITH CIRCUMFLEX 246 | /*0143*/ { 0x02, 0x05, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00 }, // 0xc38f Ï LATIN CAPITAL LETTER I WITH DIAERESIS 247 | /*0144*/ { 0x05, 0x1E, 0x09, 0x09, 0x1D, 0x09, 0x09, 0x1E, 0x00 }, // 0xc390 Ð LATIN CAPITAL LETTER ETH 248 | /*0145*/ { 0x04, 0x05, 0x0A, 0x00, 0x09, 0x0D, 0x0B, 0x09, 0x09 }, // 0xc391 Ñ LATIN CAPITAL LETTER N WITH TILDE 249 | /*0146*/ { 0x05, 0x08, 0x04, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E }, // 0xc392 Ò LATIN CAPITAL LETTER O WITH GRAVE 250 | /*0147*/ { 0x05, 0x02, 0x04, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E }, // 0xc393 Ó LATIN CAPITAL LETTER O WITH ACUTE 251 | /*0148*/ { 0x05, 0x04, 0x0A, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E }, // 0xc394 Ô LATIN CAPITAL LETTER O WITH CIRCUMFLEX 252 | /*0149*/ { 0x05, 0x05, 0x0A, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E }, // 0xc395 Õ LATIN CAPITAL LETTER O WITH TILDE 253 | /*0150*/ { 0x05, 0x0A, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xc396 Ö LATIN CAPITAL LETTER O WITH DIAERESIS 254 | /*0151*/ { 0x03, 0x00, 0x00, 0x00, 0x05, 0x02, 0x05, 0x00, 0x00 }, // 0xc397 × MULTIPLICATION SIGN 255 | /*0152*/ { 0x06, 0x01, 0x0E, 0x13, 0x15, 0x19, 0x11, 0x2E, 0x00 }, // 0xc398 Ø LATIN CAPITAL LETTER O WITH STROKE 256 | /*0153*/ { 0x05, 0x08, 0x04, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xc399 Ù LATIN CAPITAL LETTER U WITH GRAVE 257 | /*0154*/ { 0x05, 0x02, 0x04, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xc39a Ú LATIN CAPITAL LETTER U WITH ACUTE 258 | /*0155*/ { 0x05, 0x04, 0x0A, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0E }, // 0xc39b Û LATIN CAPITAL LETTER U WITH CIRCUMFLEX 259 | /*0156*/ { 0x05, 0x0A, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xc39c Ü LATIN CAPITAL LETTER U WITH DIAERESIS 260 | /*0157*/ { 0x05, 0x02, 0x04, 0x11, 0x11, 0x0A, 0x04, 0x04, 0x04 }, // 0xc39d Ý LATIN CAPITAL LETTER Y WITH ACUTE 261 | /*0158*/ { 0x05, 0x1C, 0x08, 0x0E, 0x09, 0x0E, 0x08, 0x1C, 0x00 }, // 0xc39e Þ LATIN CAPITAL LETTER THORN 262 | /*0159*/ { 0x04, 0x0E, 0x09, 0x09, 0x0E, 0x09, 0x09, 0x0A, 0x08 }, // 0xc39f ß LATIN SMALL LETTER SHARP S 263 | /*0160*/ { 0x04, 0x04, 0x02, 0x00, 0x06, 0x01, 0x05, 0x0B, 0x05 }, // 0xc3a0 à LATIN SMALL LETTER A WITH GRAVE 264 | /*0161*/ { 0x04, 0x01, 0x02, 0x00, 0x06, 0x01, 0x05, 0x0B, 0x05 }, // 0xc3a1 á LATIN SMALL LETTER A WITH ACUTE 265 | /*0162*/ { 0x04, 0x04, 0x0A, 0x00, 0x06, 0x01, 0x05, 0x0B, 0x05 }, // 0xc3a2 â LATIN SMALL LETTER A WITH CIRCUMFLEX 266 | /*0163*/ { 0x04, 0x05, 0x0A, 0x00, 0x06, 0x01, 0x05, 0x0B, 0x05 }, // 0xc3a3 ã LATIN SMALL LETTER A WITH TILDE 267 | /*0164*/ { 0x04, 0x05, 0x00, 0x06, 0x01, 0x05, 0x0B, 0x0D, 0x00 }, // 0xc3a4 ä LATIN SMALL LETTER A WITH DIAERESIS 268 | /*0165*/ { 0x04, 0x02, 0x00, 0x06, 0x01, 0x05, 0x0B, 0x0D, 0x00 }, // 0xc3a5 å LATIN SMALL LETTER A WITH RING ABOVE 269 | /*0166*/ { 0x07, 0x00, 0x00, 0x16, 0x09, 0x3E, 0x48, 0x37, 0x00 }, // 0xc3a6 æ LATIN SMALL LETTER AE 270 | /*0167*/ { 0x04, 0x00, 0x00, 0x07, 0x08, 0x08, 0x08, 0x07, 0x02 }, // 0xc3a7 ç LATIN SMALL LETTER C WITH CEDILLA 271 | /*0168*/ { 0x05, 0x08, 0x04, 0x00, 0x0E, 0x11, 0x1F, 0x10, 0x0E }, // 0xc3a8 è LATIN SMALL LETTER E WITH GRAVE 272 | /*0169*/ { 0x05, 0x02, 0x04, 0x00, 0x0E, 0x11, 0x1F, 0x10, 0x0E }, // 0xc3a9 é LATIN SMALL LETTER E WITH ACUTE 273 | /*0170*/ { 0x05, 0x04, 0x0A, 0x00, 0x0E, 0x11, 0x1F, 0x10, 0x0E }, // 0xc3aa ê LATIN SMALL LETTER E WITH CIRCUMFLEX 274 | /*0171*/ { 0x05, 0x0A, 0x00, 0x0E, 0x11, 0x1F, 0x10, 0x0E, 0x00 }, // 0xc3ab ë LATIN SMALL LETTER E WITH DIAERESIS 275 | /*0172*/ { 0x03, 0x04, 0x02, 0x00, 0x02, 0x02, 0x02, 0x07, 0x00 }, // 0xc3ac ì LATIN SMALL LETTER I WITH GRAVE 276 | /*0173*/ { 0x03, 0x01, 0x02, 0x00, 0x02, 0x02, 0x02, 0x07, 0x00 }, // 0xc3ad í LATIN SMALL LETTER I WITH ACUTE 277 | /*0174*/ { 0x03, 0x02, 0x05, 0x00, 0x02, 0x02, 0x02, 0x07, 0x00 }, // 0xc3ae î LATIN SMALL LETTER I WITH CIRCUMFLEX 278 | /*0175*/ { 0x03, 0x00, 0x05, 0x00, 0x02, 0x02, 0x02, 0x07, 0x00 }, // 0xc3af ï LATIN SMALL LETTER I WITH DIAERESIS 279 | /*0176*/ { 0x05, 0x14, 0x08, 0x14, 0x02, 0x07, 0x09, 0x09, 0x06 }, // 0xc3b0 ð LATIN SMALL LETTER ETH 280 | /*0177*/ { 0x05, 0x05, 0x0A, 0x00, 0x16, 0x19, 0x11, 0x11, 0x00 }, // 0xc3b1 ñ LATIN SMALL LETTER N WITH TILDE 281 | /*0178*/ { 0x04, 0x04, 0x02, 0x00, 0x06, 0x09, 0x09, 0x06, 0x00 }, // 0xc3b2 ò LATIN SMALL LETTER O WITH GRAVE 282 | /*0179*/ { 0x04, 0x02, 0x04, 0x00, 0x06, 0x09, 0x09, 0x06, 0x00 }, // 0xc3b3 ó LATIN SMALL LETTER O WITH ACUTE 283 | /*0180*/ { 0x04, 0x02, 0x05, 0x00, 0x06, 0x09, 0x09, 0x06, 0x00 }, // 0xc3b4 ô LATIN SMALL LETTER O WITH CIRCUMFLEX 284 | /*0181*/ { 0x04, 0x05, 0x0A, 0x00, 0x06, 0x09, 0x09, 0x06, 0x00 }, // 0xc3b5 õ LATIN SMALL LETTER O WITH TILDE 285 | /*0182*/ { 0x05, 0x0A, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xc3b6 ö LATIN SMALL LETTER O WITH DIAERESIS 286 | /*0183*/ { 0x05, 0x00, 0x04, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x00 }, // 0xc3b7 ÷ DIVISION SIGN 287 | /*0184*/ { 0x06, 0x00, 0x01, 0x0E, 0x13, 0x15, 0x19, 0x2E, 0x00 }, // 0xc3b8 ø LATIN SMALL LETTER O WITH STROKE 288 | /*0185*/ { 0x05, 0x08, 0x04, 0x00, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xc3b9 ù LATIN SMALL LETTER U WITH GRAVE 289 | /*0186*/ { 0x05, 0x02, 0x04, 0x00, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xc3ba ú LATIN SMALL LETTER U WITH ACUTE 290 | /*0187*/ { 0x05, 0x04, 0x0A, 0x00, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xc3bb û LATIN SMALL LETTER U WITH CIRCUMFLEX 291 | /*0188*/ { 0x05, 0x0A, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0D, 0x00 }, // 0xc3bc ü LATIN SMALL LETTER U WITH DIAERESIS 292 | /*0189*/ { 0x05, 0x02, 0x04, 0x11, 0x11, 0x0F, 0x01, 0x11, 0x0E }, // 0xc3bd ý LATIN SMALL LETTER Y WITH ACUTE 293 | /*0190*/ { 0x05, 0x00, 0x18, 0x08, 0x0E, 0x09, 0x0E, 0x08, 0x1C }, // 0xc3be þ LATIN SMALL LETTER THORN 294 | /*0191*/ { 0x05, 0x0A, 0x00, 0x11, 0x11, 0x0F, 0x01, 0x11, 0x0E }, // 0xc3bf ÿ LATIN SMALL LETTER Y WITH DIAERESIS 295 | 296 | /*0192*/ { 0x05, 0x04, 0x0A, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x00 }, // 0xce91 Α GREEK CAPITAL LETTER ALPHA 297 | /*0193*/ { 0x05, 0x1E, 0x11, 0x11, 0x1E, 0x11, 0x11, 0x1E, 0x00 }, // 0xce92 Β GREEK CAPITAL LETTER BETA 298 | /*0194*/ { 0x06, 0x3F, 0x11, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00 }, // 0xce93 Γ GREEK CAPITAL LETTER GAMMA 299 | /*0195*/ { 0x07, 0x08, 0x14, 0x14, 0x22, 0x22, 0x41, 0x7F, 0x00 }, // 0xce94 Δ GREEK CAPITAL LETTER DELTA 300 | /*0196*/ { 0x05, 0x1F, 0x10, 0x10, 0x1E, 0x10, 0x10, 0x1F, 0x00 }, // 0xce95 Ε GREEK CAPITAL LETTER EPSILON 301 | /*0197*/ { 0x05, 0x1F, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1F, 0x00 }, // 0xce96 Ζ GREEK CAPITAL LETTER ZETA 302 | /*0198*/ { 0x05, 0x11, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11, 0x00 }, // 0xce97 Η GREEK CAPITAL LETTER ETA 303 | /*0199*/ { 0x06, 0x1E, 0x21, 0x21, 0x2D, 0x21, 0x21, 0x1E, 0x00 }, // 0xce98 Θ GREEK CAPITAL LETTER THETA 304 | /*0200*/ { 0x03, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x00 }, // 0xce99 Ι GREEK CAPITAL LETTER IOTA 305 | /*0201*/ { 0x05, 0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11, 0x00 }, // 0xce9a Κ GREEK CAPITAL LETTER KAPPA 306 | /*0202*/ { 0x07, 0x08, 0x14, 0x14, 0x22, 0x22, 0x41, 0x41, 0x00 }, // 0xce9b Λ GREEK CAPITAL LETTER LAMDA 307 | /*0203*/ { 0x07, 0x41, 0x63, 0x55, 0x49, 0x41, 0x41, 0x41, 0x00 }, // 0xce9c Μ GREEK CAPITAL LETTER MU 308 | /*0204*/ { 0x07, 0x41, 0x61, 0x51, 0x49, 0x45, 0x43, 0x41, 0x00 }, // 0xce9d Ν GREEK CAPITAL LETTER NU 309 | /*0205*/ { 0x07, 0x7F, 0x41, 0x00, 0x3E, 0x00, 0x41, 0x7F, 0x00 }, // 0xce9e Ξ GREEK CAPITAL LETTER XI 310 | /*0206*/ { 0x06, 0x1E, 0x21, 0x21, 0x21, 0x21, 0x21, 0x1E, 0x00 }, // 0xce9f Ο GREEK CAPITAL LETTER OMICRON 311 | /*0207*/ { 0x07, 0x7F, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00 }, // 0xcea0 Π GREEK CAPITAL LETTER PI 312 | /*0208*/ { 0x05, 0x1E, 0x11, 0x11, 0x1E, 0x10, 0x10, 0x10, 0x00 }, // 0xcea1 Ρ GREEK CAPITAL LETTER RHO 313 | /*0209*/ { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0xcea2 ΢ 314 | /*0210*/ { 0x06, 0x3F, 0x21, 0x10, 0x08, 0x10, 0x21, 0x3F, 0x00 }, // 0xcea3 Σ GREEK CAPITAL LETTER SIGMA 315 | /*0211*/ { 0x07, 0x7F, 0x49, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }, // 0xcea4 Τ GREEK CAPITAL LETTER TAU 316 | /*0212*/ { 0x07, 0x41, 0x22, 0x14, 0x08, 0x08, 0x08, 0x1C, 0x00 }, // 0xcea5 Υ GREEK CAPITAL LETTER UPSILON 317 | /*0213*/ { 0x07, 0x08, 0x3E, 0x49, 0x49, 0x49, 0x3E, 0x08, 0x00 }, // 0xcea6 Φ GREEK CAPITAL LETTER PHI 318 | /*0214*/ { 0x07, 0x63, 0x22, 0x14, 0x08, 0x14, 0x22, 0x63, 0x00 }, // 0xcea7 Χ GREEK CAPITAL LETTER CHI 319 | /*0215*/ { 0x07, 0x49, 0x2A, 0x2A, 0x1C, 0x08, 0x08, 0x1C, 0x00 }, // 0xcea8 Ψ GREEK CAPITAL LETTER PSI 320 | /*0216*/ { 0x07, 0x1C, 0x22, 0x41, 0x41, 0x22, 0x14, 0x77, 0x00 }, // 0xcea9 Ω GREEK CAPITAL LETTER OMEGA 321 | /*0217*/ { 0x03, 0x05, 0x00, 0x07, 0x02, 0x02, 0x02, 0x07, 0x00 }, // 0xceaa Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA 322 | /*0218*/ { 0x07, 0x14, 0x41, 0x22, 0x14, 0x08, 0x08, 0x1c, 0x00 }, // 0xceab Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA 323 | /*0219*/ { 0x05, 0x04, 0x01, 0x0d, 0x12, 0x12, 0x15, 0x0d, 0x00 }, // 0xceac ά GREEK SMALL LETTER ALPHA WITH TONOS 324 | /*0220*/ { 0x04, 0x03, 0x00, 0x07, 0x08, 0x06, 0x08, 0x07, 0x00 }, // 0xcead έ GREEK SMALL LETTER EPSILON WITH TONOS 325 | /*0221*/ { 0x04, 0x01, 0x02, 0x00, 0x0a, 0x0d, 0x09, 0x09, 0x01 }, // 0xceae ή GREEK SMALL LETTER ETA WITH TONOS 326 | /*0222*/ { 0x02, 0x01, 0x02, 0x00, 0x02, 0x02, 0x02, 0x01, 0x00 }, // 0xceaf ί GREEK SMALL LETTER IOTA WITH TONOS 327 | /*0223*/ { 0x05, 0x02, 0x0d, 0x00, 0x11, 0x09, 0x09, 0x06, 0x00 }, // 0xceb0 ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS 328 | /*0224*/ { 0x05, 0x00, 0x01, 0x0d, 0x12, 0x12, 0x15, 0x0d, 0x00 }, // 0xceb1 α GREEK SMALL LETTER ALPHA 329 | /*0225*/ { 0x04, 0x0E, 0x09, 0x09, 0x0E, 0x09, 0x09, 0x0A, 0x08 }, // 0xceb2 β GREEK SMALL LETTER BETA 330 | /*0226*/ { 0x06, 0x00, 0x31, 0x0A, 0x04, 0x0A, 0x11, 0x0A, 0x04 }, // 0xceb3 γ GREEK SMALL LETTER GAMMA 331 | /*0227*/ { 0x05, 0x0C, 0x10, 0x1E, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xceb4 δ GREEK SMALL LETTER DELTA 332 | /*0228*/ { 0x04, 0x00, 0x07, 0x08, 0x06, 0x08, 0x09, 0x07, 0x00 }, // 0xceb5 ε GREEK SMALL LETTER EPSILON 333 | /*0229*/ { 0x04, 0x01, 0x06, 0x08, 0x08, 0x08, 0x06, 0x01, 0x03 }, // 0xceb6 ζ GREEK SMALL LETTER ZETA 334 | /*0230*/ { 0x05, 0x00, 0x00, 0x16, 0x19, 0x11, 0x11, 0x11, 0x01 }, // 0xceb7 η GREEK SMALL LETTER ETA 335 | /*0231*/ { 0x05, 0x00, 0x00, 0x0E, 0x11, 0x1F, 0x11, 0x0E, 0x00 }, // 0xceb8 θ GREEK SMALL LETTER THETA 336 | /*0232*/ { 0x03, 0x00, 0x00, 0x06, 0x02, 0x02, 0x02, 0x01, 0x00 }, // 0xceb9 ι GREEK SMALL LETTER IOTA 337 | /*0233*/ { 0x04, 0x00, 0x09, 0x0A, 0x0C, 0x0A, 0x09, 0x09, 0x00 }, // 0xceba κ GREEK SMALL LETTER KAPPA 338 | /*0234*/ { 0x06, 0x00, 0x08, 0x04, 0x0C, 0x0A, 0x12, 0x21, 0x00 }, // 0xcebb λ GREEK SMALL LETTER LAMDA 339 | /*0235*/ { 0x05, 0x00, 0x00, 0x11, 0x11, 0x11, 0x19, 0x16, 0x10 }, // 0xcebc μ GREEK SMALL LETTER MU 340 | /*0236*/ { 0x07, 0x00, 0x00, 0x41, 0x22, 0x22, 0x14, 0x08, 0x00 }, // 0xcebd ν GREEK SMALL LETTER NU 341 | /*0237*/ { 0x05, 0x03, 0x04, 0x02, 0x0C, 0x10, 0x10, 0x0E, 0x01 }, // 0xcebe ξ GREEK SMALL LETTER XI 342 | /*0238*/ { 0x05, 0x00, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xcebf ο GREEK SMALL LETTER OMICRON 343 | /*0239*/ { 0x06, 0x00, 0x00, 0x3F, 0x12, 0x12, 0x12, 0x12, 0x00 }, // 0xcf80 π GREEK SMALL LETTER PI 344 | /*0240*/ { 0x05, 0x00, 0x00, 0x0E, 0x11, 0x11, 0x19, 0x16, 0x10 }, // 0xcf81 ρ GREEK SMALL LETTER RHO 345 | /*0241*/ { 0x04, 0x00, 0x06, 0x08, 0x08, 0x06, 0x01, 0x06, 0x08 }, // 0xcf82 ς GREEK SMALL LETTER FINAL SIGMA 346 | /*0242*/ { 0x05, 0x00, 0x01, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xcf83 σ GREEK SMALL LETTER SIGMA 347 | /*0243*/ { 0x05, 0x00, 0x01, 0x0E, 0x14, 0x04, 0x04, 0x02, 0x00 }, // 0xcf84 τ GREEK SMALL LETTER TAU 348 | /*0244*/ { 0x06, 0x00, 0x00, 0x32, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xcf85 υ GREEK SMALL LETTER UPSILON 349 | /*0245*/ { 0x07, 0x00, 0x26, 0x49, 0x49, 0x49, 0x3E, 0x08, 0x08 }, // 0xcf86 φ GREEK SMALL LETTER PHI 350 | /*0246*/ { 0x07, 0x00, 0x62, 0x12, 0x14, 0x08, 0x14, 0x23, 0x00 }, // 0xcf87 χ GREEK SMALL LETTER CHI 351 | /*0247*/ { 0x07, 0x00, 0x49, 0x49, 0x2A, 0x1C, 0x08, 0x08, 0x08 }, // 0xcf88 ψ GREEK SMALL LETTER PSI 352 | /*0248*/ { 0x07, 0x00, 0x00, 0x22, 0x49, 0x49, 0x49, 0x36, 0x00 }, // 0xcf89 ω GREEK SMALL LETTER OMEGA 353 | 354 | /*0249*/ { 0x04, 0x04, 0x02, 0x00, 0x0f, 0x08, 0x0f, 0x08, 0x0f }, // 0xd080 Ѐ CYRILLIC CAPITAL LETTER IE WITH GRAVE 355 | /*0250*/ { 0x05, 0x0A, 0x00, 0x1F, 0x10, 0x1E, 0x10, 0x1F, 0x00 }, // 0xd081 Ё CYRILLIC CAPITAL LETTER IO 356 | /*0251*/ { 0x07, 0x7C, 0x10, 0x16, 0x19, 0x11, 0x11, 0x16, 0x00 }, // 0xd082 Ђ CYRILLIC CAPITAL LETTER DJE 357 | /*0252*/ { 0x04, 0x02, 0x00, 0x0F, 0x08, 0x08, 0x08, 0x08, 0x00 }, // 0xd083 Ѓ CYRILLIC CAPITAL LETTER GJE 358 | /*0253*/ { 0x05, 0x0E, 0x11, 0x10, 0x1C, 0x10, 0x11, 0x0E, 0x00 }, // 0xd084 Є CYRILLIC CAPITAL LETTER UKRAINIAN IE 359 | /*0254*/ { 0x05, 0x0E, 0x11, 0x10, 0x0E, 0x01, 0x11, 0x0E, 0x00 }, // 0xd085 Ѕ CYRILLIC CAPITAL LETTER DZE 360 | /*0255*/ { 0x03, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x00 }, // 0xd086 І CYRILLIC CAPITAL LETTER BYELORUSSION-UKRAINIAN I 361 | /*0256*/ { 0x03, 0x05, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00 }, // 0xd087 Ї CYRILLIC CAPITAL LETTER YI 362 | /*0257*/ { 0x04, 0x0F, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0C, 0x00 }, // 0xd088 Ј CYRILLIC CAPITAL LETTER JE 363 | /*0258*/ { 0x07, 0x38, 0x28, 0x28, 0x2E, 0x29, 0x29, 0x4E, 0x00 }, // 0xd089 Љ CYRILLIC CAPITAL LETTER LJE 364 | /*0259*/ { 0x06, 0x28, 0x28, 0x28, 0x3E, 0x29, 0x29, 0x2E, 0x00 }, // 0xd08a Њ CYRILLIC CAPITAL LETTER NJE 365 | /*0260*/ { 0x06, 0x38, 0x10, 0x16, 0x19, 0x11, 0x11, 0x11, 0x00 }, // 0xd08b Ћ CYRILLIC CAPITAL LETTER TSHE 366 | /*0261*/ { 0x06, 0x29, 0x22, 0x24, 0x38, 0x24, 0x22, 0x21, 0x00 }, // 0xd08c Ќ CYRILLIC CAPITAL LETTER KJE 367 | /*0262*/ { 0x05, 0x08, 0x04, 0x11, 0x13, 0x15, 0x19, 0x11, 0x00 }, // 0xd08d Ѝ CYRILLIC CAPITAL LETTER I WITH GRAVE 368 | /*0263*/ { 0x05, 0x15, 0x15, 0x11, 0x09, 0x07, 0x01, 0x02, 0x1C }, // 0xd08e Ў CYRILLIC CAPITAL LETTER SHORT U 369 | /*0264*/ { 0x05, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x04 }, // 0xd08f Џ CYRILLIC CAPITAL LETTER DZHE 370 | /*0265*/ { 0x05, 0x04, 0x0a, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x00 }, // 0xd090 А CYRILLIC CAPITAL LETTER A 371 | /*0266*/ { 0x05, 0x1F, 0x10, 0x10, 0x1E, 0x11, 0x11, 0x1E, 0x00 }, // 0xd091 Б CYRILLIC CAPITAL LETTER BE 372 | /*0267*/ { 0x05, 0x1E, 0x11, 0x11, 0x1E, 0x11, 0x11, 0x1E, 0x00 }, // 0xd092 В CYRILLIC CAPITAL LETTER VE 373 | /*0268*/ { 0x05, 0x1F, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00 }, // 0xd093 Г CYRILLIC CAPITAL LETTER GHE 374 | /*0269*/ { 0x06, 0x0C, 0x12, 0x12, 0x12, 0x12, 0x12, 0x3F, 0x21 }, // 0xd094 Д CYRILLIC CAPITAL LETTER DE 375 | /*0270*/ { 0x05, 0x1F, 0x10, 0x10, 0x1E, 0x10, 0x10, 0x1F, 0x00 }, // 0xd095 Е CYRILLIC CAPITAL LETTER IE 376 | /*0271*/ { 0x05, 0x15, 0x15, 0x15, 0x0E, 0x15, 0x15, 0x15, 0x00 }, // 0xd096 Ж CYRILLIC CAPITAL LETTER ZHE 377 | /*0272*/ { 0x05, 0x1E, 0x01, 0x01, 0x0E, 0x01, 0x01, 0x1E, 0x00 }, // 0xd097 З CYRILLIC CAPITAL LETTER ZE 378 | /*0273*/ { 0x05, 0x11, 0x11, 0x13, 0x15, 0x19, 0x11, 0x11, 0x00 }, // 0xd098 И CYRILLIC CAPITAL LETTER I 379 | /*0274*/ { 0x05, 0x15, 0x11, 0x13, 0x15, 0x19, 0x11, 0x11, 0x00 }, // 0xd099 Й CYRILLIC CAPITAL LETTER SHORT I 380 | /*0275*/ { 0x05, 0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11, 0x00 }, // 0xd09a К CYRILLIC CAPITAL LETTER KA 381 | /*0276*/ { 0x05, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x11, 0x00 }, // 0xd09b Л CYRILLIC CAPITAL LETTER EL 382 | /*0277*/ { 0x05, 0x11, 0x1B, 0x15, 0x15, 0x11, 0x11, 0x11, 0x00 }, // 0xd09c М CYRILLIC CAPITAL LETTER EM 383 | /*0278*/ { 0x05, 0x11, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11, 0x00 }, // 0xd09d Н CYRILLIC CAPITAL LETTER EN 384 | /*0279*/ { 0x05, 0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xd09e О CYRILLIC CAPITAL LETTER O 385 | /*0280*/ { 0x05, 0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00 }, // 0xd09f П CYRILLIC CAPITAL LETTER PE 386 | /*0281*/ { 0x05, 0x1E, 0x11, 0x11, 0x1E, 0x10, 0x10, 0x10, 0x00 }, // 0xd0a0 Р CYRILLIC CAPITAL LETTER ER 387 | /*0282*/ { 0x05, 0x0E, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0E, 0x00 }, // 0xd0a1 С CYRILLIC CAPITAL LETTER ES 388 | /*0283*/ { 0x05, 0x1F, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00 }, // 0xd0a2 Т CYRILLIC CAPITAL LETTER TE 389 | /*0284*/ { 0x05, 0x11, 0x11, 0x11, 0x0F, 0x01, 0x11, 0x0E, 0x00 }, // 0xd0a3 У CYRILLIC CAPITAL LETTER U 390 | /*0285*/ { 0x07, 0x08, 0x3E, 0x49, 0x49, 0x49, 0x3E, 0x08, 0x00 }, // 0xd0a4 Ф CYRILLIC CAPITAL LETTER EF 391 | /*0286*/ { 0x05, 0x11, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x11, 0x00 }, // 0xd0a5 Х CYRILLIC CAPITAL LETTER HA 392 | /*0287*/ { 0x06, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x3F, 0x01 }, // 0xd0a6 Ц CYRILLIC CAPITAL LETTER TSE 393 | /*0288*/ { 0x05, 0x11, 0x11, 0x11, 0x0F, 0x01, 0x01, 0x01, 0x00 }, // 0xd0a7 Ч CYRILLIC CAPITAL LETTER CHE 394 | /*0289*/ { 0x05, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x1F, 0x00 }, // 0xd0a8 Ш CYRILLIC CAPITAL LETTER SHA 395 | /*0290*/ { 0x06, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x3F, 0x01 }, // 0xd0a9 Щ CYRILLIC CAPITAL LETTER SHCHA 396 | /*0291*/ { 0x07, 0x70, 0x10, 0x10, 0x1E, 0x11, 0x11, 0x1E, 0x00 }, // 0xd0aa Ъ CYRILLIC CAPITAL LETTER HARD SIGN 397 | /*0292*/ { 0x07, 0x41, 0x41, 0x41, 0x79, 0x45, 0x45, 0x79, 0x00 }, // 0xd0ab Ы CYRILLIC CAPITAL LETTER YERU 398 | /*0293*/ { 0x05, 0x10, 0x10, 0x10, 0x1E, 0x11, 0x11, 0x1E, 0x00 }, // 0xd0ac Ь CYRILLIC CAPITAL LETTER SOFT SIGN 399 | /*0294*/ { 0x04, 0x0E, 0x01, 0x01, 0x07, 0x01, 0x01, 0x0E, 0x00 }, // 0xd0ad Э CYRILLIC CAPITAL LETTER E 400 | /*0295*/ { 0x06, 0x26, 0x29, 0x29, 0x39, 0x29, 0x29, 0x26, 0x00 }, // 0xd0ae Ю CYRILLIC CAPITAL LETTER YU 401 | /*0296*/ { 0x05, 0x0F, 0x11, 0x11, 0x0F, 0x05, 0x09, 0x11, 0x00 }, // 0xd0af Я CYRILLIC CAPITAL LETTER YA 402 | /*0297*/ { 0x05, 0x00, 0x00, 0x0E, 0x01, 0x0F, 0x11, 0x0F, 0x00 }, // 0xd0b0 а CYRILLIC SMALL LETTER A 403 | /*0298*/ { 0x05, 0x03, 0x0C, 0x10, 0x1E, 0x11, 0x11, 0x0E, 0x00 }, // 0xd0b1 б CYRILLIC SMALL LETTER BE 404 | /*0299*/ { 0x05, 0x00, 0x00, 0x1E, 0x11, 0x1E, 0x11, 0x1E, 0x00 }, // 0xd0b2 в CYRILLIC SMALL LETTER VE 405 | /*0300*/ { 0x04, 0x00, 0x00, 0x0F, 0x09, 0x08, 0x08, 0x08, 0x00 }, // 0xd0b3 г CYRILLIC SMALL LETTER GHE 406 | /*0301*/ { 0x06, 0x00, 0x00, 0x0C, 0x12, 0x12, 0x12, 0x3F, 0x21 }, // 0xd0b4 д CYRILLIC SMALL LETTER DE 407 | /*0302*/ { 0x05, 0x00, 0x00, 0x0E, 0x11, 0x1F, 0x10, 0x0E, 0x00 }, // 0xd0b5 е CYRILLIC SMALL LETTER IE 408 | /*0303*/ { 0x05, 0x00, 0x00, 0x15, 0x15, 0x0E, 0x15, 0x15, 0x00 }, // 0xd0b6 ж CYRILLIC SMALL LETTER ZHE 409 | /*0304*/ { 0x05, 0x00, 0x00, 0x1E, 0x01, 0x0E, 0x01, 0x1E, 0x00 }, // 0xd0b7 з CYRILLIC SMALL LETTER ZE 410 | /*0305*/ { 0x05, 0x00, 0x00, 0x11, 0x13, 0x15, 0x19, 0x11, 0x00 }, // 0xd0b8 и CYRILLIC SMALL LETTER I 411 | /*0306*/ { 0x05, 0x0e, 0x00, 0x11, 0x13, 0x15, 0x19, 0x11, 0x00 }, // 0xd0b9 й CYRILLIC SMALL LETTER SHORT I 412 | /*0307*/ { 0x05, 0x00, 0x00, 0x11, 0x12, 0x1C, 0x12, 0x11, 0x00 }, // 0xd0ba к CYRILLIC SMALL LETTER KA 413 | /*0308*/ { 0x05, 0x00, 0x00, 0x07, 0x09, 0x09, 0x09, 0x11, 0x00 }, // 0xd0bb л CYRILLIC SMALL LETTER EL 414 | /*0309*/ { 0x05, 0x00, 0x00, 0x11, 0x1B, 0x15, 0x11, 0x11, 0x00 }, // 0xd0bc м CYRILLIC SMALL LETTER EM 415 | /*0310*/ { 0x05, 0x00, 0x00, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x00 }, // 0xd0bd н CYRILLIC SMALL LETTER EN 416 | /*0311*/ { 0x05, 0x00, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00 }, // 0xd0be о CYRILLIC SMALL LETTER O 417 | /*0312*/ { 0x05, 0x00, 0x00, 0x1F, 0x11, 0x11, 0x11, 0x11, 0x00 }, // 0xd0bf п CYRILLIC SMALL LETTER PE 418 | /*0313*/ { 0x05, 0x00, 0x00, 0x1E, 0x11, 0x11, 0x1E, 0x10, 0x10 }, // 0xd180 р CYRILLIC SMALL LETTER ER 419 | /*0314*/ { 0x04, 0x00, 0x00, 0x07, 0x08, 0x08, 0x08, 0x07, 0x00 }, // 0xd181 с CYRILLIC SMALL LETTER ES 420 | /*0315*/ { 0x05, 0x00, 0x00, 0x1F, 0x04, 0x04, 0x04, 0x04, 0x00 }, // 0xd182 т CYRILLIC SMALL LETTER TE 421 | /*0316*/ { 0x05, 0x00, 0x00, 0x11, 0x11, 0x0F, 0x01, 0x01, 0x0E }, // 0xd183 у CYRILLIC SMALL LETTER U 422 | /*0317*/ { 0x07, 0x00, 0x00, 0x08, 0x3E, 0x49, 0x3E, 0x08, 0x08 }, // 0xd184 ф CYRILLIC SMALL LETTER EF 423 | /*0318*/ { 0x05, 0x00, 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00 }, // 0xd185 х CYRILLIC SMALL LETTER HA 424 | /*0319*/ { 0x05, 0x00, 0x00, 0x12, 0x12, 0x12, 0x12, 0x1F, 0x01 }, // 0xd186 ц CYRILLIC SMALL LETTER TSE 425 | /*0320*/ { 0x05, 0x00, 0x00, 0x11, 0x11, 0x0F, 0x01, 0x01, 0x00 }, // 0xd187 ч CYRILLIC SMALL LETTER CHE 426 | /*0321*/ { 0x05, 0x00, 0x00, 0x15, 0x15, 0x15, 0x15, 0x1F, 0x00 }, // 0xd188 ш CYRILLIC SMALL LETTER CHA 427 | /*0322*/ { 0x06, 0x00, 0x00, 0x2A, 0x2A, 0x2A, 0x2A, 0x3F, 0x01 }, // 0xd189 щ CYRILLIC SMALL LETTER SHCHA 428 | /*0323*/ { 0x05, 0x00, 0x00, 0x18, 0x08, 0x0E, 0x09, 0x0E, 0x00 }, // 0xd18a ъ CYRILLIC SMALL LETTER HARD SIGN 429 | /*0324*/ { 0x06, 0x00, 0x00, 0x21, 0x21, 0x39, 0x25, 0x39, 0x00 }, // 0xd18b ы CYRILLIC SMALL LETTER YERU 430 | /*0325*/ { 0x04, 0x00, 0x00, 0x08, 0x08, 0x0E, 0x09, 0x0E, 0x00 }, // 0xd18c ь CYRILLIC SMALL LETTER SOFT SIGN 431 | /*0326*/ { 0x04, 0x00, 0x00, 0x0E, 0x01, 0x07, 0x01, 0x0E, 0x00 }, // 0xd18d э CYRILLIC SMALL LETTER E 432 | /*0327*/ { 0x06, 0x00, 0x00, 0x26, 0x29, 0x39, 0x29, 0x26, 0x00 }, // 0xd18e ю CYRILLIC SMALL LETTER YU 433 | /*0328*/ { 0x04, 0x00, 0x00, 0x07, 0x09, 0x07, 0x05, 0x09, 0x00 }, // 0xd18f я CYRILLIC SMALL LETTER YA 434 | /*0329*/ { 0x05, 0x0A, 0x00, 0x0E, 0x11, 0x1F, 0x10, 0x0E, 0x00 }, // 0xd191 ё CYRILLIC SMALL LETTER IO 435 | /*0330*/ { 0x06, 0x10, 0x38, 0x10, 0x16, 0x19, 0x11, 0x11, 0x02 }, // 0xd192 ђ CYRILLIC SMALL LETTER DJE 436 | /*0331*/ { 0x03, 0x00, 0x02, 0x00, 0x07, 0x04, 0x04, 0x04, 0x00 }, // 0xd193 ѓ CYRILLIC SMALL LETTER GJE 437 | /*0332*/ { 0x04, 0x00, 0x00, 0x07, 0x08, 0x0E, 0x08, 0x07, 0x00 }, // 0xd194 є CYRILLIC SMALL LETTER UKRAINIAN IE 438 | /*0333*/ { 0x04, 0x00, 0x00, 0x07, 0x08, 0x06, 0x01, 0x0E, 0x00 }, // 0xd195 ѕ CYRILLIC SMALL LETTER DZE 439 | /*0334*/ { 0x03, 0x00, 0x02, 0x00, 0x06, 0x02, 0x02, 0x07, 0x00 }, // 0xd196 і CYRILLIC SMALL LETTER BYELORUSSION-UKRAINIAN I 440 | /*0335*/ { 0x03, 0x00, 0x05, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00 }, // 0xd197 ї CYRILLIC SMALL LETTER YI 441 | /*0336*/ { 0x04, 0x00, 0x01, 0x00, 0x03, 0x01, 0x01, 0x09, 0x06 }, // 0xd198 ј CYRILLIC SMALL LETTER JE 442 | /*0337*/ { 0x07, 0x00, 0x00, 0x38, 0x28, 0x2E, 0x29, 0x4E, 0x00 }, // 0xd199 љ CYRILLIC SMALL LETTER LJE 443 | /*0338*/ { 0x06, 0x00, 0x28, 0x28, 0x28, 0x3E, 0x29, 0x2E, 0x00 }, // 0xd19a њ CYRILLIC SMALL LETTER NJE 444 | /*0339*/ { 0x06, 0x10, 0x38, 0x10, 0x16, 0x19, 0x11, 0x11, 0x00 }, // 0xd19b ћ CYRILLIC SMALL LETTER TSHE 445 | /*0340*/ { 0x04, 0x0A, 0x08, 0x09, 0x0A, 0x0C, 0x0A, 0x09, 0x00 }, // 0xd19c ќ CYRILLIC SMALL LETTER KJE 446 | /*0341*/ { 0x04, 0x04, 0x02, 0x00, 0x09, 0x0b, 0x0d, 0x09, 0x00 }, // 0xd19d ѝ CYRILLIC SMALL LETTER I WITH GRAVE 447 | /*0342*/ { 0x05, 0x04, 0x04, 0x11, 0x11, 0x0F, 0x01, 0x11, 0x0E }, // 0xd19e ў CYRILLIC SMALL LETTER SHORT U 448 | /*0343*/ { 0x05, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x04 }, // 0xd19f џ CYRILLIC SMALL LETTER DZHE 449 | /*0344*/ { 0x04, 0x01, 0x0F, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }, // 0xd290 Ґ CYRILLIC CAPITAL LETTER GHE WITH UPTURN 450 | /*0345*/ { 0x04, 0x00, 0x01, 0x0F, 0x08, 0x08, 0x08, 0x08, 0x00 }, // 0xd291 ґ CYRILLIC SMALL LETTER GHE WITH UPTURN 451 | }; 452 | 453 | //---------------------------------------------------------------------------------------------------------------------- 454 | 455 | extern "C" uint8_t sntp_getreachability(uint8_t); 456 | 457 | bool getNtpServer() { // connect WiFi -> fetch ntp packet -> disconnect Wifi 458 | uint8_t cnt = 0; 459 | WiFi.mode(WIFI_STA); 460 | WiFi.begin(SSID, PW); 461 | 462 | while(WiFi.status() != WL_CONNECTED) { 463 | delay(500); 464 | Serial.print("."); 465 | cnt++; 466 | if(cnt > 20) 467 | break; 468 | } 469 | 470 | if(WiFi.status() != WL_CONNECTED) return false; 471 | 472 | Serial.println("\nconnected with: " + WiFi.SSID()); 473 | Serial.println("IP Address: " + WiFi.localIP().toString()); 474 | bool timeSync; 475 | uint32_t timeout { millis() }; 476 | configTime(TZName, NTP_SERVER[0], NTP_SERVER[1], NTP_SERVER[2]); 477 | do { 478 | delay(25); 479 | if(millis() - timeout >= 1e3) { 480 | Serial.printf("waiting for NTP %02ld sec\n", (millis() - timeout) / 1000); 481 | delay(975); 482 | } 483 | sntp_getreachability(0) ? timeSync = true : sntp_getreachability(1) ? timeSync = true : 484 | sntp_getreachability(2) ? timeSync = true : false; 485 | } while(millis() - timeout <= 16e3 && !timeSync); 486 | 487 | Serial.printf("NTP Synchronization %s!\n", timeSync ? "successfully" : "failed"); 488 | WiFi.disconnect(); 489 | return timeSync; 490 | } 491 | //---------------------------------------------------------------------------------------------------------------------- 492 | 493 | const uint8_t InitArr[7][2] = { 494 | { 0x0C, 0x00 }, // display off 495 | { 0x00, 0xFF }, // no LEDtest 496 | { 0x09, 0x00 }, // BCD off 497 | { 0x0F, 0x00 }, // normal operation 498 | { 0x0B, 0x07 }, // start display 499 | { 0x0A, 0x04 }, // brightness 500 | { 0x0C, 0x01 } // display on 501 | }; 502 | //---------------------------------------------------------------------------------------------------------------------- 503 | 504 | void helpArr_init(void) { //helperarray init 505 | uint8_t i, j, k; 506 | j = 0; 507 | k = 0; 508 | for (i = 0; i < anzMAX * 8; i++) { 509 | _helpArrPos[i] = (1 << j); //bitmask 510 | _helpArrMAX[i] = k; 511 | j++; 512 | if (j > 7) { 513 | j = 0; 514 | k++; 515 | } 516 | } 517 | } 518 | //---------------------------------------------------------------------------------------------------------------------- 519 | 520 | void max7219_init() { //all MAX7219 init 521 | uint8_t i, j; 522 | for (i = 0; i < 7; i++) { 523 | digitalWrite(MAX_CS, LOW); 524 | delayMicroseconds(1); 525 | for (j = 0; j < anzMAX; j++) { 526 | SPI.write(InitArr[i][0]); //register 527 | SPI.write(InitArr[i][1]); //value 528 | } 529 | digitalWrite(MAX_CS, HIGH); 530 | } 531 | } 532 | //---------------------------------------------------------------------------------------------------------------------- 533 | 534 | void max7219_set_brightness(unsigned short br) { //brightness MAX7219 535 | uint8_t j; 536 | if (br < 16) { 537 | digitalWrite(MAX_CS, LOW); 538 | delayMicroseconds(1); 539 | for (j = 0; j < anzMAX; j++) { 540 | SPI.write(0x0A); //register 541 | SPI.write(br); //value 542 | } 543 | digitalWrite(MAX_CS, HIGH); 544 | } 545 | } 546 | //---------------------------------------------------------------------------------------------------------------------- 547 | 548 | void clear_Display() { //clear all 549 | uint8_t i, j; 550 | for(i = 0; i < 8; i++) { //8 rows 551 | digitalWrite(MAX_CS, LOW); 552 | delayMicroseconds(1); 553 | for(j = anzMAX; j > 0; j--) { 554 | _LEDarr[j - 1][i] = 0; //LEDarr clear 555 | SPI.write(i + 1); //current row 556 | SPI.write(_LEDarr[j - 1][i]); 557 | } 558 | digitalWrite(MAX_CS, HIGH); 559 | } 560 | } 561 | //---------------------------------------------------------------------------------------------------------------------- 562 | 563 | void rotate_90() { // for Generic displays 564 | for(uint8_t k = anzMAX; k > 0; k--) { 565 | uint8_t i, j, m, imask, jmask; 566 | uint8_t tmp[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; 567 | for(i = 0, imask = 0x01; i < 8; i++, imask <<= 1) { 568 | for(j = 0, jmask = 0x01; j < 8; j++, jmask <<= 1) { 569 | if(_LEDarr[k - 1][i] & jmask) { 570 | tmp[j] |= imask; 571 | } 572 | } 573 | } 574 | for(m = 0; m < 8; m++) { 575 | _LEDarr[k - 1][m] = tmp[m]; 576 | } 577 | } 578 | } 579 | //---------------------------------------------------------------------------------------------------------------------- 580 | 581 | void refresh_display() { //take info into LEDarr 582 | uint8_t i, j; 583 | #ifdef ROTATE_90 584 | rotate_90(); 585 | #endif 586 | for(i = 0; i < 8; i++) { //8 rows 587 | digitalWrite(MAX_CS, LOW); 588 | delayMicroseconds(1); 589 | for(j = anzMAX; j > 0; j--) { 590 | SPI.write(i + 1); //current row 591 | #ifdef REVERSE_HORIZONTAL 592 | SPI.setBitOrder(LSBFIRST); // bitorder for reverse columns 593 | #endif 594 | 595 | #ifdef REVERSE_VERTICAL 596 | SPI.write(_LEDarr[j - 1][7-i]); 597 | #else 598 | SPI.write(_LEDarr[j - 1][i]); 599 | #endif 600 | 601 | #ifdef REVERSE_HORIZONTAL 602 | SPI.setBitOrder(MSBFIRST); // reset bitorder 603 | #endif 604 | } 605 | digitalWrite(MAX_CS, HIGH); 606 | } 607 | } 608 | //---------------------------------------------------------------------------------------------------------------------- 609 | 610 | uint8_t char2Arr_t(unsigned short ch, int PosX, short PosY) { //characters into arr, shows only the time 611 | int i, j, k, l, m, o1, o2, o3, o4 = 0; 612 | PosX++; 613 | k = ch - 0x30; //ASCII position in font 614 | if((k >= 0) && (k < 11)) { //character found in font? 615 | o4 = font_t[k][0]; //character width 616 | o3 = 1 << (o4 - 1); 617 | for(i = 0; i < o4; i++) { 618 | if(((PosX - i <= _maxPosX) && (PosX - i >= 0)) && ((PosY > -8) && (PosY < 8))) { //within matrix? 619 | o1 = _helpArrPos[PosX - i]; 620 | o2 = _helpArrMAX[PosX - i]; 621 | for(j = 0; j < 8; j++) { 622 | if(((PosY >= 0) && (PosY <= j)) || ((PosY < 0) && (j < PosY + 8))) { //scroll vertical 623 | l = font_t[k][j + 1]; 624 | m = (l & (o3 >> i)); //e.g. o4=7 0zzzzz0, o4=4 0zz0 625 | if(m > 0) 626 | _LEDarr[o2][j - PosY] = _LEDarr[o2][j - PosY] | (o1); //set point 627 | else 628 | _LEDarr[o2][j - PosY] = _LEDarr[o2][j - PosY] & (~o1); //clear point 629 | } 630 | } 631 | } 632 | } 633 | } 634 | return o4; 635 | } 636 | //---------------------------------------------------------------------------------------------------------------------- 637 | 638 | uint8_t char2Arr_p(uint16_t ch, int PosX) { //characters into arr, proportional font 639 | int i, j, l, m, o1, o2, o3, o4 = 0; 640 | if(ch <= 345) { //character found in font? 641 | o4 = font_p[ch][0]; //character width 642 | o3 = 1 << (o4 - 1); 643 | for(i = 0; i < o4; i++) { 644 | if((PosX - i <= _maxPosX) && (PosX - i >= 0)) { //within matrix? 645 | o1 = _helpArrPos[PosX - i]; 646 | o2 = _helpArrMAX[PosX - i]; 647 | for(j = 0; j < 8; j++) { 648 | l = font_p[ch][j + 1]; 649 | m = (l & (o3 >> i)); //e.g. o4=7 0zzzzz0, o4=4 0zz0 650 | if(m > 0) 651 | _LEDarr[o2][j] = _LEDarr[o2][j] | (o1); //set point 652 | else 653 | _LEDarr[o2][j] = _LEDarr[o2][j] & (~o1); //clear point 654 | } 655 | } 656 | } 657 | } 658 | return o4; 659 | } 660 | //---------------------------------------------------------------------------------------------------------------------- 661 | 662 | uint16_t scrolltext(int16_t posX, String txt) { 663 | uint16_t i=0, j=0; 664 | boolean k=false; 665 | while((txt[i]!=0)&&(j<256)){ 666 | if((txt[i]>=0x20)&&(txt[i]<=0x7f)){ // ASCII section 667 | _chbuf[j]=txt[i]-0x20; k=true; i++; j++; 668 | } 669 | if(txt[i]==0xC2){ // basic latin section (0x80...0x9f are controls, not used) 670 | if((txt[i+1]>=0xA0)&&(txt[i+1]<=0xBF)){_chbuf[j]=txt[i+1]-0x40; k=true; i+=2; j++;} 671 | } 672 | if(txt[i]==0xC3){ // latin1 supplement section 673 | if((txt[i+1]>=0x80)&&(txt[i+1]<=0xBF)){_chbuf[j]=txt[i+1]+0x00; k=true; i+=2; j++;} 674 | } 675 | if(txt[i]==0xCE){ // greek section 676 | if((txt[i+1]>=0x91)&&(txt[i+1]<=0xBF)){_chbuf[j]=txt[i+1]+0x2F; k=true; i+=2; j++;} 677 | } 678 | if(txt[i]==0xCF){ // greek section 679 | if((txt[i+1]>=0x80)&&(txt[i+1]<=0x89)){_chbuf[j]=txt[i+1]+0x6F; k=true; i+=2; j++;} 680 | } 681 | if(txt[i]==0xD0){ // cyrillic section 682 | if((txt[i+1]>=0x80)&&(txt[i+1]<=0xBF)){_chbuf[j]=txt[i+1]+0x79; k=true; i+=2; j++;} 683 | } 684 | if(txt[i]==0xD1){ // cyrillic section 685 | if((txt[i+1]>=0x80)&&(txt[i+1]<=0x9F)){_chbuf[j]=txt[i+1]+0xB9; k=true; i+=2; j++;} 686 | } 687 | if(k==false){ 688 | _chbuf[j]=0x00; // space 1px 689 | i++; j++; 690 | } 691 | k=false; 692 | } 693 | // _chbuf stores the position of th char in font and in j is the length of the real string 694 | 695 | int16_t p=0; 696 | for(int k=0; k12) h-=12; 799 | if(h==0) h=12; 800 | hour1 = (h % 10); 801 | hour2 = (h / 10); 802 | #endif //FORMAT24H 803 | 804 | y = y2; //scroll updown 805 | sc1 = 1; 806 | sec1++; 807 | if (sec1 == 10) { 808 | sc2 = 1; 809 | sec2++; 810 | sec1 = 0; 811 | } 812 | if (sec2 == 6) { 813 | min1++; 814 | sec2 = 0; 815 | sc3 = 1; 816 | } 817 | if (min1 == 10) { 818 | min2++; 819 | min1 = 0; 820 | sc4 = 1; 821 | } 822 | if (min2 == 6) { 823 | hour1++; 824 | min2 = 0; 825 | sc5 = 1; 826 | } 827 | if (hour1 == 10) { 828 | hour2++; 829 | hour1 = 0; 830 | sc6 = 1; 831 | } 832 | #ifdef FORMAT24H 833 | if ((hour2 == 2) && (hour1 == 4)) { 834 | hour1 = 0; 835 | hour2 = 0; 836 | sc6 = 1; 837 | } 838 | #else 839 | if ((hour2 == 1) && (hour1 == 3)) { // 12 hour format 840 | hour1 = 1; 841 | hour2 = 0; 842 | sc6 = 1; 843 | } 844 | #endif //FORMAT24H 845 | sec11 = sec12; 846 | sec12 = sec1; 847 | sec21 = sec22; 848 | sec22 = sec2; 849 | min11 = min12; 850 | min12 = min1; 851 | min21 = min22; 852 | min22 = min2; 853 | hour11 = hour12; 854 | hour12 = hour1; 855 | hour21 = hour22; 856 | hour22 = hour2; 857 | if (tm.tm_sec == 45) f_scroll_x1 = true; // scroll ddmmyy 858 | #ifdef UDTXT 859 | if (tm.tm_sec == 25) f_scroll_x2 = true; // scroll userdefined text 860 | #endif //UDTXT 861 | } // end lastsec 862 | // ---------------------------------------------- 863 | if (_f_tckr50ms == true) { 864 | _f_tckr50ms = false; 865 | // ------------------------------------- 866 | if (f_scroll_x1 == true) { 867 | _zPosX++; 868 | _dPosX++; 869 | if (_dPosX == sctxtlen) _zPosX = 0; 870 | if (_zPosX == _maxPosX){f_scroll_x1 = false; _dPosX = -8;} 871 | } 872 | // ------------------------------------- 873 | if (f_scroll_x2 == true) { 874 | _zPosX++; 875 | _dPosX++; 876 | if (_dPosX == sctxtlen) _zPosX = 0; 877 | if (_zPosX == _maxPosX){f_scroll_x2 = false; _dPosX = -8;} 878 | } 879 | // ------------------------------------- 880 | if (sc1 == 1) { 881 | if (_f_updown == 1) y--; 882 | else y++; 883 | char2Arr_t(48 + sec12, _zPosX - 42, y); 884 | char2Arr_t(48 + sec11, _zPosX - 42, y + y1); 885 | if (y == 0) {sc1 = 0; f_scrollend_y = true;} 886 | } 887 | else char2Arr_t(48 + sec1, _zPosX - 42, 0); 888 | // ------------------------------------- 889 | if (sc2 == 1) { 890 | char2Arr_t(48 + sec22, _zPosX - 36, y); 891 | char2Arr_t(48 + sec21, _zPosX - 36, y + y1); 892 | if (y == 0) sc2 = 0; 893 | } 894 | else char2Arr_t(48 + sec2, _zPosX - 36, 0); 895 | char2Arr_t(':', _zPosX - 32, 0); 896 | // ------------------------------------- 897 | if (sc3 == 1) { 898 | char2Arr_t(48 + min12, _zPosX - 25, y); 899 | char2Arr_t(48 + min11, _zPosX - 25, y + y1); 900 | if (y == 0) sc3 = 0; 901 | } 902 | else char2Arr_t(48 + min1, _zPosX - 25, 0); 903 | // ------------------------------------- 904 | if (sc4 == 1) { 905 | char2Arr_t(48 + min22, _zPosX - 19, y); 906 | char2Arr_t(48 + min21, _zPosX - 19, y + y1); 907 | if (y == 0) sc4 = 0; 908 | } 909 | else char2Arr_t(48 + min2, _zPosX - 19, 0); 910 | char2Arr_t(':', _zPosX - 15 + x, 0); 911 | // ------------------------------------- 912 | if (sc5 == 1) { 913 | char2Arr_t(48 + hour12, _zPosX - 8, y); 914 | char2Arr_t(48 + hour11, _zPosX - 8, y + y1); 915 | if (y == 0) sc5 = 0; 916 | } 917 | else char2Arr_t(48 + hour1, _zPosX - 8, 0); 918 | // ------------------------------------- 919 | if (sc6 == 1) { 920 | char2Arr_t(48 + hour22, _zPosX - 2, y); 921 | char2Arr_t(48 + hour21, _zPosX - 2, y + y1); 922 | if (y == 0) sc6 = 0; 923 | } 924 | else char2Arr_t(48 + hour2, _zPosX - 2, 0); 925 | // ------------------------------------- 926 | if(f_scroll_x1){ // day month year 927 | String txt= " "; 928 | txt += WD_arr[tm.tm_wday] + " "; 929 | txt += String(tm.tm_mday) + ". "; 930 | txt += M_arr[tm.tm_mon] + " "; 931 | txt += String(tm.tm_year + 1900) + " "; 932 | sctxtlen=scrolltext(_dPosX, txt); 933 | } 934 | // ------------------------------------- 935 | if(f_scroll_x2){ // user defined text 936 | #ifdef UDTXT 937 | sctxtlen=scrolltext(_dPosX, UDTXT ); 938 | #endif //UDTXT 939 | } 940 | // ------------------------------------- 941 | refresh_display(); //all 50msec 942 | if (f_scrollend_y == true) f_scrollend_y = false; 943 | } //end 50ms 944 | // ----------------------------------------------- 945 | if (y == 0) { 946 | // do something else 947 | } 948 | } 949 | 950 | 951 | 952 | //********************************************************************************************************* 953 | // Examples for time zones * 954 | //********************************************************************************************************* 955 | // UTC GMT0 956 | // Africa/Abidjan GMT0 957 | // Africa/Accra GMT0 958 | // Africa/Addis_Ababa EAT-3 959 | // Africa/Algiers CET-1 960 | // Africa/Blantyre, Harare CAT-2 961 | // Africa/Cairo EEST 962 | // Africa/Casablanca WET0 963 | // Africa/Freetown GMT0 964 | // Africa/Johannesburg SAST-2 965 | // Africa/Kinshasa WAT-1 966 | // Africa/Lome GMT0 967 | // Africa/Maseru SAST-2 968 | // Africa/Mbabane SAST-2 969 | // Africa/Nairobi EAT-3 970 | // Africa/Tripoli EET-2 971 | // Africa/Tunis CET-1CEST,M3.5.0,M10.5.0/3 972 | // Africa/Windhoek WAT-1WAST,M9.1.0,M4.1.0 973 | // America/Adak HAST10HADT,M3.2.0,M11.1.0 974 | // America/Alaska AKST9AKDT,M3.2.0,M11.1.0 975 | // America/Anguilla,Dominica AST4 976 | // America/Araguaina BRT3 977 | // Argentina/San_Luis ART3 978 | // America/Asuncion PYT4PYST,M10.3.0/0,M3.2.0/0 979 | // America/Atka HAST10HADT,M3.2.0,M11.1.0 980 | // America/Boa_Vista AMT4 981 | // America/Bogota COT5 982 | // America/Campo_Grande AMT4AMST,M10.2.0/0,M2.3.0/0 983 | // America/Caracas VET4:30 984 | // America/Catamarca ART3ARST,M10.1.0/0,M3.3.0/0 985 | // America/Cayenne GFT3 986 | // America/Chicago CST6CDT,M3.2.0,M11.1.0 987 | // America/Costa_Rica CST6 988 | // America/Los_Angeles PST8PDT,M3.2.0,M11.1.0 989 | // America/Dawson_Creek MST7 990 | // America/Denver MST7MDT,M3.2.0,M11.1.0 991 | // America/Detroit EST5EDT,M3.2.0,M11.1.0 992 | // America/Eirunepe ACT5 993 | // America/Godthab WGST 994 | // America/Guayaquil ECT5 995 | // America/Guyana GYT4 996 | // America/Havana CST5CDT,M3.3.0/0,M10.5.0/1 997 | // America/Hermosillo MST7 998 | // America/Jamaica EST5 999 | // America/La_Paz BOT4 1000 | // America/Lima PET5 1001 | // America/Miquelon PMST3PMDT,M3.2.0,M11.1.0 1002 | // America/Montevideo UYT3UYST,M10.1.0,M3.2.0 1003 | // America/Noronha FNT2 1004 | // America/Paramaribo SRT3 1005 | // America/Phoenix MST7 1006 | // America/Santiago CLST 1007 | // America/Sao_Paulo BRT3BRST,M10.2.0/0,M2.3.0/0 1008 | // America/Scoresbysund EGT1EGST,M3.5.0/0,M10.5.0/1 1009 | // America/St_Johns NST3:30NDT,M3.2.0/0:01,M11.1.0/0:01 1010 | // America/Toronto EST5EDT,M3.2.0,M11.1.0 1011 | // Antarctica/Casey WST-8 1012 | // Antarctica/Davis DAVT-7 1013 | // Antarctica/DumontDUrville DDUT-10 1014 | // Antarctica/Mawson MAWT-6 1015 | // Antarctica/McMurdo NZST-12NZDT,M9.5.0,M4.1.0/3 1016 | // Antarctica/Palmer CLST 1017 | // Antarctica/Rothera ROTT3 1018 | // Antarctica/South_Pole NZST-12NZDT,M9.5.0,M4.1.0/3 1019 | // Antarctica/Syowa SYOT-3 1020 | // Antarctica/Vostok VOST-6 1021 | // Arctic/Longyearbyen CET-1CEST,M3.5.0,M10.5.0/3 1022 | // Argentina/Buenos_Aires ART3ARST,M10.1.0/0,M3.3.0/0 1023 | // Asia/Almaty ALMT-6 1024 | // Asia/Amman EET-2EEST,M3.5.4/0,M10.5.5/1 1025 | // Asia/Anadyr ANAT-12ANAST,M3.5.0,M10.5.0/3 1026 | // Asia/Aqtau, Aqtobe AQTT-5 1027 | // Asia/Ashgabat TMT-5 1028 | // Asia/Ashkhabad TMT-5 1029 | // Asia/Baku AZT-4AZST,M3.5.0/4,M10.5.0/5 1030 | // Asia/Bangkok ICT-7 1031 | // Asia/Bishkek KGT-6 1032 | // Asia/Brunei BNT-8 1033 | // Asia/Calcutta IST-5:30 1034 | // Asia/Choibalsan CHOT-9 1035 | // Asia/Chongqing CST-8 1036 | // Asia/Colombo IST-5:30 1037 | // Asia/Dacca BDT-6 1038 | // Asia/Damascus EET-2EEST,M4.1.5/0,J274/0 1039 | // Asia/Dili TLT-9 1040 | // Asia/Dubai GST-4 1041 | // Asia/Dushanbe TJT-5 1042 | // Asia/Gaza EET-2EEST,J91/0,M9.2.4 1043 | // Asia/Ho_Chi_Minh ICT-7 1044 | // Asia/Hong_Kong HKT-8 1045 | // Asia/Hovd HOVT-7 1046 | // Asia/Irkutsk IRKT-8IRKST,M3.5.0,M10.5.0/3 1047 | // Asia/Jakarta, Pontianak WIT-7 1048 | // Asia/Jayapura EIT-9 1049 | // Asia/Jerusalem IDDT 1050 | // Asia/Kabul AFT-4:30 1051 | // Asia/Kamchatka PETT-12PETST,M3.5.0,M10.5.0/3 1052 | // Asia/Karachi PKT-5 1053 | // Asia/Katmandu NPT-5:45 1054 | // Asia/Kolkata IST-5:30 1055 | // Asia/Krasnoyarsk KRAT-7KRAST,M3.5.0,M10.5.0/3 1056 | // Asia/Kuala_Lumpur MYT-8 1057 | // Asia/Kuching MYT-8 1058 | // Asia/Kuwait, Bahrain AST-3 1059 | // Asia/Magadan MAGT-11MAGST,M3.5.0,M10.5.0/3 1060 | // Asia/Makassar CIT-8 1061 | // Asia/Manila PHT-8 1062 | // Asia/Mideast/Riyadh87 zzz-3:07:04 1063 | // Asia/Muscat GST-4 1064 | // Asia/Novosibirsk NOVT-6NOVST,M3.5.0,M10.5.0/3 1065 | // Asia/Omsk OMST-6OMSST,M3.5.0,M10.5.0/3 1066 | // Asia/Oral ORAT-5 1067 | // Asia/Phnom_Penh ICT-7 1068 | // Asia/Pyongyang KST-9 1069 | // Asia/Qyzylorda QYZT-6 1070 | // Asia/Rangoon MMT-6:30 1071 | // Asia/Saigon ICT-7 1072 | // Asia/Sakhalin SAKT-10SAKST,M3.5.0,M10.5.0/3 1073 | // Asia/Samarkand UZT-5 1074 | // Asia/Seoul KST-9 1075 | // Asia/Singapore SGT-8 1076 | // Asia/Taipei CST-8 1077 | // Asia/Tashkent UZT-5 1078 | // Asia/Tbilisi GET-4 1079 | // Asia/Tehran IRDT 1080 | // Asia/Tel_Aviv IDDT 1081 | // Asia/Thimbu BTT-6 1082 | // Asia/Thimphu BTT-6 1083 | // Asia/Tokyo JST-9 1084 | // Asia/Ujung_Pandang CIT-8 1085 | // Asia/Ulaanbaatar ULAT-8 1086 | // Asia/Ulan_Bator ULAT-8 1087 | // Asia/Urumqi CST-8 1088 | // Asia/Vientiane ICT-7 1089 | // Asia/Vladivostok VLAT-10VLAST,M3.5.0,M10.5.0/3 1090 | // Asia/Yekaterinburg YAKT-9YAKST,M3.5.0,M10.5.0/3 1091 | // Asia/Yerevan AMT-4AMST,M3.5.0,M10.5.0/3 1092 | // Atlantic/Azores AZOT1AZOST,M3.5.0/0,M10.5.0/1 1093 | // Atlantic/Canary WET0WEST,M3.5.0/1,M10.5.0 1094 | // Atlantic/Cape_Verde CVT1 1095 | // Atlantic/Jan_Mayen CET-1CEST,M3.5.0,M10.5.0/3 1096 | // Atlantic/South_Georgia GST2 1097 | // Atlantic/St_Helena GMT0 1098 | // Atlantic/Stanley FKT4FKST,M9.1.0,M4.3.0 1099 | // Australia/Adelaide CST-9:30CST,M10.1.0,M4.1.0/3 1100 | // Australia/Brisbane EST-10 1101 | // Australia/Darwin CST-9:30 1102 | // Australia/Eucla CWST-8:45 1103 | // Australia/LHI LHST-10:30LHST-11,M10.1.0,M4.1.0 1104 | // Australia/Lindeman EST-10 1105 | // Australia/Lord_Howe LHST-10:30LHST-11,M10.1.0,M4.1.0 1106 | // Australia/Melbourne EST-10EST,M10.1.0,M4.1.0/3 1107 | // Australia/North CST-9:30 1108 | // Australia/Perth, West WST-8 1109 | // Australia/Queensland EST-10 1110 | // Brazil/Acre ACT5 1111 | // Brazil/DeNoronha FNT2 1112 | // Brazil/East BRT3BRST,M10.2.0/0,M2.3.0/0 1113 | // Brazil/West AMT4 1114 | // Canada/Central CST6CDT,M3.2.0,M11.1.0 1115 | // Canada/Eastern EST5EDT,M3.2.0,M11.1.0 1116 | // Canada/Newfoundland NST3:30NDT,M3.2.0/0:01,M11.1.0/0:01 1117 | // Canada/Pacific PST8PDT,M3.2.0,M11.1.0 1118 | // Chile/Continental CLST 1119 | // Chile/EasterIsland EASST 1120 | // Europe/Berlin CET-1CEST,M3.5.0,M10.5.0/3 1121 | // Europe/Athens EET-2EEST,M3.5.0/3,M10.5.0/4 1122 | // Europe/Belfast GMT0BST,M3.5.0/1,M10.5.0 1123 | // Europe/Kaliningrad EET-2EEST,M3.5.0,M10.5.0/3 1124 | // Europe/Lisbon WET0WEST,M3.5.0/1,M10.5.0 1125 | // Europe/London GMT0BST,M3.5.0/1,M10.5.0 1126 | // Europe/Minsk EET-2EEST,M3.5.0,M10.5.0/3 1127 | // Europe/Moscow MSK-3MSD,M3.5.0,M10.5.0/3 1128 | // Europe/Samara SAMT-4SAMST,M3.5.0,M10.5.0/3 1129 | // Europe/Volgograd VOLT-3VOLST,M3.5.0,M10.5.0/3 1130 | // Indian/Chagos IOT-6 1131 | // Indian/Christmas CXT-7 1132 | // Indian/Cocos CCT-6:30 1133 | // Indian/Kerguelen TFT-5 1134 | // Indian/Mahe SCT-4 1135 | // Indian/Maldives MVT-5 1136 | // Indian/Mauritius MUT-4 1137 | // Indian/Reunion RET-4 1138 | // Mexico/General CST6CDT,M4.1.0,M10.5.0 1139 | // Pacific/Apia WST11 1140 | // Pacific/Auckland NZST-12NZDT,M9.5.0,M4.1.0/3 1141 | // Pacific/Chatham CHAST-12:45CHADT,M9.5.0/2:45,M4.1.0/3:45 1142 | // Pacific/Easter EASST 1143 | // Pacific/Efate VUT-11 1144 | // Pacific/Enderbury PHOT-13 1145 | // Pacific/Fakaofo TKT10 1146 | // Pacific/Fiji FJT-12 1147 | // Pacific/Funafuti TVT-12 1148 | // Pacific/Galapagos GALT6 1149 | // Pacific/Gambier GAMT9 1150 | // Pacific/Guadalcanal SBT-11 1151 | // Pacific/Guam ChST-10 1152 | // Pacific/Honolulu HST10 1153 | // Pacific/Johnston HST10 1154 | // Pacific/Kiritimati LINT-14 1155 | // Pacific/Kosrae KOST-11 1156 | // Pacific/Kwajalein MHT-12 1157 | // Pacific/Majuro MHT-12 1158 | // Pacific/Marquesas MART9:30 1159 | // Pacific/Midway SST11 1160 | // Pacific/Nauru NRT-12 1161 | // Pacific/Niue NUT11 1162 | // Pacific/Norfolk NFT-11:30 1163 | // Pacific/Noumea NCT-11 1164 | // Pacific/Pago_Pago SST11 1165 | // Pacific/Palau PWT-9 1166 | // Pacific/Pitcairn PST8 1167 | // Pacific/Ponape PONT-11 1168 | // Pacific/Port_Moresby PGT-10 1169 | // Pacific/Rarotonga CKT10 1170 | // Pacific/Saipan ChST-10 1171 | // Pacific/Samoa SST11 1172 | // Pacific/Tahiti TAHT10 1173 | // Pacific/Tarawa GILT-12 1174 | // Pacific/Tongatapu TOT-13 1175 | // Pacific/Truk TRUT-10 1176 | // Pacific/Wake WAKT-12 1177 | // Pacific/Wallis WFT-12 1178 | // Pacific/Yap TRUT-10 1179 | // SystemV/HST10 HST10 1180 | // SystemV/MST7 MST7 1181 | // SystemV/PST8 PST8 1182 | // SystemV/YST9 GAMT9 1183 | // US/Aleutian HAST10HADT,M3.2.0,M11.1.0 1184 | // US/Arizona MST7 1185 | // US/Eastern EST5EDT,M3.2.0,M11.1.0 1186 | // US/East-Indiana EST5EDT,M3.2.0,M11.1.0 1187 | // US/Hawaii HST10 1188 | // US/Michigan EST5EDT,M3.2.0,M11.1.0 1189 | // US/Samoa SST11 1190 | 1191 | 1192 | 1193 | 1194 | 1195 | 1196 | --------------------------------------------------------------------------------