aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboards/clueboard/2x1800/2021/.noci0
-rw-r--r--keyboards/clueboard/2x1800/2021/2021.c154
-rw-r--r--keyboards/clueboard/2x1800/2021/2021.h18
-rw-r--r--keyboards/clueboard/2x1800/2021/config.h96
-rw-r--r--keyboards/clueboard/2x1800/2021/font.h156
-rw-r--r--keyboards/clueboard/2x1800/2021/info.json425
-rw-r--r--keyboards/clueboard/2x1800/2021/keymaps/default/keymap.json18
-rw-r--r--keyboards/clueboard/2x1800/2021/keymaps/default_4u/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/2021/keymaps/default_4u/readme.md1
-rw-r--r--keyboards/clueboard/2x1800/2021/keymaps/default_7u/keymap.c49
-rw-r--r--keyboards/clueboard/2x1800/2021/keymaps/default_7u/readme.md1
-rw-r--r--keyboards/clueboard/2x1800/2021/keymaps/signboard/config.h20
-rw-r--r--keyboards/clueboard/2x1800/2021/keymaps/signboard/keymap.c50
-rw-r--r--keyboards/clueboard/2x1800/2021/keymaps/signboard/readme.md1
-rw-r--r--keyboards/clueboard/2x1800/2021/max7219.c318
-rw-r--r--keyboards/clueboard/2x1800/2021/max7219.h87
-rw-r--r--keyboards/clueboard/2x1800/2021/readme.md17
-rw-r--r--keyboards/clueboard/2x1800/2021/rules.mk1
18 files changed, 1440 insertions, 0 deletions
diff --git a/keyboards/clueboard/2x1800/2021/.noci b/keyboards/clueboard/2x1800/2021/.noci
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/.noci
diff --git a/keyboards/clueboard/2x1800/2021/2021.c b/keyboards/clueboard/2x1800/2021/2021.c
new file mode 100644
index 000000000..40f2a2ed6
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/2021.c
@@ -0,0 +1,154 @@
1/* Copyright 2017 Zach White <skullydazed@gmail.com>
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include "2021.h"
18#include "max7219.h"
19#include "font.h"
20
21#ifndef DRAWING_TOY_MODE
22static uint16_t led_frame_timer = 0;
23
24void matrix_scan_kb(void) {
25 if (timer_elapsed(led_frame_timer) > 100) {
26 max7219_message_sign_task(true);
27 led_frame_timer = timer_read();
28 }
29}
30#endif
31
32void matrix_init_kb(void) {
33 max7219_init();
34
35#if defined(MAX7219_LED_TEST)
36 while(1) {
37 for (int i=0; i<MAX7219_CONTROLLERS; i++) {
38 max7219_display_test(i, true);
39 wait_ms(500);
40 max7219_display_test(i, false);
41 }
42 }
43#elif defined(MAX7219_LED_ITERATE)
44 while (1) {
45 for (int row=0; row<8; row++) {
46 for(int col=0;col<8*MAX7219_CONTROLLERS;col++) {
47 max7219_set_led(row, col, true);
48 wait_ms(500);
49 max7219_set_led(row, col, false);
50 }
51 }
52 }
53#elif defined(MAX7219_LED_DANCE)
54 while (1) {
55 for (int col=0; col<8; col++) {
56 for (int device_num=0; device_num<MAX7219_CONTROLLERS; device_num++) {
57 if (col % 2 == 0) {
58 max7219_led_a[col][device_num] = 0b01010101;
59 } else {
60 max7219_led_a[col][device_num] = 0b10101010;
61 }
62 }
63 }
64 max7219_write_frame();
65 wait_ms(500);
66 for (int col=0; col<8; col++) {
67 for (int device_num=0; device_num<MAX7219_CONTROLLERS; device_num++) {
68 if (col % 2 == 0) {
69 max7219_led_a[col][device_num] = 0b10101010;
70 } else {
71 max7219_led_a[col][device_num] = 0b01010101;
72 }
73 }
74 }
75 max7219_write_frame();
76 wait_ms(500);
77 }
78#elif defined(MAX7219_LED_FONTTEST)
79 uint8_t message[MSG_FONTTEST_LEN][6] = MSG_FONTTEST;
80 max7219_message_sign(message, MSG_FONTTEST_LEN);
81#elif defined(MAX7219_LED_CLUEBOARD)
82 uint8_t message[MSG_CLUEBOARD_LEN][6] = MSG_CLUEBOARD;
83 max7219_message_sign(message, MSG_CLUEBOARD_LEN);
84#elif defined(MAX7219_LED_KONAMI)
85 uint8_t message[MSG_KONAMI_LEN][6] = MSG_KONAMI;
86 max7219_message_sign(message, MSG_KONAMI_LEN);
87#elif defined(MAX7219_LED_QMK_POWERED)
88 uint8_t message[MSG_QMK_POWERED_LEN][6] = MSG_QMK_POWERED;
89 max7219_message_sign(message, MSG_QMK_POWERED_LEN);
90#elif defined(DRAWING_TOY_MODE)
91 max7219_set_led(0, 0, true);
92#endif
93}
94
95__attribute__ ((weak))
96bool encoder_update_keymap(int8_t index, bool clockwise) {
97 return false;
98}
99
100#define NUM_COLUMNS 8*MAX7219_CONTROLLERS
101uint8_t led_position[2] = {0,0}; // The location of the cursor in the matrix
102
103bool encoder_update_kb(uint8_t index, bool clockwise) {
104 if (!encoder_update_keymap(index, clockwise)) {
105#if defined(DRAWING_TOY_MODE)
106 // Encoder 1, left
107 if (index == 0 && clockwise) {
108 if (led_position[0] < NUM_COLUMNS-1) { // turned right
109 led_position[0]++;
110 } else {
111 led_position[0]=0;
112 }
113 } else if (index == 0) {
114 if (led_position[0] > 0) { // turned left
115 led_position[0]--;
116 } else {
117 led_position[0]=NUM_COLUMNS-1;
118 }
119 }
120
121 // Encoder 2, right
122 else if (index == 1 && clockwise) {
123 if (led_position[1] < 7) { // turned right
124 led_position[1]++;
125 } else {
126 led_position[1]=0;
127 }
128 } else if (index == 1) {
129 if (led_position[1] > 0) { // turned left
130 led_position[1]--;
131 } else {
132 led_position[1]=7;
133 }
134 }
135
136 max7219_set_led(led_position[1], led_position[0], true);
137#else
138 // Encoder 1, left
139 if (index == 0 && clockwise) {
140 tap_code(KC_MS_R); // turned right
141 } else if (index == 0) {
142 tap_code(KC_MS_L); // turned left
143 }
144
145 // Encoder 2, right
146 else if (index == 1 && clockwise) {
147 tap_code(KC_MS_U); // turned right
148 } else if (index == 1) {
149 tap_code(KC_MS_D); // turned left
150 }
151#endif
152 }
153 return true;
154}
diff --git a/keyboards/clueboard/2x1800/2021/2021.h b/keyboards/clueboard/2x1800/2021/2021.h
new file mode 100644
index 000000000..ecb9e00c4
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/2021.h
@@ -0,0 +1,18 @@
1/* Copyright 2017 Zach White <skullydazed@gmail.com>
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#pragma once
17
18#include "quantum.h"
diff --git a/keyboards/clueboard/2x1800/2021/config.h b/keyboards/clueboard/2x1800/2021/config.h
new file mode 100644
index 000000000..eccede6a4
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/config.h
@@ -0,0 +1,96 @@
1/*
2Copyright 2017 Zach White <skullydazed@clueboard.co>
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18#pragma once
19
20#include "config_common.h"
21
22/* audio support */
23#define AUDIO_PIN_ALT B7
24#define AUDIO_PIN C4
25#define AUDIO_CLICKY
26
27/*
28 * Encoder Assignments
29 */
30#define ENCODERS_PAD_A { D0, C5 }
31#define ENCODERS_PAD_B { D1, C6 }
32#define ENCODER_RESOLUTION 4
33
34/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
35#define LOCKING_SUPPORT_ENABLE
36
37/* Locking resynchronize hack */
38#define LOCKING_RESYNC_ENABLE
39
40// Configure our MAX7219's
41//#define MAX7219_LOAD B0
42//#define MAX7219_CONTROLLERS 4
43//#define MAX7219_LED_INTENSITY 1 // Max: 15
44
45// Define this to disable the startup test
46//#define MAX7219_NO_STARTUP_TEST
47
48/* This controls the speed of the sign, lower is faster. This is the minimal
49 * time between animation frames, in ms. Actual time between frames will
50 * always be slightly longer due to other keyboard tasks.
51 */
52//#define MAX7219_SCROLL_TIME 100
53
54/* This setting controls how big the scrollable area for your message sign
55 * is. If you set it to 0 your display will not work. If you set it to 1
56 * you will have no buffer area, and you will only be able to display a
57 * total of 6 characters. Every number after that increases the buffer area
58 * by 32 columns.
59 *
60 * You can calculate how big to make this for the number of characters you
61 * want to display:
62 *
63 * <number of characters in message> * 6 / 32 + 1
64 *
65 * You do not need to tune this unless you are trying to save ram.
66 */
67//#define MAX7219_BUFFER_MULTIPLIER 24
68
69// You can only define one of these at a time:
70
71// Define this to test all LEDs. Keyboard functions will not work.
72//#define MAX7219_LED_TEST
73
74// Define this to iterate through LEDs 1 by 1. Keyboard functions will not work.
75//#define MAX7219_LED_ITERATE
76
77// Define this to show a simple animation. Keyboard functions will not work.
78//#define MAX7219_LED_DANCE
79
80// Define this to show all the characters available
81//#define MAX7219_LED_FONTTEST
82
83// Define this to show Clueboard on the sign
84//#define MAX7219_LED_CLUEBOARD
85
86// Define this to show the Konami code on the sign
87//#define MAX7219_LED_KONAMI
88
89// Define this to show QMK on the sign
90//#define MAX7219_LED_QMK_POWERED
91
92// Define this to treat the message board like an etch-a-sketch
93//#define DRAWING_TOY_MODE
94
95// Define this if you don't want any of the above
96//#define MAX7219_LED_CUSTOM
diff --git a/keyboards/clueboard/2x1800/2021/font.h b/keyboards/clueboard/2x1800/2021/font.h
new file mode 100644
index 000000000..5ddcbfba5
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/font.h
@@ -0,0 +1,156 @@
1/* 5x8 Font for Clueboard 2x1800.
2 *
3 * Copyright (c) 2021 Zach White <skullydazed@gmail.com>
4 *
5 * Permission is hereby granted, free of charge, to any person
6 * obtaining a copy of this software and associated documentation
7 * files (the "Software"), to deal in the Software without
8 * restriction, including without limitation the rights to use,
9 * copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following
12 * conditions:
13 *
14 * This permission notice shall be included in all copies or
15 * substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 * OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27// Top row of keyboard, when shift held
28#define CHR_TILDE {0b00110000, 0b01000000, 0b00110000, 0b00001000, 0b00110000, 0b00000000}
29#define CHR_BANG {0b00000000, 0b00000000, 0b11111010, 0b10000000, 0b00000000, 0b00000000}
30#define CHR_AT {0b01001100, 0b10010010, 0b10011110, 0b10000010, 0b01111100, 0b00000000}
31#define CHR_POUND {0b00101000, 0b11111110, 0b00101000, 0b11111110, 0b00101000, 0b00000000}
32#define CHR_DOLLAR {0b00100100, 0b01010100, 0b11111110, 0b10101010, 0b01001000, 0b00000000}
33#define CHR_PERCENT {0b11000010, 0b11000100, 0b00010000, 0b00100110, 0b01000110, 0b00000000}
34#define CHR_CARET {0b00100000, 0b01000000, 0b10000000, 0b01000000, 0b00100000, 0b00000000}
35#define CHR_AMPERSAND {0b01101100, 0b10010010, 0b10101010, 0b01000100, 0b00001010, 0b00000000}
36#define CHR_ASTERISK {0b00101000, 0b00010000, 0b01111100, 0b00010000, 0b00101000, 0b00000000}
37#define CHR_LPAREN {0b00000000, 0b00111000, 0b01000100, 0b10000010, 0b00000000, 0b00000000}
38#define CHR_RPAREN {0b00000000, 0b10000010, 0b01000100, 0b00111000, 0b00000000, 0b00000000}
39#define CHR_UNDERSCORE {0b00000010, 0b00000010, 0b00000010, 0b00000010, 0b00000010, 0b00000000}
40#define CHR_PLUS {0b00010000, 0b00010000, 0b01111100, 0b00010000, 0b00010000, 0b00000000}
41
42// Top row of keyboard, without shift
43#define CHR_BACKTICK {0b00000000, 0b11000000, 0b01100000, 0b10000000, 0b00000000, 0b00000000}
44#define CHR_1 {0b00100000, 0b01000010, 0b11111110, 0b00000010, 0b00000010, 0b00000000}
45#define CHR_2 {0b01000010, 0b10000110, 0b10001010, 0b10010010, 0b01100010, 0b00000000}
46#define CHR_3 {0b10000100, 0b10000010, 0b10100010, 0b11010010, 0b10001100, 0b00000000}
47#define CHR_4 {0b00011000, 0b00101000, 0b01001000, 0b11111110, 0b00001000, 0b00000000}
48#define CHR_5 {0b11100100, 0b10100010, 0b10100010, 0b10100010, 0b10011100, 0b00000000}
49#define CHR_6 {0b00111100, 0b01010010, 0b10010010, 0b10010010, 0b00001100, 0b00000000}
50#define CHR_7 {0b11000000, 0b10001110, 0b10010000, 0b10100000, 0b11000000, 0b00000000}
51#define CHR_8 {0b01101100, 0b10010010, 0b10010010, 0b10010010, 0b01101100, 0b00000000}
52#define CHR_9 {0b01100000, 0b10010010, 0b10010010, 0b10010010, 0b01111000, 0b00000000}
53#define CHR_0 {0b01111100, 0b10001010, 0b10010010, 0b10100010, 0b01111100, 0b00000000}
54#define CHR_DASH {0b00000000, 0b00010000, 0b00010000, 0b00010000, 0b00000000, 0b00000000}
55#define CHR_EQUAL {0b00000000, 0b00101000, 0b00101000, 0b00101000, 0b00000000, 0b00000000}
56
57// Letters
58#define CHR_A {0b01111110, 0b10001000, 0b10001000, 0b10001000, 0b01111110, 0b00000000}
59#define CHR_B {0b11111110, 0b10010010, 0b10010010, 0b10010010, 0b01101100, 0b00000000}
60#define CHR_C {0b01111100, 0b10000010, 0b10000010, 0b10000010, 0b01000100, 0b00000000}
61#define CHR_D {0b11111110, 0b10000010, 0b10000010, 0b10000010, 0b01111100, 0b00000000}
62#define CHR_E {0b11111110, 0b10010010, 0b10010010, 0b10010010, 0b10000010, 0b00000000}
63#define CHR_F {0b11111110, 0b10010000, 0b10010000, 0b10010000, 0b10000000, 0b00000000}
64#define CHR_G {0b01111100, 0b10000010, 0b10010010, 0b10010010, 0b01011100, 0b00000000}
65#define CHR_H {0b11111110, 0b00010000, 0b00010000, 0b00010000, 0b11111110, 0b00000000}
66#define CHR_I {0b00000000, 0b10000010, 0b11111110, 0b10000010, 0b00000000, 0b00000000}
67#define CHR_J {0b00000100, 0b00000010, 0b10000010, 0b11111100, 0b10000000, 0b00000000}
68#define CHR_K {0b11111110, 0b00010000, 0b00101000, 0b01000100, 0b10000010, 0b00000000}
69#define CHR_L {0b00000000, 0b11111110, 0b00000010, 0b00000010, 0b00000010, 0b00000000}
70#define CHR_M {0b11111110, 0b01000000, 0b00110000, 0b01000000, 0b11111110, 0b00000000}
71#define CHR_N {0b11111110, 0b01100000, 0b00010000, 0b00001100, 0b11111110, 0b00000000}
72#define CHR_O {0b01111100, 0b10000010, 0b10000010, 0b10000010, 0b01111100, 0b00000000}
73#define CHR_P {0b11111110, 0b10010000, 0b10010000, 0b10010000, 0b01100000, 0b00000000}
74#define CHR_Q {0b01111100, 0b10000010, 0b10001010, 0b10000100, 0b01111010, 0b00000000}
75#define CHR_R {0b11111110, 0b10010000, 0b10011000, 0b10010100, 0b01100010, 0b00000000}
76#define CHR_S {0b01100100, 0b10010010, 0b10010010, 0b10010010, 0b01001100, 0b00000000}
77#define CHR_T {0b10000000, 0b10000000, 0b11111110, 0b10000000, 0b10000000, 0b00000000}
78#define CHR_U {0b11111100, 0b00000010, 0b00000010, 0b00000010, 0b11111100, 0b00000000}
79#define CHR_V {0b11111000, 0b00000100, 0b00000010, 0b00000100, 0b11111000, 0b00000000}
80#define CHR_W {0b11111100, 0b00000010, 0b00011100, 0b00000010, 0b11111110, 0b00000000}
81#define CHR_X {0b11000110, 0b00101000, 0b00010000, 0b00101000, 0b11000110, 0b00000000}
82#define CHR_Y {0b11100000, 0b00010000, 0b00001110, 0b00010000, 0b11100000, 0b00000000}
83#define CHR_Z {0b10000110, 0b10001010, 0b10010010, 0b10100010, 0b11000010, 0b00000000}
84
85#define CHR_a {0b00000100, 0b00101010, 0b00101010, 0b00101010, 0b00011110, 0b00000000}
86#define CHR_b {0b11111110, 0b00010010, 0b00100010, 0b00100010, 0b00011100, 0b00000000}
87#define CHR_c {0b00011100, 0b00100010, 0b00100010, 0b00100010, 0b00000100, 0b00000000}
88#define CHR_d {0b00011100, 0b00100010, 0b00100010, 0b00010010, 0b11111110, 0b00000000}
89#define CHR_e {0b00011100, 0b00101010, 0b00101010, 0b00101010, 0b00011000, 0b00000000}
90#define CHR_f {0b00000000, 0b00010000, 0b01111110, 0b10010000, 0b10000000, 0b01000000}
91#define CHR_g {0b00011000, 0b00100101, 0b00100101, 0b00100101, 0b00111110, 0b00000000}
92#define CHR_h {0b11111110, 0b00010000, 0b00100000, 0b00100000, 0b00011110, 0b00000000}
93#define CHR_i {0b00000000, 0b00010010, 0b10111110, 0b00000010, 0b00000000, 0b00000000}
94#define CHR_j {0b00000100, 0b00000010, 0b00100010, 0b10111100, 0b00000000, 0b00000000}
95#define CHR_k {0b11111110, 0b00001000, 0b00010100, 0b00100010, 0b00000000, 0b00000000}
96#define CHR_l {0b00000000, 0b10000010, 0b11111110, 0b00000010, 0b00000000, 0b00000000}
97#define CHR_m {0b00111110, 0b00100000, 0b00111110, 0b00100000, 0b00111110, 0b00000000}
98#define CHR_n {0b00111110, 0b00010000, 0b00100000, 0b00100000, 0b00011110, 0b00000000}
99#define CHR_o {0b00011100, 0b00100010, 0b00100010, 0b00100010, 0b00011100, 0b00000000}
100#define CHR_p {0b00111111, 0b00100100, 0b00100100, 0b00100100, 0b00011000, 0b00000000}
101#define CHR_q {0b00011000, 0b00100100, 0b00100100, 0b00011000, 0b00111111, 0b00000000}
102#define CHR_r {0b00111110, 0b00010000, 0b00100000, 0b00100000, 0b00010000, 0b00000000}
103#define CHR_s {0b00010010, 0b00101010, 0b00101010, 0b00101010, 0b00000100, 0b00000000}
104#define CHR_t {0b00100000, 0b11111100, 0b00100010, 0b00000010, 0b00000100, 0b00000000}
105#define CHR_u {0b00111100, 0b00000010, 0b00000010, 0b00000100, 0b00111110, 0b00000000}
106#define CHR_v {0b00111000, 0b00000100, 0b00000010, 0b00000100, 0b00111000, 0b00000000}
107#define CHR_w {0b00111100, 0b00000010, 0b00111100, 0b00000010, 0b00111100, 0b00000000}
108#define CHR_x {0b00100010, 0b00010100, 0b00001000, 0b00010100, 0b00100010, 0b00000000}
109#define CHR_y {0b00111000, 0b00000101, 0b00000101, 0b00000101, 0b00111110, 0b00000000}
110#define CHR_z {0b00100010, 0b00100110, 0b00101010, 0b00110010, 0b00100010, 0b00000000}
111
112// Punctuation
113#define CHR_LCURLY {0b00000000, 0b00010000, 0b01101100, 0b10000010, 0b00000000, 0b00000000}
114#define CHR_RCURLY {0b00000000, 0b10000010, 0b01101100, 0b00010000, 0b00000000, 0b00000000}
115#define CHR_PIPE {0b00000000, 0b00000000, 0b11101110, 0b00000000, 0b00000000, 0b00000000}
116#define CHR_COLON {0b00000000, 0b00000000, 0b01101100, 0b01101100, 0b00000000, 0b00000000}
117#define CHR_QUOTE {0b00000000, 0b01110000, 0b00000000, 0b01110000, 0b00000000, 0b00000000}
118#define CHR_LESSTHAN {0b00010000, 0b00101000, 0b01000100, 0b10000010, 0b00000000, 0b00000000}
119#define CHR_GREATERTHAN {0b10000010, 0b01000100, 0b00101000, 0b00010000, 0b00000000, 0b00000000}
120#define CHR_QUESTIONMARK {0b01000000, 0b10000000, 0b10001010, 0b10010000, 0b01100000, 0b00000000}
121#define CHR_INTERROBANG {0b01100000, 0b10000000, 0b11101010, 0b10010000, 0b01100000, 0b00000000}
122#define CHR_LBRACKET {0b00000000, 0b11111110, 0b10000010, 0b10000010, 0b00000000, 0b00000000}
123#define CHR_RBRACKET {0b00000000, 0b10000010, 0b10000010, 0b11111110, 0b00000000, 0b00000000}
124#define CHR_BACKSLASH {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100, 0b00000000}
125#define CHR_SEMICOLON {0b00000000, 0b00000000, 0b01101010, 0b01101100, 0b00000000, 0b00000000}
126#define CHR_APOSTROPHE {0b00000000, 0b00000000, 0b01110000, 0b00000000, 0b00000000, 0b00000000}
127#define CHR_COMMA {0b00000000, 0b00000000, 0b00001010, 0b00001100, 0b00000000, 0b00000000}
128#define CHR_PERIOD {0b00000000, 0b00000000, 0b00000110, 0b00000110, 0b00000000, 0b00000000}
129#define CHR_SLASH {0b00000100, 0b00001000, 0b00010000, 0b00100000, 0b01000000, 0b00000000}
130#define CHR_SPACE {0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000}
131#define CHR_DEGREES {0b11000000, 0b11000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000}
132
133// Graphics
134#define CHR_CENT {0b00111000, 0b01000100, 0b11111110, 0b01000100, 0b00101000, 0b00000000}
135#define CHR_DEGREES_C {0b11000000, 0b11001100, 0b00010010, 0b00010010, 0b00000000, 0b00000000}
136#define CHR_DEGREES_F {0b11000000, 0b11011110, 0b00010100, 0b00010000, 0b00000000, 0b00000000}
137#define CHR_DIVISION {0b00010000, 0b00010000, 0b01010100, 0b00010000, 0b00010000, 0b00000000}
138#define CHR_LEFT_ARROW {0b00010000, 0b00111000, 0b01010100, 0b00010000, 0b00010000, 0b00000000}
139#define CHR_RIGHT_ARROW {0b00010000, 0b00010000, 0b01010100, 0b00111000, 0b00010000, 0b00000000}
140#define CHR_UP_ARROW {0b00010000, 0b00100000, 0b01111110, 0b00100000, 0b00010000, 0b00000000}
141#define CHR_DOWN_ARROW {0b00001000, 0b00000100, 0b01111110, 0b00000100, 0b00001000, 0b00000000}
142#define CHR_PI {0b00100010, 0b00111100, 0b00100000, 0b00111110, 0b00100010, 0b00000000}
143#define CHR_PSI {0b01111000, 0b00001000, 0b01111110, 0b00001000, 0b01111000, 0b00000000}
144
145// Predefined messages
146#define MSG_FONTTEST {CHR_TILDE, CHR_BANG, CHR_AT, CHR_POUND, CHR_PERCENT, CHR_CARET, CHR_AMPERSAND, CHR_LPAREN, CHR_RPAREN, CHR_UNDERSCORE, CHR_PLUS, CHR_BACKTICK, CHR_1, CHR_2, CHR_3, CHR_4, CHR_5, CHR_6, CHR_7, CHR_8, CHR_9, CHR_0, CHR_DASH, CHR_EQUAL, CHR_A, CHR_B, CHR_C, CHR_D, CHR_E, CHR_F, CHR_G, CHR_H, CHR_I, CHR_J, CHR_K, CHR_L, CHR_M, CHR_N, CHR_O, CHR_P, CHR_Q, CHR_R, CHR_S, CHR_T, CHR_U, CHR_V, CHR_W, CHR_X, CHR_Y, CHR_Z, CHR_a, CHR_b, CHR_c, CHR_d, CHR_e, CHR_f, CHR_g, CHR_h, CHR_i, CHR_j, CHR_k, CHR_l, CHR_m, CHR_n, CHR_o, CHR_p, CHR_q, CHR_r, CHR_s, CHR_t, CHR_u, CHR_v, CHR_w, CHR_x, CHR_y, CHR_z, CHR_LCURLY, CHR_RCURLY, CHR_PIPE, CHR_COLON, CHR_QUOTE, CHR_LESSTHAN, CHR_GREATERTHAN, CHR_QUESTIONMARK, CHR_INTERROBANG, CHR_LBRACKET, CHR_RBRACKET, CHR_BACKSLASH, CHR_SEMICOLON, CHR_APOSTROPHE, CHR_COMMA, CHR_PERIOD, CHR_SLASH, CHR_CENT, CHR_DEGREES, CHR_DEGREES_C, CHR_DEGREES_F, CHR_DIVISION, CHR_LEFT_ARROW, CHR_RIGHT_ARROW, CHR_UP_ARROW, CHR_DOWN_ARROW, CHR_PI, CHR_PSI}
147#define MSG_FONTTEST_LEN 104
148
149#define MSG_CLUEBOARD {CHR_INTERROBANG, CHR_C, CHR_l, CHR_u, CHR_e, CHR_b, CHR_o, CHR_a, CHR_r, CHR_d}
150#define MSG_CLUEBOARD_LEN 10
151
152#define MSG_KONAMI {CHR_UP_ARROW, CHR_SPACE, CHR_UP_ARROW, CHR_SPACE, CHR_DOWN_ARROW, CHR_SPACE, CHR_DOWN_ARROW, CHR_SPACE, CHR_LEFT_ARROW, CHR_SPACE, CHR_RIGHT_ARROW, CHR_SPACE, CHR_LEFT_ARROW, CHR_SPACE, CHR_RIGHT_ARROW, CHR_SPACE, CHR_B, CHR_SPACE, CHR_A, CHR_SPACE, CHR_LESSTHAN, CHR_S, CHR_E, CHR_L, CHR_E, CHR_C, CHR_T, CHR_GREATERTHAN, CHR_SPACE, CHR_LESSTHAN, CHR_S, CHR_T, CHR_A, CHR_R, CHR_T, CHR_GREATERTHAN}
153#define MSG_KONAMI_LEN 36
154
155#define MSG_QMK_POWERED {CHR_PSI, CHR_P, CHR_o, CHR_w, CHR_e, CHR_r, CHR_e, CHR_d, CHR_SPACE, CHR_b, CHR_y, CHR_SPACE, CHR_Q, CHR_M, CHR_K}
156#define MSG_QMK_POWERED_LEN 15
diff --git a/keyboards/clueboard/2x1800/2021/info.json b/keyboards/clueboard/2x1800/2021/info.json
new file mode 100644
index 000000000..460be68cb
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/info.json
@@ -0,0 +1,425 @@
1{
2 "manufacturer": "Clueboard",
3 "keyboard_name": "Clueboard 2x1800 2021",
4 "maintainer": "skullydazed",
5 "height": 6.5,
6 "width": 24,
7 "bootloader": "halfkay",
8 "debounce": 5,
9 "diode_direction": "ROW2COL",
10 "features": {
11 "audio": true,
12 "bootmagic": false,
13 "console": true,
14 "encoder": true,
15 "extrakey": true,
16 "mousekey": true,
17 "nkro": true
18 },
19 "indicators": {
20 "caps_lock": "B5",
21 "num_lock": "B4",
22 "scroll_lock": "B6"
23 },
24 "matrix_pins": {
25 "cols": ["D2", "D3", "D4", "D5", "D7", "E0", "E1", "F0", "E6", "A0", "E7"],
26 "rows": ["C0", "C1", "C2", "C3", "C7", "F7", "F1", "F2", "F3", "F4", "F5", "F6"]
27 },
28 "processor": "at90usb1286",
29 "usb": {
30 "pid": "0x23A0"
31 },
32 "layout_aliases": {
33 "KEYMAP": "LAYOUT_all",
34 "LAYOUT": "LAYOUT_all"
35 },
36 "layouts": {
37 "LAYOUT_4u_space": {
38 "key_count": 124,
39 "layout": [
40 { "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
41 { "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
42 { "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
43 { "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
44 { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 0 },
45 { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 0 },
46 { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 0 },
47 { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 0 },
48 { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 0 },
49 { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 0 },
50 { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 0 },
51 { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 0 },
52 { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 0 },
53 { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 0 },
54 { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 0 },
55 { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 0 },
56 { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 0 },
57 { "matrix": [6, 7], "w": 1, "x": 20, "y": 0 },
58 { "matrix": [6, 8], "w": 1, "x": 21, "y": 0 },
59 { "matrix": [6, 9], "w": 1, "x": 22, "y": 0 },
60 { "matrix": [6, 10], "w": 1, "x": 23, "y": 0 },
61 { "matrix": [1, 0], "w": 1, "x": 0, "y": 1.25 },
62 { "matrix": [1, 1], "w": 1, "x": 1, "y": 1.25 },
63 { "matrix": [1, 2], "w": 1, "x": 2, "y": 1.25 },
64 { "matrix": [1, 3], "w": 1, "x": 3, "y": 1.25 },
65 { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1.25 },
66 { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1.25 },
67 { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1.25 },
68 { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1.25 },
69 { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1.25 },
70 { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1.25 },
71 { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1.25 },
72 { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 1.25 },
73 { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 1.25 },
74 { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 1.25 },
75 { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 1.25 },
76 { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 1.25 },
77 { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 1.25 },
78 { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 1.25 },
79 { "matrix": [7, 7], "w": 1, "x": 20, "y": 1.25 },
80 { "matrix": [7, 8], "w": 1, "x": 21, "y": 1.25 },
81 { "matrix": [7, 9], "w": 1, "x": 22, "y": 1.25 },
82 { "matrix": [7, 10], "w": 1, "x": 23, "y": 1.25 },
83 { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 2.25 },
84 { "matrix": [2, 1], "w": 1, "x": 1, "y": 2.25 },
85 { "matrix": [2, 2], "w": 1, "x": 2, "y": 2.25 },
86 { "matrix": [2, 3], "w": 1, "x": 3, "y": 2.25 },
87 { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 2.25 },
88 { "matrix": [2, 5], "w": 1, "x": 6, "y": 2.25 },
89 { "matrix": [2, 6], "w": 1, "x": 7, "y": 2.25 },
90 { "matrix": [2, 7], "w": 1, "x": 8, "y": 2.25 },
91 { "matrix": [2, 8], "w": 1, "x": 9, "y": 2.25 },
92 { "matrix": [2, 9], "w": 1, "x": 10, "y": 2.25 },
93 { "matrix": [2, 10], "w": 1, "x": 11, "y": 2.25 },
94 { "matrix": [8, 0], "w": 1, "x": 12, "y": 2.25 },
95 { "matrix": [8, 1], "w": 1, "x": 13, "y": 2.25 },
96 { "matrix": [8, 2], "w": 1, "x": 14, "y": 2.25 },
97 { "matrix": [8, 3], "w": 1, "x": 15, "y": 2.25 },
98 { "matrix": [8, 4], "w": 1, "x": 16, "y": 2.25 },
99 { "matrix": [8, 5], "w": 1, "x": 17, "y": 2.25 },
100 { "matrix": [8, 6], "w": 1.5, "x": 18, "y": 2.25 },
101 { "matrix": [8, 7], "w": 1, "x": 20, "y": 2.25 },
102 { "matrix": [8, 8], "w": 1, "x": 21, "y": 2.25 },
103 { "matrix": [8, 9], "w": 1, "x": 22, "y": 2.25 },
104 { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 2.25 },
105 { "matrix": [3, 1], "w": 1, "x": 1, "y": 3.25 },
106 { "matrix": [3, 2], "w": 1, "x": 2, "y": 3.25 },
107 { "matrix": [3, 3], "w": 1, "x": 3, "y": 3.25 },
108 { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 3.25 },
109 { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 3.25 },
110 { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 3.25 },
111 { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 3.25 },
112 { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 3.25 },
113 { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 3.25 },
114 { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 3.25 },
115 { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 3.25 },
116 { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 3.25 },
117 { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 3.25 },
118 { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 3.25 },
119 { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 3.25 },
120 { "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 3.25 },
121 { "matrix": [9, 7], "w": 1, "x": 20, "y": 3.25 },
122 { "matrix": [9, 8], "w": 1, "x": 21, "y": 3.25 },
123 { "matrix": [9, 9], "w": 1, "x": 22, "y": 3.25 },
124 { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 4.25 },
125 { "matrix": [4, 1], "w": 1, "x": 1, "y": 4.25 },
126 { "matrix": [4, 2], "w": 1, "x": 2, "y": 4.25 },
127 { "matrix": [4, 3], "w": 1, "x": 3, "y": 4.25 },
128 { "matrix": [4, 4], "w": 1.25, "x": 5.5, "y": 4.25 },
129 { "matrix": [4, 5], "w": 1, "x": 6.75, "y": 4.25 },
130 { "matrix": [4, 6], "w": 1, "x": 7.75, "y": 4.25 },
131 { "matrix": [4, 7], "w": 1, "x": 8.75, "y": 4.25 },
132 { "matrix": [4, 8], "w": 1, "x": 9.75, "y": 4.25 },
133 { "matrix": [4, 9], "w": 1, "x": 10.75, "y": 4.25 },
134 { "matrix": [4, 10], "w": 1, "x": 11.75, "y": 4.25 },
135 { "matrix": [10, 0], "w": 1, "x": 12.75, "y": 4.25 },
136 { "matrix": [10, 1], "w": 1, "x": 13.75, "y": 4.25 },
137 { "matrix": [10, 2], "w": 1, "x": 14.75, "y": 4.25 },
138 { "matrix": [10, 3], "w": 1, "x": 15.75, "y": 4.25 },
139 { "matrix": [10, 4], "w": 1.75, "x": 16.75, "y": 4.25 },
140 { "matrix": [10, 5], "w": 1, "x": 20, "y": 4.25 },
141 { "matrix": [9, 6], "w": 1, "x": 21, "y": 4.25 },
142 { "matrix": [10, 7], "w": 1, "x": 22, "y": 4.25 },
143 { "h": 2, "matrix": [10, 8], "w": 1, "x": 23, "y": 4.25 },
144 { "matrix": [10, 9], "w": 1, "x": 4.25, "y": 4.5 },
145 { "matrix": [10, 10], "w": 1, "x": 18.75, "y": 4.5 },
146 { "matrix": [5, 1], "w": 1, "x": 1, "y": 5.25 },
147 { "matrix": [5, 2], "w": 1, "x": 2, "y": 5.25 },
148 { "matrix": [5, 3], "w": 1, "x": 6.5, "y": 5.25 },
149 { "matrix": [5, 4], "w": 1, "x": 7.5, "y": 5.25 },
150 { "matrix": [5, 5], "w": 1, "x": 8.5, "y": 5.25 },
151 { "matrix": [5, 6], "w": 4, "x": 9.5, "y": 5.25 },
152 { "matrix": [5, 7], "w": 1, "x": 13.5, "y": 5.25 },
153 { "matrix": [5, 8], "w": 1, "x": 14.5, "y": 5.25 },
154 { "matrix": [11, 0], "w": 1, "x": 15.5, "y": 5.25 },
155 { "matrix": [11, 2], "w": 1, "x": 16.5, "y": 5.25 },
156 { "matrix": [11, 3], "w": 1, "x": 21, "y": 5.25 },
157 { "matrix": [11, 4], "w": 1, "x": 22, "y": 5.25 },
158 { "matrix": [11, 5], "w": 1, "x": 3.25, "y": 5.5 },
159 { "matrix": [10, 6], "w": 1, "x": 4.25, "y": 5.5 },
160 { "matrix": [11, 6], "w": 1, "x": 5.25, "y": 5.5 },
161 { "matrix": [11, 7], "w": 1, "x": 17.75, "y": 5.5 },
162 { "matrix": [11, 8], "w": 1, "x": 18.75, "y": 5.5 },
163 { "matrix": [11, 9], "w": 1, "x": 19.75, "y": 5.5 }
164 ]
165 },
166 "LAYOUT_7u_space": {
167 "key_count": 121,
168 "layout": [
169 { "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
170 { "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
171 { "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
172 { "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
173 { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 0 },
174 { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 0 },
175 { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 0 },
176 { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 0 },
177 { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 0 },
178 { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 0 },
179 { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 0 },
180 { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 0 },
181 { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 0 },
182 { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 0 },
183 { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 0 },
184 { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 0 },
185 { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 0 },
186 { "matrix": [6, 7], "w": 1, "x": 20, "y": 0 },
187 { "matrix": [6, 8], "w": 1, "x": 21, "y": 0 },
188 { "matrix": [6, 9], "w": 1, "x": 22, "y": 0 },
189 { "matrix": [6, 10], "w": 1, "x": 23, "y": 0 },
190 { "matrix": [1, 0], "w": 1, "x": 0, "y": 1.25 },
191 { "matrix": [1, 1], "w": 1, "x": 1, "y": 1.25 },
192 { "matrix": [1, 2], "w": 1, "x": 2, "y": 1.25 },
193 { "matrix": [1, 3], "w": 1, "x": 3, "y": 1.25 },
194 { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1.25 },
195 { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1.25 },
196 { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1.25 },
197 { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1.25 },
198 { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1.25 },
199 { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1.25 },
200 { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1.25 },
201 { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 1.25 },
202 { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 1.25 },
203 { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 1.25 },
204 { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 1.25 },
205 { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 1.25 },
206 { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 1.25 },
207 { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 1.25 },
208 { "matrix": [7, 7], "w": 1, "x": 20, "y": 1.25 },
209 { "matrix": [7, 8], "w": 1, "x": 21, "y": 1.25 },
210 { "matrix": [7, 9], "w": 1, "x": 22, "y": 1.25 },
211 { "matrix": [7, 10], "w": 1, "x": 23, "y": 1.25 },
212 { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 2.25 },
213 { "matrix": [2, 1], "w": 1, "x": 1, "y": 2.25 },
214 { "matrix": [2, 2], "w": 1, "x": 2, "y": 2.25 },
215 { "matrix": [2, 3], "w": 1, "x": 3, "y": 2.25 },
216 { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 2.25 },
217 { "matrix": [2, 5], "w": 1, "x": 6, "y": 2.25 },
218 { "matrix": [2, 6], "w": 1, "x": 7, "y": 2.25 },
219 { "matrix": [2, 7], "w": 1, "x": 8, "y": 2.25 },
220 { "matrix": [2, 8], "w": 1, "x": 9, "y": 2.25 },
221 { "matrix": [2, 9], "w": 1, "x": 10, "y": 2.25 },
222 { "matrix": [2, 10], "w": 1, "x": 11, "y": 2.25 },
223 { "matrix": [8, 0], "w": 1, "x": 12, "y": 2.25 },
224 { "matrix": [8, 1], "w": 1, "x": 13, "y": 2.25 },
225 { "matrix": [8, 2], "w": 1, "x": 14, "y": 2.25 },
226 { "matrix": [8, 3], "w": 1, "x": 15, "y": 2.25 },
227 { "matrix": [8, 4], "w": 1, "x": 16, "y": 2.25 },
228 { "matrix": [8, 5], "w": 1, "x": 17, "y": 2.25 },
229 { "matrix": [8, 6], "w": 1.5, "x": 18, "y": 2.25 },
230 { "matrix": [8, 7], "w": 1, "x": 20, "y": 2.25 },
231 { "matrix": [8, 8], "w": 1, "x": 21, "y": 2.25 },
232 { "matrix": [8, 9], "w": 1, "x": 22, "y": 2.25 },
233 { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 2.25 },
234 { "matrix": [3, 1], "w": 1, "x": 1, "y": 3.25 },
235 { "matrix": [3, 2], "w": 1, "x": 2, "y": 3.25 },
236 { "matrix": [3, 3], "w": 1, "x": 3, "y": 3.25 },
237 { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 3.25 },
238 { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 3.25 },
239 { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 3.25 },
240 { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 3.25 },
241 { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 3.25 },
242 { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 3.25 },
243 { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 3.25 },
244 { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 3.25 },
245 { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 3.25 },
246 { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 3.25 },
247 { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 3.25 },
248 { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 3.25 },
249 { "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 3.25 },
250 { "matrix": [9, 7], "w": 1, "x": 20, "y": 3.25 },
251 { "matrix": [9, 8], "w": 1, "x": 21, "y": 3.25 },
252 { "matrix": [9, 9], "w": 1, "x": 22, "y": 3.25 },
253 { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 4.25 },
254 { "matrix": [4, 1], "w": 1, "x": 1, "y": 4.25 },
255 { "matrix": [4, 2], "w": 1, "x": 2, "y": 4.25 },
256 { "matrix": [4, 3], "w": 1, "x": 3, "y": 4.25 },
257 { "matrix": [4, 4], "w": 1.25, "x": 5.5, "y": 4.25 },
258 { "matrix": [4, 5], "w": 1, "x": 6.75, "y": 4.25 },
259 { "matrix": [4, 6], "w": 1, "x": 7.75, "y": 4.25 },
260 { "matrix": [4, 7], "w": 1, "x": 8.75, "y": 4.25 },
261 { "matrix": [4, 8], "w": 1, "x": 9.75, "y": 4.25 },
262 { "matrix": [4, 9], "w": 1, "x": 10.75, "y": 4.25 },
263 { "matrix": [4, 10], "w": 1, "x": 11.75, "y": 4.25 },
264 { "matrix": [10, 0], "w": 1, "x": 12.75, "y": 4.25 },
265 { "matrix": [10, 1], "w": 1, "x": 13.75, "y": 4.25 },
266 { "matrix": [10, 2], "w": 1, "x": 14.75, "y": 4.25 },
267 { "matrix": [10, 3], "w": 1, "x": 15.75, "y": 4.25 },
268 { "matrix": [10, 4], "w": 1.75, "x": 16.75, "y": 4.25 },
269 { "matrix": [10, 5], "w": 1, "x": 20, "y": 4.25 },
270 { "matrix": [9, 6], "w": 1, "x": 21, "y": 4.25 },
271 { "matrix": [10, 7], "w": 1, "x": 22, "y": 4.25 },
272 { "h": 2, "matrix": [10, 8], "w": 1, "x": 23, "y": 4.25 },
273 { "matrix": [10, 9], "w": 1, "x": 4.25, "y": 4.5 },
274 { "matrix": [10, 10], "w": 1, "x": 18.75, "y": 4.5 },
275 { "matrix": [5, 1], "w": 1, "x": 1, "y": 5.25 },
276 { "matrix": [5, 2], "w": 1, "x": 2, "y": 5.25 },
277 { "matrix": [5, 3], "w": 1, "x": 6.5, "y": 5.25 },
278 { "matrix": [5, 4], "w": 1, "x": 7.5, "y": 5.25 },
279 { "matrix": [5, 5], "w": 7, "x": 8.5, "y": 5.25 },
280 { "matrix": [5, 6], "w": 1, "x": 15.5, "y": 5.25 },
281 { "matrix": [5, 7], "w": 1, "x": 16.5, "y": 5.25 },
282 { "matrix": [11, 0], "w": 1, "x": 21, "y": 5.25 },
283 { "matrix": [11, 4], "w": 1, "x": 22, "y": 5.25 },
284 { "matrix": [11, 5], "w": 1, "x": 3.25, "y": 5.5 },
285 { "matrix": [10, 6], "w": 1, "x": 4.25, "y": 5.5 },
286 { "matrix": [11, 6], "w": 1, "x": 5.25, "y": 5.5 },
287 { "matrix": [11, 7], "w": 1, "x": 17.75, "y": 5.5 },
288 { "matrix": [11, 8], "w": 1, "x": 18.75, "y": 5.5 },
289 { "matrix": [11, 9], "w": 1, "x": 19.75, "y": 5.5 }
290 ]
291 },
292 "LAYOUT_all": {
293 "key_count": 127,
294 "layout": [
295 { "label": "Home", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
296 { "label": "End", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
297 { "label": "PgUp", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
298 { "label": "PgDn", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
299 { "label": "Esc", "matrix": [0, 4], "w": 1, "x": 4.75, "y": 0 },
300 { "label": "F1", "matrix": [0, 6], "w": 1, "x": 6.25, "y": 0 },
301 { "label": "F2", "matrix": [0, 7], "w": 1, "x": 7.25, "y": 0 },
302 { "label": "F3", "matrix": [0, 8], "w": 1, "x": 8.25, "y": 0 },
303 { "label": "F4", "matrix": [0, 9], "w": 1, "x": 9.25, "y": 0 },
304 { "label": "F5", "matrix": [0, 10], "w": 1, "x": 10.75, "y": 0 },
305 { "label": "F6", "matrix": [6, 0], "w": 1, "x": 11.75, "y": 0 },
306 { "label": "F7", "matrix": [6, 1], "w": 1, "x": 12.75, "y": 0 },
307 { "label": "F8", "matrix": [6, 2], "w": 1, "x": 13.75, "y": 0 },
308 { "label": "F9", "matrix": [6, 3], "w": 1, "x": 15.25, "y": 0 },
309 { "label": "F10", "matrix": [6, 4], "w": 1, "x": 16.25, "y": 0 },
310 { "label": "F11", "matrix": [6, 5], "w": 1, "x": 17.25, "y": 0 },
311 { "label": "F12", "matrix": [6, 6], "w": 1, "x": 18.25, "y": 0 },
312 { "label": "PrtSc", "matrix": [6, 7], "w": 1, "x": 20, "y": 0 },
313 { "label": "Scroll Lock", "matrix": [6, 8], "w": 1, "x": 21, "y": 0 },
314 { "label": "Pause", "matrix": [6, 9], "w": 1, "x": 22, "y": 0 },
315 { "label": "Insert", "matrix": [6, 10], "w": 1, "x": 23, "y": 0 },
316 { "label": "-", "matrix": [1, 0], "w": 1, "x": 0, "y": 1.25 },
317 { "label": "Num Lock", "matrix": [1, 1], "w": 1, "x": 1, "y": 1.25 },
318 { "label": "/", "matrix": [1, 2], "w": 1, "x": 2, "y": 1.25 },
319 { "label": "*", "matrix": [1, 3], "w": 1, "x": 3, "y": 1.25 },
320 { "label": "~", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1.25 },
321 { "label": "!", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1.25 },
322 { "label": "@", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1.25 },
323 { "label": "#", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1.25 },
324 { "label": "$", "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1.25 },
325 { "label": "%", "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1.25 },
326 { "label": "^", "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1.25 },
327 { "label": "&", "matrix": [7, 0], "w": 1, "x": 11.5, "y": 1.25 },
328 { "label": "*", "matrix": [7, 1], "w": 1, "x": 12.5, "y": 1.25 },
329 { "label": "(", "matrix": [7, 2], "w": 1, "x": 13.5, "y": 1.25 },
330 { "label": ")", "matrix": [7, 3], "w": 1, "x": 14.5, "y": 1.25 },
331 { "label": "_", "matrix": [7, 4], "w": 1, "x": 15.5, "y": 1.25 },
332 { "label": "+", "matrix": [7, 5], "w": 1, "x": 16.5, "y": 1.25 },
333 { "label": "Backspace", "matrix": [7, 6], "w": 2, "x": 17.5, "y": 1.25 },
334 { "label": "Num Lock", "matrix": [7, 7], "w": 1, "x": 20, "y": 1.25 },
335 { "label": "/", "matrix": [7, 8], "w": 1, "x": 21, "y": 1.25 },
336 { "label": "*", "matrix": [7, 9], "w": 1, "x": 22, "y": 1.25 },
337 { "label": "-", "matrix": [7, 10], "w": 1, "x": 23, "y": 1.25 },
338 { "h": 2, "label": "+", "matrix": [2, 0], "w": 1, "x": 0, "y": 2.25 },
339 { "label": "7", "matrix": [2, 1], "w": 1, "x": 1, "y": 2.25 },
340 { "label": "8", "matrix": [2, 2], "w": 1, "x": 2, "y": 2.25 },
341 { "label": "9", "matrix": [2, 3], "w": 1, "x": 3, "y": 2.25 },
342 { "label": "Tab", "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 2.25 },
343 { "label": "Q", "matrix": [2, 5], "w": 1, "x": 6, "y": 2.25 },
344 { "label": "W", "matrix": [2, 6], "w": 1, "x": 7, "y": 2.25 },
345 { "label": "E", "matrix": [2, 7], "w": 1, "x": 8, "y": 2.25 },
346 { "label": "R", "matrix": [2, 8], "w": 1, "x": 9, "y": 2.25 },
347 { "label": "T", "matrix": [2, 9], "w": 1, "x": 10, "y": 2.25 },
348 { "label": "Y", "matrix": [2, 10], "w": 1, "x": 11, "y": 2.25 },
349 { "label": "U", "matrix": [8, 0], "w": 1, "x": 12, "y": 2.25 },
350 { "label": "I", "matrix": [8, 1], "w": 1, "x": 13, "y": 2.25 },
351 { "label": "O", "matrix": [8, 2], "w": 1, "x": 14, "y": 2.25 },
352 { "label": "P", "matrix": [8, 3], "w": 1, "x": 15, "y": 2.25 },
353 { "label": "{", "matrix": [8, 4], "w": 1, "x": 16, "y": 2.25 },
354 { "label": "}", "matrix": [8, 5], "w": 1, "x": 17, "y": 2.25 },
355 { "label": "|", "matrix": [8, 6], "w": 1.5, "x": 18, "y": 2.25 },
356 { "label": "7", "matrix": [8, 7], "w": 1, "x": 20, "y": 2.25 },
357 { "label": "8", "matrix": [8, 8], "w": 1, "x": 21, "y": 2.25 },
358 { "label": "9", "matrix": [8, 9], "w": 1, "x": 22, "y": 2.25 },
359 { "h": 2, "label": "+", "matrix": [8, 10], "w": 1, "x": 23, "y": 2.25 },
360 { "label": "4", "matrix": [3, 1], "w": 1, "x": 1, "y": 3.25 },
361 { "label": "5", "matrix": [3, 2], "w": 1, "x": 2, "y": 3.25 },
362 { "label": "6", "matrix": [3, 3], "w": 1, "x": 3, "y": 3.25 },
363 { "label": "Caps Lock", "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 3.25 },
364 { "label": "A", "matrix": [3, 5], "w": 1, "x": 6.25, "y": 3.25 },
365 { "label": "S", "matrix": [3, 6], "w": 1, "x": 7.25, "y": 3.25 },
366 { "label": "D", "matrix": [3, 7], "w": 1, "x": 8.25, "y": 3.25 },
367 { "label": "F", "matrix": [3, 8], "w": 1, "x": 9.25, "y": 3.25 },
368 { "label": "G", "matrix": [3, 9], "w": 1, "x": 10.25, "y": 3.25 },
369 { "label": "H", "matrix": [3, 10], "w": 1, "x": 11.25, "y": 3.25 },
370 { "label": "J", "matrix": [9, 0], "w": 1, "x": 12.25, "y": 3.25 },
371 { "label": "K", "matrix": [9, 1], "w": 1, "x": 13.25, "y": 3.25 },
372 { "label": "L", "matrix": [9, 2], "w": 1, "x": 14.25, "y": 3.25 },
373 { "label": ":", "matrix": [9, 3], "w": 1, "x": 15.25, "y": 3.25 },
374 { "label": "\"", "matrix": [9, 4], "w": 1, "x": 16.25, "y": 3.25 },
375 { "label": "Enter", "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 3.25 },
376 { "label": "4", "matrix": [9, 7], "w": 1, "x": 20, "y": 3.25 },
377 { "label": "5", "matrix": [9, 8], "w": 1, "x": 21, "y": 3.25 },
378 { "label": "6", "matrix": [9, 9], "w": 1, "x": 22, "y": 3.25 },
379 { "h": 2, "label": "Enter", "matrix": [4, 0], "w": 1, "x": 0, "y": 4.25 },
380 { "label": "1", "matrix": [4, 1], "w": 1, "x": 1, "y": 4.25 },
381 { "label": "2", "matrix": [4, 2], "w": 1, "x": 2, "y": 4.25 },
382 { "label": "3", "matrix": [4, 3], "w": 1, "x": 3, "y": 4.25 },
383 { "label": "\\u2191", "matrix": [4, 4], "w": 1, "x": 4.25, "y": 4.5 },
384 { "label": "Shift", "matrix": [4, 5], "w": 1.25, "x": 5.5, "y": 4.25 },
385 { "label": "Z", "matrix": [4, 6], "w": 1, "x": 6.75, "y": 4.25 },
386 { "label": "X", "matrix": [4, 7], "w": 1, "x": 7.75, "y": 4.25 },
387 { "label": "C", "matrix": [4, 8], "w": 1, "x": 8.75, "y": 4.25 },
388 { "label": "V", "matrix": [4, 9], "w": 1, "x": 9.75, "y": 4.25 },
389 { "label": "B", "matrix": [4, 10], "w": 1, "x": 10.75, "y": 4.25 },
390 { "label": "N", "matrix": [10, 0], "w": 1, "x": 11.75, "y": 4.25 },
391 { "label": "M", "matrix": [10, 1], "w": 1, "x": 12.75, "y": 4.25 },
392 { "label": "<", "matrix": [10, 2], "w": 1, "x": 13.75, "y": 4.25 },
393 { "label": ">", "matrix": [10, 3], "w": 1, "x": 14.75, "y": 4.25 },
394 { "label": "?", "matrix": [10, 4], "w": 1, "x": 15.75, "y": 4.25 },
395 { "label": "Shift", "matrix": [10, 5], "w": 1.75, "x": 16.75, "y": 4.25 },
396 { "label": "\\u2191", "matrix": [9, 6], "w": 1, "x": 18.75, "y": 4.5 },
397 { "label": "1", "matrix": [10, 7], "w": 1, "x": 20, "y": 4.25 },
398 { "label": "2", "matrix": [10, 8], "w": 1, "x": 21, "y": 4.25 },
399 { "label": "3", "matrix": [10, 9], "w": 1, "x": 22, "y": 4.25 },
400 { "h": 2, "label": "Enter", "matrix": [10, 10], "w": 1, "x": 23, "y": 4.25 },
401 { "label": "0", "matrix": [5, 1], "w": 1, "x": 1, "y": 5.25 },
402 { "label": ".", "matrix": [5, 2], "w": 1, "x": 2, "y": 5.25 },
403 { "label": "\\u2190", "matrix": [5, 3], "w": 1, "x": 3.25, "y": 5.5 },
404 { "label": "\\u2193", "matrix": [5, 4], "w": 1, "x": 4.25, "y": 5.5 },
405 { "label": "\\u2192", "matrix": [5, 5], "w": 1, "x": 5.25, "y": 5.5 },
406 { "label": "Ctrl", "matrix": [5, 6], "w": 1, "x": 6.5, "y": 5.25 },
407 { "label": "Win", "matrix": [5, 7], "w": 1, "x": 7.5, "y": 5.25 },
408 { "label": "Alt", "matrix": [5, 8], "w": 1, "x": 8.5, "y": 5.25 },
409 { "label": "1u", "matrix": [5, 9], "w": 1, "x": 9.5, "y": 5.25 },
410 { "label": "1u", "matrix": [5, 10], "w": 1, "x": 10.5, "y": 5.25 },
411 { "label": "1u", "matrix": [11, 0], "w": 1, "x": 11.5, "y": 5.25 },
412 { "label": "1u", "matrix": [11, 1], "w": 1, "x": 12.5, "y": 5.25 },
413 { "label": "Alt", "matrix": [11, 2], "w": 1, "x": 13.5, "y": 5.25 },
414 { "label": "Win", "matrix": [11, 3], "w": 1, "x": 14.5, "y": 5.25 },
415 { "label": "Menu", "matrix": [11, 4], "w": 1, "x": 15.5, "y": 5.25 },
416 { "label": "Ctrl", "matrix": [11, 5], "w": 1, "x": 16.5, "y": 5.25 },
417 { "label": "\\u2190", "matrix": [10, 6], "w": 1, "x": 17.75, "y": 5.5 },
418 { "label": "\\u2193", "matrix": [11, 6], "w": 1, "x": 18.75, "y": 5.5 },
419 { "label": "\\u2192", "matrix": [11, 7], "w": 1, "x": 19.75, "y": 5.5 },
420 { "label": "0", "matrix": [11, 8], "w": 1, "x": 21, "y": 5.25 },
421 { "label": ".", "matrix": [11, 9], "w": 1, "x": 22, "y": 5.25 }
422 ]
423 }
424 }
425}
diff --git a/keyboards/clueboard/2x1800/2021/keymaps/default/keymap.json b/keyboards/clueboard/2x1800/2021/keymaps/default/keymap.json
new file mode 100644
index 000000000..7122f42d4
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/keymaps/default/keymap.json
@@ -0,0 +1,18 @@
1{
2 "version": 1,
3 "author": "skullydazed",
4 "notes": "",
5 "keyboard": "clueboard/2x1800/2018",
6 "keymap": "default",
7 "layout": "LAYOUT_all",
8 "layers": [
9 [
10 "KC_HOME", "KC_END", "KC_PGUP", "KC_PGDN", "KC_ESC", "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", "KC_PSCR", "KC_SLCK", "KC_PAUS", "KC_INS",
11 "KC_PMNS", "KC_NLCK", "KC_PSLS", "KC_PAST", "KC_GRV", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_MINS", "KC_EQL", "KC_BSPC", "KC_NLCK", "KC_PSLS", "KC_PAST", "KC_PMNS",
12 "KC_PPLS", "KC_P7", "KC_P8", "KC_P9", "KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_LBRC", "KC_RBRC", "KC_BSLS", "KC_P7", "KC_P8", "KC_P9", "KC_PPLS",
13 "KC_P4", "KC_P5", "KC_P6", "KC_CAPS", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", "KC_QUOT", "KC_ENT", "KC_P4", "KC_P5", "KC_P6",
14 "KC_PENT", "KC_P1", "KC_P2", "KC_P3", "KC_UP", "KC_LSFT", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_RSFT", "KC_UP", "KC_P1", "KC_P2", "KC_P3", "KC_PENT",
15 "KC_P0", "KC_PDOT", "KC_LEFT", "KC_DOWN", "KC_RGHT", "KC_LCTL", "KC_LGUI", "KC_LALT", "KC_SPC", "KC_SPC", "KC_SPC", "KC_SPC", "KC_RALT", "KC_RGUI", "KC_APP", "KC_RCTL", "KC_LEFT", "KC_DOWN", "KC_RGHT", "KC_P0", "KC_PDOT"
16 ]
17 ]
18}
diff --git a/keyboards/clueboard/2x1800/2021/keymaps/default_4u/keymap.c b/keyboards/clueboard/2x1800/2021/keymaps/default_4u/keymap.c
new file mode 100644
index 000000000..14d76a59f
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/keymaps/default_4u/keymap.c
@@ -0,0 +1,28 @@
1/* Copyright 2017 Zach White <skullydazed@gmail.com>
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#include QMK_KEYBOARD_H
17
18const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
19[0] = LAYOUT_4u_space(
20 KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS, \
21 \
22 KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
23 KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, \
24 KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \
25 KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \
26 KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \
27)
28};
diff --git a/keyboards/clueboard/2x1800/2021/keymaps/default_4u/readme.md b/keyboards/clueboard/2x1800/2021/keymaps/default_4u/readme.md
new file mode 100644
index 000000000..a696972e8
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/keymaps/default_4u/readme.md
@@ -0,0 +1 @@
# The default keymap for 2x1800 with 4u Spacebar
diff --git a/keyboards/clueboard/2x1800/2021/keymaps/default_7u/keymap.c b/keyboards/clueboard/2x1800/2021/keymaps/default_7u/keymap.c
new file mode 100644
index 000000000..3717bd540
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/keymaps/default_7u/keymap.c
@@ -0,0 +1,49 @@
1/* Copyright 2017 Zach White <skullydazed@gmail.com>
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#include QMK_KEYBOARD_H
17
18const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
19[0] = LAYOUT_7u_space(
20 KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_DEL, \
21 \
22 KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
23 KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, \
24 KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \
25 KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \
26 KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LALT, KC_SPC, KC_LGUI, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \
27)
28};
29
30
31#ifdef AUDIO_ENABLE
32 float song_one_up[][2] = SONG(ONE_UP_SOUND);
33#endif
34
35volatile uint8_t runonce = true;
36static uint16_t my_timer;
37
38void matrix_init_user(void) {
39 my_timer = timer_read();
40}
41
42void matrix_scan_user(void) {
43 if (runonce && timer_elapsed(my_timer) > 500) {
44 runonce = false;
45#ifdef AUDIO_ENABLE
46 PLAY_SONG(song_one_up);
47#endif
48 }
49}
diff --git a/keyboards/clueboard/2x1800/2021/keymaps/default_7u/readme.md b/keyboards/clueboard/2x1800/2021/keymaps/default_7u/readme.md
new file mode 100644
index 000000000..f5718e842
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/keymaps/default_7u/readme.md
@@ -0,0 +1 @@
# The default keymap for 2x1800 with 7u spacebar
diff --git a/keyboards/clueboard/2x1800/2021/keymaps/signboard/config.h b/keyboards/clueboard/2x1800/2021/keymaps/signboard/config.h
new file mode 100644
index 000000000..81995d66f
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/keymaps/signboard/config.h
@@ -0,0 +1,20 @@
1/* Copyright 2017 Zach White <skullydazed@gmail.com>
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#pragma once
18#define MAX7219_LED_FONTTEST
19
20// place overrides here
diff --git a/keyboards/clueboard/2x1800/2021/keymaps/signboard/keymap.c b/keyboards/clueboard/2x1800/2021/keymaps/signboard/keymap.c
new file mode 100644
index 000000000..3559455b6
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/keymaps/signboard/keymap.c
@@ -0,0 +1,50 @@
1#include QMK_KEYBOARD_H
2#include "font.h"
3#include "max7219.h"
4
5enum custom_keycodes {
6 MSG_CB = SAFE_RANGE,
7 MSG_CS,
8 MSG_KMI,
9 MSG_QMK,
10};
11
12uint8_t custom_message[5][6] = {CHR_M, CHR_y, CHR_SPACE, CHR_2, CHR_CENT};
13
14const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
15 [0] = LAYOUT_all(
16 MSG_CB, MSG_QMK, MSG_KMI, MSG_CS, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS,
17 KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
18 KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS,
19 KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6,
20 KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
21 KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
22 )
23};
24
25bool process_record_user(uint16_t keycode, keyrecord_t *record) {
26 if (record->event.pressed) {
27 switch (keycode) {
28 case MSG_CB:
29 max7219_led_scrolling=true;
30 uint8_t cb_msg[MSG_CLUEBOARD_LEN][6] = MSG_CLUEBOARD;
31 max7219_message_sign(cb_msg, MSG_CLUEBOARD_LEN);
32 return true;
33 case MSG_CS:
34 max7219_led_scrolling=false;
35 max7219_message_sign(custom_message, 5);
36 return true;
37 case MSG_KMI:
38 max7219_led_scrolling=true;
39 uint8_t kmi_msg[MSG_KONAMI_LEN][6] = MSG_KONAMI;
40 max7219_message_sign(kmi_msg, MSG_KONAMI_LEN);
41 return true;
42 case MSG_QMK:
43 max7219_led_scrolling=true;
44 uint8_t qmk_msg[MSG_QMK_POWERED_LEN][6] = MSG_QMK_POWERED;
45 max7219_message_sign(qmk_msg, MSG_QMK_POWERED_LEN);
46 return true;
47 }
48 }
49 return true;
50};
diff --git a/keyboards/clueboard/2x1800/2021/keymaps/signboard/readme.md b/keyboards/clueboard/2x1800/2021/keymaps/signboard/readme.md
new file mode 100644
index 000000000..4e3457efc
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/keymaps/signboard/readme.md
@@ -0,0 +1 @@
# The default keymap for 2x1800
diff --git a/keyboards/clueboard/2x1800/2021/max7219.c b/keyboards/clueboard/2x1800/2021/max7219.c
new file mode 100644
index 000000000..1ba22362f
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/max7219.c
@@ -0,0 +1,318 @@
1/*
2 * Copyright (c) 2021 Zach White <skullydazed@gmail.com>
3 * Copyright (c) 2007 Eberhard Fahle
4 *
5 * max7219.c - A library for controling Leds with a MAX7219/MAX7221
6 *
7 * Permission is hereby granted, free of charge, to any person
8 * obtaining a copy of this software and associated documentation
9 * files (the "Software"), to deal in the Software without
10 * restriction, including without limitation the rights to use,
11 * copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following
14 * conditions:
15 *
16 * This permission notice shall be included in all copies or
17 * substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
21 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
23 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
24 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26 * OTHER DEALINGS IN THE SOFTWARE.
27 */
28
29/*
30 * This driver started as a port of Arduino's LedControl to QMK. The
31 * original Arduino code can be found here:
32 *
33 * https://github.com/wayoda/LedControl
34 *
35 * Unlike LedControl we are using the native SPI support, you will need to
36 * use the native SPI pins for your MCU. You can set the CS pin with
37 * `#define MAX7219_LOAD <pin>`.
38 *
39 * This has only been tested on AVR, specifically a Teensy 2.0++.
40 */
41
42#include "max7219.h"
43#include "font.h"
44
45// Datastructures
46bool max7219_led_scrolling = true;
47uint16_t max7219_buffer_end = 0;
48uint8_t max7219_spidata[MAX_BYTES];
49uint8_t max7219_led_a[8][MAX7219_BUFFER_SIZE];
50
51/* Write max7219_spidata to all the max7219's
52 */
53void max7219_write_all(void) {
54 dprintf("max7219_write_all()\n");
55 if (spi_start(MAX7219_LOAD, false, 0, 8)) {
56 for(int i = MAX_BYTES; i>0; i--) {
57 dprintf("spi_write(%d)\n", max7219_spidata[i-1]);
58 spi_write(max7219_spidata[i-1]);
59 }
60 spi_stop();
61 } else {
62 xprintf("Could not spi_start!\n");
63 }
64}
65
66/* Write the current frame in max7219_led_a to all the max7219's
67 */
68void max7219_write_frame(void) {
69 dprintf("max7219_write_frame()\n");
70
71 // Set our opcode and data
72 for (int col=0; col<8; col++) {
73 for (int device_num=0; device_num<MAX7219_CONTROLLERS; device_num++) {
74 int offset=device_num*2;
75 max7219_spidata[offset] = max7219_led_a[col][device_num];
76 max7219_spidata[offset+1] = col+1;
77 }
78 max7219_write_all();
79 }
80}
81
82/* Stores a message in the sign buffer.
83 *
84 * message should be a 2d array with the outer array having a length of your
85 * message and the inner array having a length of 6. Use the CHR_<letter>
86 * macros from font.h to populate your array.
87 *
88 * Example:
89 *
90 * uint8_t message[10][6] = {CHR_INTERROBANG, CHR_C, CHR_l, CHR_u, CHR_e, CHR_b, CHR_o, CHR_a, CHR_r, CHR_d};
91 * max7219_message(message, 10);
92 */
93void max7219_message_sign(uint8_t message[][6], size_t message_len) {
94 uint8_t letter_num = 0;
95 uint8_t letter_col = 0;
96 max7219_buffer_end = message_len * 6 + 32;
97
98 for (int device_num=0; device_num<MAX7219_BUFFER_SIZE; device_num++) {
99 for (int col=0; col<8; col++) {
100 if (letter_num >= message_len) {
101 max7219_led_a[col][device_num] = 0b00000000;
102 } else {
103 max7219_led_a[col][device_num] = message[letter_num][letter_col];
104 if (letter_col == 5) {
105 letter_num++;
106 letter_col = 0;
107 } else {
108 letter_col++;
109 }
110 }
111 }
112 }
113
114 max7219_write_frame();
115}
116
117/* Scroll the content on the sign left by 1 column.
118 *
119 * When loop_message is true columns that slide off the left will be added
120 * to the right to be displayed again.
121 */
122void max7219_message_sign_task(bool loop_message) {
123 uint8_t left_col = 0b00000000;
124
125 if (!max7219_led_scrolling) {
126 return;
127 }
128
129 if (loop_message) {
130 left_col = max7219_led_a[0][0];
131 }
132
133 int i=0;
134
135 for (int device_num=0; device_num<MAX7219_BUFFER_SIZE; device_num++) {
136 for (int col=0; col<8; col++) {
137 i++;
138
139 if (i == max7219_buffer_end) {
140 max7219_led_a[col][device_num] = left_col;
141 device_num=MAX7219_BUFFER_SIZE;
142 break;
143 } else if (col < 7) {
144 max7219_led_a[col][device_num] = max7219_led_a[col+1][device_num];
145 } else if (device_num == MAX7219_BUFFER_SIZE-1) {
146 max7219_led_a[col][device_num] = left_col;
147 } else {
148 max7219_led_a[col][device_num] = max7219_led_a[0][device_num+1];
149 }
150 }
151 }
152 max7219_write_frame();
153}
154
155/* Write data to a single max7219
156 */
157void max7219_write(int device_num, volatile uint8_t opcode, volatile uint8_t data) {
158 dprintf("max7219_write(%d, %d, %d)\n", device_num, opcode, data);
159
160 // Clear the data array
161 for(int i = MAX_BYTES; i>0; i--) {
162 max7219_spidata[i-1]=0;
163 }
164
165 // Set our opcode and data
166 uint8_t offset = device_num*2;
167 max7219_spidata[offset] = data;
168 max7219_spidata[offset+1] = opcode;
169
170 // Write the data
171 max7219_write_all();
172}
173
174/* Turn off all the LEDs
175 */
176void max7219_clear_display(void) {
177 dprintf("max7219_clear_display();\n");
178
179 for (int col=0; col<8; col++) {
180 for (int device_num=0; device_num<MAX7219_BUFFER_SIZE; device_num++) {
181 max7219_led_a[col][device_num] = 0b00000000;
182 }
183 }
184 max7219_write_frame();
185}
186
187/* Enable the display test (IE turn on all 64 LEDs)
188 */
189void max7219_display_test(int device_num, bool enabled) {
190 dprintf("max7219_display_test(%d, %d);\n", device_num, enabled);
191
192 if (device_num<0 || device_num >= MAX7219_CONTROLLERS) {
193 return;
194 }
195
196 max7219_write(device_num, OP_DISPLAYTEST, enabled);
197}
198
199/* Initialize the max7219 system and set the controller(s) to a default state.
200 */
201void max7219_init(void) {
202 wait_ms(1500);
203 dprintf("max7219_init()\n");
204
205 setPinOutput(MAX7219_LOAD);
206 writePinHigh(MAX7219_LOAD);
207 spi_init();
208
209 for (int i=0; i<MAX7219_CONTROLLERS; i++) {
210 max7219_shutdown(i, true);
211 }
212
213 for (int i=0; i<MAX7219_CONTROLLERS; i++) {
214 // Reset everything to defaults and enable the display
215 max7219_display_test(i, false);
216 max7219_set_scan_limit(i, 7);
217 max7219_set_decode_mode(i, 0);
218 max7219_set_intensity(i, MAX7219_LED_INTENSITY);
219 }
220
221 max7219_clear_display();
222
223#ifndef MAX7219_NO_STARTUP_TEST
224 for (int i=0; i<MAX7219_CONTROLLERS; i++) {
225 // Test this display
226 max7219_display_test(i, true);
227 wait_ms(75);
228 max7219_display_test(i, false);
229 }
230#endif
231
232 for (int i=0; i<MAX7219_CONTROLLERS; i++) {
233 max7219_shutdown(i, false);
234 }
235}
236
237/* Set the decode mode of the controller. You probably don't want to change this.
238 */
239void max7219_set_decode_mode(int device_num, int mode) {
240 dprintf("max7219_set_decode_mode(%d, %d);\n", device_num, mode);
241
242 if (device_num<0 || device_num >= MAX7219_CONTROLLERS) {
243 return;
244 }
245
246 max7219_write(device_num, OP_DECODEMODE, mode);
247}
248
249/* Set the intensity (brightness) for the LEDs.
250 */
251void max7219_set_intensity(int device_num, int intensity) {
252 dprintf("max7219_set_intensity(%d, %d);\n", device_num, intensity);
253
254 if (device_num<0 || device_num >= MAX7219_CONTROLLERS) {
255 return;
256 }
257
258 if (intensity >= 0 && intensity<16) {
259 max7219_write(device_num, OP_INTENSITY, intensity);
260 }
261}
262
263/* Control a single LED.
264 */
265void max7219_set_led(int row, int column, bool state) {
266 dprintf("max7219_set_led(%d, %d, %d);\n", row, column, state);
267
268 if (column<0 || column>8*MAX7219_CONTROLLERS) {
269 xprintf("max7219_set_led: column (%d) out of bounds\n", column);
270 return;
271 }
272
273 if (row<0 || row>7) {
274 xprintf("max7219_set_led: row (%d) out of bounds\n", row);
275 return;
276 }
277
278 /* At this point we reverse the sense of row and column to match the
279 * physical layout of my LEDs.
280 */
281 uint8_t device_num = column / 8;
282 uint8_t col = column % 8;
283 uint8_t val = 0b10000000 >> row;
284
285 if (state) {
286 max7219_led_a[col][device_num] = max7219_led_a[col][device_num]|val;
287 } else {
288 val = ~val;
289 max7219_led_a[col][device_num] = max7219_led_a[col][device_num]&val;
290 }
291 max7219_write(device_num, col+1, max7219_led_a[col][device_num]);
292}
293
294/* Set the number of digits (rows) to be scanned.
295 */
296void max7219_set_scan_limit(int device_num, int limit) {
297 dprintf("max7219_set_scan_limit(%d, %d);\n", device_num, limit);
298
299 if (device_num<0 || device_num >= MAX7219_CONTROLLERS) {
300 return;
301 }
302
303 if (limit >= 0 && limit < 8) {
304 max7219_write(device_num, OP_SCANLIMIT, limit);
305 }
306}
307
308/* Enable (true) or disable (false) the controller.
309 */
310void max7219_shutdown(int device_num, bool shutdown) {
311 dprintf("max7219_shutdown(%d, %d);\n", device_num, shutdown);
312
313 if (device_num<0 || device_num >= MAX7219_CONTROLLERS) {
314 return;
315 }
316
317 max7219_write(device_num, OP_SHUTDOWN, !shutdown);
318}
diff --git a/keyboards/clueboard/2x1800/2021/max7219.h b/keyboards/clueboard/2x1800/2021/max7219.h
new file mode 100644
index 000000000..95d1d9389
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/max7219.h
@@ -0,0 +1,87 @@
1/*
2 * Copyright (c) 2021 Zach White <skullydazed@gmail.com>
3 * Copyright (c) 2007 Eberhard Fahle
4 *
5 * max7219.h - A library for controling Leds with a MAX7219/MAX7221
6 *
7 * Permission is hereby granted, free of charge, to any person
8 * obtaining a copy of this software and associated documentation
9 * files (the "Software"), to deal in the Software without
10 * restriction, including without limitation the rights to use,
11 * copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following
14 * conditions:
15 *
16 * This permission notice shall be included in all copies or
17 * substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
21 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
23 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
24 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26 * OTHER DEALINGS IN THE SOFTWARE.
27 */
28#pragma once
29#include "quantum.h"
30#include "spi_master.h"
31
32// Set defaults if they're not set
33#ifndef MAX7219_LOAD
34# define MAX7219_LOAD B0
35#endif
36
37#ifndef MAX7219_CONTROLLERS
38# define MAX7219_CONTROLLERS 4
39#endif
40
41#ifndef MAX7219_LED_INTENSITY
42# define MAX7219_LED_INTENSITY 1
43#endif
44
45#ifndef MAX7219_SCROLL_TIME
46# define MAX7219_SCROLL_TIME 100
47#endif
48
49#ifndef MAX7219_BUFFER_MULTIPLIER
50# define MAX7219_BUFFER_MULTIPLIER 24
51#endif
52
53#if !defined(MAX7219_LED_TEST) && !defined(MAX7219_LED_ITERATE) && !defined(MAX7219_LED_DANCE) && !defined(MAX7219_LED_FONTTEST) && !defined(MAX7219_LED_CLUEBOARD) && !defined(MAX7219_LED_KONAMI) && !defined(MAX7219_LED_QMK_POWERED) && !defined(MAX7219_DRAWING_TOY_MODE) && !defined(MAX7219_LED_CUSTOM)
54# define MAX7219_QMK_POWERED
55#endif
56
57// Configure our MAX7219's
58#define MAX_BYTES MAX7219_CONTROLLERS * 2
59#define LED_COUNT MAX7219_CONTROLLERS * 64
60#define MAX7219_BUFFER_SIZE MAX7219_CONTROLLERS*MAX7219_BUFFER_MULTIPLIER
61
62// Opcodes for the MAX7219
63#define OP_DECODEMODE 9
64#define OP_INTENSITY 10
65#define OP_SCANLIMIT 11
66#define OP_SHUTDOWN 12
67#define OP_DISPLAYTEST 15
68
69// Datastructures
70extern uint8_t max7219_led_a[8][MAX7219_BUFFER_SIZE];
71extern bool max7219_led_scrolling;
72
73// Functions
74void max7219_write(int device_num, volatile uint8_t opcode, volatile uint8_t data);
75void max7219_write_all(void);
76void max7219_write_frame(void);
77void max7219_clear_display(void);
78void max7219_display_test(int device_num, bool enabled);
79void max7219_init(void);
80void max7219_message_sign(uint8_t message[][6], size_t message_len);
81void max7219_message_sign_task(bool loop_message);
82void max7219_set_decode_mode(int device_num, int mode);
83void max7219_set_intensity(int device_num, int intensity);
84void max7219_set_led(int row, int column, bool state);
85void max7219_set_all_leds(uint8_t led_matrix[LED_COUNT]);
86void max7219_set_scan_limit(int device_num, int limit);
87void max7219_shutdown(int device_num, bool is_in_shutdown);
diff --git a/keyboards/clueboard/2x1800/2021/readme.md b/keyboards/clueboard/2x1800/2021/readme.md
new file mode 100644
index 000000000..97d536740
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/readme.md
@@ -0,0 +1,17 @@
1# Clueboard 2x1800
2
3Clueboard 2x1800 LED Sign Edition
4
5* Keyboard Maintainer: [Zach White](https://github.com/skullydazed)
6* Hardware Supported: Clueboard 2x1800 PCB
7* Hardware Availability: 2021 Apr 1 Group Buy
8
9Make example for this keyboard:
10
11 make clueboard/2x1800/2021:default
12
13Flashing example for this keyboard:
14
15 make clueboard/2x1800/2021:default:flash
16
17See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/clueboard/2x1800/2021/rules.mk b/keyboards/clueboard/2x1800/2021/rules.mk
new file mode 100644
index 000000000..e9f44d7bd
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2021/rules.mk
@@ -0,0 +1 @@
QUANTUM_LIB_SRC += max7219.c spi_master.c