diff options
Diffstat (limited to 'main')
| -rw-r--r-- | main/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | main/atascii.h | 130 | ||||
| -rw-r--r-- | main/main.c | 128 |
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); + } +} |
