gui-framework
Ondřej Hruška 4 years ago
parent b241ee9873
commit 0353b96303
Signed by: MightyPork
GPG Key ID: 2C5FD5035250423D
  1. 2
      main/CMakeLists.txt
  2. 40
      main/app_main.c
  3. 59
      main/gui.c
  4. 10
      main/gui.h
  5. 54
      main/hello_world_main.c
  6. 136
      main/knob.c
  7. 7
      main/knob.h
  8. 372
      main/nokia.c

@ -1,4 +1,4 @@
set(COMPONENT_SRCS "hello_world_main.c" "nokia.c")
set(COMPONENT_SRCS "app_main.c" "nokia.c" "knob.c" "gui.c")
set(COMPONENT_ADD_INCLUDEDIRS "")
register_component()

@ -0,0 +1,40 @@
/* Hello World Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "nokia.h"
#include "knob.h"
#include "gui.h"
void __attribute__((noreturn)) app_main()
{
printf("Hello world!\n");
gpio_config_t output = {
.pin_bit_mask = (1<<22),
.mode = GPIO_MODE_OUTPUT
};
gpio_config(&output);
gui_init();
knob_init();
bool level = 0;
while (1) {
vTaskDelay(pdMS_TO_TICKS(1000));
gpio_set_level(22, level);
level ^= 1;
}
}

@ -0,0 +1,59 @@
#include "gui.h"
#include "nokia.h"
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
static void gui_thread(void *arg);
TaskHandle_t hGuiThread = NULL;
void gui_init() {
printf("GUI init\n");
LCD_setup();
LCD_clearDisplay(0);
LCD_setStr("Hello World", 0, 0, 1);
LCD_updateDisplay();
int rv = xTaskCreate(gui_thread, "gui", 4096, NULL, 3, &hGuiThread);
assert (rv == pdPASS);
}
static void __attribute__((noreturn)) gui_thread(void *arg) {
uint32_t pos = 20;
#define NMAX 60
while (1) {
uint32_t value;
xTaskNotifyWait(0, ULONG_MAX, &value, portMAX_DELAY);
printf("Knob event 0x%02x ", value);
switch (value) {
case 0b100:
printf("PUSH |");
break;
case 0b010:
printf("BACK |");
if (pos == 0) {
pos = NMAX;
} else {
pos--;
}
break;
case 0b001:
printf("FWD |");
if (pos == NMAX) {
pos = 0;
} else {
pos += 1;
}
break;
}
for (int i=0; i<pos; i++) {
printf(" ");
}
printf("#\n");
}
}

@ -0,0 +1,10 @@
#ifndef GUI_H
#define GUI_H
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
extern TaskHandle_t hGuiThread;
void gui_init();
#endif //GUI_H

@ -1,54 +0,0 @@
/* Hello World Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "nokia.h"
void app_main()
{
printf("Hello world!\n");
/* Print chip information */
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
printf("This is ESP32 chip with %d CPU cores, WiFi%s%s, ",
chip_info.cores,
(chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
(chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");
printf("silicon revision %d, ", chip_info.revision);
printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
LCD_setup();
for (int i = 5; i >= 0; i--) {
printf("Restarting in %d seconds...\n", i);
LCD_clearDisplay(0);
LCD_setStr("Hello World", 0, 0, 1);
LCD_setStr("Driver stolen from Arduino now on ESP32", 0, 10, 1);
LCD_setRect(0,LCD_HEIGHT-12,LCD_WIDTH, LCD_HEIGHT-1, 1, 1);
char buf[25];
sprintf(buf, "Reboot in %d s", i);
LCD_setStr(buf, 4, LCD_HEIGHT - 10, 0);
LCD_updateDisplay();
vTaskDelay(900 / portTICK_PERIOD_MS);
}
printf("Restarting now.\n");
fflush(stdout);
esp_restart();
}

@ -0,0 +1,136 @@
#include <driver/gpio.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include "knob.h"
#include "gui.h"
const int pushPin = 5;
const int wheelPin1 = 18;
const int wheelPin2 = 23;
static void handle_pushbtn(void *arg);
static void handle_wheel(void *arg);
void knob_init() {
printf("Knob init\n");
gpio_config_t output = {
.pin_bit_mask = (1<<pushPin) | (1 << wheelPin1) | (1 << wheelPin2),
.mode = GPIO_MODE_INPUT,
.pull_up_en = 1,
.intr_type = GPIO_INTR_ANYEDGE,
};
gpio_config(&output);
gpio_install_isr_service(0);
gpio_intr_enable(pushPin);
gpio_intr_enable(wheelPin1);
gpio_intr_enable(wheelPin2);
gpio_isr_handler_add(pushPin, handle_pushbtn, (void *)0);
gpio_isr_handler_add(wheelPin1, handle_wheel, (void *)0);
gpio_isr_handler_add(wheelPin2, handle_wheel, (void *)1);
}
enum state {
S_11 = 0,
S_FWD_1_01 = 1,
S_FWD_2_00 = 2,
S_FWD_3_10 = 3,
S_BCK_1_10 = 4,
S_BCK_2_00 = 5,
S_BCK_3_01 = 6,
S_ILLEGAL = 7,
};
#define SW_FWD 0b10000000
#define SW_BCK 0b01000000
static enum state wheelState = S_11;
const uint8_t switch_table[28] = {
/* -- S_11 -- */
S_ILLEGAL, /* 00 ILLEGAL */
S_FWD_1_01, /* 01 ADVANCE */
S_BCK_1_10, /* 10 BACK */
S_11, /* 11 */
/* -- S_FWD_1_01 -- */
S_FWD_2_00, /* 00 ADVANCE */
S_FWD_1_01, /* 01 */
S_ILLEGAL, /* 10 ILLEGAL */
S_11, /* 11 ABORT */
/* -- S_FWD_2_00 -- */
S_FWD_2_00, /* 00 */
S_FWD_1_01, /* 01 ABORT */
S_FWD_3_10, /* 10 ADVANCE */
S_ILLEGAL, /* 11 ILLEGAL */
/* -- S_FWD_3_10 -- */
S_FWD_2_00, /* 00 ABORT */
S_ILLEGAL, /* 01 ILLEGAL */
S_FWD_3_10, /* 10 */
SW_FWD | S_11, /* 11 ADVANCE */
/* -- S_BCK_1_10 -- */
S_BCK_2_00, /* 00 ADVANCE */
S_ILLEGAL, /* 01 ILLEGAL */
S_BCK_1_10, /* 10 */
S_11, /* 11 ABORT */
/* -- S_BCK_2_00 -- */
S_BCK_2_00, /* 00 */
S_BCK_3_01, /* 01 */
S_BCK_1_10, /* 10 ABORT */
S_ILLEGAL, /* 11 */
/* -- S_BCK_3_01 -- */
S_BCK_2_00, /* 00 */
S_BCK_3_01, /* 01 */
S_ILLEGAL, /* 10 */
SW_BCK | S_11, /* 11 */
};
static void handle_wheel(void *arg) {
const uint32_t inputs = gpio_input_get();
const uint8_t ab =
(((inputs >> wheelPin2) & 1) << 1) |
((inputs >> wheelPin1) & 1);
if (wheelState == S_ILLEGAL) {
if (ab != 0b11) {
return;
}
}
uint8_t next = switch_table[wheelState*4 + ab];
const bool forward = next & SW_FWD;
const bool backward = next & SW_BCK;
next &= ~(SW_FWD | SW_BCK);
wheelState = next;
if (forward || backward) {
BaseType_t higherWoken = 0;
xTaskNotifyFromISR(hGuiThread, forward | (backward << 1), eSetValueWithOverwrite, &higherWoken);
if (higherWoken) {
portYIELD_FROM_ISR();
}
}
}
static void handle_pushbtn(void *arg) {
const uint32_t inputs = gpio_input_get();
if ((inputs & (1 << pushPin)) == 0) {
BaseType_t higherWoken = 0;
xTaskNotifyFromISR(hGuiThread, 0b100, eSetValueWithOverwrite, &higherWoken);
if (higherWoken) {
portYIELD_FROM_ISR();
}
}
}

@ -0,0 +1,7 @@
#ifndef KNOB_H
#define KNOB_H
void knob_init();
#endif //KNOB_H

@ -18,6 +18,8 @@ static const int sclkPin = 13; // SCLK - Serial clock, pin 7 on LCD.
#define LCD_COMMAND 0
#define LCD_DATA 1
#define DEFAULT_CONTRAST 48
static spi_device_handle_t hSPI;
/* Font table:
@ -28,197 +30,102 @@ per character. */
static const uint8_t ASCII[][5] = {
// First 32 characters (0x00-0x19) are ignored. These are
// non-displayable, control characters.
{0x00, 0x00, 0x00, 0x00, 0x00} // 0x20
,
{0x00, 0x00, 0x5f, 0x00, 0x00} // 0x21 !
,
{0x00, 0x07, 0x00, 0x07, 0x00} // 0x22 "
,
{0x14, 0x7f, 0x14, 0x7f, 0x14} // 0x23 #
,
{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 0x24 $
,
{0x23, 0x13, 0x08, 0x64, 0x62} // 0x25 %
,
{0x36, 0x49, 0x55, 0x22, 0x50} // 0x26 &
,
{0x00, 0x05, 0x03, 0x00, 0x00} // 0x27 '
,
{0x00, 0x1c, 0x22, 0x41, 0x00} // 0x28 (
,
{0x00, 0x41, 0x22, 0x1c, 0x00} // 0x29 )
,
{0x14, 0x08, 0x3e, 0x08, 0x14} // 0x2a *
,
{0x08, 0x08, 0x3e, 0x08, 0x08} // 0x2b +
,
{0x00, 0x50, 0x30, 0x00, 0x00} // 0x2c ,
,
{0x08, 0x08, 0x08, 0x08, 0x08} // 0x2d -
,
{0x00, 0x60, 0x60, 0x00, 0x00} // 0x2e .
,
{0x20, 0x10, 0x08, 0x04, 0x02} // 0x2f /
,
{0x3e, 0x51, 0x49, 0x45, 0x3e} // 0x30 0
,
{0x00, 0x42, 0x7f, 0x40, 0x00} // 0x31 1
,
{0x42, 0x61, 0x51, 0x49, 0x46} // 0x32 2
,
{0x21, 0x41, 0x45, 0x4b, 0x31} // 0x33 3
,
{0x18, 0x14, 0x12, 0x7f, 0x10} // 0x34 4
,
{0x27, 0x45, 0x45, 0x45, 0x39} // 0x35 5
,
{0x3c, 0x4a, 0x49, 0x49, 0x30} // 0x36 6
,
{0x01, 0x71, 0x09, 0x05, 0x03} // 0x37 7
,
{0x36, 0x49, 0x49, 0x49, 0x36} // 0x38 8
,
{0x06, 0x49, 0x49, 0x29, 0x1e} // 0x39 9
,
{0x00, 0x36, 0x36, 0x00, 0x00} // 0x3a :
,
{0x00, 0x56, 0x36, 0x00, 0x00} // 0x3b ;
,
{0x08, 0x14, 0x22, 0x41, 0x00} // 0x3c <
,
{0x14, 0x14, 0x14, 0x14, 0x14} // 0x3d =
,
{0x00, 0x41, 0x22, 0x14, 0x08} // 0x3e >
,
{0x02, 0x01, 0x51, 0x09, 0x06} // 0x3f ?
,
{0x32, 0x49, 0x79, 0x41, 0x3e} // 0x40 @
,
{0x7e, 0x11, 0x11, 0x11, 0x7e} // 0x41 A
,
{0x7f, 0x49, 0x49, 0x49, 0x36} // 0x42 B
,
{0x3e, 0x41, 0x41, 0x41, 0x22} // 0x43 C
,
{0x7f, 0x41, 0x41, 0x22, 0x1c} // 0x44 D
,
{0x7f, 0x49, 0x49, 0x49, 0x41} // 0x45 E
,
{0x7f, 0x09, 0x09, 0x09, 0x01} // 0x46 F
,
{0x3e, 0x41, 0x49, 0x49, 0x7a} // 0x47 G
,
{0x7f, 0x08, 0x08, 0x08, 0x7f} // 0x48 H
,
{0x00, 0x41, 0x7f, 0x41, 0x00} // 0x49 I
,
{0x20, 0x40, 0x41, 0x3f, 0x01} // 0x4a J
,
{0x7f, 0x08, 0x14, 0x22, 0x41} // 0x4b K
,
{0x7f, 0x40, 0x40, 0x40, 0x40} // 0x4c L
,
{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 0x4d M
,
{0x7f, 0x04, 0x08, 0x10, 0x7f} // 0x4e N
,
{0x3e, 0x41, 0x41, 0x41, 0x3e} // 0x4f O
,
{0x7f, 0x09, 0x09, 0x09, 0x06} // 0x50 P
,
{0x3e, 0x41, 0x51, 0x21, 0x5e} // 0x51 Q
,
{0x7f, 0x09, 0x19, 0x29, 0x46} // 0x52 R
,
{0x46, 0x49, 0x49, 0x49, 0x31} // 0x53 S
,
{0x01, 0x01, 0x7f, 0x01, 0x01} // 0x54 T
,
{0x3f, 0x40, 0x40, 0x40, 0x3f} // 0x55 U
,
{0x1f, 0x20, 0x40, 0x20, 0x1f} // 0x56 V
,
{0x3f, 0x40, 0x38, 0x40, 0x3f} // 0x57 W
,
{0x63, 0x14, 0x08, 0x14, 0x63} // 0x58 X
,
{0x07, 0x08, 0x70, 0x08, 0x07} // 0x59 Y
,
{0x61, 0x51, 0x49, 0x45, 0x43} // 0x5a Z
,
{0x00, 0x7f, 0x41, 0x41, 0x00} // 0x5b [
,
{0x02, 0x04, 0x08, 0x10, 0x20} // 0x5c \ (keep this to escape the backslash)
,
{0x00, 0x41, 0x41, 0x7f, 0x00} // 0x5d ]
,
{0x04, 0x02, 0x01, 0x02, 0x04} // 0x5e ^
,
{0x40, 0x40, 0x40, 0x40, 0x40} // 0x5f _
,
{0x00, 0x01, 0x02, 0x04, 0x00} // 0x60 `
,
{0x20, 0x54, 0x54, 0x54, 0x78} // 0x61 a
,
{0x7f, 0x48, 0x44, 0x44, 0x38} // 0x62 b
,
{0x38, 0x44, 0x44, 0x44, 0x20} // 0x63 c
,
{0x38, 0x44, 0x44, 0x48, 0x7f} // 0x64 d
,
{0x38, 0x54, 0x54, 0x54, 0x18} // 0x65 e
,
{0x08, 0x7e, 0x09, 0x01, 0x02} // 0x66 f
,
{0x0c, 0x52, 0x52, 0x52, 0x3e} // 0x67 g
,
{0x7f, 0x08, 0x04, 0x04, 0x78} // 0x68 h
,
{0x00, 0x44, 0x7d, 0x40, 0x00} // 0x69 i
,
{0x20, 0x40, 0x44, 0x3d, 0x00} // 0x6a j
,
{0x7f, 0x10, 0x28, 0x44, 0x00} // 0x6b k
,
{0x00, 0x41, 0x7f, 0x40, 0x00} // 0x6c l
,
{0x7c, 0x04, 0x18, 0x04, 0x78} // 0x6d m
,
{0x7c, 0x08, 0x04, 0x04, 0x78} // 0x6e n
,
{0x38, 0x44, 0x44, 0x44, 0x38} // 0x6f o
,
{0x7c, 0x14, 0x14, 0x14, 0x08} // 0x70 p
,
{0x08, 0x14, 0x14, 0x18, 0x7c} // 0x71 q
,
{0x7c, 0x08, 0x04, 0x04, 0x08} // 0x72 r
,
{0x48, 0x54, 0x54, 0x54, 0x20} // 0x73 s
,
{0x04, 0x3f, 0x44, 0x40, 0x20} // 0x74 t
,
{0x3c, 0x40, 0x40, 0x20, 0x7c} // 0x75 u
,
{0x1c, 0x20, 0x40, 0x20, 0x1c} // 0x76 v
,
{0x3c, 0x40, 0x30, 0x40, 0x3c} // 0x77 w
,
{0x44, 0x28, 0x10, 0x28, 0x44} // 0x78 x
,
{0x0c, 0x50, 0x50, 0x50, 0x3c} // 0x79 y
,
{0x44, 0x64, 0x54, 0x4c, 0x44} // 0x7a z
,
{0x00, 0x08, 0x36, 0x41, 0x00} // 0x7b {
,
{0x00, 0x00, 0x7f, 0x00, 0x00} // 0x7c |
,
{0x00, 0x41, 0x36, 0x08, 0x00} // 0x7d }
,
{0x10, 0x08, 0x08, 0x10, 0x08} // 0x7e ~
,
{0x78, 0x46, 0x41, 0x46, 0x78} // 0x7f DEL
{0x00, 0x00, 0x00, 0x00, 0x00}, // 0x20
{0x00, 0x00, 0x5f, 0x00, 0x00}, // 0x21 !
{0x00, 0x07, 0x00, 0x07, 0x00}, // 0x22 "
{0x14, 0x7f, 0x14, 0x7f, 0x14}, // 0x23 #
{0x24, 0x2a, 0x7f, 0x2a, 0x12}, // 0x24 $
{0x23, 0x13, 0x08, 0x64, 0x62}, // 0x25 %
{0x36, 0x49, 0x55, 0x22, 0x50}, // 0x26 &
{0x00, 0x05, 0x03, 0x00, 0x00}, // 0x27 '
{0x00, 0x1c, 0x22, 0x41, 0x00}, // 0x28 (
{0x00, 0x41, 0x22, 0x1c, 0x00}, // 0x29 )
{0x14, 0x08, 0x3e, 0x08, 0x14}, // 0x2a *
{0x08, 0x08, 0x3e, 0x08, 0x08}, // 0x2b +
{0x00, 0x50, 0x30, 0x00, 0x00}, // 0x2c ,
{0x08, 0x08, 0x08, 0x08, 0x08}, // 0x2d -
{0x00, 0x60, 0x60, 0x00, 0x00}, // 0x2e .
{0x20, 0x10, 0x08, 0x04, 0x02}, // 0x2f /
{0x3e, 0x51, 0x49, 0x45, 0x3e}, // 0x30 0
{0x00, 0x42, 0x7f, 0x40, 0x00}, // 0x31 1
{0x42, 0x61, 0x51, 0x49, 0x46}, // 0x32 2
{0x21, 0x41, 0x45, 0x4b, 0x31}, // 0x33 3
{0x18, 0x14, 0x12, 0x7f, 0x10}, // 0x34 4
{0x27, 0x45, 0x45, 0x45, 0x39}, // 0x35 5
{0x3c, 0x4a, 0x49, 0x49, 0x30}, // 0x36 6
{0x01, 0x71, 0x09, 0x05, 0x03}, // 0x37 7
{0x36, 0x49, 0x49, 0x49, 0x36}, // 0x38 8
{0x06, 0x49, 0x49, 0x29, 0x1e}, // 0x39 9
{0x00, 0x36, 0x36, 0x00, 0x00}, // 0x3a :
{0x00, 0x56, 0x36, 0x00, 0x00}, // 0x3b ;
{0x08, 0x14, 0x22, 0x41, 0x00}, // 0x3c <
{0x14, 0x14, 0x14, 0x14, 0x14}, // 0x3d =
{0x00, 0x41, 0x22, 0x14, 0x08}, // 0x3e >
{0x02, 0x01, 0x51, 0x09, 0x06}, // 0x3f ?
{0x32, 0x49, 0x79, 0x41, 0x3e}, // 0x40 @
{0x7e, 0x11, 0x11, 0x11, 0x7e}, // 0x41 A
{0x7f, 0x49, 0x49, 0x49, 0x36}, // 0x42 B
{0x3e, 0x41, 0x41, 0x41, 0x22}, // 0x43 C
{0x7f, 0x41, 0x41, 0x22, 0x1c}, // 0x44 D
{0x7f, 0x49, 0x49, 0x49, 0x41}, // 0x45 E
{0x7f, 0x09, 0x09, 0x09, 0x01}, // 0x46 F
{0x3e, 0x41, 0x49, 0x49, 0x7a}, // 0x47 G
{0x7f, 0x08, 0x08, 0x08, 0x7f}, // 0x48 H
{0x00, 0x41, 0x7f, 0x41, 0x00}, // 0x49 I
{0x20, 0x40, 0x41, 0x3f, 0x01}, // 0x4a J
{0x7f, 0x08, 0x14, 0x22, 0x41}, // 0x4b K
{0x7f, 0x40, 0x40, 0x40, 0x40}, // 0x4c L
{0x7f, 0x02, 0x0c, 0x02, 0x7f}, // 0x4d M
{0x7f, 0x04, 0x08, 0x10, 0x7f}, // 0x4e N
{0x3e, 0x41, 0x41, 0x41, 0x3e}, // 0x4f O
{0x7f, 0x09, 0x09, 0x09, 0x06}, // 0x50 P
{0x3e, 0x41, 0x51, 0x21, 0x5e}, // 0x51 Q
{0x7f, 0x09, 0x19, 0x29, 0x46}, // 0x52 R
{0x46, 0x49, 0x49, 0x49, 0x31}, // 0x53 S
{0x01, 0x01, 0x7f, 0x01, 0x01}, // 0x54 T
{0x3f, 0x40, 0x40, 0x40, 0x3f}, // 0x55 U
{0x1f, 0x20, 0x40, 0x20, 0x1f}, // 0x56 V
{0x3f, 0x40, 0x38, 0x40, 0x3f}, // 0x57 W
{0x63, 0x14, 0x08, 0x14, 0x63}, // 0x58 X
{0x07, 0x08, 0x70, 0x08, 0x07}, // 0x59 Y
{0x61, 0x51, 0x49, 0x45, 0x43}, // 0x5a Z
{0x00, 0x7f, 0x41, 0x41, 0x00}, // 0x5b [
{0x02, 0x04, 0x08, 0x10, 0x20}, // 0x5c \ (keep this to escape the backslash)
{0x00, 0x41, 0x41, 0x7f, 0x00}, // 0x5d ]
{0x04, 0x02, 0x01, 0x02, 0x04}, // 0x5e ^
{0x40, 0x40, 0x40, 0x40, 0x40}, // 0x5f _
{0x00, 0x01, 0x02, 0x04, 0x00}, // 0x60 `
{0x20, 0x54, 0x54, 0x54, 0x78}, // 0x61 a
{0x7f, 0x48, 0x44, 0x44, 0x38}, // 0x62 b
{0x38, 0x44, 0x44, 0x44, 0x20}, // 0x63 c
{0x38, 0x44, 0x44, 0x48, 0x7f}, // 0x64 d
{0x38, 0x54, 0x54, 0x54, 0x18}, // 0x65 e
{0x08, 0x7e, 0x09, 0x01, 0x02}, // 0x66 f
{0x0c, 0x52, 0x52, 0x52, 0x3e}, // 0x67 g
{0x7f, 0x08, 0x04, 0x04, 0x78}, // 0x68 h
{0x00, 0x44, 0x7d, 0x40, 0x00}, // 0x69 i
{0x20, 0x40, 0x44, 0x3d, 0x00}, // 0x6a j
{0x7f, 0x10, 0x28, 0x44, 0x00}, // 0x6b k
{0x00, 0x41, 0x7f, 0x40, 0x00}, // 0x6c l
{0x7c, 0x04, 0x18, 0x04, 0x78}, // 0x6d m
{0x7c, 0x08, 0x04, 0x04, 0x78}, // 0x6e n
{0x38, 0x44, 0x44, 0x44, 0x38}, // 0x6f o
{0x7c, 0x14, 0x14, 0x14, 0x08}, // 0x70 p
{0x08, 0x14, 0x14, 0x18, 0x7c}, // 0x71 q
{0x7c, 0x08, 0x04, 0x04, 0x08}, // 0x72 r
{0x48, 0x54, 0x54, 0x54, 0x20}, // 0x73 s
{0x04, 0x3f, 0x44, 0x40, 0x20}, // 0x74 t
{0x3c, 0x40, 0x40, 0x20, 0x7c}, // 0x75 u
{0x1c, 0x20, 0x40, 0x20, 0x1c}, // 0x76 v
{0x3c, 0x40, 0x30, 0x40, 0x3c}, // 0x77 w
{0x44, 0x28, 0x10, 0x28, 0x44}, // 0x78 x
{0x0c, 0x50, 0x50, 0x50, 0x3c}, // 0x79 y
{0x44, 0x64, 0x54, 0x4c, 0x44}, // 0x7a z
{0x00, 0x08, 0x36, 0x41, 0x00}, // 0x7b {
{0x00, 0x00, 0x7f, 0x00, 0x00}, // 0x7c |
{0x00, 0x41, 0x36, 0x08, 0x00}, // 0x7d }
{0x10, 0x08, 0x08, 0x10, 0x08}, // 0x7e ~
{0x78, 0x46, 0x41, 0x46, 0x78}, // 0x7f DEL
};
/* The displayMap variable stores a buffer representation of the
@ -235,50 +142,7 @@ to the PCD8544.
Because the PCD8544 won't let us write individual pixels at a
time, this is how we can make targeted changes to the display. */
static uint8_t displayMap[LCD_WIDTH * LCD_HEIGHT / 8] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,0)->(11,7) ~ These 12 bytes cover an 8x12 block in the left corner of the display
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,0)->(23,7)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, // (24,0)->(35,7)
0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0x1E, 0x0E, 0x02, 0x00, // (36,0)->(47,7)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (48,0)->(59,7)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,0)->(71,7)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,0)->(83,7)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,8)->(11,15)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,8)->(23,15)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // (24,8)->(35,15)
0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, // (36,8)->(47,15)
0xF8, 0xF0, 0xF8, 0xFE, 0xFE, 0xFC, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, // (48,8)->(59,15)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,8)->(71,15)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,8)->(83,15)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,16)->(11,23)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,16)->(23,23)
0x00, 0x00, 0xF8, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xF3, 0xE0, 0xE0, 0xC0, // (24,16)->(35,23)
0xC0, 0xC0, 0xE0, 0xE0, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // (36,16)->(47,23)
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0x00, 0x00, 0x00, // (48,16)->(59,23)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,16)->(71,23)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,16)->(83,23)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,24)->(11,31)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,24)->(23,31)
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // (24,24)->(35,31)
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // (36,24)->(47,31)
0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, // (48,24)->(59,31)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,24)->(71,31)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,24)->(83,31)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,32)->(11,39)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,32)->(23,39)
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, // (24,32)->(35,39)
0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, // (36,32)->(47,39)
0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (48,32)->(59,39)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,32)->(71,39)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,32)->(83,39)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,40)->(11,47)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,40)->(23,47)
0x00, 0x00, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, // (24,40)->(35,47)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (36,40)->(47,47)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (48,40)->(59,47)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,40)->(71,47)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,40)->(83,47) !!! The bottom right pixel!
};
static uint8_t displayMap[LCD_WIDTH * LCD_HEIGHT / 8];
// There are two memory banks in the LCD, data/RAM and commands.
// This function sets the DC pin high or low depending, and then
@ -583,6 +447,9 @@ void lcd_spi_pre_transfer_callback(spi_transaction_t *t)
//This sends the magical commands to the PCD8544
void LCD_setup(void)
{
// clear the display array
LCD_clearDisplay(0);
gpio_config_t output = {
.pin_bit_mask = (1<<scePin) | (1<<rstPin) | (1<<dcPin) | (1<<sdinPin) | (1<<sclkPin),
.mode = GPIO_MODE_OUTPUT
@ -617,23 +484,26 @@ void LCD_setup(void)
ESP_ERROR_CHECK(ret);
spi_device_acquire_bus(hSPI, portMAX_DELAY);
//Reset the LCD to a known state
gpio_set_level(rstPin, 0);
gpio_set_level(rstPin, 1);
const uint8_t magic[6] = {
0x21, // Tell LCD extended commands follow
0x80 + 40, // Set LCD Vop (Contrast)
0x04, // Set Temp coefficent
0x14, // LCD bias mode 1:48 (try 0x13)
//We must send 0x20 before modifying the display control mode
0x20, // Clear extended option
0x0C, // Set display control, normal mode.
};
LCD_SendBytes(LCD_COMMAND, &magic[0], 6);
{
//Reset the LCD to a known state
gpio_set_level(rstPin, 0);
gpio_set_level(rstPin, 1);
const uint8_t magic[6] = {
0x21, // Tell LCD extended commands follow
0x80 + DEFAULT_CONTRAST, // Set LCD Vop (Contrast)
0x04, // Set Temp coefficent
0x14, // LCD bias mode 1:48 (try 0x13)
//We must send 0x20 before modifying the display control mode
0x20, // Clear extended option
0x0C, // Set display control, normal mode.
};
LCD_SendBytes(LCD_COMMAND, &magic[0], 6);
}
spi_device_release_bus(hSPI);
// show the blank screen (display is in indefined state after boot)
LCD_updateDisplay();
}

Loading…
Cancel
Save