├── Calculator.ino ├── FacesTest.ino ├── GameBoy.ino ├── KeyBoard.ino ├── README.md └── m5stack-micropython-tft-repl-v1.0.bin /Calculator.ino: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #define FACES_KEYBOARD_I2C_ADDR 0x08 4 | 5 | #define Set_Bit(val, bitn) (val |=(1<<(bitn))) 6 | #define Clr_Bit(val, bitn) (val&=~(1<<(bitn))) 7 | #define Get_Bit(val, bitn) (val &(1<<(bitn)) ) 8 | 9 | //L1 PD2 10 | //L2 PD3 11 | //L3 PD4 12 | //L4 PD5 13 | //L5 PD6 14 | 15 | //C1 PC0 16 | //C2 PC1 17 | //C3 PC2 18 | //C4 PC3 19 | 20 | //IRQ PB0 21 | #define IRQ_1 Set_Bit(PORTB,0) 22 | #define IRQ_0 Clr_Bit(PORTB,0) 23 | void setup() 24 | { 25 | Set_Bit(DDRB, 0); 26 | IRQ_1; 27 | DDRC = 0x00; 28 | PORTC = 0xff; 29 | DDRD = 0xff; 30 | PORTD = 0x00; 31 | Wire.begin(FACES_KEYBOARD_I2C_ADDR); 32 | Wire.onRequest(requestEvent); 33 | } 34 | 35 | 36 | unsigned char i = 0; 37 | unsigned char temp = 0, hadPressed = 0; 38 | void requestEvent() 39 | { 40 | if (hadPressed == 1) 41 | { 42 | Wire.write(temp); 43 | hadPressed = 0; 44 | IRQ_1; 45 | return; 46 | } 47 | } 48 | 49 | int count = 0; 50 | void loop() 51 | { 52 | // Serial.println(temp); 53 | Clr_Bit(PORTD, 2); 54 | Set_Bit(PORTD, 3); 55 | Set_Bit(PORTD, 4); 56 | Set_Bit(PORTD, 5); 57 | Set_Bit(PORTD, 6); 58 | delay(1); 59 | switch (PINC & 0x0f) 60 | { 61 | case 0x0e: 62 | count = 0; 63 | while ((PINC & 0x0f) != 0x0f) 64 | { 65 | if (count++ > 400) 66 | { 67 | temp = 0x08; //backspace 68 | hadPressed = 1; IRQ_0; 69 | while ((PINC & 0x0f) != 0x0f) delay(1); 70 | return; break; 71 | } 72 | delay(1); 73 | } 74 | temp = 'A'; hadPressed = 1; IRQ_0; return; break; 75 | case 0x0d: temp = 'M'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 76 | case 0x0b: temp = '%'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 77 | case 0x07: temp = '/'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 78 | } 79 | Set_Bit(PORTD, 2); 80 | Clr_Bit(PORTD, 3); 81 | Set_Bit(PORTD, 4); 82 | Set_Bit(PORTD, 5); 83 | Set_Bit(PORTD, 6); 84 | delay(1); 85 | switch (PINC & 0x0f) 86 | { 87 | case 0x0e: temp = '7'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 88 | case 0x0d: temp = '8'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 89 | case 0x0b: temp = '9'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 90 | case 0x07: temp = '*'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 91 | } 92 | Set_Bit(PORTD, 2); 93 | Set_Bit(PORTD, 3); 94 | Clr_Bit(PORTD, 4); 95 | Set_Bit(PORTD, 5); 96 | Set_Bit(PORTD, 6); 97 | delay(1); 98 | switch (PINC & 0x0f) 99 | { 100 | case 0x0e: temp = '4'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 101 | case 0x0d: temp = '5'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 102 | case 0x0b: temp = '6'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 103 | case 0x07: temp = '-'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 104 | } 105 | 106 | Set_Bit(PORTD, 2); 107 | Set_Bit(PORTD, 3); 108 | Set_Bit(PORTD, 4); 109 | Clr_Bit(PORTD, 5); 110 | Set_Bit(PORTD, 6); 111 | delay(1); 112 | switch (PINC & 0x0f) 113 | { 114 | case 0x0e: temp = '1'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 115 | case 0x0d: temp = '2'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 116 | case 0x0b: temp = '3'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 117 | case 0x07: temp = '+'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 118 | } 119 | Set_Bit(PORTD, 2); 120 | Set_Bit(PORTD, 3); 121 | Set_Bit(PORTD, 4); 122 | Set_Bit(PORTD, 5); 123 | Clr_Bit(PORTD, 6); 124 | delay(1); 125 | switch (PINC & 0x0f) 126 | { 127 | case 0x0e: temp = '.'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 128 | case 0x0d: temp = '0'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 129 | case 0x0b: temp = '`'; while ((PINC & 0x0f) != 0x0f)delay(1); hadPressed = 1; IRQ_0; return; break; 130 | case 0x07: 131 | count = 0; 132 | while ((PINC & 0x0f) != 0x0f) 133 | { 134 | if (count++ > 400) 135 | { 136 | temp = 0x0d; 137 | hadPressed = 1; IRQ_0; 138 | while ((PINC & 0x0f) != 0x0f) delay(1); 139 | return; break; 140 | } 141 | delay(1); 142 | } 143 | temp = '='; hadPressed = 1; IRQ_0; return; break; 144 | } 145 | delay(10); 146 | } 147 | -------------------------------------------------------------------------------- /FacesTest.ino: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #define FACES_KEYBOARD_I2C_ADDR 0x08 4 | 5 | void setup() 6 | { 7 | Serial.begin(115200); 8 | Wire.begin(); 9 | pinMode(5, INPUT); 10 | digitalWrite(5,HIGH); 11 | } 12 | void loop() 13 | { 14 | if (digitalRead(5) == LOW) 15 | { 16 | Wire.requestFrom(FACES_KEYBOARD_I2C_ADDR, 1); 17 | while (Wire.available()) 18 | { 19 | char c = Wire.read(); // receive a byte as character 20 | Serial.print(c); // print the character 21 | } 22 | } 23 | delay(10); 24 | } 25 | -------------------------------------------------------------------------------- /GameBoy.ino: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #define FACES_KEYBOARD_I2C_ADDR 0x08 4 | 5 | #define Set_Bit(val, bitn) (val |=(1<<(bitn))) 6 | #define Clr_Bit(val, bitn) (val&=~(1<<(bitn))) 7 | #define Get_Bit(val, bitn) (val &(1<<(bitn)) ) 8 | //KEY PORTB 9 | //IRQ PC0 10 | #define IRQ_1 Set_Bit(PORTC,0) 11 | #define IRQ_0 Clr_Bit(PORTC,0) 12 | 13 | unsigned char oldPINB=0; 14 | void setup() 15 | { 16 | DDRC = 0x01; 17 | PORTC = 0x01; 18 | DDRD = 0x00; 19 | PORTD = 0x00; 20 | DDRB = 0x00; 21 | PORTB = 0xff; 22 | oldPINB=PINB; 23 | Wire.begin(FACES_KEYBOARD_I2C_ADDR); 24 | Wire.onRequest(requestEvent); 25 | } 26 | unsigned char i = 0; 27 | unsigned char temp = 0, hadPressed = 0; 28 | void requestEvent() 29 | { 30 | Wire.write(PINB); 31 | if (hadPressed == 1) 32 | { 33 | hadPressed = 0; 34 | IRQ_1; 35 | } 36 | 37 | } 38 | void loop() 39 | { 40 | if(PINB!=oldPINB) 41 | { 42 | temp=PINB; 43 | oldPINB=temp; 44 | IRQ_0; 45 | hadPressed = 1; 46 | } 47 | /* 48 | if (PINB != 0xff) 49 | { 50 | switch(PINB) 51 | { 52 | case 0xFE:temp='U';while(PINB!=0xff)delay(1);IRQ_0;hadPressed = 1;break; 53 | case 0xFD:temp='D';while(PINB!=0xff)delay(1);IRQ_0;hadPressed = 1;break; 54 | case 0xFB:temp='L';while(PINB!=0xff)delay(1);IRQ_0;hadPressed = 1;break; 55 | case 0xF7:temp='R';while(PINB!=0xff)delay(1);IRQ_0;hadPressed = 1;break; 56 | case 0xEF:temp='A';while(PINB!=0xff)delay(1);IRQ_0;hadPressed = 1;break; 57 | case 0xDF:temp='B';while(PINB!=0xff)delay(1);IRQ_0;hadPressed = 1;break; 58 | case 0xBF:temp='s';while(PINB!=0xff)delay(1);IRQ_0;hadPressed = 1;break; 59 | case 0x7F:temp='S';while(PINB!=0xff)delay(1);IRQ_0;hadPressed = 1;break; 60 | } 61 | }*/ 62 | delay(10); 63 | } 64 | -------------------------------------------------------------------------------- /KeyBoard.ino: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #define FACES_KEYBOARD_I2C_ADDR 0x08 4 | 5 | #define Set_Bit(val, bitn) (val |=(1<<(bitn))) 6 | #define Clr_Bit(val, bitn) (val&=~(1<<(bitn))) 7 | #define Get_Bit(val, bitn) (val &(1<<(bitn)) ) 8 | 9 | //C1 PC2 10 | //C2 PC3 11 | //C3 PC1 except alt and enter 12 | 13 | //R1 PB1 QA 14 | //R2 PB0 WSZ 15 | //R3 PD5 EDX 16 | //R4 PD6 RFC 17 | //R5 PD7 TGV 18 | //R6 PD4 YHB 19 | //R7 PD3 UJN 20 | //R8 PD2 IKM 21 | //R9 PD1 OL$ 22 | //R10 PD0 P+del 23 | 24 | //PB6 Enter 25 | //PB4 Alt 26 | //PB3 Fn 27 | //PB7 sym 28 | 29 | //PB5 aA 30 | //PC0 space 31 | 32 | //PC0 LEDR(1) LEDL(0) 33 | //PB2 IRQ 34 | 35 | #define LED_L_1 Set_Bit(DDRC,0);Set_Bit(PORTC,0) 36 | #define LED_R_1 Set_Bit(DDRC,0);Clr_Bit(PORTC,0) 37 | #define LED_L_0 Clr_Bit(DDRC,0);Clr_Bit(PORTC,0) 38 | #define LED_R_0 Clr_Bit(DDRC,0);Clr_Bit(PORTC,0) 39 | 40 | #define IRQ_1 Set_Bit(PORTB,2) 41 | #define IRQ_0 Clr_Bit(PORTB,2) 42 | unsigned char ALT = 0, aA = 0, SYM = 0, FN = 0, ESC = 0; 43 | unsigned char twoBytes = 0; 44 | unsigned char KEY = 0, KEY2 = 0, hadPressed = 0; 45 | 46 | #define aA_Pressed (PINB & 0x20) != 0x20 47 | #define SYM_Pressed (PINB & 0x80) != 0x80 48 | #define ALT_Pressed (PINB & 0x10) != 0x10 49 | #define FN_Pressed (PINB & 0x08) != 0x08 50 | #define ENTER_Pressed (PINB & 0x40) != 0x40 51 | #define aA_unPressed (PINB & 0x20) == 0x20 52 | #define SYM_unPressed (PINB & 0x80) == 0x80 53 | #define ALT_unPressed (PINB & 0x10) == 0x10 54 | #define FN_unPressed (PINB & 0x08) == 0x08 55 | #define ENTER_unPressed (PINB & 0x40) == 0x40 56 | int LedMode = 0; //0->LR off.1->L on,2->L slow , 3->L fast, 4->R on,5->R slow,6->R fast,7->L R slow 8->LR Fast 57 | 58 | void setup() 59 | { 60 | DDRB = 0x04; 61 | PORTB = 0xfb; 62 | IRQ_1; 63 | 64 | pinMode(A3, OUTPUT); 65 | pinMode(A2, OUTPUT); 66 | pinMode(A1, OUTPUT); 67 | pinMode(A0, OUTPUT); 68 | 69 | for(int i=0;i<5;i++) 70 | { 71 | LED_L_1; 72 | delay(i*30); 73 | LED_R_1; 74 | delay(i*30); 75 | } 76 | LED_R_0; 77 | DDRD = 0x00; 78 | PORTD = 0xff; 79 | 80 | LedMode = 1; 81 | Wire.begin(FACES_KEYBOARD_I2C_ADDR); 82 | Wire.onRequest(requestEvent); 83 | 84 | } 85 | 86 | void requestEvent() 87 | { 88 | if (hadPressed == 1) 89 | { 90 | Wire.write(KEY); 91 | hadPressed = 0; 92 | IRQ_1; 93 | return; 94 | } 95 | if (twoBytes == 1) 96 | { 97 | Wire.write(KEY2); 98 | twoBytes = 0; 99 | } 100 | } 101 | 102 | 103 | unsigned char GetInput() 104 | { 105 | if (aA_Pressed) 106 | { 107 | FN = 0; SYM = 0; ALT = 0; 108 | while (aA_Pressed)delay(1); //release key 109 | if (aA == 0) //had not pressed 110 | { 111 | delay(200); //detect doblue click 112 | if (aA_Pressed) 113 | { 114 | while (aA_Pressed)delay(1); 115 | aA = 2; 116 | LedMode = 2; 117 | } 118 | else 119 | { 120 | aA = 1; 121 | LedMode = 1; 122 | } 123 | } 124 | else // had pressed 125 | { 126 | delay(200); 127 | if (aA_Pressed) 128 | { 129 | while (aA_Pressed)delay(1); 130 | if (aA == 2) 131 | { 132 | aA = 0; 133 | } 134 | else 135 | { 136 | LedMode = 2; 137 | aA = 2; 138 | } 139 | } 140 | else 141 | { 142 | aA = 0; 143 | } 144 | } 145 | } 146 | if (ALT_Pressed) 147 | { 148 | FN = 0; SYM = 0; aA = 0; 149 | LedMode = 3; 150 | ALT = 1; 151 | } 152 | else 153 | { 154 | ALT = 0; 155 | } 156 | 157 | 158 | if (FN_Pressed) 159 | { 160 | aA = 0; SYM = 0; ALT = 0; 161 | while (FN_Pressed)delay(1); //release key 162 | if (FN == 0) //had not pressed 163 | { 164 | delay(200); //detect doblue click 165 | if (FN_Pressed) 166 | { 167 | while (FN_Pressed)delay(1); 168 | FN = 2; 169 | LedMode = 5; 170 | } 171 | else 172 | { 173 | FN = 1; 174 | LedMode = 4; 175 | } 176 | } 177 | else // had pressed 178 | { 179 | delay(200); 180 | if (FN_Pressed) 181 | { 182 | while (FN_Pressed)delay(1); 183 | if (FN == 2) 184 | { 185 | FN = 0; 186 | } 187 | else 188 | { 189 | LedMode = 5; 190 | FN = 2; 191 | } 192 | } 193 | else 194 | { 195 | FN = 0; 196 | } 197 | } 198 | } 199 | if (SYM_Pressed) 200 | { 201 | aA = 0; FN = 0; ALT = 0; 202 | while (SYM_Pressed)delay(1); //release key 203 | if (SYM == 0) //had not pressed 204 | { 205 | delay(200); //detect doblue click 206 | if (SYM_Pressed) 207 | { 208 | while (SYM_Pressed)delay(1); 209 | SYM = 2; 210 | LedMode = 6; 211 | } 212 | else 213 | { 214 | SYM = 1; 215 | LedMode = 7; 216 | } 217 | } 218 | else // had pressed 219 | { 220 | delay(200); 221 | if (SYM_Pressed) 222 | { 223 | while (SYM_Pressed)delay(1); 224 | if (SYM == 2) 225 | { 226 | SYM = 0; 227 | } 228 | else 229 | { 230 | LedMode = 6; 231 | SYM = 2; 232 | } 233 | } 234 | else 235 | { 236 | SYM = 0; 237 | } 238 | } 239 | } 240 | 241 | if (ENTER_Pressed) 242 | { 243 | while (ENTER_Pressed)delay(1); //ENTER 244 | return 29; 245 | } 246 | 247 | //normal key scan 248 | Set_Bit(PORTC, 1); 249 | Set_Bit(PORTC, 3); 250 | Clr_Bit(PORTC, 2); 251 | delay(2); 252 | switch (PIND) 253 | { 254 | case 0xfe: while (PIND != 0xff)delay(1); return 9; break; 255 | case 0xfd: while (PIND != 0xff)delay(1); return 8; break; 256 | case 0xfb: while (PIND != 0xff)delay(1); return 7; break; 257 | case 0xf7: while (PIND != 0xff)delay(1); return 6; break; 258 | case 0xef: while (PIND != 0xff)delay(1); return 5; break; 259 | case 0xdf: while (PIND != 0xff)delay(1); return 2; break; 260 | case 0xbf: while (PIND != 0xff)delay(1); return 3; break; 261 | case 0x7f: while (PIND != 0xff)delay(1); return 4; break; 262 | } 263 | switch (PINB & 0x03) 264 | { 265 | case 0x01: while ((PINB & 0x03) != 0x03)delay(1); return 0; break; 266 | case 0x02: while ((PINB & 0x03) != 0x03)delay(1); return 1; break; 267 | } 268 | Set_Bit(PORTC, 1); 269 | Set_Bit(PORTC, 2); 270 | Clr_Bit(PORTC, 3); 271 | delay(2); 272 | switch (PIND) 273 | { 274 | case 0xfe: while (PIND != 0xff)delay(1); return 19; break; 275 | case 0xfd: while (PIND != 0xff)delay(1); return 18; break; 276 | case 0xfb: while (PIND != 0xff)delay(1); return 17; break; 277 | case 0xf7: while (PIND != 0xff)delay(1); return 16; break; 278 | case 0xef: while (PIND != 0xff)delay(1); return 15; break; 279 | case 0xdf: while (PIND != 0xff)delay(1); return 12; break; 280 | case 0xbf: while (PIND != 0xff)delay(1); return 13; break; 281 | case 0x7f: while (PIND != 0xff)delay(1); return 14; break; 282 | } 283 | switch (PINB & 0x03) 284 | { 285 | case 0x01: while ((PINB & 0x03) != 0x03)delay(1); return 10; break; 286 | case 0x02: while ((PINB & 0x03) != 0x03)delay(1); return 11; break; 287 | } 288 | 289 | Set_Bit(PORTC, 2); 290 | Set_Bit(PORTC, 3); 291 | Clr_Bit(PORTC, 1); 292 | delay(2); 293 | switch (PIND) 294 | { 295 | case 0xfe: while (PIND != 0xff)delay(1); return 32; break; 296 | case 0xfd: while (PIND != 0xff)delay(1); return 28; break; 297 | case 0xfb: while (PIND != 0xff)delay(1); return 27; break; 298 | case 0xf7: while (PIND != 0xff)delay(1); return 26; break; 299 | case 0xef: while (PIND != 0xff)delay(1); return 25; break; 300 | case 0xdf: while (PIND != 0xff)delay(1); return 22; break; 301 | case 0xbf: while (PIND != 0xff)delay(1); return 23; break; 302 | case 0x7f: while (PIND != 0xff)delay(1); return 24; break; 303 | } 304 | switch (PINB & 0x03) 305 | { 306 | case 0x01: while ((PINB & 0x03) != 0x03)delay(1); return 31; break; 307 | case 0x02: while ((PINB & 0x03) != 0x03)delay(1); return 21; break; 308 | } 309 | 310 | return 255; 311 | 312 | } 313 | unsigned int idle = 0; 314 | unsigned char KeyMap[35][5] = 315 | { {'q', 'Q', '#', '~', 144}, 316 | {'w', 'W', '1', '^', 145}, 317 | {'e', 'E', '2', '&', 146}, 318 | {'r', 'R', '3', '`', 147}, 319 | {'t', 'T', '(', '<', 148}, 320 | {'y', 'Y', ')', '>', 149}, 321 | {'u', 'U', '_', '{', 150}, 322 | {'i', 'I', '-', '}', 151}, 323 | {'o', 'O', '+', '[', 152}, 324 | {'p', 'P', '@', ']', 153}, 325 | {'a', 'A', '*', '|', 154}, 326 | {'s', 'S', '4', '=', 155}, 327 | { 'd', 'D', '5', '\\', 156}, 328 | {'f', 'F', '6', '%', 157}, 329 | {'g', 'G', '/', 180, 158}, 330 | {'h', 'H', ':', 181, 159}, 331 | {'j', 'J', ';', 182, 160}, 332 | {'k', 'K', '\'', 183 , 161}, 333 | {'l', 'L', '"', 184, 162}, 334 | {8 , 8, 127, 8, 163}, //del & backspace 335 | {255, 255, 255, 185, 164}, //alt 336 | {'z', 'Z', '7', 186, 165}, 337 | {'x', 'X', '8', 187, 166}, 338 | {'c', 'C', '9', 188, 167}, 339 | {'v', 'V', '?', 189, 168}, 340 | {'b', 'B', '!', 190, 169}, 341 | {'n', 'N', ',', 191, 170}, 342 | {'m', 'M', '.', 192, 171}, 343 | {'$', '$', 255, 193, 172}, 344 | {13, 13, 13, 13, 173}, //enter 345 | {255, 255, 255, 255, 174}, //aA 346 | {'0', '0', '0', '0', 175}, 347 | {' ', ' ', ' ', ' ', 176}, 348 | {255, 255, 255, 255, 177}, 349 | {255, 255, 27, 255, 178} 350 | }; 351 | void loop() 352 | { 353 | idle++; 354 | unsigned char kk = GetInput(); 355 | if (aA == 0 && ALT == 0 && FN == 0 && SYM == 0) 356 | LedMode = 0; 357 | switch (LedMode) 358 | { 359 | case 0: LED_L_0; break; 360 | case 1: LED_L_1; break; 361 | case 2: 362 | if ((idle / 20) % 2 == 1) 363 | { 364 | LED_L_0; 365 | } else { 366 | LED_L_1; 367 | } break; 368 | case 3: 369 | if ((idle / 10) % 2 == 1) 370 | { 371 | LED_L_0; 372 | } 373 | else 374 | { 375 | LED_L_1; 376 | } break; 377 | case 4: LED_R_1; break; 378 | case 5: 379 | if ((idle / 20) % 2 == 1) 380 | { 381 | LED_R_0; 382 | } 383 | else 384 | { 385 | LED_R_1; 386 | } break; 387 | case 6: 388 | if ((idle / 10) % 2 == 1) 389 | { 390 | LED_R_0; 391 | } 392 | else 393 | { 394 | LED_R_1; 395 | } break; 396 | case 7: 397 | if ((idle / 30) % 2 == 1) 398 | { 399 | LED_L_1; 400 | } 401 | else 402 | { 403 | LED_R_1; 404 | } break; 405 | case 8: 406 | if ((idle / 20) % 2 == 1) 407 | { 408 | LED_L_1; 409 | } 410 | else 411 | { 412 | LED_R_1; 413 | } break; 414 | } 415 | if (kk == 29) 416 | { 417 | KEY = 0x0d; twoBytes = 1; KEY2 = 0x0a;//enter 418 | hadPressed = 1; IRQ_0; 419 | } 420 | else if (kk < 36) 421 | { 422 | if (ALT > 0) 423 | { 424 | KEY = KeyMap[kk][4]; 425 | } 426 | else 427 | { 428 | if (SYM > 0) 429 | { 430 | if (SYM == 1)SYM = 0; 431 | KEY = KeyMap[kk][2]; 432 | } 433 | else 434 | { 435 | if (FN > 0) 436 | { 437 | if (FN == 1)FN = 0; 438 | KEY = KeyMap[kk][3]; 439 | } 440 | else 441 | { 442 | if (aA > 0) 443 | { 444 | if (aA == 1) 445 | aA = 0; 446 | KEY = KeyMap[kk][1]; 447 | } 448 | else 449 | KEY = KeyMap[kk][0]; 450 | } 451 | } 452 | } 453 | hadPressed = 1; 454 | IRQ_0; 455 | } 456 | } 457 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FACES 2 | 3 | This repository is about the firmwares of FACES Keyboards(*QWERTY, GameBoy, Calculator*). 4 | 5 | They communicate with M5Core through I2C(*I2C address is 0x08*). You can program FACES through MicroPython or Arduino. 6 | -------------------------------------------------------------------------------- /m5stack-micropython-tft-repl-v1.0.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/m5stack/FACES-Firmware/7c3f0d7deee7e83422a031a62bc84509986dece6/m5stack-micropython-tft-repl-v1.0.bin --------------------------------------------------------------------------------