aboutsummaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/CMakeLists.txt2
-rw-r--r--main/atascii.h130
-rw-r--r--main/main.c128
3 files changed, 260 insertions, 0 deletions
diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt
new file mode 100644
index 0000000..cf2c455
--- /dev/null
+++ b/main/CMakeLists.txt
@@ -0,0 +1,2 @@
+idf_component_register(SRCS "main.c"
+ INCLUDE_DIRS ".")
diff --git a/main/atascii.h b/main/atascii.h
new file mode 100644
index 0000000..6404ff1
--- /dev/null
+++ b/main/atascii.h
@@ -0,0 +1,130 @@
+const uint8_t atascii_font [][8] = {
+ {0x00, 0x36, 0x7f, 0x7f, 0x3e, 0x1c, 0x08, 0x00}, // 00
+ {0x18, 0x18, 0x18, 0x1f, 0x1f, 0x18, 0x18, 0x18}, // 01
+ {0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03}, // 02
+ {0x18, 0x18, 0x18, 0xf8, 0xf8, 0x00, 0x00, 0x00}, // 03
+ {0x18, 0x18, 0x18, 0xf8, 0xf8, 0x18, 0x18, 0x18}, // 04
+ {0x00, 0x00, 0x00, 0xf8, 0xf8, 0x18, 0x18, 0x18}, // 05
+ {0x03, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xc0}, // 06
+ {0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x07, 0x03}, // 07
+ {0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff}, // 08
+ {0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f}, // 09
+ {0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff}, // 0A
+ {0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 0B
+ {0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00}, // 0C
+ {0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 0D
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff}, // 0E
+ {0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0}, // 0F
+ {0x00, 0x1c, 0x1c, 0x77, 0x77, 0x08, 0x1c, 0x00}, // 10
+ {0x00, 0x00, 0x00, 0x1f, 0x1f, 0x18, 0x18, 0x18}, // 11
+ {0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00}, // 12
+ {0x18, 0x18, 0x18, 0xff, 0xff, 0x18, 0x18, 0x18}, // 13
+ {0x00, 0x00, 0x3c, 0x7e, 0x7e, 0x7e, 0x3c, 0x00}, // 14
+ {0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff}, // 15
+ {0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0}, // 16
+ {0x00, 0x00, 0x00, 0xff, 0xff, 0x18, 0x18, 0x18}, // 17
+ {0x18, 0x18, 0x18, 0xff, 0xff, 0x00, 0x00, 0x00}, // 18
+ {0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0}, // 19
+ {0x18, 0x18, 0x18, 0x1f, 0x1f, 0x00, 0x00, 0x00}, // 1A
+ {0x78, 0x60, 0x78, 0x60, 0x7e, 0x18, 0x1e, 0x00}, // 1B
+ {0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x00}, // 1C
+ {0x00, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00}, // 1D
+ {0x00, 0x18, 0x30, 0x7e, 0x30, 0x18, 0x00, 0x00}, // 1E
+ {0x00, 0x18, 0x0c, 0x7e, 0x0c, 0x18, 0x00, 0x00}, // 1F
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 20
+ {0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00}, // 21
+ {0x00, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00}, // 22
+ {0x00, 0x66, 0xff, 0x66, 0x66, 0xff, 0x66, 0x00}, // 23
+ {0x18, 0x3e, 0x60, 0x3c, 0x06, 0x7c, 0x18, 0x00}, // 24
+ {0x00, 0x66, 0x6c, 0x18, 0x30, 0x66, 0x46, 0x00}, // 25
+ {0x1c, 0x36, 0x1c, 0x38, 0x6f, 0x66, 0x3b, 0x00}, // 26
+ {0x00, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}, // 27
+ {0x00, 0x0e, 0x1c, 0x18, 0x18, 0x1c, 0x0e, 0x00}, // 28
+ {0x00, 0x70, 0x38, 0x18, 0x18, 0x38, 0x70, 0x00}, // 29
+ {0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00}, // 2A
+ {0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00}, // 2B
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30}, // 2C
+ {0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00}, // 2D
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00}, // 2E
+ {0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x40, 0x00}, // 2F
+ {0x00, 0x3c, 0x66, 0x6e, 0x76, 0x66, 0x3c, 0x00}, // 30
+ {0x00, 0x18, 0x38, 0x18, 0x18, 0x18, 0x7e, 0x00}, // 31
+ {0x00, 0x3c, 0x66, 0x0c, 0x18, 0x30, 0x7e, 0x00}, // 32
+ {0x00, 0x7e, 0x0c, 0x18, 0x0c, 0x66, 0x3c, 0x00}, // 33
+ {0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0x7e, 0x0c, 0x00}, // 34
+ {0x00, 0x7e, 0x60, 0x7c, 0x06, 0x66, 0x3c, 0x00}, // 35
+ {0x00, 0x3c, 0x60, 0x7c, 0x66, 0x66, 0x3c, 0x00}, // 36
+ {0x00, 0x7e, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x00}, // 37
+ {0x00, 0x3c, 0x66, 0x3c, 0x66, 0x66, 0x3c, 0x00}, // 38
+ {0x00, 0x3c, 0x66, 0x3e, 0x06, 0x0c, 0x38, 0x00}, // 39
+ {0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00}, // 3A
+ {0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x30}, // 3B
+ {0x06, 0x0c, 0x18, 0x30, 0x18, 0x0c, 0x06, 0x00}, // 3C
+ {0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00}, // 3D
+ {0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00}, // 3E
+ {0x00, 0x3c, 0x66, 0x0c, 0x18, 0x00, 0x18, 0x00}, // 3F
+ {0x00, 0x3c, 0x66, 0x6e, 0x6e, 0x60, 0x3e, 0x00}, // 40
+ {0x00, 0x18, 0x3c, 0x66, 0x66, 0x7e, 0x66, 0x00}, // 41
+ {0x00, 0x7c, 0x66, 0x7c, 0x66, 0x66, 0x7c, 0x00}, // 42
+ {0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x00}, // 43
+ {0x00, 0x78, 0x6c, 0x66, 0x66, 0x6c, 0x78, 0x00}, // 44
+ {0x00, 0x7e, 0x60, 0x7c, 0x60, 0x60, 0x7e, 0x00}, // 45
+ {0x00, 0x7e, 0x60, 0x7c, 0x60, 0x60, 0x60, 0x00}, // 46
+ {0x00, 0x3e, 0x60, 0x60, 0x6e, 0x66, 0x3e, 0x00}, // 47
+ {0x00, 0x66, 0x66, 0x7e, 0x66, 0x66, 0x66, 0x00}, // 48
+ {0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x00}, // 49
+ {0x00, 0x06, 0x06, 0x06, 0x06, 0x66, 0x3c, 0x00}, // 4A
+ {0x00, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x00}, // 4B
+ {0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7e, 0x00}, // 4C
+ {0x00, 0x63, 0x77, 0x7f, 0x6b, 0x63, 0x63, 0x00}, // 4D
+ {0x00, 0x66, 0x76, 0x7e, 0x7e, 0x6e, 0x66, 0x00}, // 4E
+ {0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00}, // 4F
+ {0x00, 0x7c, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x00}, // 50
+ {0x00, 0x3c, 0x66, 0x66, 0x66, 0x6c, 0x36, 0x00}, // 51
+ {0x00, 0x7c, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x00}, // 52
+ {0x00, 0x3c, 0x60, 0x3c, 0x06, 0x06, 0x3c, 0x00}, // 53
+ {0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00}, // 54
+ {0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x00}, // 55
+ {0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00}, // 56
+ {0x00, 0x63, 0x63, 0x6b, 0x7f, 0x77, 0x63, 0x00}, // 57
+ {0x00, 0x66, 0x66, 0x3c, 0x3c, 0x66, 0x66, 0x00}, // 58
+ {0x00, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x00}, // 59
+ {0x00, 0x7e, 0x0c, 0x18, 0x30, 0x60, 0x7e, 0x00}, // 5A
+ {0x00, 0x1e, 0x18, 0x18, 0x18, 0x18, 0x1e, 0x00}, // 5B
+ {0x00, 0x40, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x00}, // 5C
+ {0x00, 0x78, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00}, // 5D
+ {0x00, 0x08, 0x1c, 0x36, 0x63, 0x00, 0x00, 0x00}, // 5E
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00}, // 5F
+ {0x00, 0x18, 0x3c, 0x7e, 0x7e, 0x3c, 0x18, 0x00}, // 60
+ {0x00, 0x00, 0x3c, 0x06, 0x3e, 0x66, 0x3e, 0x00}, // 61
+ {0x00, 0x60, 0x60, 0x7c, 0x66, 0x66, 0x7c, 0x00}, // 62
+ {0x00, 0x00, 0x3c, 0x60, 0x60, 0x60, 0x3c, 0x00}, // 63
+ {0x00, 0x06, 0x06, 0x3e, 0x66, 0x66, 0x3e, 0x00}, // 64
+ {0x00, 0x00, 0x3c, 0x66, 0x7e, 0x60, 0x3c, 0x00}, // 65
+ {0x00, 0x0e, 0x18, 0x3e, 0x18, 0x18, 0x18, 0x00}, // 66
+ {0x00, 0x00, 0x3e, 0x66, 0x66, 0x3e, 0x06, 0x7c}, // 67
+ {0x00, 0x60, 0x60, 0x7c, 0x66, 0x66, 0x66, 0x00}, // 68
+ {0x00, 0x18, 0x00, 0x38, 0x18, 0x18, 0x3c, 0x00}, // 69
+ {0x00, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x3c}, // 6A
+ {0x00, 0x60, 0x60, 0x6c, 0x78, 0x6c, 0x66, 0x00}, // 6B
+ {0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00}, // 6C
+ {0x00, 0x00, 0x66, 0x7f, 0x7f, 0x6b, 0x63, 0x00}, // 6D
+ {0x00, 0x00, 0x7c, 0x66, 0x66, 0x66, 0x66, 0x00}, // 6E
+ {0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x00}, // 6F
+ {0x00, 0x00, 0x7c, 0x66, 0x66, 0x7c, 0x60, 0x60}, // 70
+ {0x00, 0x00, 0x3e, 0x66, 0x66, 0x3e, 0x06, 0x06}, // 71
+ {0x00, 0x00, 0x7c, 0x66, 0x60, 0x60, 0x60, 0x00}, // 72
+ {0x00, 0x00, 0x3e, 0x60, 0x3c, 0x06, 0x7c, 0x00}, // 73
+ {0x00, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x0e, 0x00}, // 74
+ {0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3e, 0x00}, // 75
+ {0x00, 0x00, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00}, // 76
+ {0x00, 0x00, 0x63, 0x6b, 0x7f, 0x3e, 0x36, 0x00}, // 77
+ {0x00, 0x00, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0x00}, // 78
+ {0x00, 0x00, 0x66, 0x66, 0x66, 0x3e, 0x0c, 0x78}, // 79
+ {0x00, 0x00, 0x7e, 0x0c, 0x18, 0x30, 0x7e, 0x00}, // 7A
+ {0x00, 0x18, 0x3c, 0x7e, 0x7e, 0x18, 0x3c, 0x00}, // 7B
+ {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}, // 7C
+ {0x00, 0x7e, 0x78, 0x7c, 0x6e, 0x66, 0x06, 0x00}, // 7D
+ {0x08, 0x18, 0x38, 0x78, 0x38, 0x18, 0x08, 0x00}, // 7E
+ {0x10, 0x18, 0x1c, 0x1e, 0x1c, 0x18, 0x10, 0x00} // 7F
+};
diff --git a/main/main.c b/main/main.c
new file mode 100644
index 0000000..5ffcb6d
--- /dev/null
+++ b/main/main.c
@@ -0,0 +1,128 @@
+#include <stdio.h>
+#include <string.h>
+
+#include "driver/spi_master.h"
+#include "driver/gpio.h"
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+#include "atascii.h"
+#include "esp_log.h"
+
+
+#define NUM_COL 160
+#define NUM_ROW 8
+#define CHAR_HEIGHT 8
+#define CHAR_WIDTH 8
+#define RED 1
+#define GREEN 2
+#define ORANGE 3
+
+#define PIN_NUM_MISO 12
+#define PIN_NUM_MOSI 13
+#define PIN_NUM_CLK 14
+#define PIN_NUM_CS 15
+#define PIN_NUM_R_LATCH 16
+#define PIN_NUM_R_CLK 17
+#define PIN_NUM_R_ADDR_0 5
+#define PIN_NUM_R_ADDR_1 18
+#define PIN_NUM_R_ADDR_2 19
+
+#define TAG "led_display"
+
+static uint16_t pattern[NUM_ROW][NUM_COL / 8]; // each column is two bits, so 8 can fit in 16-bit integer
+
+void draw_char_at_position(char character, uint16_t col_start, uint16_t row_start, uint16_t color) {
+ uint8_t cur_char_row;
+ for(int row = row_start; (row - row_start) < CHAR_HEIGHT && row < NUM_ROW; row++) {
+ cur_char_row = atascii_font[(uint8_t) character][row - row_start];
+ for(int col = col_start; (col - col_start) < CHAR_WIDTH && col < NUM_COL; col++) {
+ pattern[row][col / 8] = (pattern[row][col / 8] & ~(0b0000000000000011 << (2 * (col - col_start)))); // clear this column (note the bitwise inversion)
+ if((1 << (col - col_start)) & cur_char_row) {
+ pattern[row][col / 8] = ((pattern[row][col / 8]) | color << (2 * (col - col_start))); // write color to column
+ }
+ }
+ }
+}
+
+void app_main(void)
+{
+ esp_err_t ret;
+ spi_device_handle_t spi;
+
+ spi_bus_config_t buscfg={
+ .miso_io_num=PIN_NUM_MISO,
+ .mosi_io_num=PIN_NUM_MOSI,
+ .sclk_io_num=PIN_NUM_CLK,
+ .quadwp_io_num=-1,
+ .quadhd_io_num=-1,
+ .max_transfer_sz=3*600*2*8,
+ .flags=SPICOMMON_BUSFLAG_DUAL
+ };
+
+ spi_device_interface_config_t devcfg={
+ .clock_speed_hz=1*1000*1000, //Clock out at 1 MHz
+ .mode=0, //SPI mode 0
+ .spics_io_num=PIN_NUM_CS, //CS pin
+ .queue_size=7, //We want to be able to queue 7 transactions at a time
+ .flags=SPI_DEVICE_HALFDUPLEX, //Needed to use both data lines for output
+ };
+
+ //Initialize the SPI bus and attach our device handle
+ ret=spi_bus_initialize(HSPI_HOST, &buscfg, SPI_DMA_CH_AUTO);
+ ESP_ERROR_CHECK(ret);
+ ret=spi_bus_add_device(HSPI_HOST, &devcfg, &spi);
+ ESP_ERROR_CHECK(ret);
+
+ ESP_LOGI(TAG, "Initialized SPI host.");
+
+ gpio_set_direction(PIN_NUM_R_LATCH, GPIO_MODE_OUTPUT);
+ gpio_set_direction(PIN_NUM_R_CLK, GPIO_MODE_OUTPUT);
+ gpio_set_direction(PIN_NUM_R_ADDR_0, GPIO_MODE_OUTPUT);
+ gpio_set_direction(PIN_NUM_R_ADDR_1, GPIO_MODE_OUTPUT);
+ gpio_set_direction(PIN_NUM_R_ADDR_2, GPIO_MODE_OUTPUT);
+
+ ESP_LOGI(TAG, "Setup GPIO.");
+
+ char* text = "Hello World!! 1234567890";
+ for(int i = 0; i < strlen(text); i++) {
+ draw_char_at_position(text[i], i * CHAR_WIDTH, 0, RED);
+ }
+
+ ESP_LOG_BUFFER_HEX(TAG, pattern[0], 16);
+ ESP_LOG_BUFFER_HEX(TAG, pattern[1], 16);
+ ESP_LOG_BUFFER_HEX(TAG, pattern[2], 16);
+ ESP_LOG_BUFFER_HEX(TAG, pattern[3], 16);
+ ESP_LOG_BUFFER_HEX(TAG, pattern[4], 16);
+ ESP_LOG_BUFFER_HEX(TAG, pattern[5], 16);
+ ESP_LOG_BUFFER_HEX(TAG, pattern[6], 16);
+ ESP_LOG_BUFFER_HEX(TAG, pattern[7], 16);
+
+ ESP_LOGI(TAG, "Done drawing pattern.");
+
+ uint8_t current_row = 0;
+ while(true) {
+ spi_transaction_t t;
+ memset(&t, 0, sizeof(t));
+ t.length = NUM_COL;
+ t.tx_buffer = pattern[current_row];
+ t.flags = SPI_TRANS_MODE_DIO; // output on two data lines. Even bits go to GREEN, odd to RED
+ ret = spi_device_polling_transmit(spi, &t);
+ ESP_ERROR_CHECK(ret);
+
+ gpio_set_level(PIN_NUM_R_LATCH, 0);
+ gpio_set_level(PIN_NUM_R_CLK, 1);
+
+ gpio_set_level(PIN_NUM_R_ADDR_0, 1 & current_row);
+ gpio_set_level(PIN_NUM_R_ADDR_1, 1 & (current_row >> 1));
+ gpio_set_level(PIN_NUM_R_ADDR_2, 1 & (current_row >> 2));
+
+ gpio_set_level(PIN_NUM_R_LATCH, 1);
+ gpio_set_level(PIN_NUM_R_CLK, 0);
+
+ if(++current_row == NUM_ROW) {
+ current_row = 0;
+ }
+
+ vTaskDelay((10) / portTICK_PERIOD_MS);
+ }
+}