mirror of
https://github.com/esp8266/Arduino.git
synced 2025-06-16 11:21:18 +03:00
Merge pull request #206 from Links2004/esp8266
rework Adafruit_ILI9341 complete now work with the new SPI implementation
This commit is contained in:
BIN
docs/esp8266_tcp_active_close.png
Normal file
BIN
docs/esp8266_tcp_active_close.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 130 KiB |
@ -1,232 +0,0 @@
|
||||
#include "Adafruit_ILI9341.h"
|
||||
#include "Adafruit_GFX.h"
|
||||
|
||||
extern "C"{
|
||||
#include <ets_sys.h>
|
||||
#include <os_type.h>
|
||||
#include <osapi.h>
|
||||
#include "driver/hspi.h"
|
||||
}
|
||||
|
||||
#define SWAPBYTES(i) ((i>>8) | (i<<8))
|
||||
|
||||
void Adafruit_ILI9341::transmitCmdData(uint8_t cmd, const uint8_t *data, uint8_t numDataByte)
|
||||
{
|
||||
spi_wait_ready();
|
||||
TFT_DC_COMMAND;
|
||||
spi_send_uint8(cmd);
|
||||
spi_wait_ready();
|
||||
TFT_DC_DATA;
|
||||
spi_send_data(data, numDataByte);
|
||||
}
|
||||
|
||||
void Adafruit_ILI9341::begin() {
|
||||
//Set communication using HW SPI Port
|
||||
config = spi_init(HSPI, 1, spi_mode_tx);
|
||||
TFT_DC_INIT;
|
||||
delay(1);
|
||||
|
||||
uint8_t data[15] = {0};
|
||||
|
||||
data[0] = 0x39;
|
||||
data[1] = 0x2C;
|
||||
data[2] = 0x00;
|
||||
data[3] = 0x34;
|
||||
data[4] = 0x02;
|
||||
transmitCmdData(0xCB, data, 5);
|
||||
|
||||
data[0] = 0x00;
|
||||
data[1] = 0XC1;
|
||||
data[2] = 0X30;
|
||||
transmitCmdData(0xCF, data, 3);
|
||||
|
||||
data[0] = 0x85;
|
||||
data[1] = 0x00;
|
||||
data[2] = 0x78;
|
||||
transmitCmdData(0xE8, data, 3);
|
||||
|
||||
data[0] = 0x00;
|
||||
data[1] = 0x00;
|
||||
transmitCmdData(0xEA, data, 2);
|
||||
|
||||
data[0] = 0x64;
|
||||
data[1] = 0x03;
|
||||
data[2] = 0X12;
|
||||
data[3] = 0X81;
|
||||
transmitCmdData(0xED, data, 4);
|
||||
|
||||
data[0] = 0x20;
|
||||
transmitCmdData(0xF7, data, 1);
|
||||
|
||||
data[0] = 0x23; //VRH[5:0]
|
||||
transmitCmdData(0xC0, data, 1); //Power control
|
||||
|
||||
data[0] = 0x10; //SAP[2:0];BT[3:0]
|
||||
transmitCmdData(0xC1, data, 1); //Power control
|
||||
|
||||
data[0] = 0x3e; //Contrast
|
||||
data[1] = 0x28;
|
||||
transmitCmdData(0xC5, data, 2); //VCM control
|
||||
|
||||
data[0] = 0x86; //--
|
||||
transmitCmdData(0xC7, data, 1); //VCM control2
|
||||
|
||||
data[0] = 0x48; //C8
|
||||
transmitCmdData(0x36, data, 1); // Memory Access Control
|
||||
|
||||
data[0] = 0x55;
|
||||
transmitCmdData(0x3A, data, 1);
|
||||
|
||||
data[0] = 0x00;
|
||||
data[1] = 0x18;
|
||||
transmitCmdData(0xB1, data, 2);
|
||||
|
||||
data[0] = 0x08;
|
||||
data[1] = 0x82;
|
||||
data[2] = 0x27;
|
||||
transmitCmdData(0xB6, data, 3); // Display Function Control
|
||||
|
||||
data[0] = 0x00;
|
||||
transmitCmdData(0xF2, data, 1); // 3Gamma Function Disable
|
||||
|
||||
data[0] = 0x01;
|
||||
transmitCmdData(0x26, data, 1); //Gamma curve selected
|
||||
|
||||
data[0] = 0x0F;
|
||||
data[1] = 0x31;
|
||||
data[2] = 0x2B;
|
||||
data[3] = 0x0C;
|
||||
data[4] = 0x0E;
|
||||
data[5] = 0x08;
|
||||
data[6] = 0x4E;
|
||||
data[7] = 0xF1;
|
||||
data[8] = 0x37;
|
||||
data[9] = 0x07;
|
||||
data[10] = 0x10;
|
||||
data[11] = 0x03;
|
||||
data[12] = 0x0E;
|
||||
data[13] = 0x09;
|
||||
data[14] = 0x00;
|
||||
transmitCmdData(0xE0, data, 15); //Set Gamma
|
||||
|
||||
data[0] = 0x00;
|
||||
data[1] = 0x0E;
|
||||
data[2] = 0x14;
|
||||
data[3] = 0x03;
|
||||
data[4] = 0x11;
|
||||
data[5] = 0x07;
|
||||
data[6] = 0x31;
|
||||
data[7] = 0xC1;
|
||||
data[8] = 0x48;
|
||||
data[9] = 0x08;
|
||||
data[10] = 0x0F;
|
||||
data[11] = 0x0C;
|
||||
data[12] = 0x31;
|
||||
data[13] = 0x36;
|
||||
data[14] = 0x0F;
|
||||
transmitCmdData(0xE1, data, 15); //Set Gamma
|
||||
|
||||
transmitCmd(0x11); //Exit Sleep
|
||||
delay(120);
|
||||
|
||||
transmitCmd(0x29); //Display on
|
||||
transmitCmd(0x2c);
|
||||
spi_wait_ready();
|
||||
}
|
||||
|
||||
void Adafruit_ILI9341::drawPixel(int16_t x, int16_t y, uint16_t color) {
|
||||
|
||||
if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
|
||||
setAddrWindow(x,y,x+1,y+1);
|
||||
transmitData(SWAPBYTES(color));
|
||||
}
|
||||
|
||||
|
||||
void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h,
|
||||
uint16_t color) {
|
||||
|
||||
// Rudimentary clipping
|
||||
if((x >= _width) || (y >= _height)) return;
|
||||
|
||||
if((y+h-1) >= _height)
|
||||
h = _height-y;
|
||||
|
||||
setAddrWindow(x, y, x, y+h-1);
|
||||
transmitData(SWAPBYTES(color), h);
|
||||
}
|
||||
|
||||
void Adafruit_ILI9341::drawFastHLine(int16_t x, int16_t y, int16_t w,
|
||||
uint16_t color) {
|
||||
|
||||
// Rudimentary clipping
|
||||
if((x >= _width) || (y >= _height)) return;
|
||||
if((x+w-1) >= _width) w = _width-x;
|
||||
setAddrWindow(x, y, x+w-1, y);
|
||||
transmitData(SWAPBYTES(color), w);
|
||||
}
|
||||
|
||||
void Adafruit_ILI9341::fillScreen(uint16_t color) {
|
||||
fillRect(0, 0, _width, _height, color);
|
||||
}
|
||||
|
||||
// fill a rectangle
|
||||
void Adafruit_ILI9341::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
|
||||
uint16_t color) {
|
||||
|
||||
// rudimentary clipping (drawChar w/big text requires this)
|
||||
if((x >= _width) || (y >= _height)) return;
|
||||
if((x + w - 1) >= _width) w = _width - x;
|
||||
if((y + h - 1) >= _height) h = _height - y;
|
||||
|
||||
setAddrWindow(x, y, x+w-1, y+h-1);
|
||||
transmitData(SWAPBYTES(color), h*w);
|
||||
}
|
||||
|
||||
|
||||
// Pass 8-bit (each) R,G,B, get back 16-bit packed color
|
||||
uint16_t Adafruit_ILI9341::color565(uint8_t r, uint8_t g, uint8_t b) {
|
||||
return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
|
||||
}
|
||||
|
||||
|
||||
#define MADCTL_MY 0x80
|
||||
#define MADCTL_MX 0x40
|
||||
#define MADCTL_MV 0x20
|
||||
#define MADCTL_ML 0x10
|
||||
#define MADCTL_RGB 0x00
|
||||
#define MADCTL_BGR 0x08
|
||||
#define MADCTL_MH 0x04
|
||||
|
||||
void Adafruit_ILI9341::setRotation(uint8_t m) {
|
||||
|
||||
uint8_t data;
|
||||
rotation = m % 4; // can't be higher than 3
|
||||
switch (rotation) {
|
||||
case 0:
|
||||
data = MADCTL_MX | MADCTL_BGR;
|
||||
_width = ILI9341_TFTWIDTH;
|
||||
_height = ILI9341_TFTHEIGHT;
|
||||
break;
|
||||
case 1:
|
||||
data = MADCTL_MV | MADCTL_BGR;
|
||||
_width = ILI9341_TFTHEIGHT;
|
||||
_height = ILI9341_TFTWIDTH;
|
||||
break;
|
||||
case 2:
|
||||
data = MADCTL_MY | MADCTL_BGR;
|
||||
_width = ILI9341_TFTWIDTH;
|
||||
_height = ILI9341_TFTHEIGHT;
|
||||
break;
|
||||
case 3:
|
||||
data = MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR;
|
||||
_width = ILI9341_TFTHEIGHT;
|
||||
_height = ILI9341_TFTWIDTH;
|
||||
break;
|
||||
}
|
||||
transmitCmdData(ILI9341_MADCTL, &data, 1);
|
||||
}
|
||||
|
||||
|
||||
void Adafruit_ILI9341::invertDisplay(boolean i) {
|
||||
transmitCmd(i ? ILI9341_INVON : ILI9341_INVOFF);
|
||||
}
|
@ -1,126 +0,0 @@
|
||||
#ifndef _ADAFRUIT_ILI9341H_
|
||||
#define _ADAFRUIT_ILI9341H_
|
||||
|
||||
#include "Adafruit_GFX.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
#include <c_types.h>
|
||||
#include <osapi.h>
|
||||
#include <gpio.h>
|
||||
#include "driver/hspi.h"
|
||||
}
|
||||
|
||||
#define ILI9341_TFTWIDTH 240
|
||||
#define ILI9341_TFTHEIGHT 320
|
||||
|
||||
#define ILI9341_NOP 0x00
|
||||
#define ILI9341_SWRESET 0x01
|
||||
#define ILI9341_RDDID 0x04
|
||||
#define ILI9341_RDDST 0x09
|
||||
|
||||
#define ILI9341_SLPIN 0x10
|
||||
#define ILI9341_SLPOUT 0x11
|
||||
#define ILI9341_PTLON 0x12
|
||||
#define ILI9341_NORON 0x13
|
||||
|
||||
#define ILI9341_RDMODE 0x0A
|
||||
#define ILI9341_RDMADCTL 0x0B
|
||||
#define ILI9341_RDPIXFMT 0x0C
|
||||
#define ILI9341_RDIMGFMT 0x0A
|
||||
#define ILI9341_RDSELFDIAG 0x0F
|
||||
|
||||
#define ILI9341_INVOFF 0x20
|
||||
#define ILI9341_INVON 0x21
|
||||
#define ILI9341_GAMMASET 0x26
|
||||
#define ILI9341_DISPOFF 0x28
|
||||
#define ILI9341_DISPON 0x29
|
||||
|
||||
#define ILI9341_CASET 0x2A
|
||||
#define ILI9341_PASET 0x2B
|
||||
#define ILI9341_RAMWR 0x2C
|
||||
#define ILI9341_RAMRD 0x2E
|
||||
|
||||
#define ILI9341_PTLAR 0x30
|
||||
#define ILI9341_MADCTL 0x36
|
||||
#define ILI9341_PIXFMT 0x3A
|
||||
|
||||
#define ILI9341_FRMCTR1 0xB1
|
||||
#define ILI9341_FRMCTR2 0xB2
|
||||
#define ILI9341_FRMCTR3 0xB3
|
||||
#define ILI9341_INVCTR 0xB4
|
||||
#define ILI9341_DFUNCTR 0xB6
|
||||
|
||||
#define ILI9341_PWCTR1 0xC0
|
||||
#define ILI9341_PWCTR2 0xC1
|
||||
#define ILI9341_PWCTR3 0xC2
|
||||
#define ILI9341_PWCTR4 0xC3
|
||||
#define ILI9341_PWCTR5 0xC4
|
||||
#define ILI9341_VMCTR1 0xC5
|
||||
#define ILI9341_VMCTR2 0xC7
|
||||
|
||||
#define ILI9341_RDID1 0xDA
|
||||
#define ILI9341_RDID2 0xDB
|
||||
#define ILI9341_RDID3 0xDC
|
||||
#define ILI9341_RDID4 0xDD
|
||||
|
||||
#define ILI9341_GMCTRP1 0xE0
|
||||
#define ILI9341_GMCTRN1 0xE1
|
||||
/*
|
||||
#define ILI9341_PWCTR6 0xFC
|
||||
|
||||
*/
|
||||
|
||||
// Color definitions
|
||||
#define ILI9341_BLACK 0x0000
|
||||
#define ILI9341_BLUE 0x001F
|
||||
#define ILI9341_RED 0xF800
|
||||
#define ILI9341_GREEN 0x07E0
|
||||
#define ILI9341_CYAN 0x07FF
|
||||
#define ILI9341_MAGENTA 0xF81F
|
||||
#define ILI9341_YELLOW 0xFFE0
|
||||
#define ILI9341_WHITE 0xFFFF
|
||||
|
||||
#define TFT_DC_DATA GPIO_OUTPUT_SET(2, 1)
|
||||
#define TFT_DC_COMMAND GPIO_OUTPUT_SET(2, 0)
|
||||
#define TFT_DC_INIT PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2); TFT_DC_DATA
|
||||
|
||||
#define MAKEWORD(b1, b2, b3, b4) (uint32_t(b1) | ((b2) << 8) | ((b3) << 16) | ((b4) << 24))
|
||||
#define SWAPBYTES(i) ((i>>8) | (i<<8))
|
||||
|
||||
class Adafruit_ILI9341 : public Adafruit_GFX {
|
||||
|
||||
private:
|
||||
uint8_t tabcolor;
|
||||
spi_config config;
|
||||
void transmitCmdData(uint8_t cmd, const uint8_t *data, uint8_t numDataByte);
|
||||
inline void transmitData(uint16_t data) {spi_wait_ready(); spi_send_uint16(data);}
|
||||
inline void transmitCmdData(uint8_t cmd, uint32_t data) {spi_wait_ready(); TFT_DC_COMMAND; spi_send_uint8(cmd); spi_wait_ready(); TFT_DC_DATA; spi_send_uint32(data);}
|
||||
inline void transmitData(uint16_t data, int32_t repeats){spi_wait_ready(); spi_send_uint16_r(data, repeats);}
|
||||
inline void transmitCmd(uint8_t cmd){spi_wait_ready(); TFT_DC_COMMAND; spi_send_uint8(cmd);spi_wait_ready(); TFT_DC_DATA;}
|
||||
inline void drawPixelInternal(int16_t x, int16_t y, uint16_t color) { if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
|
||||
setAddrWindow(x,y,x+1,y+1);
|
||||
transmitData(SWAPBYTES(color));
|
||||
}
|
||||
|
||||
public:
|
||||
Adafruit_ILI9341() : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT), tabcolor(0){}
|
||||
|
||||
void begin(),
|
||||
fillScreen(uint16_t color),
|
||||
drawPixel(int16_t x, int16_t y, uint16_t color),
|
||||
drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color),
|
||||
drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color),
|
||||
fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
|
||||
uint16_t color),
|
||||
setRotation(uint8_t r),
|
||||
invertDisplay(boolean i);
|
||||
inline void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1)
|
||||
{ transmitCmdData(ILI9341_CASET, MAKEWORD(x0 >> 8, x0 & 0xFF, x1 >> 8, x1 & 0xFF));
|
||||
transmitCmdData(ILI9341_PASET, MAKEWORD(y0 >> 8, y0 & 0xFF, y1 >> 8, y1 & 0xFF));
|
||||
transmitCmd(ILI9341_RAMWR); // write to RAM
|
||||
}
|
||||
uint16_t color565(uint8_t r, uint8_t g, uint8_t b);
|
||||
};
|
||||
|
||||
#endif
|
@ -1,525 +0,0 @@
|
||||
// Font size 2
|
||||
|
||||
#include "Font16.h"
|
||||
|
||||
const unsigned char widtbl_f16[96] = // character width table
|
||||
{
|
||||
5, 2, 3, 8, 7, 8, 8, 2, // char 32 - 39
|
||||
6, 6, 7, 5, 2, 5, 4, 6, // char 40 - 47
|
||||
7, 7, 7, 7, 7, 7, 7, 7, // char 48 - 55
|
||||
7, 7, 2, 2, 5, 5, 5, 7, // char 56 - 63
|
||||
8, 7, 7, 7, 7, 7, 7, 7, // char 64 - 71
|
||||
6, 3, 7, 7, 6, 9, 7, 7, // char 72 - 79
|
||||
7, 7, 7, 7, 7, 7, 7, 9, // char 80 - 87
|
||||
7, 7, 7, 3, 6, 3, 16, 16, // char 88 - 95
|
||||
3, 6, 6, 6, 6, 6, 5, 6, // char 96 - 103
|
||||
6, 4, 4, 5, 4, 7, 6, 7, // char 104 - 111
|
||||
6, 7, 5, 5, 4, 6, 7, 7, // char 112 - 119
|
||||
5, 6, 6, 11, 16, 8, 2, 13 // char 120 - 127
|
||||
};
|
||||
|
||||
// Row format, MSB left
|
||||
|
||||
const unsigned char chr_f16_20[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
|
||||
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_21[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11
|
||||
0x00, 0x40, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_22[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0xA0, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
|
||||
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_23[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x24, 0x24, 0x24, 0xFF, 0x24, 0x24, 0xFF, 0x24, // row 1 - 11
|
||||
0x24, 0x24, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_24[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x70, 0x40, 0x40, // row 1 - 11
|
||||
0x40, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_25[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x61, 0x91, 0x92, 0x64, 0x08, 0x10, 0x26, 0x49, // row 1 - 11
|
||||
0x89, 0x86, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_26[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x20, 0x50, 0x88, 0x88, 0x50, 0x20, 0x52, 0x8C, // row 1 - 11
|
||||
0x8C, 0x73, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_27[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
|
||||
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_28[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x0C, 0x10, 0x20, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11
|
||||
0x40, 0x40, 0x20, 0x10, 0x0C // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_29[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0xC0, 0x20, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, // row 1 - 11
|
||||
0x08, 0x08, 0x10, 0x20, 0xC0 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_2A[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x10, 0x92, 0x54, 0x38, 0x54, 0x92, 0x10, // row 1 - 11
|
||||
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_2B[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0xF8, 0x20, 0x20, // row 1 - 11
|
||||
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_2C[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
|
||||
0xC0, 0xC0, 0x40, 0x80, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_2D[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, // row 1 - 11
|
||||
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_2E[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
|
||||
0xC0, 0xC0, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_2F[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, // row 1 - 11
|
||||
0x40, 0x80, 0x80, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_30[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x82, 0x82, 0x82, 0x82, 0x44, // row 1 - 11
|
||||
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_31[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x10, 0x30, 0x50, 0x10, 0x10, 0x10, 0x10, 0x10, // row 1 - 11
|
||||
0x10, 0x7C, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_32[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x02, 0x04, 0x18, 0x20, 0x40, // row 1 - 11
|
||||
0x80, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_33[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x78, 0x84, 0x02, 0x04, 0x38, 0x04, 0x02, 0x02, // row 1 - 11
|
||||
0x84, 0x78, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_34[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x04, 0x0C, 0x14, 0x24, 0x44, 0x84, 0xFE, 0x04, // row 1 - 11
|
||||
0x04, 0x04, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_35[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0xFC, 0x80, 0x80, 0x80, 0xF8, 0x04, 0x02, 0x02, // row 1 - 11
|
||||
0x84, 0x78, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_36[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x3C, 0x40, 0x80, 0x80, 0xB8, 0xC4, 0x82, 0x82, // row 1 - 11
|
||||
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_37[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x7E, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, // row 1 - 11
|
||||
0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_38[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x44, 0x38, 0x44, 0x82, 0x82, // row 1 - 11
|
||||
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_39[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x46, 0x3A, 0x02, 0x02, // row 1 - 11
|
||||
0x04, 0x78, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_3A[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, // row 1 - 11
|
||||
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_3B[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, // row 1 - 11
|
||||
0x40, 0x80, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_3C[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x40, 0x20, // row 1 - 11
|
||||
0x10, 0x08, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_3D[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xF8, 0x00, // row 1 - 11
|
||||
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_3E[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x10, 0x20, // row 1 - 11
|
||||
0x40, 0x80, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_3F[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x02, 0x04, 0x08, 0x10, 0x10, // row 1 - 11
|
||||
0x00, 0x10, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_40[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x3C, 0x42, 0x99, 0xA5, 0xA5, 0xA5, 0xA5, 0x9E, // row 1 - 11
|
||||
0x40, 0x3E, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_41[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x10, 0x10, 0x28, 0x28, 0x44, 0x44, 0x7C, 0x82, // row 1 - 11
|
||||
0x82, 0x82, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_42[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x84, 0xF8, 0x84, 0x82, 0x82, // row 1 - 11
|
||||
0x84, 0xF8, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_43[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x3C, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11
|
||||
0x42, 0x3C, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_44[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11
|
||||
0x84, 0xF8, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_45[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0xFE, 0x80, 0x80, 0x80, 0xFC, 0x80, 0x80, 0x80, // row 1 - 11
|
||||
0x80, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_46[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0xFE, 0x80, 0x80, 0x80, 0xF8, 0x80, 0x80, 0x80, // row 1 - 11
|
||||
0x80, 0x80, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_47[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x3C, 0x42, 0x80, 0x80, 0x80, 0x9C, 0x82, 0x82, // row 1 - 11
|
||||
0x42, 0x3C, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_48[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0xFC, 0x84, 0x84, 0x84, // row 1 - 11
|
||||
0x84, 0x84, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_49[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11
|
||||
0x40, 0xE0, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_4A[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x82, // row 1 - 11
|
||||
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_4B[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x84, 0x88, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x88, // row 1 - 11
|
||||
0x84, 0x82, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_4C[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11
|
||||
0x80, 0xFC, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_4D[32] = // 2 unsigned chars per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x80, 0xC1, 0x80, 0xA2, 0x80, // row 1 - 6
|
||||
0xA2, 0x80, 0x94, 0x80, 0x94, 0x80, 0x88, 0x80, 0x88, 0x80, 0x80, 0x80, // row 7 - 12
|
||||
0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 13 - 16
|
||||
};
|
||||
const unsigned char chr_f16_4E[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0xC2, 0xC2, 0xA2, 0xA2, 0x92, 0x92, 0x8A, 0x8A, // row 1 - 11
|
||||
0x86, 0x86, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_4F[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11
|
||||
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_50[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x82, 0x82, 0x84, 0xF8, 0x80, // row 1 - 11
|
||||
0x80, 0x80, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_51[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11
|
||||
0x44, 0x38, 0x08, 0x06, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_52[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x82, 0x84, 0xF8, 0x90, 0x88, // row 1 - 11
|
||||
0x84, 0x82, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_53[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x80, 0x60, 0x1C, 0x02, 0x82, // row 1 - 11
|
||||
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_54[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // row 1 - 11
|
||||
0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_55[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11
|
||||
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_56[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x44, 0x44, 0x28, 0x28, // row 1 - 11
|
||||
0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_57[32] = // 2 unsigned chars per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 6
|
||||
0x88, 0x80, 0x88, 0x80, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x22, 0x00, // row 7 - 12
|
||||
0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 13 - 16
|
||||
};
|
||||
const unsigned char chr_f16_58[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x82, 0x82, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44, // row 1 - 11
|
||||
0x82, 0x82, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_59[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x44, 0x28, 0x10, 0x10, 0x10, // row 1 - 11
|
||||
0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_5A[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0xFE, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x40, // row 1 - 11
|
||||
0x80, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_5B[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0xE0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11
|
||||
0x80, 0x80, 0xE0, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_5C[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, // row 1 - 11
|
||||
0x40, 0x80, 0x80, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_5D[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // row 1 - 11
|
||||
0x20, 0x20, 0xE0, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_5E[32] = // 2 unsigned chars per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xDE, 0x84, 0x21, 0x84, 0x21, // row 1 - 6
|
||||
0x84, 0x21, 0x84, 0x21, 0x84, 0x21, 0x84, 0x21, 0x84, 0x21, 0x84, 0x21, // row 7 - 12
|
||||
0x84, 0x21, 0x84, 0x21, 0x00, 0x00, 0x00, 0x00 // row 13 - 16
|
||||
};
|
||||
const unsigned char chr_f16_5F[32] = // 2 unsigned chars per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0x52, 0x94, 0x4A, 0x52, // row 1 - 6
|
||||
0x84, 0x21, 0x84, 0x21, 0x08, 0x42, 0x08, 0x42, 0x10, 0x84, 0x10, 0x84, // row 7 - 12
|
||||
0x21, 0x08, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00 // row 13 - 16
|
||||
};
|
||||
const unsigned char chr_f16_60[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
|
||||
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_61[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x08, 0x04, 0x74, 0x8C, // row 1 - 11
|
||||
0x8C, 0x74, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_62[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11
|
||||
0xC8, 0xB0, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_63[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x80, 0x80, 0x80, // row 1 - 11
|
||||
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_64[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x34, 0x4C, 0x84, 0x84, 0x84, // row 1 - 11
|
||||
0x4C, 0x34, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_65[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x84, 0xF8, 0x80, // row 1 - 11
|
||||
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_66[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x30, 0x48, 0x40, 0x40, 0x40, 0xE0, 0x40, 0x40, // row 1 - 11
|
||||
0x40, 0x40, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_67[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x4C, 0x84, 0x84, 0x84, // row 1 - 11
|
||||
0x4C, 0x34, 0x04, 0x08, 0x70 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_68[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11
|
||||
0x84, 0x84, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_69[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11
|
||||
0x40, 0x40, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_6A[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, // row 1 - 11
|
||||
0x10, 0x10, 0x10, 0x90, 0x60 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_6B[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x88, 0x90, 0xA0, 0xC0, 0xA0, // row 1 - 11
|
||||
0x90, 0x88, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_6C[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11
|
||||
0x40, 0x40, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_6D[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xD2, 0x92, 0x92, 0x92, // row 1 - 11
|
||||
0x92, 0x92, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_6E[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11
|
||||
0x84, 0x84, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_6F[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, // row 1 - 11
|
||||
0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_70[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11
|
||||
0xC8, 0xB0, 0x80, 0x80, 0x80 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_71[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x4C, 0x84, 0x84, 0x84, // row 1 - 11
|
||||
0x4C, 0x34, 0x04, 0x04, 0x06 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_72[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xC8, 0x80, 0x80, 0x80, // row 1 - 11
|
||||
0x80, 0x80, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_73[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x88, 0x80, 0x70, 0x08, // row 1 - 11
|
||||
0x88, 0x70, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_74[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x40, // row 1 - 11
|
||||
0x40, 0x30, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_75[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, // row 1 - 11
|
||||
0x4C, 0x34, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_76[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x44, // row 1 - 11
|
||||
0x28, 0x10, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_77[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x92, 0x92, // row 1 - 11
|
||||
0xAA, 0x44, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_78[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x50, 0x20, 0x50, // row 1 - 11
|
||||
0x88, 0x88, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_79[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, // row 1 - 11
|
||||
0x4C, 0x34, 0x04, 0x08, 0x70 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_7A[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x04, 0x08, 0x30, 0x40, // row 1 - 11
|
||||
0x80, 0xFC, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_7B[32] = // 2 unsigned chars per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, // row 1 - 6
|
||||
0xA0, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, // row 7 - 12
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 13 - 16
|
||||
};
|
||||
const unsigned char chr_f16_7C[32] = // 2 unsigned chars per row
|
||||
{
|
||||
0x00, 0x00, 0xF0, 0x00, 0x88, 0x00, 0x88, 0x00, 0xF0, 0x00, 0xA3, 0xC0, // row 1 - 6
|
||||
0x92, 0x20, 0x8A, 0x20, 0x03, 0xC4, 0x02, 0x0A, 0x02, 0x11, 0x02, 0x11, // row 7 - 12
|
||||
0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00 // row 13 - 16
|
||||
};
|
||||
const unsigned char chr_f16_7D[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, // row 1 - 11
|
||||
0x32, 0x2C, 0x20, 0x40, 0x80 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_7E[16] = // 1 unsigned char per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
|
||||
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
|
||||
};
|
||||
const unsigned char chr_f16_7F[32] = // 2 unsigned chars per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 6
|
||||
0x00, 0x00, 0x34, 0xD0, 0x2A, 0xA8, 0x2A, 0xA8, 0x2A, 0xA8, 0x2A, 0xA8, // row 7 - 12
|
||||
0x2A, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 13 - 16
|
||||
};
|
||||
|
||||
const unsigned char* chrtbl_f16[96] = // character pointer table
|
||||
{
|
||||
chr_f16_20, chr_f16_21, chr_f16_22, chr_f16_23, chr_f16_24, chr_f16_25, chr_f16_26, chr_f16_27,
|
||||
chr_f16_28, chr_f16_29, chr_f16_2A, chr_f16_2B, chr_f16_2C, chr_f16_2D, chr_f16_2E, chr_f16_2F,
|
||||
chr_f16_30, chr_f16_31, chr_f16_32, chr_f16_33, chr_f16_34, chr_f16_35, chr_f16_36, chr_f16_37,
|
||||
chr_f16_38, chr_f16_39, chr_f16_3A, chr_f16_3B, chr_f16_3C, chr_f16_3D, chr_f16_3E, chr_f16_3F,
|
||||
chr_f16_40, chr_f16_41, chr_f16_42, chr_f16_43, chr_f16_44, chr_f16_45, chr_f16_46, chr_f16_47,
|
||||
chr_f16_48, chr_f16_49, chr_f16_4A, chr_f16_4B, chr_f16_4C, chr_f16_4D, chr_f16_4E, chr_f16_4F,
|
||||
chr_f16_50, chr_f16_51, chr_f16_52, chr_f16_53, chr_f16_54, chr_f16_55, chr_f16_56, chr_f16_57,
|
||||
chr_f16_58, chr_f16_59, chr_f16_5A, chr_f16_5B, chr_f16_5C, chr_f16_5D, chr_f16_5E, chr_f16_5F,
|
||||
chr_f16_60, chr_f16_61, chr_f16_62, chr_f16_63, chr_f16_64, chr_f16_65, chr_f16_66, chr_f16_67,
|
||||
chr_f16_68, chr_f16_69, chr_f16_6A, chr_f16_6B, chr_f16_6C, chr_f16_6D, chr_f16_6E, chr_f16_6F,
|
||||
chr_f16_70, chr_f16_71, chr_f16_72, chr_f16_73, chr_f16_74, chr_f16_75, chr_f16_76, chr_f16_77,
|
||||
chr_f16_78, chr_f16_79, chr_f16_7A, chr_f16_7B, chr_f16_7C, chr_f16_7D, chr_f16_7E, chr_f16_7F
|
||||
};
|
@ -1,7 +0,0 @@
|
||||
#define nr_chrs_f16 96
|
||||
#define chr_hgt_f16 16
|
||||
#define data_size_f16 8
|
||||
#define firstchr_f16 32
|
||||
|
||||
extern const unsigned char widtbl_f16[96];
|
||||
extern const unsigned char* chrtbl_f16[96];
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +0,0 @@
|
||||
#define nr_chrs_f32 96
|
||||
#define chr_hgt_f32 26
|
||||
#define data_size_f32 8
|
||||
#define firstchr_f32 32
|
||||
|
||||
extern const unsigned char widtbl_f32[96];
|
||||
extern const unsigned char* chrtbl_f32[96];
|
@ -1,338 +0,0 @@
|
||||
// Font size 6 is intended to display numbers and time
|
||||
// This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 . : a p m
|
||||
// The Pipe character | is a narrow space to aid formatting
|
||||
// All other characters print as a space
|
||||
|
||||
|
||||
#include "Font64.h"
|
||||
|
||||
const unsigned char widtbl_f64[96] = // character width table
|
||||
{
|
||||
15, 15, 15, 15, 15, 15, 15, 15, // char 32 - 39
|
||||
15, 15, 15, 15, 15, 15, 18, 15, // char 40 - 47
|
||||
30, 30, 30, 30, 30, 30, 30, 30, // char 48 - 55
|
||||
30, 30, 18, 15, 15, 15, 15, 15, // char 56 - 63
|
||||
15, 15, 15, 15, 15, 15, 15, 15, // char 64 - 71
|
||||
15, 15, 15, 15, 15, 15, 15, 15, // char 72 - 79
|
||||
15, 15, 15, 15, 15, 15, 15, 15, // char 80 - 87
|
||||
15, 15, 15, 15, 15, 15, 15, 15, // char 88 - 95
|
||||
15, 30, 15, 15, 15, 15, 15, 15, // char 96 - 103
|
||||
15, 15, 15, 15, 15, 45, 15, 15, // char 104 - 111
|
||||
32, 15, 15, 15, 15, 15, 15, 15, // char 112 - 119
|
||||
15, 15, 15, 15, 10, 15, 15, 15 // char 120 - 127
|
||||
};
|
||||
|
||||
// Row format, MSB left
|
||||
|
||||
const unsigned char chr_f64_20[96] = // 2 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 6
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 31 - 36
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 43 - 48
|
||||
};
|
||||
const unsigned char chr_f64_2E[144] = // 3 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 4
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 9 - 12
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 16
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 17 - 20
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 21 - 24
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 28
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, // row 29 - 32
|
||||
0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, // row 33 - 36
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 40
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 41 - 44
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 45 - 48
|
||||
};
|
||||
const unsigned char chr_f64_30[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x03, 0xFF, 0xF0, 0x00, // row 1 - 3
|
||||
0x07, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 4 - 6
|
||||
0x1F, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x3E, 0x00, 0x1F, 0x00, // row 7 - 9
|
||||
0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, // row 10 - 12
|
||||
0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 13 - 15
|
||||
0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 16 - 18
|
||||
0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 19 - 21
|
||||
0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 22 - 24
|
||||
0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x3C, 0x00, 0x0F, 0x00, // row 25 - 27
|
||||
0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x3E, 0x00, 0x1F, 0x00, // row 28 - 30
|
||||
0x1E, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 31 - 33
|
||||
0x0F, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xF0, 0x00, // row 34 - 36
|
||||
0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f64_31[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, // row 1 - 3
|
||||
0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, // row 4 - 6
|
||||
0x00, 0x0F, 0xC0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xFF, 0xC0, 0x00, // row 7 - 9
|
||||
0x07, 0xFF, 0xC0, 0x00, 0x07, 0xFB, 0xC0, 0x00, 0x07, 0xC3, 0xC0, 0x00, // row 10 - 12
|
||||
0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 13 - 15
|
||||
0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 16 - 18
|
||||
0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 19 - 21
|
||||
0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 22 - 24
|
||||
0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 25 - 27
|
||||
0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 28 - 30
|
||||
0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 31 - 33
|
||||
0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, // row 34 - 36
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f64_32[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0xF8, 0x00, // row 1 - 3
|
||||
0x03, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x07, 0xE0, 0x7F, 0x00, // row 4 - 6
|
||||
0x0F, 0x80, 0x1F, 0x00, 0x0F, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x80, // row 7 - 9
|
||||
0x1F, 0x00, 0x07, 0x80, 0x1E, 0x00, 0x07, 0x80, 0x1E, 0x00, 0x07, 0x80, // row 10 - 12
|
||||
0x1E, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x0F, 0x80, // row 13 - 15
|
||||
0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3F, 0x00, // row 16 - 18
|
||||
0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x07, 0xF8, 0x00, // row 19 - 21
|
||||
0x00, 0x1F, 0xF0, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0xFF, 0x80, 0x00, // row 22 - 24
|
||||
0x01, 0xFE, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, // row 25 - 27
|
||||
0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, // row 28 - 30
|
||||
0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0x80, // row 31 - 33
|
||||
0x3F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0x80, // row 34 - 36
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f64_33[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x03, 0xFF, 0xF0, 0x00, // row 1 - 3
|
||||
0x07, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 4 - 6
|
||||
0x1F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x1F, 0x00, // row 7 - 9
|
||||
0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, // row 10 - 12
|
||||
0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3E, 0x00, // row 13 - 15
|
||||
0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, // row 16 - 18
|
||||
0x00, 0x3F, 0xFC, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0x00, // row 19 - 21
|
||||
0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, // row 22 - 24
|
||||
0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 25 - 27
|
||||
0x7C, 0x00, 0x0F, 0x80, 0x7C, 0x00, 0x1F, 0x80, 0x3E, 0x00, 0x1F, 0x00, // row 28 - 30
|
||||
0x3F, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0xFE, 0x00, 0x0F, 0xFF, 0xFC, 0x00, // row 31 - 33
|
||||
0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x00, 0x7F, 0x80, 0x00, // row 34 - 36
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f64_34[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, // row 1 - 3
|
||||
0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x00, // row 4 - 6
|
||||
0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1E, 0xF0, 0x00, // row 7 - 9
|
||||
0x00, 0x1E, 0xF0, 0x00, 0x00, 0x3C, 0xF0, 0x00, 0x00, 0x78, 0xF0, 0x00, // row 10 - 12
|
||||
0x00, 0xF8, 0xF0, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x01, 0xE0, 0xF0, 0x00, // row 13 - 15
|
||||
0x03, 0xC0, 0xF0, 0x00, 0x07, 0xC0, 0xF0, 0x00, 0x07, 0x80, 0xF0, 0x00, // row 16 - 18
|
||||
0x0F, 0x00, 0xF0, 0x00, 0x1F, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0xF0, 0x00, // row 19 - 21
|
||||
0x3C, 0x00, 0xF0, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x7F, 0xFF, 0xFF, 0x80, // row 22 - 24
|
||||
0x7F, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xFF, 0x80, // row 25 - 27
|
||||
0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, // row 28 - 30
|
||||
0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, // row 31 - 33
|
||||
0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, // row 34 - 36
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f64_35[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFE, 0x00, // row 1 - 3
|
||||
0x07, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFE, 0x00, // row 4 - 6
|
||||
0x07, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, // row 7 - 9
|
||||
0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, // row 10 - 12
|
||||
0x0E, 0x00, 0x00, 0x00, 0x1E, 0x3F, 0xC0, 0x00, 0x1E, 0xFF, 0xF0, 0x00, // row 13 - 15
|
||||
0x1F, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0xFC, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 16 - 18
|
||||
0x1F, 0x00, 0x3F, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x00, // row 19 - 21
|
||||
0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, // row 22 - 24
|
||||
0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x07, 0x80, // row 25 - 27
|
||||
0x3C, 0x00, 0x07, 0x80, 0x3C, 0x00, 0x0F, 0x80, 0x3C, 0x00, 0x0F, 0x00, // row 28 - 30
|
||||
0x3E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 31 - 33
|
||||
0x0F, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xF0, 0x00, // row 34 - 36
|
||||
0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f64_36[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFF, 0xF0, 0x00, // row 1 - 3
|
||||
0x03, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x0F, 0xE0, 0x7E, 0x00, // row 4 - 6
|
||||
0x1F, 0x80, 0x1F, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x0F, 0x80, // row 7 - 9
|
||||
0x3E, 0x00, 0x07, 0x80, 0x3C, 0x00, 0x07, 0x80, 0x3C, 0x00, 0x00, 0x00, // row 10 - 12
|
||||
0x3C, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x3F, 0x80, 0x00, // row 13 - 15
|
||||
0x78, 0xFF, 0xF0, 0x00, 0x7B, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xFC, 0x00, // row 16 - 18
|
||||
0x7F, 0xC0, 0xFE, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0x1F, 0x00, // row 19 - 21
|
||||
0x7C, 0x00, 0x0F, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x78, 0x00, 0x07, 0x80, // row 22 - 24
|
||||
0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 25 - 27
|
||||
0x78, 0x00, 0x07, 0x80, 0x3C, 0x00, 0x0F, 0x80, 0x3C, 0x00, 0x0F, 0x00, // row 28 - 30
|
||||
0x3E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 31 - 33
|
||||
0x0F, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xF0, 0x00, // row 34 - 36
|
||||
0x00, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f64_37[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0x80, // row 1 - 3
|
||||
0x3F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0x80, // row 4 - 6
|
||||
0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1E, 0x00, // row 7 - 9
|
||||
0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF8, 0x00, // row 10 - 12
|
||||
0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, // row 13 - 15
|
||||
0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, // row 16 - 18
|
||||
0x00, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, // row 19 - 21
|
||||
0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, // row 22 - 24
|
||||
0x00, 0x7C, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, // row 25 - 27
|
||||
0x00, 0xF8, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, // row 28 - 30
|
||||
0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, // row 31 - 33
|
||||
0x01, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, // row 34 - 36
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f64_38[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x01, 0xFF, 0xE0, 0x00, // row 1 - 3
|
||||
0x07, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 4 - 6
|
||||
0x1F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x1F, 0x00, // row 7 - 9
|
||||
0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, // row 10 - 12
|
||||
0x3E, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x3E, 0x00, // row 13 - 15
|
||||
0x0F, 0xC0, 0xFC, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xF0, 0x00, // row 16 - 18
|
||||
0x07, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0x80, 0x7E, 0x00, // row 19 - 21
|
||||
0x3E, 0x00, 0x1F, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x7C, 0x00, 0x0F, 0x80, // row 22 - 24
|
||||
0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 25 - 27
|
||||
0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x7C, 0x00, 0x0F, 0x80, // row 28 - 30
|
||||
0x7C, 0x00, 0x0F, 0x80, 0x3E, 0x00, 0x1F, 0x00, 0x3F, 0x80, 0x7F, 0x00, // row 31 - 33
|
||||
0x1F, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xF8, 0x00, // row 34 - 36
|
||||
0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f64_39[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x03, 0xFF, 0xE0, 0x00, // row 1 - 3
|
||||
0x07, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xC0, 0xFE, 0x00, // row 4 - 6
|
||||
0x3F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x3C, 0x00, 0x0F, 0x00, // row 7 - 9
|
||||
0x7C, 0x00, 0x0F, 0x00, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 10 - 12
|
||||
0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, 0x78, 0x00, 0x07, 0x80, // row 13 - 15
|
||||
0x7C, 0x00, 0x0F, 0x80, 0x3C, 0x00, 0x0F, 0x80, 0x3E, 0x00, 0x1F, 0x80, // row 16 - 18
|
||||
0x1F, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0xFF, 0x80, 0x0F, 0xFF, 0xFF, 0x80, // row 19 - 21
|
||||
0x07, 0xFF, 0xF7, 0x80, 0x03, 0xFF, 0xC7, 0x80, 0x00, 0x7F, 0x07, 0x80, // row 22 - 24
|
||||
0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, // row 25 - 27
|
||||
0x78, 0x00, 0x0F, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x7C, 0x00, 0x1E, 0x00, // row 28 - 30
|
||||
0x3C, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0x1F, 0x81, 0xFC, 0x00, // row 31 - 33
|
||||
0x0F, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x03, 0xFF, 0xC0, 0x00, // row 34 - 36
|
||||
0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f64_3A[144] = // 3 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 4
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 8
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, // row 9 - 12
|
||||
0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, // row 13 - 16
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 17 - 20
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 21 - 24
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, // row 25 - 28
|
||||
0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, // row 29 - 32
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 33 - 36
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 40
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 41 - 44
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 45 - 48
|
||||
};
|
||||
const unsigned char chr_f64_61[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 3
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 4 - 6
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 9
|
||||
0x00, 0x7F, 0xC0, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFC, 0x00, // row 10 - 12
|
||||
0x07, 0xFF, 0xFE, 0x00, 0x0F, 0xC0, 0x7E, 0x00, 0x1F, 0x00, 0x1F, 0x00, // row 13 - 15
|
||||
0x1E, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x0F, 0x00, // row 16 - 18
|
||||
0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0xFF, 0x00, // row 19 - 21
|
||||
0x01, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xCF, 0x00, // row 22 - 24
|
||||
0x1F, 0xF0, 0x0F, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x3E, 0x00, 0x0F, 0x00, // row 25 - 27
|
||||
0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0x1F, 0x00, // row 28 - 30
|
||||
0x3C, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x1F, 0x01, 0xFF, 0xC0, // row 31 - 33
|
||||
0x1F, 0xFF, 0xE7, 0xC0, 0x0F, 0xFF, 0xC7, 0xC0, 0x07, 0xFF, 0x03, 0xC0, // row 34 - 36
|
||||
0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 39
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f64_6D[288] = // 6 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 2
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 3 - 4
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 5 - 6
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 8
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x1F, 0xC0, 0x00, // row 9 - 10
|
||||
0x1E, 0x3F, 0xF0, 0x7F, 0xF0, 0x00, 0x1E, 0xFF, 0xF8, 0xFF, 0xF8, 0x00, // row 11 - 12
|
||||
0x1E, 0xFF, 0xFD, 0xFF, 0xFC, 0x00, 0x1F, 0xE0, 0x7F, 0xE0, 0x7C, 0x00, // row 13 - 14
|
||||
0x1F, 0x80, 0x3F, 0x80, 0x3E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1E, 0x00, // row 15 - 16
|
||||
0x1F, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 17 - 18
|
||||
0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 19 - 20
|
||||
0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 21 - 22
|
||||
0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 23 - 24
|
||||
0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 25 - 26
|
||||
0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 27 - 28
|
||||
0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 29 - 30
|
||||
0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 31 - 32
|
||||
0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 33 - 34
|
||||
0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, // row 35 - 36
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 38
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 39 - 40
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 41 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 44
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 45 - 46
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 47 - 48
|
||||
};
|
||||
const unsigned char chr_f64_70[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 3
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 4 - 6
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 9
|
||||
0x00, 0x0F, 0xE0, 0x00, 0x1E, 0x3F, 0xFC, 0x00, 0x1E, 0x7F, 0xFE, 0x00, // row 10 - 12
|
||||
0x1E, 0xFF, 0xFF, 0x00, 0x1F, 0xF0, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0x80, // row 13 - 15
|
||||
0x1F, 0x80, 0x07, 0xC0, 0x1F, 0x00, 0x03, 0xC0, 0x1F, 0x00, 0x03, 0xC0, // row 16 - 18
|
||||
0x1F, 0x00, 0x03, 0xE0, 0x1E, 0x00, 0x01, 0xE0, 0x1E, 0x00, 0x01, 0xE0, // row 19 - 21
|
||||
0x1E, 0x00, 0x01, 0xE0, 0x1E, 0x00, 0x01, 0xE0, 0x1E, 0x00, 0x01, 0xE0, // row 22 - 24
|
||||
0x1E, 0x00, 0x01, 0xE0, 0x1E, 0x00, 0x01, 0xE0, 0x1E, 0x00, 0x01, 0xE0, // row 25 - 27
|
||||
0x1E, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xC0, 0x1F, 0x00, 0x07, 0xC0, // row 28 - 30
|
||||
0x1F, 0x80, 0x07, 0xC0, 0x1F, 0xC0, 0x0F, 0x80, 0x1F, 0xF0, 0x3F, 0x80, // row 31 - 33
|
||||
0x1E, 0xFF, 0xFF, 0x00, 0x1E, 0x7F, 0xFE, 0x00, 0x1E, 0x3F, 0xFC, 0x00, // row 34 - 36
|
||||
0x1E, 0x0F, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, // row 37 - 39
|
||||
0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, // row 40 - 42
|
||||
0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
|
||||
const unsigned char * chrtbl_f64[96] = // character pointer table
|
||||
{
|
||||
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
|
||||
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_2E, chr_f64_20,
|
||||
chr_f64_30, chr_f64_31, chr_f64_32, chr_f64_33, chr_f64_34, chr_f64_35, chr_f64_36, chr_f64_37,
|
||||
chr_f64_38, chr_f64_39, chr_f64_3A, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
|
||||
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
|
||||
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
|
||||
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
|
||||
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
|
||||
chr_f64_20, chr_f64_61, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
|
||||
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_6D, chr_f64_20, chr_f64_20,
|
||||
chr_f64_70, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20,
|
||||
chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20
|
||||
};
|
@ -1,7 +0,0 @@
|
||||
#define nr_chrs_f64 96
|
||||
#define chr_hgt_f64 48
|
||||
#define data_size_f64 8
|
||||
#define firstchr_f64 32
|
||||
|
||||
extern const unsigned char widtbl_f64[96];
|
||||
extern const unsigned char* chrtbl_f64[96];
|
@ -1,264 +0,0 @@
|
||||
// Font size 7 is a 7 segment font intended to display numbers and time
|
||||
// This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 : .
|
||||
// All other characters print as a space
|
||||
|
||||
#include "Font7s.h"
|
||||
|
||||
|
||||
const unsigned char widtbl_f7s[96] = // character width table
|
||||
{
|
||||
12, 12, 12, 12, 12, 12, 12, 12, // char 32 - 39
|
||||
12, 12, 12, 12, 12, 12, 12, 12, // char 40 - 47
|
||||
32, 32, 32, 32, 32, 32, 32, 32, // char 48 - 55
|
||||
32, 32, 12, 12, 12, 12, 12, 12, // char 56 - 63
|
||||
12, 12, 12, 12, 12, 12, 12, 12, // char 64 - 71
|
||||
12, 12, 12, 12, 12, 12, 12, 12, // char 72 - 79
|
||||
12, 12, 12, 12, 12, 12, 12, 12, // char 80 - 87
|
||||
12, 12, 12, 12, 12, 12, 12, 12, // char 88 - 95
|
||||
12, 12, 12, 12, 12, 12, 12, 12, // char 96 - 103
|
||||
12, 12, 12, 12, 12, 12, 12, 12, // char 104 - 111
|
||||
12, 12, 12, 12, 12, 12, 12, 12, // char 112 - 119
|
||||
12, 12, 12, 12, 12, 12, 12, 12 // char 120 - 127
|
||||
};
|
||||
|
||||
// Row format, MSB left
|
||||
|
||||
const unsigned char chr_f7s_20[96] = // 2 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 6
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 31 - 36
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 43 - 48
|
||||
};
|
||||
const unsigned char chr_f7s_2E[96] = // 2 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 6
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 13 - 18
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 31 - 36
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 42
|
||||
0x0E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x0E, 0x00, 0x00, 0x00 // row 43 - 48
|
||||
};
|
||||
const unsigned char chr_f7s_30[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3
|
||||
0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x20, 0x0C, 0xFF, 0xFE, 0x70, // row 4 - 6
|
||||
0x1E, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 7 - 9
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 10 - 12
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 13 - 15
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 16 - 18
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3E, 0x00, 0x00, 0xF8, // row 19 - 21
|
||||
0x38, 0x00, 0x00, 0x38, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, // row 22 - 24
|
||||
0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x18, 0x3E, 0x00, 0x00, 0x78, // row 25 - 27
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 28 - 30
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 31 - 33
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 34 - 36
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 37 - 39
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x1E, 0x00, 0x00, 0xF0, // row 40 - 42
|
||||
0x0C, 0xFF, 0xFE, 0x60, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45
|
||||
0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f7s_31[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 3
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x70, // row 4 - 6
|
||||
0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 7 - 9
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 10 - 12
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 13 - 15
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 16 - 18
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x78, // row 19 - 21
|
||||
0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, // row 22 - 24
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x78, // row 25 - 27
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 28 - 30
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 31 - 33
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 34 - 36
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 37 - 39
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF0, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f7s_32[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3
|
||||
0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x20, 0x00, 0xFF, 0xFE, 0x70, // row 4 - 6
|
||||
0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 7 - 9
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 10 - 12
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 13 - 15
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 16 - 18
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF8, // row 19 - 21
|
||||
0x00, 0xFF, 0xFE, 0x38, 0x03, 0xFF, 0xFF, 0x88, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24
|
||||
0x27, 0xFF, 0xFF, 0xC0, 0x39, 0xFF, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x00, // row 25 - 27
|
||||
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 28 - 30
|
||||
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 31 - 33
|
||||
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 34 - 36
|
||||
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 37 - 39
|
||||
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, // row 40 - 42
|
||||
0x0C, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45
|
||||
0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f7s_33[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3
|
||||
0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x20, 0x00, 0xFF, 0xFE, 0x70, // row 4 - 6
|
||||
0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 7 - 9
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 10 - 12
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 13 - 15
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 16 - 18
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF8, // row 19 - 21
|
||||
0x00, 0xFF, 0xFE, 0x38, 0x03, 0xFF, 0xFF, 0x88, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24
|
||||
0x07, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x18, 0x00, 0x00, 0x00, 0x78, // row 25 - 27
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 28 - 30
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 31 - 33
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 34 - 36
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 37 - 39
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF0, // row 40 - 42
|
||||
0x00, 0xFF, 0xFE, 0x60, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45
|
||||
0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f7s_34[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 3
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0C, 0x00, 0x00, 0x70, // row 4 - 6
|
||||
0x1E, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 7 - 9
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 10 - 12
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 13 - 15
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 16 - 18
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3E, 0x00, 0x00, 0xF8, // row 19 - 21
|
||||
0x38, 0xFF, 0xFE, 0x38, 0x23, 0xFF, 0xFF, 0x88, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24
|
||||
0x07, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x18, 0x00, 0x00, 0x00, 0x78, // row 25 - 27
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 28 - 30
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 31 - 33
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 34 - 36
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 37 - 39
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF0, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f7s_35[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3
|
||||
0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x00, 0x0C, 0xFF, 0xFE, 0x00, // row 4 - 6
|
||||
0x1E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 7 - 9
|
||||
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 10 - 12
|
||||
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 13 - 15
|
||||
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 16 - 18
|
||||
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, // row 19 - 21
|
||||
0x38, 0xFF, 0xFE, 0x00, 0x23, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24
|
||||
0x07, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x18, 0x00, 0x00, 0x00, 0x78, // row 25 - 27
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 28 - 30
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 31 - 33
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 34 - 36
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 37 - 39
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF0, // row 40 - 42
|
||||
0x00, 0xFF, 0xFE, 0x60, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45
|
||||
0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f7s_36[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3
|
||||
0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x00, 0x0C, 0xFF, 0xFE, 0x00, // row 4 - 6
|
||||
0x1E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 7 - 9
|
||||
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 10 - 12
|
||||
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 13 - 15
|
||||
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, // row 16 - 18
|
||||
0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, // row 19 - 21
|
||||
0x38, 0xFF, 0xFE, 0x00, 0x23, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24
|
||||
0x27, 0xFF, 0xFF, 0xC0, 0x39, 0xFF, 0xFF, 0x18, 0x3E, 0x00, 0x00, 0x78, // row 25 - 27
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 28 - 30
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 31 - 33
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 34 - 36
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 37 - 39
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x1E, 0x00, 0x00, 0xF0, // row 40 - 42
|
||||
0x0C, 0xFF, 0xFE, 0x60, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45
|
||||
0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f7s_37[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3
|
||||
0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x20, 0x00, 0xFF, 0xFE, 0x70, // row 4 - 6
|
||||
0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 7 - 9
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 10 - 12
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 13 - 15
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 16 - 18
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF8, // row 19 - 21
|
||||
0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, // row 22 - 24
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x78, // row 25 - 27
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 28 - 30
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 31 - 33
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 34 - 36
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 37 - 39
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF0, // row 40 - 42
|
||||
0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 43 - 45
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f7s_38[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3
|
||||
0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x20, 0x0C, 0xFF, 0xFE, 0x70, // row 4 - 6
|
||||
0x1E, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 7 - 9
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 10 - 12
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 13 - 15
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 16 - 18
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3E, 0x00, 0x00, 0xF8, // row 19 - 21
|
||||
0x38, 0xFF, 0xFE, 0x38, 0x23, 0xFF, 0xFF, 0x88, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24
|
||||
0x27, 0xFF, 0xFF, 0xC0, 0x39, 0xFF, 0xFF, 0x18, 0x3E, 0x00, 0x00, 0x78, // row 25 - 27
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 28 - 30
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 31 - 33
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 34 - 36
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 37 - 39
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x1E, 0x00, 0x00, 0xF0, // row 40 - 42
|
||||
0x0C, 0xFF, 0xFE, 0x60, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45
|
||||
0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f7s_39[192] = // 4 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, // row 1 - 3
|
||||
0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x20, 0x0C, 0xFF, 0xFE, 0x70, // row 4 - 6
|
||||
0x1E, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 7 - 9
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 10 - 12
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 13 - 15
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, // row 16 - 18
|
||||
0x3F, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF8, 0x3E, 0x00, 0x00, 0xF8, // row 19 - 21
|
||||
0x38, 0xFF, 0xFE, 0x38, 0x23, 0xFF, 0xFF, 0x88, 0x0F, 0xFF, 0xFF, 0xE0, // row 22 - 24
|
||||
0x07, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x18, 0x00, 0x00, 0x00, 0x78, // row 25 - 27
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 28 - 30
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 31 - 33
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 34 - 36
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, // row 37 - 39
|
||||
0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xF0, // row 40 - 42
|
||||
0x00, 0xFF, 0xFE, 0x60, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, // row 43 - 45
|
||||
0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 // row 46 - 48
|
||||
};
|
||||
const unsigned char chr_f7s_3A[96] = // 2 bytes per row
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 6
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 7 - 12
|
||||
0x00, 0x00, 0x0E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x0E, 0x00, // row 13 - 18
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 19 - 24
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 25 - 30
|
||||
0x0E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x0E, 0x00, 0x00, 0x00, // row 31 - 36
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 37 - 42
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 43 - 48
|
||||
};
|
||||
|
||||
const unsigned char * chrtbl_f7s[96] = // character pointer table
|
||||
{
|
||||
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
|
||||
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_2E, chr_f7s_20,
|
||||
chr_f7s_30, chr_f7s_31, chr_f7s_32, chr_f7s_33, chr_f7s_34, chr_f7s_35, chr_f7s_36, chr_f7s_37,
|
||||
chr_f7s_38, chr_f7s_39, chr_f7s_3A, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
|
||||
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
|
||||
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
|
||||
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
|
||||
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
|
||||
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
|
||||
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
|
||||
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20,
|
||||
chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20
|
||||
};
|
@ -1,7 +0,0 @@
|
||||
#define nr_chrs_f7s 96
|
||||
#define chr_hgt_f7s 48
|
||||
#define data_size_f7s 8
|
||||
#define firstchr_f7s 32
|
||||
|
||||
extern const unsigned char widtbl_f7s[96];
|
||||
extern const unsigned char * chrtbl_f7s[96];
|
@ -1,8 +0,0 @@
|
||||
// Comment out the #defines below with // to stop that font being loaded
|
||||
// If all fonts are loaded the total space required is ablout 17890 bytes
|
||||
|
||||
//#define LOAD_GLCD // Standard Adafruit font needs ~1792 bytes in FLASH
|
||||
//#define LOAD_FONT2 // Small font, needs ~3092 bytes in FLASH
|
||||
//#define LOAD_FONT4 // Medium font, needs ~8126 bytes in FLASH
|
||||
//#define LOAD_FONT6 // Large font, needs ~4404 bytes in FLASH
|
||||
//#define LOAD_FONT7 // 7 segment font, needs ~3652 bytes in FLASH
|
@ -1,79 +0,0 @@
|
||||
#ifndef INCLUDE_HSPI_H_
|
||||
#define INCLUDE_HSPI_H_
|
||||
|
||||
#include "spi_register.h"
|
||||
#include <osapi.h>
|
||||
#include <os_type.h>
|
||||
#include <gpio.h>
|
||||
#include <ets_sys.h>
|
||||
|
||||
#define SPI 0
|
||||
#define HSPI 1
|
||||
|
||||
#define SPIFIFOSIZE 16 //16 words length
|
||||
|
||||
extern uint32_t *spi_fifo;
|
||||
extern uint32_t current_spi_port;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
spi_mode_tx,
|
||||
spi_mode_txrx
|
||||
} spi_mode;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t spi_port;
|
||||
uint32_t clock_reg_val;
|
||||
spi_mode mode;
|
||||
} spi_config;
|
||||
|
||||
spi_config spi_init(uint32_t spi_port, uint32_t prescaler, spi_mode mode);
|
||||
void spi_reinit(spi_config *config);
|
||||
void spi_send_data(const uint8_t * data, uint8_t datasize);
|
||||
void spi_send_uint16_r(const uint16_t data, int32_t repeats);
|
||||
static inline void spi_wait_ready(void){while (READ_PERI_REG(SPI_FLASH_CMD(current_spi_port))&SPI_FLASH_USR);}
|
||||
|
||||
static inline void spi_prepare_tx(uint32_t bytecount)
|
||||
{
|
||||
uint32_t bitcount = bytecount * 8 - 1;
|
||||
|
||||
WRITE_PERI_REG(SPI_FLASH_USER1(current_spi_port), (bitcount & SPI_USR_OUT_BITLEN) << SPI_USR_OUT_BITLEN_S);
|
||||
}
|
||||
|
||||
static inline void spi_prepare_txrx_bits(uint32_t txbitcount, uint32_t rxbitcount)
|
||||
{
|
||||
WRITE_PERI_REG(SPI_FLASH_USER1(current_spi_port), ((txbitcount & SPI_USR_OUT_BITLEN) << SPI_USR_OUT_BITLEN_S) |
|
||||
((rxbitcount & SPI_USR_DIN_BITLEN) << SPI_USR_DIN_BITLEN_S));
|
||||
}
|
||||
|
||||
static inline void spi_start_tx()
|
||||
{
|
||||
SET_PERI_REG_MASK(SPI_FLASH_CMD(current_spi_port), SPI_FLASH_USR); // send
|
||||
}
|
||||
|
||||
static inline void spi_send_uint8(uint8_t data)
|
||||
{
|
||||
spi_prepare_tx(1);
|
||||
*spi_fifo = data;
|
||||
spi_start_tx();
|
||||
}
|
||||
|
||||
static inline void spi_send_uint16(uint16_t data)
|
||||
{
|
||||
spi_prepare_tx(2);
|
||||
*spi_fifo = data;
|
||||
spi_start_tx();
|
||||
}
|
||||
|
||||
static inline void spi_send_uint32(uint32_t data)
|
||||
{
|
||||
spi_prepare_tx(4);
|
||||
*spi_fifo = data;
|
||||
spi_start_tx();
|
||||
}
|
||||
|
||||
/* This is needed to implement XPT2046 driver since it transmits 13 bits back*/
|
||||
extern uint16_t spi_send_uint8_receive_13bits(uint8_t to_send);
|
||||
|
||||
#endif /* INCLUDE_HSPI_H_ */
|
@ -1,239 +0,0 @@
|
||||
//Generated at 2014-07-29 11:03:29
|
||||
/*
|
||||
* Copyright (c) 2010 - 2011 Espressif System
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SPI_REGISTER_H_INCLUDED
|
||||
#define SPI_REGISTER_H_INCLUDED
|
||||
|
||||
#define REG_SPI_BASE(i) (0x60000200-i*0x100)
|
||||
|
||||
#define SPI_FLASH_CMD(i) (REG_SPI_BASE(i) + 0x0)
|
||||
#define SPI_FLASH_READ (BIT(31))
|
||||
#define SPI_FLASH_WREN (BIT(30))
|
||||
#define SPI_FLASH_WRDI (BIT(29))
|
||||
#define SPI_FLASH_RDID (BIT(28))
|
||||
#define SPI_FLASH_RDSR (BIT(27))
|
||||
#define SPI_FLASH_WRSR (BIT(26))
|
||||
#define SPI_FLASH_PP (BIT(25))
|
||||
#define SPI_FLASH_SE (BIT(24))
|
||||
#define SPI_FLASH_BE (BIT(23))
|
||||
#define SPI_FLASH_CE (BIT(22))
|
||||
#define SPI_FLASH_DP (BIT(21))
|
||||
#define SPI_FLASH_RES (BIT(20))
|
||||
#define SPI_FLASH_HPM (BIT(19))
|
||||
#define SPI_FLASH_USR (BIT(18))
|
||||
|
||||
#define SPI_FLASH_ADDR(i) (REG_SPI_BASE(i) + 0x4)
|
||||
|
||||
#define SPI_FLASH_CTRL(i) (REG_SPI_BASE(i) + 0x8)
|
||||
#define SPI_WR_BIT_ODER (BIT(26))
|
||||
#define SPI_RD_BIT_ODER (BIT(25))
|
||||
#define SPI_QIO_MODE (BIT(24))
|
||||
#define SPI_DIO_MODE (BIT(23))
|
||||
#define SPI_TWO_BYTE_STATUS_EN (BIT(22))
|
||||
#define SPI_WP_REG (BIT(21))
|
||||
#define SPI_QOUT_MODE (BIT(20))
|
||||
#define SPI_SHARE_BUS (BIT(19))
|
||||
#define SPI_HOLD_MODE (BIT(18))
|
||||
#define SPI_ENABLE_AHB (BIT(17))
|
||||
#define SPI_SST_AAI (BIT(16))
|
||||
#define SPI_RESANDRES (BIT(15))
|
||||
#define SPI_DOUT_MODE (BIT(14))
|
||||
#define SPI_FASTRD_MODE (BIT(13))
|
||||
|
||||
#define SPI_FLASH_CTRL1(i) (REG_SPI_BASE (i) + 0xC)
|
||||
#define SPI_T_CSH 0x0000000F
|
||||
#define SPI_T_CSH_S 28
|
||||
#define SPI_T_RES 0x00000FFF
|
||||
#define SPI_T_RES_S 16
|
||||
#define SPI_BUS_TIMER_LIMIT 0x0000FFFF
|
||||
#define SPI_BUS_TIMER_LIMIT_S 0
|
||||
|
||||
#define SPI_FLASH_STATUS(i) (REG_SPI_BASE(i) + 0x10)
|
||||
#define SPI_STATUS_EXT 0x000000FF
|
||||
#define SPI_STATUS_EXT_S 24
|
||||
#define SPI_WB_MODE 0x000000FF
|
||||
#define SPI_WB_MODE_S 16
|
||||
#define SPI_FLASH_STATUS_PRO_FLAG (BIT(7))
|
||||
#define SPI_FLASH_TOP_BOT_PRO_FLAG (BIT(5))
|
||||
#define SPI_FLASH_BP2 (BIT(4))
|
||||
#define SPI_FLASH_BP1 (BIT(3))
|
||||
#define SPI_FLASH_BP0 (BIT(2))
|
||||
#define SPI_FLASH_WRENABLE_FLAG (BIT(1))
|
||||
#define SPI_FLASH_BUSY_FLAG (BIT(0))
|
||||
|
||||
#define SPI_FLASH_CTRL2(i) (REG_SPI_BASE(i) + 0x14)
|
||||
#define SPI_CS_DELAY_NUM 0x0000000F
|
||||
#define SPI_CS_DELAY_NUM_S 28
|
||||
#define SPI_CS_DELAY_MODE 0x00000003
|
||||
#define SPI_CS_DELAY_MODE_S 26
|
||||
#define SPI_MOSI_DELAY_NUM 0x00000007
|
||||
#define SPI_MOSI_DELAY_NUM_S 23
|
||||
#define SPI_MOSI_DELAY_MODE 0x00000003
|
||||
#define SPI_MOSI_DELAY_MODE_S 21
|
||||
#define SPI_MISO_DELAY_NUM 0x00000007
|
||||
#define SPI_MISO_DELAY_NUM_S 18
|
||||
#define SPI_MISO_DELAY_MODE 0x00000003
|
||||
#define SPI_MISO_DELAY_MODE_S 16
|
||||
#define SPI_CK_OUT_HIGH_MODE 0x0000000F
|
||||
#define SPI_CK_OUT_HIGH_MODE_S 12
|
||||
#define SPI_CK_OUT_LOW_MODE 0x0000000F
|
||||
#define SPI_CK_OUT_LOW_MODE_S 8
|
||||
#define SPI_HOLD_TIME 0x0000000F
|
||||
#define SPI_HOLD_TIME_S 4
|
||||
#define SPI_SETUP_TIME 0x0000000F
|
||||
#define SPI_SETUP_TIME_S 0
|
||||
|
||||
#define SPI_FLASH_CLOCK(i) (REG_SPI_BASE(i) + 0x18)
|
||||
#define SPI_CLK_EQU_SYSCLK (BIT(31))
|
||||
#define SPI_CLKDIV_PRE 0x00001FFF
|
||||
#define SPI_CLKDIV_PRE_S 18
|
||||
#define SPI_CLKCNT_N 0x0000003F
|
||||
#define SPI_CLKCNT_N_S 12
|
||||
#define SPI_CLKCNT_H 0x0000003F
|
||||
#define SPI_CLKCNT_H_S 6
|
||||
#define SPI_CLKCNT_L 0x0000003F
|
||||
#define SPI_CLKCNT_L_S 0
|
||||
|
||||
#define SPI_FLASH_USER(i) (REG_SPI_BASE(i) + 0x1C)
|
||||
#define SPI_USR_COMMAND (BIT(31))
|
||||
#define SPI_FLASH_USR_ADDR (BIT(30))
|
||||
#define SPI_FLASH_USR_DUMMY (BIT(29))
|
||||
#define SPI_FLASH_USR_DIN (BIT(28))
|
||||
#define SPI_FLASH_DOUT (BIT(27))
|
||||
#define SPI_USR_DUMMY_IDLE (BIT(26))
|
||||
#define SPI_USR_DOUT_HIGHPART (BIT(25))
|
||||
#define SPI_USR_DIN_HIGHPART (BIT(24))
|
||||
#define SPI_USR_PREP_HOLD (BIT(23))
|
||||
#define SPI_USR_CMD_HOLD (BIT(22))
|
||||
#define SPI_USR_ADDR_HOLD (BIT(21))
|
||||
#define SPI_USR_DUMMY_HOLD (BIT(20))
|
||||
#define SPI_USR_DIN_HOLD (BIT(19))
|
||||
#define SPI_USR_DOUT_HOLD (BIT(18))
|
||||
#define SPI_USR_HOLD_POL (BIT(17))
|
||||
#define SPI_SIO (BIT(16))
|
||||
#define SPI_FWRITE_QIO (BIT(15))
|
||||
#define SPI_FWRITE_DIO (BIT(14))
|
||||
#define SPI_FWRITE_QUAD (BIT(13))
|
||||
#define SPI_FWRITE_DUAL (BIT(12))
|
||||
#define SPI_WR_BYTE_ORDER (BIT(11))
|
||||
#define SPI_RD_BYTE_ORDER (BIT(10))
|
||||
#define SPI_AHB_ENDIAN_MODE 0x00000003
|
||||
#define SPI_AHB_ENDIAN_MODE_S 8
|
||||
#define SPI_CK_OUT_EDGE (BIT(7))
|
||||
#define SPI_CK_I_EDGE (BIT(6))
|
||||
#define SPI_CS_SETUP (BIT(5))
|
||||
#define SPI_CS_HOLD (BIT(4))
|
||||
#define SPI_AHB_USR_COMMAND (BIT(3))
|
||||
#define SPI_AHB_USR_COMMAND_4BYTE (BIT(1))
|
||||
#define SPI_DOUTDIN (BIT(0))
|
||||
|
||||
#define SPI_FLASH_USER1(i) (REG_SPI_BASE(i) + 0x20)
|
||||
#define SPI_USR_ADDR_BITLEN 0x0000003F
|
||||
#define SPI_USR_ADDR_BITLEN_S 26
|
||||
#define SPI_USR_OUT_BITLEN 0x000001FF
|
||||
#define SPI_USR_OUT_BITLEN_S 17
|
||||
#define SPI_USR_DIN_BITLEN 0x000001FF
|
||||
#define SPI_USR_DIN_BITLEN_S 8
|
||||
#define SPI_USR_DUMMY_CYCLELEN 0x000000FF
|
||||
#define SPI_USR_DUMMY_CYCLELEN_S 0
|
||||
|
||||
#define SPI_FLASH_USER2(i) (REG_SPI_BASE(i) + 0x24)
|
||||
#define SPI_USR_COMMAND_BITLEN 0x0000000F
|
||||
#define SPI_USR_COMMAND_BITLEN_S 28
|
||||
#define SPI_USR_COMMAND_VALUE 0x0000FFFF
|
||||
#define SPI_USR_COMMAND_VALUE_S 0
|
||||
|
||||
#define SPI_FLASH_USER3(i) (REG_SPI_BASE(i) + 0x28)
|
||||
#define SPI_FLASH_PIN(i) (REG_SPI_BASE(i) + 0x2C)
|
||||
#define SPI_FLASH_SLAVE(i) (REG_SPI_BASE(i) + 0x30)
|
||||
#define SPI_SYNC_RESET (BIT(31))
|
||||
#define SPI_SLAVE_MODE (BIT(30))
|
||||
#define SPI_SLV_WR_RD_BUF_EN (BIT(29))
|
||||
#define SPI_SLV_WR_RD_STA_EN (BIT(28))
|
||||
#define SPI_SLV_CMD_DEFINE (BIT(27))
|
||||
#define SPI_TRANS_CNT 0x0000000F
|
||||
#define SPI_TRANS_CNT_S 23
|
||||
#define SPI_SLV_LAST_STATE 0x00000007
|
||||
#define SPI_SLV_LAST_STATE_S 20
|
||||
#define SPI_SLV_LAST_COMMAND 0x00000007
|
||||
#define SPI_SLV_LAST_COMMAND_S 17
|
||||
#define SPI_CS_I_MODE 0x00000003
|
||||
#define SPI_CS_I_MODE_S 10
|
||||
#define SPI_INT_EN 0x0000001F
|
||||
#define SPI_INT_EN_S 5
|
||||
#define SPI_TRANS_DONE (BIT(4))
|
||||
#define SPI_SLV_WR_STA_DONE (BIT(3))
|
||||
#define SPI_SLV_RD_STA_DONE (BIT(2))
|
||||
#define SPI_SLV_WR_BUF_DONE (BIT(1))
|
||||
#define SPI_SLV_RD_BUF_DONE (BIT(0))
|
||||
|
||||
#define SPI_FLASH_SLAVE1(i) (REG_SPI_BASE(i) + 0x34)
|
||||
#define SPI_SLV_STATUS_BITLEN 0x0000001F
|
||||
#define SPI_SLV_STATUS_BITLEN_S 27
|
||||
#define SPI_SLV_STATUS_FAST_EN (BIT(26))
|
||||
#define SPI_SLV_STATUS_READBACK (BIT(25))
|
||||
#define SPI_SLV_BUF_BITLEN 0x000001FF
|
||||
#define SPI_SLV_BUF_BITLEN_S 16
|
||||
#define SPI_SLV_RD_ADDR_BITLEN 0x0000003F
|
||||
#define SPI_SLV_RD_ADDR_BITLEN_S 10
|
||||
#define SPI_SLV_WR_ADDR_BITLEN 0x0000003F
|
||||
#define SPI_SLV_WR_ADDR_BITLEN_S 4
|
||||
#define SPI_SLV_WRSTA_DUMMY_EN (BIT(3))
|
||||
#define SPI_SLV_RDSTA_DUMMY_EN (BIT(2))
|
||||
#define SPI_SLV_WRBUF_DUMMY_EN (BIT(1))
|
||||
#define SPI_SLV_RDBUF_DUMMY_EN (BIT(0))
|
||||
|
||||
#define SPI_FLASH_SLAVE2(i) (REG_SPI_BASE(i) + 0x38)
|
||||
#define SPI_SLV_WRBUF_DUMMY_CYCLELEN 0x000000FF
|
||||
#define SPI_SLV_WRBUF_DUMMY_CYCLELEN_S 24
|
||||
#define SPI_SLV_RDBUF_DUMMY_CYCLELEN 0x000000FF
|
||||
#define SPI_SLV_RDBUF_DUMMY_CYCLELEN_S 16
|
||||
#define SPI_SLV_WRSTA_DUMMY_CYCLELEN 0x000000FF
|
||||
#define SPI_SLV_WRSTA_DUMMY_CYCLELEN_S 8
|
||||
#define SPI_SLV_RDSTA_DUMMY_CYCLELEN 0x000000FF
|
||||
#define SPI_SLV_RDSTA_DUMMY_CYCLELEN_S 0
|
||||
|
||||
#define SPI_FLASH_SLAVE3(i) (REG_SPI_BASE(i) + 0x3C)
|
||||
#define SPI_SLV_WRSTA_CMD_VALUE 0x000000FF
|
||||
#define SPI_SLV_WRSTA_CMD_VALUE_S 24
|
||||
#define SPI_SLV_RDSTA_CMD_VALUE 0x000000FF
|
||||
#define SPI_SLV_RDSTA_CMD_VALUE_S 16
|
||||
#define SPI_SLV_WRBUF_CMD_VALUE 0x000000FF
|
||||
#define SPI_SLV_WRBUF_CMD_VALUE_S 8
|
||||
#define SPI_SLV_RDBUF_CMD_VALUE 0x000000FF
|
||||
#define SPI_SLV_RDBUF_CMD_VALUE_S 0
|
||||
|
||||
#define SPI_FLASH_C0(i) (REG_SPI_BASE(i) +0x40)
|
||||
#define SPI_FLASH_C1(i) (REG_SPI_BASE(i) +0x44)
|
||||
#define SPI_FLASH_C2(i) (REG_SPI_BASE(i) +0x48)
|
||||
#define SPI_FLASH_C3(i) (REG_SPI_BASE(i) +0x4C)
|
||||
#define SPI_FLASH_C4(i) (REG_SPI_BASE(i) +0x50)
|
||||
#define SPI_FLASH_C5(i) (REG_SPI_BASE(i) +0x54)
|
||||
#define SPI_FLASH_C6(i) (REG_SPI_BASE(i) +0x58)
|
||||
#define SPI_FLASH_C7(i) (REG_SPI_BASE(i) +0x5C)
|
||||
|
||||
#define SPI_FLASH_EXT0(i) (REG_SPI_BASE(i) + 0xF0)
|
||||
#define SPI_T_PP_ENA (BIT(31))
|
||||
#define SPI_T_PP_SHIFT 0x0000000F
|
||||
#define SPI_T_PP_SHIFT_S 16
|
||||
#define SPI_T_PP_TIME 0x00000FFF
|
||||
#define SPI_T_PP_TIME_S 0
|
||||
|
||||
#define SPI_FLASH_EXT1(i) (REG_SPI_BASE(i) + 0xF4)
|
||||
#define SPI_T_ERASE_ENA (BIT(31))
|
||||
#define SPI_T_ERASE_SHIFT 0x0000000F
|
||||
#define SPI_T_ERASE_SHIFT_S 16
|
||||
#define SPI_T_ERASE_TIME 0x00000FFF
|
||||
#define SPI_T_ERASE_TIME_S 0
|
||||
|
||||
#define SPI_FLASH_EXT2(i) (REG_SPI_BASE(i) + 0xF8)
|
||||
#define SPI_ST 0x00000007
|
||||
#define SPI_ST_S 0
|
||||
|
||||
#define SPI_FLASH_EXT3(i) (REG_SPI_BASE(i) + 0xFC)
|
||||
#define SPI_INT_HOLD_ENA 0x00000003
|
||||
#define SPI_INT_HOLD_ENA_S 0
|
||||
#endif // SPI_REGISTER_H_INCLUDED
|
@ -1,109 +0,0 @@
|
||||
#include "driver/hspi.h"
|
||||
|
||||
/*
|
||||
Pinout:
|
||||
MISO GPIO12
|
||||
MOSI GPIO13
|
||||
CLK GPIO14
|
||||
CS GPIO15
|
||||
DC GPIO2
|
||||
*/
|
||||
|
||||
#define __min(a,b) ((a > b) ? (b):(a))
|
||||
uint32_t *spi_fifo;
|
||||
uint32_t current_spi_port;
|
||||
|
||||
spi_config spi_init(uint32_t spi_port, uint32_t prescaler, spi_mode mode)
|
||||
{
|
||||
spi_config config;
|
||||
|
||||
WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105); //clear bit9
|
||||
|
||||
if (spi_port == SPI)
|
||||
{
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA0_U, 2); // SD_D0 MISO
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA1_U, 2); // SD_D1 MOSI
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, 2); // CLK
|
||||
} else if (spi_port == HSPI)
|
||||
{
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2); // HSPIQ MISO GPIO12
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2); // HSPID MOSI GPIO13
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2); // CLK GPIO14
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2); // CS GPIO15
|
||||
}
|
||||
|
||||
|
||||
config.mode = mode;
|
||||
config.spi_port = spi_port;
|
||||
// SPI clock = CPU clock / 10 / 4
|
||||
// time length HIGHT level = (CPU clock / 10 / 2) ^ -1,
|
||||
// time length LOW level = (CPU clock / 10 / 2) ^ -1
|
||||
config.clock_reg_val = (((prescaler - 1) & SPI_CLKDIV_PRE) << SPI_CLKDIV_PRE_S) |
|
||||
((1 & SPI_CLKCNT_N) << SPI_CLKCNT_N_S) |
|
||||
((0 & SPI_CLKCNT_H) << SPI_CLKCNT_H_S) |
|
||||
((1 & SPI_CLKCNT_L) << SPI_CLKCNT_L_S);
|
||||
|
||||
spi_reinit(&config);
|
||||
return config;
|
||||
}
|
||||
|
||||
void spi_reinit(spi_config *config)
|
||||
{
|
||||
current_spi_port = config->spi_port;
|
||||
spi_fifo = (uint32_t*)SPI_FLASH_C0(current_spi_port);
|
||||
|
||||
uint32_t regvalue = SPI_FLASH_DOUT;
|
||||
WRITE_PERI_REG(SPI_FLASH_CLOCK(current_spi_port), config->clock_reg_val);
|
||||
WRITE_PERI_REG(SPI_FLASH_CTRL1(current_spi_port), 0);
|
||||
|
||||
switch(config->mode)
|
||||
{
|
||||
case spi_mode_tx:
|
||||
regvalue &= ~(BIT2 | SPI_FLASH_USR_ADDR | SPI_FLASH_USR_DUMMY | SPI_FLASH_USR_DIN | SPI_USR_COMMAND | SPI_DOUTDIN);
|
||||
break;
|
||||
case spi_mode_txrx:
|
||||
regvalue |= SPI_DOUTDIN | SPI_CK_I_EDGE;
|
||||
regvalue &= ~(BIT2 | SPI_FLASH_USR_ADDR | SPI_FLASH_USR_DUMMY | SPI_FLASH_USR_DIN | SPI_USR_COMMAND);
|
||||
break;
|
||||
}
|
||||
|
||||
WRITE_PERI_REG(SPI_FLASH_USER(current_spi_port), regvalue);
|
||||
}
|
||||
|
||||
void spi_send_uint16_r(uint16_t data, int32_t repeats)
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t word = data << 16 | data;
|
||||
|
||||
while(repeats > 0)
|
||||
{
|
||||
uint16_t bytes_to_transfer = __min(repeats * sizeof(uint16_t) , SPIFIFOSIZE * sizeof(uint32_t));
|
||||
spi_wait_ready();
|
||||
spi_prepare_tx(bytes_to_transfer);
|
||||
for(i = 0; i < (bytes_to_transfer + 3) / 4;i++)
|
||||
spi_fifo[i] = word;
|
||||
spi_start_tx();
|
||||
repeats -= bytes_to_transfer / 2;
|
||||
}
|
||||
}
|
||||
|
||||
void spi_send_data(const uint8_t * data, uint8_t datasize)
|
||||
{
|
||||
uint32_t *_data = (uint32_t*)data;
|
||||
uint8_t i;
|
||||
|
||||
uint8_t words_to_send = __min((datasize + 3) / 4, SPIFIFOSIZE);
|
||||
spi_prepare_tx(datasize);
|
||||
for(i = 0; i < words_to_send;i++)
|
||||
spi_fifo[i] = _data[i];
|
||||
spi_start_tx();
|
||||
}
|
||||
|
||||
uint16_t spi_send_uint8_receive_13bits(uint8_t to_send)
|
||||
{
|
||||
spi_prepare_txrx_bits(8, 13);
|
||||
*spi_fifo = to_send;
|
||||
spi_start_tx();
|
||||
spi_wait_ready();
|
||||
return (*spi_fifo) & 0x1FFF;
|
||||
}
|
@ -1,199 +0,0 @@
|
||||
/*
|
||||
* The Minimal snprintf() implementation
|
||||
*
|
||||
* Copyright (c) 2013,2014 Michal Ludvig <michal@logix.cz>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the auhor nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* ----
|
||||
*
|
||||
* This is a minimal snprintf() implementation optimised
|
||||
* for embedded systems with a very limited program memory.
|
||||
* mini_snprintf() doesn't support _all_ the formatting
|
||||
* the glibc does but on the other hand is a lot smaller.
|
||||
* Here are some numbers from my STM32 project (.bin file size):
|
||||
* no snprintf(): 10768 bytes
|
||||
* mini snprintf(): 11420 bytes (+ 652 bytes)
|
||||
* glibc snprintf(): 34860 bytes (+24092 bytes)
|
||||
* Wasting nearly 24kB of memory just for snprintf() on
|
||||
* a chip with 32kB flash is crazy. Use mini_snprintf() instead.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include "mini-printf.h"
|
||||
|
||||
static unsigned int
|
||||
mini_strlen(const char *s)
|
||||
{
|
||||
unsigned int len = 0;
|
||||
while (s[len] != '\0') len++;
|
||||
return len;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
mini_itoa(int value, unsigned int radix, unsigned int uppercase,
|
||||
char *buffer, unsigned int zero_pad)
|
||||
{
|
||||
char *pbuffer = buffer;
|
||||
int negative = 0;
|
||||
unsigned int i, len;
|
||||
|
||||
/* No support for unusual radixes. */
|
||||
if (radix > 16)
|
||||
return 0;
|
||||
|
||||
if (value < 0) {
|
||||
negative = 1;
|
||||
value = -value;
|
||||
}
|
||||
|
||||
/* This builds the string back to front ... */
|
||||
do {
|
||||
int digit = value % radix;
|
||||
*(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10);
|
||||
value /= radix;
|
||||
} while (value > 0);
|
||||
|
||||
for (i = (pbuffer - buffer); i < zero_pad; i++)
|
||||
*(pbuffer++) = '0';
|
||||
|
||||
if (negative)
|
||||
*(pbuffer++) = '-';
|
||||
|
||||
*(pbuffer) = '\0';
|
||||
|
||||
/* ... now we reverse it (could do it recursively but will
|
||||
* conserve the stack space) */
|
||||
len = (pbuffer - buffer);
|
||||
for (i = 0; i < len / 2; i++) {
|
||||
char j = buffer[i];
|
||||
buffer[i] = buffer[len-i-1];
|
||||
buffer[len-i-1] = j;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int
|
||||
mini_vsnprintf(char *buffer, unsigned int buffer_len, const char *fmt, va_list va)
|
||||
{
|
||||
char *pbuffer = buffer;
|
||||
char bf[24];
|
||||
char ch;
|
||||
|
||||
int _putc(char ch)
|
||||
{
|
||||
if ((unsigned int)((pbuffer - buffer) + 1) >= buffer_len)
|
||||
return 0;
|
||||
*(pbuffer++) = ch;
|
||||
*(pbuffer) = '\0';
|
||||
return 1;
|
||||
}
|
||||
|
||||
int _puts(char *s, unsigned int len)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (buffer_len - (pbuffer - buffer) - 1 < len)
|
||||
len = buffer_len - (pbuffer - buffer) - 1;
|
||||
|
||||
/* Copy to buffer */
|
||||
for (i = 0; i < len; i++)
|
||||
*(pbuffer++) = s[i];
|
||||
*(pbuffer) = '\0';
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
while ((ch=*(fmt++))) {
|
||||
if ((unsigned int)((pbuffer - buffer) + 1) >= buffer_len)
|
||||
break;
|
||||
if (ch!='%')
|
||||
_putc(ch);
|
||||
else {
|
||||
char zero_pad = 0;
|
||||
char *ptr;
|
||||
unsigned int len;
|
||||
|
||||
ch=*(fmt++);
|
||||
|
||||
/* Zero padding requested */
|
||||
if (ch=='0') {
|
||||
ch=*(fmt++);
|
||||
if (ch == '\0')
|
||||
goto end;
|
||||
if (ch >= '0' && ch <= '9')
|
||||
zero_pad = ch - '0';
|
||||
ch=*(fmt++);
|
||||
}
|
||||
|
||||
switch (ch) {
|
||||
case 0:
|
||||
goto end;
|
||||
|
||||
case 'u':
|
||||
case 'd':
|
||||
len = mini_itoa(va_arg(va, unsigned int), 10, 0, bf, zero_pad);
|
||||
_puts(bf, len);
|
||||
break;
|
||||
|
||||
case 'x':
|
||||
case 'X':
|
||||
len = mini_itoa(va_arg(va, unsigned int), 16, (ch=='X'), bf, zero_pad);
|
||||
_puts(bf, len);
|
||||
break;
|
||||
|
||||
case 'c' :
|
||||
_putc((char)(va_arg(va, int)));
|
||||
break;
|
||||
|
||||
case 's' :
|
||||
ptr = va_arg(va, char*);
|
||||
_puts(ptr, mini_strlen(ptr));
|
||||
break;
|
||||
|
||||
default:
|
||||
_putc(ch);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
end:
|
||||
return pbuffer - buffer;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
mini_snprintf(char* buffer, unsigned int buffer_len, const char *fmt, ...)
|
||||
{
|
||||
int ret;
|
||||
va_list va;
|
||||
va_start(va, fmt);
|
||||
ret = mini_vsnprintf(buffer, buffer_len, fmt, va);
|
||||
va_end(va);
|
||||
|
||||
return ret;
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* The Minimal snprintf() implementation
|
||||
*
|
||||
* Copyright (c) 2013 Michal Ludvig <michal@logix.cz>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the auhor nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __MINI_PRINTF__
|
||||
#define __MINI_PRINTF__
|
||||
#include <stdarg.h>
|
||||
|
||||
int mini_vsnprintf(char* buffer, unsigned int buffer_len, const char *fmt, va_list va);
|
||||
int mini_snprintf(char* buffer, unsigned int buffer_len, const char *fmt, ...);
|
||||
|
||||
#define vsnprintf mini_vsnprintf
|
||||
#define snprintf mini_snprintf
|
||||
|
||||
#endif
|
@ -1,12 +0,0 @@
|
||||
Port of Adafruit's library for ILI9341 to ESP8266
|
||||
Uses HSPI.
|
||||
Wiring:
|
||||
ILI9341 pin ESP8266 pin
|
||||
MISO GPIO12
|
||||
MOSI GPIO13
|
||||
SCK GPIO14
|
||||
CS GPIO15
|
||||
DC GPIO2
|
||||
|
||||
Reset 3V3
|
||||
LED through 50-60 Ohm resistor to 3V3
|
@ -43,7 +43,6 @@ void SPIClass::begin() {
|
||||
pinMode(MISO, SPECIAL); ///< GPIO12
|
||||
pinMode(MOSI, SPECIAL); ///< GPIO13
|
||||
|
||||
GPMUX = 0x105; // note crash if SPI flash Frequency < 40MHz
|
||||
SPI1C = 0;
|
||||
setFrequency(1000000); ///< 1MHz
|
||||
SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE;
|
||||
@ -124,7 +123,11 @@ void SPIClass::setFrequency(uint32_t freq) {
|
||||
const spiClk_t minFreqReg = { 0x7FFFF000 };
|
||||
uint32_t minFreq = ClkRegToFreq((spiClk_t*) &minFreqReg);
|
||||
if(freq < minFreq) {
|
||||
freq = minFreq;
|
||||
// use minimum possible clock
|
||||
setClockDivider(minFreqReg.regValue);
|
||||
lastSetRegister = SPI1CLK;
|
||||
lastSetFrequency = freq;
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t calN = 1;
|
||||
@ -187,6 +190,11 @@ void SPIClass::setFrequency(uint32_t freq) {
|
||||
}
|
||||
|
||||
void SPIClass::setClockDivider(uint32_t clockDiv) {
|
||||
if(clockDiv == 0x80000000) {
|
||||
GPMUX |= (1 << 9); // Set bit 9 if sysclock required
|
||||
} else {
|
||||
GPMUX &= ~(1 << 9);
|
||||
}
|
||||
SPI1CLK = clockDiv;
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,8 @@
|
||||
#include <Arduino.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define SPI_HAS_TRANSACTION
|
||||
|
||||
// This defines are not representing the real Divider of the ESP8266
|
||||
// the Defines match to an AVR Arduino on 16MHz for better compatibility
|
||||
#if F_CPU == 80000000L
|
||||
|
776
libraries/Adafruit_ILI9341/Adafruit_ILI9341.cpp
Normal file
776
libraries/Adafruit_ILI9341/Adafruit_ILI9341.cpp
Normal file
@ -0,0 +1,776 @@
|
||||
/***************************************************
|
||||
This is our library for the Adafruit ILI9341 Breakout and Shield
|
||||
----> http://www.adafruit.com/products/1651
|
||||
|
||||
Check out the links above for our tutorials and wiring diagrams
|
||||
These displays use SPI to communicate, 4 or 5 pins are required to
|
||||
interface (RST is optional)
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
MIT license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
#include "Adafruit_ILI9341.h"
|
||||
#ifdef ESP8266
|
||||
#include <pgmspace.h>
|
||||
#else
|
||||
#include <avr/pgmspace.h>
|
||||
#endif
|
||||
#include <limits.h>
|
||||
#include "pins_arduino.h"
|
||||
#include "wiring_private.h"
|
||||
#include <SPI.h>
|
||||
|
||||
#ifndef ESP8266
|
||||
// Constructor when using software SPI. All output pins are configurable.
|
||||
Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t mosi,
|
||||
int8_t sclk, int8_t rst, int8_t miso) : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) {
|
||||
_cs = cs;
|
||||
_dc = dc;
|
||||
_mosi = mosi;
|
||||
_miso = miso;
|
||||
_sclk = sclk;
|
||||
_rst = rst;
|
||||
hwSPI = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Constructor when using hardware SPI. Faster, but must use SPI pins
|
||||
// specific to each board type (e.g. 11,13 for Uno, 51,52 for Mega, etc.)
|
||||
Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t rst) : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) {
|
||||
_cs = cs;
|
||||
_dc = dc;
|
||||
_rst = rst;
|
||||
hwSPI = true;
|
||||
#ifndef ESP8266
|
||||
_mosi = _sclk = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
void Adafruit_ILI9341::spiwrite(uint8_t c) {
|
||||
|
||||
//Serial.print("0x"); Serial.print(c, HEX); Serial.print(", ");
|
||||
#ifndef ESP8266
|
||||
if (hwSPI) {
|
||||
#endif
|
||||
#if defined (__AVR__)
|
||||
uint8_t backupSPCR = SPCR;
|
||||
SPCR = mySPCR;
|
||||
SPDR = c;
|
||||
while(!(SPSR & _BV(SPIF)));
|
||||
SPCR = backupSPCR;
|
||||
#elif defined(TEENSYDUINO) || defined(ESP8266)
|
||||
SPI.transfer(c);
|
||||
#elif defined (__arm__)
|
||||
SPI.setClockDivider(11); // 8-ish MHz (full! speed!)
|
||||
SPI.setBitOrder(MSBFIRST);
|
||||
SPI.setDataMode(SPI_MODE0);
|
||||
SPI.transfer(c);
|
||||
#endif
|
||||
#ifndef ESP8266
|
||||
} else {
|
||||
// Fast SPI bitbang swiped from LPD8806 library
|
||||
for(uint8_t bit = 0x80; bit; bit >>= 1) {
|
||||
if(c & bit) {
|
||||
//digitalWrite(_mosi, HIGH);
|
||||
*mosiport |= mosipinmask;
|
||||
} else {
|
||||
//digitalWrite(_mosi, LOW);
|
||||
*mosiport &= ~mosipinmask;
|
||||
}
|
||||
//digitalWrite(_sclk, HIGH);
|
||||
*clkport |= clkpinmask;
|
||||
//digitalWrite(_sclk, LOW);
|
||||
*clkport &= ~clkpinmask;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void Adafruit_ILI9341::writecommand(uint8_t c) {
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_dc, LOW);
|
||||
digitalWrite(_cs, LOW);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOC = digitalPinToBitMask(_dc);
|
||||
GPOC = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*dcport &= ~dcpinmask;
|
||||
//*clkport &= ~clkpinmask; // clkport is a NULL pointer when hwSPI==true
|
||||
//digitalWrite(_sclk, LOW);
|
||||
*csport &= ~cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
spiwrite(c);
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_cs, HIGH);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOS = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*csport |= cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void Adafruit_ILI9341::writedata(uint8_t c) {
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_dc, HIGH);
|
||||
digitalWrite(_cs, LOW);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOS = digitalPinToBitMask(_dc);
|
||||
GPOC = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*dcport |= dcpinmask;
|
||||
|
||||
//*clkport &= ~clkpinmask; // clkport is a NULL pointer when hwSPI==true
|
||||
//digitalWrite(_sclk, LOW);
|
||||
*csport &= ~cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
spiwrite(c);
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_cs, HIGH);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOS = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*csport |= cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
// If the SPI library has transaction support, these functions
|
||||
// establish settings and protect from interference from other
|
||||
// libraries. Otherwise, they simply do nothing.
|
||||
#ifdef SPI_HAS_TRANSACTION
|
||||
static inline void spi_begin(void) __attribute__((always_inline));
|
||||
static inline void spi_begin(void) {
|
||||
#ifdef ESP8266
|
||||
SPI.beginTransaction(SPISettings(80000000, MSBFIRST, SPI_MODE0));
|
||||
#else
|
||||
SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
|
||||
#endif
|
||||
}
|
||||
static inline void spi_end(void) __attribute__((always_inline));
|
||||
static inline void spi_end(void) {
|
||||
SPI.endTransaction();
|
||||
}
|
||||
#else
|
||||
#define spi_begin()
|
||||
#define spi_end()
|
||||
#endif
|
||||
|
||||
// Rather than a bazillion writecommand() and writedata() calls, screen
|
||||
// initialization commands and arguments are organized in these tables
|
||||
// stored in PROGMEM. The table may look bulky, but that's mostly the
|
||||
// formatting -- storage-wise this is hundreds of bytes more compact
|
||||
// than the equivalent code. Companion function follows.
|
||||
#define DELAY 0x80
|
||||
|
||||
|
||||
// Companion code to the above tables. Reads and issues
|
||||
// a series of LCD commands stored in PROGMEM byte array.
|
||||
void Adafruit_ILI9341::commandList(uint8_t *addr) {
|
||||
|
||||
uint8_t numCommands, numArgs;
|
||||
uint16_t ms;
|
||||
|
||||
numCommands = pgm_read_byte(addr++); // Number of commands to follow
|
||||
while(numCommands--) { // For each command...
|
||||
writecommand(pgm_read_byte(addr++)); // Read, issue command
|
||||
numArgs = pgm_read_byte(addr++); // Number of args to follow
|
||||
ms = numArgs & DELAY; // If hibit set, delay follows args
|
||||
numArgs &= ~DELAY; // Mask out delay bit
|
||||
while(numArgs--) { // For each argument...
|
||||
writedata(pgm_read_byte(addr++)); // Read, issue argument
|
||||
}
|
||||
|
||||
if(ms) {
|
||||
ms = pgm_read_byte(addr++); // Read post-command delay time (ms)
|
||||
if(ms == 255) ms = 500; // If 255, delay for 500 ms
|
||||
delay(ms);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Adafruit_ILI9341::begin(void) {
|
||||
if (_rst > 0) {
|
||||
pinMode(_rst, OUTPUT);
|
||||
digitalWrite(_rst, LOW);
|
||||
}
|
||||
|
||||
pinMode(_dc, OUTPUT);
|
||||
pinMode(_cs, OUTPUT);
|
||||
#ifndef ESP8266
|
||||
#ifndef USE_DIGITAL_WRITE
|
||||
csport = portOutputRegister(digitalPinToPort(_cs));
|
||||
cspinmask = digitalPinToBitMask(_cs);
|
||||
dcport = portOutputRegister(digitalPinToPort(_dc));
|
||||
dcpinmask = digitalPinToBitMask(_dc);
|
||||
#endif
|
||||
if(hwSPI) { // Using hardware SPI
|
||||
#endif
|
||||
#if defined (__AVR__)
|
||||
SPI.begin();
|
||||
SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz (full! speed!)
|
||||
SPI.setBitOrder(MSBFIRST);
|
||||
SPI.setDataMode(SPI_MODE0);
|
||||
mySPCR = SPCR;
|
||||
#elif defined(TEENSYDUINO)
|
||||
SPI.begin();
|
||||
SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz (full! speed!)
|
||||
SPI.setBitOrder(MSBFIRST);
|
||||
SPI.setDataMode(SPI_MODE0);
|
||||
#elif defined (__arm__)
|
||||
SPI.begin();
|
||||
SPI.setClockDivider(11); // 8-ish MHz (full! speed!)
|
||||
SPI.setBitOrder(MSBFIRST);
|
||||
SPI.setDataMode(SPI_MODE0);
|
||||
#elif defined (ESP8266)
|
||||
SPI.begin();
|
||||
#endif
|
||||
#ifndef ESP8266
|
||||
} else {
|
||||
pinMode(_sclk, OUTPUT);
|
||||
pinMode(_mosi, OUTPUT);
|
||||
pinMode(_miso, INPUT);
|
||||
clkport = portOutputRegister(digitalPinToPort(_sclk));
|
||||
clkpinmask = digitalPinToBitMask(_sclk);
|
||||
mosiport = portOutputRegister(digitalPinToPort(_mosi));
|
||||
mosipinmask = digitalPinToBitMask(_mosi);
|
||||
*clkport &= ~clkpinmask;
|
||||
*mosiport &= ~mosipinmask;
|
||||
}
|
||||
#endif
|
||||
// toggle RST low to reset
|
||||
if (_rst > 0) {
|
||||
digitalWrite(_rst, HIGH);
|
||||
delay(5);
|
||||
digitalWrite(_rst, LOW);
|
||||
delay(20);
|
||||
digitalWrite(_rst, HIGH);
|
||||
delay(150);
|
||||
}
|
||||
|
||||
/*
|
||||
uint8_t x = readcommand8(ILI9341_RDMODE);
|
||||
Serial.print("\nDisplay Power Mode: 0x"); Serial.println(x, HEX);
|
||||
x = readcommand8(ILI9341_RDMADCTL);
|
||||
Serial.print("\nMADCTL Mode: 0x"); Serial.println(x, HEX);
|
||||
x = readcommand8(ILI9341_RDPIXFMT);
|
||||
Serial.print("\nPixel Format: 0x"); Serial.println(x, HEX);
|
||||
x = readcommand8(ILI9341_RDIMGFMT);
|
||||
Serial.print("\nImage Format: 0x"); Serial.println(x, HEX);
|
||||
x = readcommand8(ILI9341_RDSELFDIAG);
|
||||
Serial.print("\nSelf Diagnostic: 0x"); Serial.println(x, HEX);
|
||||
*/
|
||||
//if(cmdList) commandList(cmdList);
|
||||
|
||||
if (hwSPI) spi_begin();
|
||||
writecommand(0xEF);
|
||||
writedata(0x03);
|
||||
writedata(0x80);
|
||||
writedata(0x02);
|
||||
|
||||
writecommand(0xCF);
|
||||
writedata(0x00);
|
||||
writedata(0XC1);
|
||||
writedata(0X30);
|
||||
|
||||
writecommand(0xED);
|
||||
writedata(0x64);
|
||||
writedata(0x03);
|
||||
writedata(0X12);
|
||||
writedata(0X81);
|
||||
|
||||
writecommand(0xE8);
|
||||
writedata(0x85);
|
||||
writedata(0x00);
|
||||
writedata(0x78);
|
||||
|
||||
writecommand(0xCB);
|
||||
writedata(0x39);
|
||||
writedata(0x2C);
|
||||
writedata(0x00);
|
||||
writedata(0x34);
|
||||
writedata(0x02);
|
||||
|
||||
writecommand(0xF7);
|
||||
writedata(0x20);
|
||||
|
||||
writecommand(0xEA);
|
||||
writedata(0x00);
|
||||
writedata(0x00);
|
||||
|
||||
writecommand(ILI9341_PWCTR1); //Power control
|
||||
writedata(0x23); //VRH[5:0]
|
||||
|
||||
writecommand(ILI9341_PWCTR2); //Power control
|
||||
writedata(0x10); //SAP[2:0];BT[3:0]
|
||||
|
||||
writecommand(ILI9341_VMCTR1); //VCM control
|
||||
writedata(0x3e); //<2F>Աȶȵ<C8B6><C8B5><EFBFBD>
|
||||
writedata(0x28);
|
||||
|
||||
writecommand(ILI9341_VMCTR2); //VCM control2
|
||||
writedata(0x86); //--
|
||||
|
||||
writecommand(ILI9341_MADCTL); // Memory Access Control
|
||||
writedata(0x48);
|
||||
|
||||
writecommand(ILI9341_PIXFMT);
|
||||
writedata(0x55);
|
||||
|
||||
writecommand(ILI9341_FRMCTR1);
|
||||
writedata(0x00);
|
||||
writedata(0x18);
|
||||
|
||||
writecommand(ILI9341_DFUNCTR); // Display Function Control
|
||||
writedata(0x08);
|
||||
writedata(0x82);
|
||||
writedata(0x27);
|
||||
|
||||
writecommand(0xF2); // 3Gamma Function Disable
|
||||
writedata(0x00);
|
||||
|
||||
writecommand(ILI9341_GAMMASET); //Gamma curve selected
|
||||
writedata(0x01);
|
||||
|
||||
writecommand(ILI9341_GMCTRP1); //Set Gamma
|
||||
writedata(0x0F);
|
||||
writedata(0x31);
|
||||
writedata(0x2B);
|
||||
writedata(0x0C);
|
||||
writedata(0x0E);
|
||||
writedata(0x08);
|
||||
writedata(0x4E);
|
||||
writedata(0xF1);
|
||||
writedata(0x37);
|
||||
writedata(0x07);
|
||||
writedata(0x10);
|
||||
writedata(0x03);
|
||||
writedata(0x0E);
|
||||
writedata(0x09);
|
||||
writedata(0x00);
|
||||
|
||||
writecommand(ILI9341_GMCTRN1); //Set Gamma
|
||||
writedata(0x00);
|
||||
writedata(0x0E);
|
||||
writedata(0x14);
|
||||
writedata(0x03);
|
||||
writedata(0x11);
|
||||
writedata(0x07);
|
||||
writedata(0x31);
|
||||
writedata(0xC1);
|
||||
writedata(0x48);
|
||||
writedata(0x08);
|
||||
writedata(0x0F);
|
||||
writedata(0x0C);
|
||||
writedata(0x31);
|
||||
writedata(0x36);
|
||||
writedata(0x0F);
|
||||
|
||||
writecommand(ILI9341_SLPOUT); //Exit Sleep
|
||||
if (hwSPI) spi_end();
|
||||
delay(120);
|
||||
if (hwSPI) spi_begin();
|
||||
writecommand(ILI9341_DISPON); //Display on
|
||||
if (hwSPI) spi_end();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void Adafruit_ILI9341::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1,
|
||||
uint16_t y1) {
|
||||
|
||||
writecommand(ILI9341_CASET); // Column addr set
|
||||
writedata(x0 >> 8);
|
||||
writedata(x0 & 0xFF); // XSTART
|
||||
writedata(x1 >> 8);
|
||||
writedata(x1 & 0xFF); // XEND
|
||||
|
||||
writecommand(ILI9341_PASET); // Row addr set
|
||||
writedata(y0>>8);
|
||||
writedata(y0); // YSTART
|
||||
writedata(y1>>8);
|
||||
writedata(y1); // YEND
|
||||
|
||||
writecommand(ILI9341_RAMWR); // write to RAM
|
||||
}
|
||||
|
||||
|
||||
void Adafruit_ILI9341::pushColor(uint16_t color) {
|
||||
if (hwSPI) spi_begin();
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_dc, HIGH);
|
||||
digitalWrite(_cs, LOW);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOS = digitalPinToBitMask(_dc);
|
||||
GPOC = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*dcport |= dcpinmask;
|
||||
*csport &= ~cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
spiwrite(color >> 8);
|
||||
spiwrite(color);
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_cs, HIGH);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOS = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*csport |= cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
if (hwSPI) spi_end();
|
||||
}
|
||||
|
||||
void Adafruit_ILI9341::drawPixel(int16_t x, int16_t y, uint16_t color) {
|
||||
|
||||
if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
|
||||
|
||||
if (hwSPI) spi_begin();
|
||||
setAddrWindow(x,y,x+1,y+1);
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_dc, HIGH);
|
||||
digitalWrite(_cs, LOW);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOS = digitalPinToBitMask(_dc);
|
||||
GPOC = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*dcport |= dcpinmask;
|
||||
*csport &= ~cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
spiwrite(color >> 8);
|
||||
spiwrite(color);
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_cs, HIGH);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOS = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*csport |= cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
if (hwSPI) spi_end();
|
||||
}
|
||||
|
||||
|
||||
void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h,
|
||||
uint16_t color) {
|
||||
|
||||
// Rudimentary clipping
|
||||
if((x >= _width) || (y >= _height)) return;
|
||||
|
||||
if((y+h-1) >= _height)
|
||||
h = _height-y;
|
||||
|
||||
if (hwSPI) spi_begin();
|
||||
setAddrWindow(x, y, x, y+h-1);
|
||||
|
||||
uint8_t hi = color >> 8, lo = color;
|
||||
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_dc, HIGH);
|
||||
digitalWrite(_cs, LOW);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOS = digitalPinToBitMask(_dc);
|
||||
GPOC = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*dcport |= dcpinmask;
|
||||
*csport &= ~cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
while (h--) {
|
||||
spiwrite(hi);
|
||||
spiwrite(lo);
|
||||
}
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_cs, HIGH);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOS = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*csport |= cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
if (hwSPI) spi_end();
|
||||
}
|
||||
|
||||
|
||||
void Adafruit_ILI9341::drawFastHLine(int16_t x, int16_t y, int16_t w,
|
||||
uint16_t color) {
|
||||
|
||||
// Rudimentary clipping
|
||||
if((x >= _width) || (y >= _height)) return;
|
||||
if((x+w-1) >= _width) w = _width-x;
|
||||
if (hwSPI) spi_begin();
|
||||
setAddrWindow(x, y, x+w-1, y);
|
||||
|
||||
uint8_t hi = color >> 8, lo = color;
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_dc, HIGH);
|
||||
digitalWrite(_cs, LOW);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOS = digitalPinToBitMask(_dc);
|
||||
GPOC = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*dcport |= dcpinmask;
|
||||
*csport &= ~cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
while (w--) {
|
||||
spiwrite(hi);
|
||||
spiwrite(lo);
|
||||
}
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_cs, HIGH);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOS = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*csport |= cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
if (hwSPI) spi_end();
|
||||
}
|
||||
|
||||
void Adafruit_ILI9341::fillScreen(uint16_t color) {
|
||||
fillRect(0, 0, _width, _height, color);
|
||||
}
|
||||
|
||||
// fill a rectangle
|
||||
void Adafruit_ILI9341::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
|
||||
uint16_t color) {
|
||||
|
||||
// rudimentary clipping (drawChar w/big text requires this)
|
||||
if((x >= _width) || (y >= _height)) return;
|
||||
if((x + w - 1) >= _width) w = _width - x;
|
||||
if((y + h - 1) >= _height) h = _height - y;
|
||||
|
||||
if (hwSPI) spi_begin();
|
||||
setAddrWindow(x, y, x+w-1, y+h-1);
|
||||
|
||||
uint8_t hi = color >> 8, lo = color;
|
||||
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_dc, HIGH);
|
||||
digitalWrite(_cs, LOW);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOS = digitalPinToBitMask(_dc);
|
||||
GPOC = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*dcport |= dcpinmask;
|
||||
*csport &= ~cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
for(y=h; y>0; y--) {
|
||||
for(x=w; x>0; x--) {
|
||||
spiwrite(hi);
|
||||
spiwrite(lo);
|
||||
}
|
||||
}
|
||||
#ifdef USE_DIGITAL_WRITE
|
||||
digitalWrite(_cs, HIGH);
|
||||
#else
|
||||
#ifdef ESP8266
|
||||
GPOS = digitalPinToBitMask(_cs);
|
||||
#else
|
||||
*csport |= cspinmask;
|
||||
#endif
|
||||
#endif
|
||||
if (hwSPI) spi_end();
|
||||
}
|
||||
|
||||
|
||||
// Pass 8-bit (each) R,G,B, get back 16-bit packed color
|
||||
uint16_t Adafruit_ILI9341::color565(uint8_t r, uint8_t g, uint8_t b) {
|
||||
return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
|
||||
}
|
||||
|
||||
|
||||
#define MADCTL_MY 0x80
|
||||
#define MADCTL_MX 0x40
|
||||
#define MADCTL_MV 0x20
|
||||
#define MADCTL_ML 0x10
|
||||
#define MADCTL_RGB 0x00
|
||||
#define MADCTL_BGR 0x08
|
||||
#define MADCTL_MH 0x04
|
||||
|
||||
void Adafruit_ILI9341::setRotation(uint8_t m) {
|
||||
|
||||
if (hwSPI) spi_begin();
|
||||
writecommand(ILI9341_MADCTL);
|
||||
rotation = m % 4; // can't be higher than 3
|
||||
switch (rotation) {
|
||||
case 0:
|
||||
writedata(MADCTL_MX | MADCTL_BGR);
|
||||
_width = ILI9341_TFTWIDTH;
|
||||
_height = ILI9341_TFTHEIGHT;
|
||||
break;
|
||||
case 1:
|
||||
writedata(MADCTL_MV | MADCTL_BGR);
|
||||
_width = ILI9341_TFTHEIGHT;
|
||||
_height = ILI9341_TFTWIDTH;
|
||||
break;
|
||||
case 2:
|
||||
writedata(MADCTL_MY | MADCTL_BGR);
|
||||
_width = ILI9341_TFTWIDTH;
|
||||
_height = ILI9341_TFTHEIGHT;
|
||||
break;
|
||||
case 3:
|
||||
writedata(MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR);
|
||||
_width = ILI9341_TFTHEIGHT;
|
||||
_height = ILI9341_TFTWIDTH;
|
||||
break;
|
||||
}
|
||||
if (hwSPI) spi_end();
|
||||
}
|
||||
|
||||
|
||||
void Adafruit_ILI9341::invertDisplay(boolean i) {
|
||||
if (hwSPI) spi_begin();
|
||||
writecommand(i ? ILI9341_INVON : ILI9341_INVOFF);
|
||||
if (hwSPI) spi_end();
|
||||
}
|
||||
|
||||
|
||||
////////// stuff not actively being used, but kept for posterity
|
||||
|
||||
|
||||
uint8_t Adafruit_ILI9341::spiread(void) {
|
||||
uint8_t r = 0;
|
||||
|
||||
if (hwSPI) {
|
||||
#if defined (__AVR__)
|
||||
uint8_t backupSPCR = SPCR;
|
||||
SPCR = mySPCR;
|
||||
SPDR = 0x00;
|
||||
while(!(SPSR & _BV(SPIF)));
|
||||
r = SPDR;
|
||||
SPCR = backupSPCR;
|
||||
#elif defined(TEENSYDUINO)
|
||||
r = SPI.transfer(0x00);
|
||||
#elif defined (__arm__)
|
||||
SPI.setClockDivider(11); // 8-ish MHz (full! speed!)
|
||||
SPI.setBitOrder(MSBFIRST);
|
||||
SPI.setDataMode(SPI_MODE0);
|
||||
r = SPI.transfer(0x00);
|
||||
#else
|
||||
spi_begin();
|
||||
r = SPI.transfer(0x00);
|
||||
spi_end();
|
||||
#endif
|
||||
} else {
|
||||
#ifndef ESP8266
|
||||
for (uint8_t i=0; i<8; i++) {
|
||||
digitalWrite(_sclk, LOW);
|
||||
digitalWrite(_sclk, HIGH);
|
||||
r <<= 1;
|
||||
if (digitalRead(_miso))
|
||||
r |= 0x1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
//Serial.print("read: 0x"); Serial.print(r, HEX);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
uint8_t Adafruit_ILI9341::readdata(void) {
|
||||
digitalWrite(_dc, HIGH);
|
||||
digitalWrite(_cs, LOW);
|
||||
uint8_t r = spiread();
|
||||
digitalWrite(_cs, HIGH);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
uint8_t Adafruit_ILI9341::readcommand8(uint8_t c, uint8_t index) {
|
||||
if (hwSPI) spi_begin();
|
||||
digitalWrite(_dc, LOW); // command
|
||||
digitalWrite(_cs, LOW);
|
||||
spiwrite(0xD9); // woo sekret command?
|
||||
digitalWrite(_dc, HIGH); // data
|
||||
spiwrite(0x10 + index);
|
||||
digitalWrite(_cs, HIGH);
|
||||
|
||||
digitalWrite(_dc, LOW);
|
||||
#ifndef ESP8266
|
||||
digitalWrite(_sclk, LOW);
|
||||
#endif
|
||||
digitalWrite(_cs, LOW);
|
||||
spiwrite(c);
|
||||
|
||||
digitalWrite(_dc, HIGH);
|
||||
uint8_t r = spiread();
|
||||
digitalWrite(_cs, HIGH);
|
||||
if (hwSPI) spi_end();
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
uint16_t Adafruit_ILI9341::readcommand16(uint8_t c) {
|
||||
digitalWrite(_dc, LOW);
|
||||
if (_cs)
|
||||
digitalWrite(_cs, LOW);
|
||||
|
||||
spiwrite(c);
|
||||
pinMode(_sid, INPUT); // input!
|
||||
uint16_t r = spiread();
|
||||
r <<= 8;
|
||||
r |= spiread();
|
||||
if (_cs)
|
||||
digitalWrite(_cs, HIGH);
|
||||
|
||||
pinMode(_sid, OUTPUT); // back to output
|
||||
return r;
|
||||
}
|
||||
|
||||
uint32_t Adafruit_ILI9341::readcommand32(uint8_t c) {
|
||||
digitalWrite(_dc, LOW);
|
||||
if (_cs)
|
||||
digitalWrite(_cs, LOW);
|
||||
spiwrite(c);
|
||||
pinMode(_sid, INPUT); // input!
|
||||
|
||||
dummyclock();
|
||||
dummyclock();
|
||||
|
||||
uint32_t r = spiread();
|
||||
r <<= 8;
|
||||
r |= spiread();
|
||||
r <<= 8;
|
||||
r |= spiread();
|
||||
r <<= 8;
|
||||
r |= spiread();
|
||||
if (_cs)
|
||||
digitalWrite(_cs, HIGH);
|
||||
|
||||
pinMode(_sid, OUTPUT); // back to output
|
||||
return r;
|
||||
}
|
||||
|
||||
*/
|
170
libraries/Adafruit_ILI9341/Adafruit_ILI9341.h
Normal file
170
libraries/Adafruit_ILI9341/Adafruit_ILI9341.h
Normal file
@ -0,0 +1,170 @@
|
||||
/***************************************************
|
||||
This is our library for the Adafruit ILI9341 Breakout and Shield
|
||||
----> http://www.adafruit.com/products/1651
|
||||
|
||||
Check out the links above for our tutorials and wiring diagrams
|
||||
These displays use SPI to communicate, 4 or 5 pins are required to
|
||||
interface (RST is optional)
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
MIT license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
#ifndef _ADAFRUIT_ILI9341H_
|
||||
#define _ADAFRUIT_ILI9341H_
|
||||
|
||||
#if ARDUINO >= 100
|
||||
#include "Arduino.h"
|
||||
#include "Print.h"
|
||||
#else
|
||||
#include "WProgram.h"
|
||||
#endif
|
||||
#include <Adafruit_GFX.h>
|
||||
#ifdef ESP8266
|
||||
#include <pgmspace.h>
|
||||
#else
|
||||
#include <avr/pgmspace.h>
|
||||
#endif
|
||||
|
||||
#define ILI9341_TFTWIDTH 240
|
||||
#define ILI9341_TFTHEIGHT 320
|
||||
|
||||
#define ILI9341_NOP 0x00
|
||||
#define ILI9341_SWRESET 0x01
|
||||
#define ILI9341_RDDID 0x04
|
||||
#define ILI9341_RDDST 0x09
|
||||
|
||||
#define ILI9341_SLPIN 0x10
|
||||
#define ILI9341_SLPOUT 0x11
|
||||
#define ILI9341_PTLON 0x12
|
||||
#define ILI9341_NORON 0x13
|
||||
|
||||
#define ILI9341_RDMODE 0x0A
|
||||
#define ILI9341_RDMADCTL 0x0B
|
||||
#define ILI9341_RDPIXFMT 0x0C
|
||||
#define ILI9341_RDIMGFMT 0x0A
|
||||
#define ILI9341_RDSELFDIAG 0x0F
|
||||
|
||||
#define ILI9341_INVOFF 0x20
|
||||
#define ILI9341_INVON 0x21
|
||||
#define ILI9341_GAMMASET 0x26
|
||||
#define ILI9341_DISPOFF 0x28
|
||||
#define ILI9341_DISPON 0x29
|
||||
|
||||
#define ILI9341_CASET 0x2A
|
||||
#define ILI9341_PASET 0x2B
|
||||
#define ILI9341_RAMWR 0x2C
|
||||
#define ILI9341_RAMRD 0x2E
|
||||
|
||||
#define ILI9341_PTLAR 0x30
|
||||
#define ILI9341_MADCTL 0x36
|
||||
#define ILI9341_PIXFMT 0x3A
|
||||
|
||||
#define ILI9341_FRMCTR1 0xB1
|
||||
#define ILI9341_FRMCTR2 0xB2
|
||||
#define ILI9341_FRMCTR3 0xB3
|
||||
#define ILI9341_INVCTR 0xB4
|
||||
#define ILI9341_DFUNCTR 0xB6
|
||||
|
||||
#define ILI9341_PWCTR1 0xC0
|
||||
#define ILI9341_PWCTR2 0xC1
|
||||
#define ILI9341_PWCTR3 0xC2
|
||||
#define ILI9341_PWCTR4 0xC3
|
||||
#define ILI9341_PWCTR5 0xC4
|
||||
#define ILI9341_VMCTR1 0xC5
|
||||
#define ILI9341_VMCTR2 0xC7
|
||||
|
||||
#define ILI9341_RDID1 0xDA
|
||||
#define ILI9341_RDID2 0xDB
|
||||
#define ILI9341_RDID3 0xDC
|
||||
#define ILI9341_RDID4 0xDD
|
||||
|
||||
#define ILI9341_GMCTRP1 0xE0
|
||||
#define ILI9341_GMCTRN1 0xE1
|
||||
/*
|
||||
#define ILI9341_PWCTR6 0xFC
|
||||
|
||||
*/
|
||||
|
||||
// Color definitions
|
||||
#define ILI9341_BLACK 0x0000 /* 0, 0, 0 */
|
||||
#define ILI9341_NAVY 0x000F /* 0, 0, 128 */
|
||||
#define ILI9341_DARKGREEN 0x03E0 /* 0, 128, 0 */
|
||||
#define ILI9341_DARKCYAN 0x03EF /* 0, 128, 128 */
|
||||
#define ILI9341_MAROON 0x7800 /* 128, 0, 0 */
|
||||
#define ILI9341_PURPLE 0x780F /* 128, 0, 128 */
|
||||
#define ILI9341_OLIVE 0x7BE0 /* 128, 128, 0 */
|
||||
#define ILI9341_LIGHTGREY 0xC618 /* 192, 192, 192 */
|
||||
#define ILI9341_DARKGREY 0x7BEF /* 128, 128, 128 */
|
||||
#define ILI9341_BLUE 0x001F /* 0, 0, 255 */
|
||||
#define ILI9341_GREEN 0x07E0 /* 0, 255, 0 */
|
||||
#define ILI9341_CYAN 0x07FF /* 0, 255, 255 */
|
||||
#define ILI9341_RED 0xF800 /* 255, 0, 0 */
|
||||
#define ILI9341_MAGENTA 0xF81F /* 255, 0, 255 */
|
||||
#define ILI9341_YELLOW 0xFFE0 /* 255, 255, 0 */
|
||||
#define ILI9341_WHITE 0xFFFF /* 255, 255, 255 */
|
||||
#define ILI9341_ORANGE 0xFD20 /* 255, 165, 0 */
|
||||
#define ILI9341_GREENYELLOW 0xAFE5 /* 173, 255, 47 */
|
||||
#define ILI9341_PINK 0xF81F
|
||||
|
||||
//#define USE_DIGITAL_WRITE
|
||||
|
||||
class Adafruit_ILI9341 : public Adafruit_GFX {
|
||||
|
||||
public:
|
||||
#ifndef ESP8266
|
||||
Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK,
|
||||
int8_t _RST, int8_t _MISO);
|
||||
#endif
|
||||
Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _RST = -1);
|
||||
|
||||
void begin(void),
|
||||
setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1),
|
||||
pushColor(uint16_t color),
|
||||
fillScreen(uint16_t color),
|
||||
drawPixel(int16_t x, int16_t y, uint16_t color),
|
||||
drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color),
|
||||
drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color),
|
||||
fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
|
||||
uint16_t color),
|
||||
setRotation(uint8_t r),
|
||||
invertDisplay(boolean i);
|
||||
uint16_t color565(uint8_t r, uint8_t g, uint8_t b);
|
||||
|
||||
/* These are not for current use, 8-bit protocol only! */
|
||||
uint8_t readdata(void),
|
||||
readcommand8(uint8_t reg, uint8_t index = 0);
|
||||
/*
|
||||
uint16_t readcommand16(uint8_t);
|
||||
uint32_t readcommand32(uint8_t);
|
||||
void dummyclock(void);
|
||||
*/
|
||||
|
||||
void spiwrite(uint8_t),
|
||||
writecommand(uint8_t c),
|
||||
writedata(uint8_t d),
|
||||
commandList(uint8_t *addr);
|
||||
uint8_t spiread(void);
|
||||
|
||||
private:
|
||||
uint8_t tabcolor;
|
||||
|
||||
boolean hwSPI;
|
||||
#if defined (__AVR__) || defined(TEENSYDUINO)
|
||||
uint8_t mySPCR;
|
||||
volatile uint8_t *mosiport, *clkport, *dcport, *rsport, *csport;
|
||||
int8_t _cs, _dc, _rst, _mosi, _miso, _sclk;
|
||||
uint8_t mosipinmask, clkpinmask, cspinmask, dcpinmask;
|
||||
#elif defined (__arm__)
|
||||
volatile RwReg *mosiport, *clkport, *dcport, *rsport, *csport;
|
||||
uint32_t _cs, _dc, _rst, _mosi, _miso, _sclk;
|
||||
uint32_t mosipinmask, clkpinmask, cspinmask, dcpinmask;
|
||||
#elif defined (ESP8266)
|
||||
uint32_t _cs, _dc, _rst;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif
|
21
libraries/Adafruit_ILI9341/README.txt
Normal file
21
libraries/Adafruit_ILI9341/README.txt
Normal file
@ -0,0 +1,21 @@
|
||||
This is a library for the Adafruit ILI9341 display products
|
||||
|
||||
This library works with the Adafruit 2.8" Touch Shield V2 (SPI)
|
||||
----> http://www.adafruit.com/products/1651
|
||||
|
||||
Check out the links above for our tutorials and wiring diagrams.
|
||||
These displays use SPI to communicate, 4 or 5 pins are required
|
||||
to interface (RST is optional).
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
MIT license, all text above must be included in any redistribution
|
||||
|
||||
To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_ILI9341. Check that the Adafruit_ILI9341 folder contains Adafruit_ILI9341.cpp and Adafruit_ILI9341.
|
||||
|
||||
Place the Adafruit_ILI9341 library folder your arduinosketchfolder/libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE
|
||||
|
||||
Also requires the Adafruit_GFX library for Arduino.
|
@ -0,0 +1,145 @@
|
||||
/***************************************************
|
||||
This is our touchscreen painting example for the Adafruit ILI9341 Breakout
|
||||
----> http://www.adafruit.com/products/1770
|
||||
|
||||
Check out the links above for our tutorials and wiring diagrams
|
||||
These displays use SPI to communicate, 4 or 5 pins are required to
|
||||
interface (RST is optional)
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
MIT license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
/** NOT FOR USE WITH THE TOUCH SHIELD, ONLY FOR THE BREAKOUT! **/
|
||||
|
||||
#include <Adafruit_GFX.h> // Core graphics library
|
||||
#include <SPI.h>
|
||||
#include <Adafruit_ILI9341.h>
|
||||
#include "TouchScreen.h"
|
||||
|
||||
// These are the four touchscreen analog pins
|
||||
#define YP A2 // must be an analog pin, use "An" notation!
|
||||
#define XM A3 // must be an analog pin, use "An" notation!
|
||||
#define YM 5 // can be a digital pin
|
||||
#define XP 4 // can be a digital pin
|
||||
|
||||
// This is calibration data for the raw touch data to the screen coordinates
|
||||
#define TS_MINX 150
|
||||
#define TS_MINY 120
|
||||
#define TS_MAXX 920
|
||||
#define TS_MAXY 940
|
||||
|
||||
#define MINPRESSURE 10
|
||||
#define MAXPRESSURE 1000
|
||||
|
||||
// The display uses hardware SPI, plus #9 & #10
|
||||
#define TFT_CS 10
|
||||
#define TFT_DC 9
|
||||
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
|
||||
|
||||
// For better pressure precision, we need to know the resistance
|
||||
// between X+ and X- Use any multimeter to read it
|
||||
// For the one we're using, its 300 ohms across the X plate
|
||||
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
|
||||
|
||||
// Size of the color selection boxes and the paintbrush size
|
||||
#define BOXSIZE 40
|
||||
#define PENRADIUS 3
|
||||
int oldcolor, currentcolor;
|
||||
|
||||
void setup(void) {
|
||||
// while (!Serial); // used for leonardo debugging
|
||||
|
||||
Serial.begin(9600);
|
||||
Serial.println(F("Touch Paint!"));
|
||||
|
||||
tft.begin();
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
|
||||
// make the color selection boxes
|
||||
tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED);
|
||||
tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW);
|
||||
tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN);
|
||||
tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN);
|
||||
tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE);
|
||||
tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA);
|
||||
|
||||
// select the current color 'red'
|
||||
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
currentcolor = ILI9341_RED;
|
||||
}
|
||||
|
||||
|
||||
void loop()
|
||||
{
|
||||
// Retrieve a point
|
||||
TSPoint p = ts.getPoint();
|
||||
|
||||
/*
|
||||
Serial.print("X = "); Serial.print(p.x);
|
||||
Serial.print("\tY = "); Serial.print(p.y);
|
||||
Serial.print("\tPressure = "); Serial.println(p.z);
|
||||
*/
|
||||
|
||||
// we have some minimum pressure we consider 'valid'
|
||||
// pressure of 0 means no pressing!
|
||||
if (p.z < MINPRESSURE || p.z > MAXPRESSURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Scale from ~0->1000 to tft.width using the calibration #'s
|
||||
p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
|
||||
p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
|
||||
|
||||
/*
|
||||
Serial.print("("); Serial.print(p.x);
|
||||
Serial.print(", "); Serial.print(p.y);
|
||||
Serial.println(")");
|
||||
*/
|
||||
|
||||
|
||||
if (p.y < BOXSIZE) {
|
||||
oldcolor = currentcolor;
|
||||
|
||||
if (p.x < BOXSIZE) {
|
||||
currentcolor = ILI9341_RED;
|
||||
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
} else if (p.x < BOXSIZE*2) {
|
||||
currentcolor = ILI9341_YELLOW;
|
||||
tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
} else if (p.x < BOXSIZE*3) {
|
||||
currentcolor = ILI9341_GREEN;
|
||||
tft.drawRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
} else if (p.x < BOXSIZE*4) {
|
||||
currentcolor = ILI9341_CYAN;
|
||||
tft.drawRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
} else if (p.x < BOXSIZE*5) {
|
||||
currentcolor = ILI9341_BLUE;
|
||||
tft.drawRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
} else if (p.x < BOXSIZE*6) {
|
||||
currentcolor = ILI9341_MAGENTA;
|
||||
tft.drawRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
}
|
||||
|
||||
if (oldcolor != currentcolor) {
|
||||
if (oldcolor == ILI9341_RED)
|
||||
tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED);
|
||||
if (oldcolor == ILI9341_YELLOW)
|
||||
tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW);
|
||||
if (oldcolor == ILI9341_GREEN)
|
||||
tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN);
|
||||
if (oldcolor == ILI9341_CYAN)
|
||||
tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN);
|
||||
if (oldcolor == ILI9341_BLUE)
|
||||
tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE);
|
||||
if (oldcolor == ILI9341_MAGENTA)
|
||||
tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA);
|
||||
}
|
||||
}
|
||||
if (((p.y-PENRADIUS) > BOXSIZE) && ((p.y+PENRADIUS) < tft.height())) {
|
||||
tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor);
|
||||
}
|
||||
}
|
@ -11,8 +11,6 @@
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
MIT license, all text above must be included in any redistribution
|
||||
|
||||
Modified by Sermus for ESP8266
|
||||
****************************************************/
|
||||
|
||||
|
||||
@ -20,14 +18,33 @@
|
||||
#include "Adafruit_GFX.h"
|
||||
#include "Adafruit_ILI9341.h"
|
||||
|
||||
Adafruit_ILI9341 tft = Adafruit_ILI9341();
|
||||
// For the Adafruit shield, these are the default.
|
||||
#define TFT_DC 9
|
||||
#define TFT_CS 10
|
||||
|
||||
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
|
||||
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
|
||||
// If using the breakout, change pins as desired
|
||||
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
Serial.begin(9600);
|
||||
Serial.println("ILI9341 Test!");
|
||||
|
||||
tft.begin();
|
||||
|
||||
// read diagnostics (optional but can help debug problems)
|
||||
uint8_t x = tft.readcommand8(ILI9341_RDMODE);
|
||||
Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX);
|
||||
x = tft.readcommand8(ILI9341_RDMADCTL);
|
||||
Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX);
|
||||
x = tft.readcommand8(ILI9341_RDPIXFMT);
|
||||
Serial.print("Pixel Format: 0x"); Serial.println(x, HEX);
|
||||
x = tft.readcommand8(ILI9341_RDIMGFMT);
|
||||
Serial.print("Image Format: 0x"); Serial.println(x, HEX);
|
||||
x = tft.readcommand8(ILI9341_RDSELFDIAG);
|
||||
Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX);
|
||||
|
||||
Serial.println(F("Benchmark Time (microseconds)"));
|
||||
|
||||
Serial.print(F("Screen fill "));
|
||||
@ -329,4 +346,4 @@ unsigned long testFilledRoundRects() {
|
||||
}
|
||||
|
||||
return micros() - start;
|
||||
}
|
||||
}
|
@ -0,0 +1,341 @@
|
||||
#include <Arduino.h>
|
||||
#include <Adafruit_ILI9341.h>
|
||||
|
||||
// For the Adafruit shield, these are the default.
|
||||
#define TFT_DC 4
|
||||
#define TFT_CS 5
|
||||
|
||||
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
|
||||
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
|
||||
|
||||
#define SERIAL_OUT Serial
|
||||
|
||||
unsigned long testFillScreen() {
|
||||
unsigned long start = micros();
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
tft.fillScreen(ILI9341_RED);
|
||||
tft.fillScreen(ILI9341_GREEN);
|
||||
tft.fillScreen(ILI9341_BLUE);
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
return micros() - start;
|
||||
}
|
||||
|
||||
unsigned long testText() {
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
unsigned long start = micros();
|
||||
tft.setCursor(0, 0);
|
||||
tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1);
|
||||
tft.println("Hello World!");
|
||||
tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2);
|
||||
tft.println(1234.56);
|
||||
tft.setTextColor(ILI9341_RED); tft.setTextSize(3);
|
||||
tft.println(0xDEADBEEF, HEX);
|
||||
tft.println();
|
||||
tft.setTextColor(ILI9341_GREEN);
|
||||
tft.setTextSize(5);
|
||||
tft.println("Groop");
|
||||
tft.setTextSize(2);
|
||||
tft.println("I implore thee,");
|
||||
tft.setTextSize(1);
|
||||
tft.println("my foonting turlingdromes.");
|
||||
tft.println("And hooptiously drangle me");
|
||||
tft.println("with crinkly bindlewurdles,");
|
||||
tft.println("Or I will rend thee");
|
||||
tft.println("in the gobberwarts");
|
||||
tft.println("with my blurglecruncheon,");
|
||||
tft.println("see if I don't!");
|
||||
return micros() - start;
|
||||
}
|
||||
|
||||
unsigned long testLines(uint16_t color) {
|
||||
unsigned long start, t;
|
||||
int x1, y1, x2, y2,
|
||||
w = tft.width(),
|
||||
h = tft.height();
|
||||
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
delay(0);
|
||||
|
||||
x1 = y1 = 0;
|
||||
y2 = h - 1;
|
||||
start = micros();
|
||||
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
|
||||
x2 = w - 1;
|
||||
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
|
||||
t = micros() - start; // fillScreen doesn't count against timing
|
||||
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
delay(0);
|
||||
|
||||
x1 = w - 1;
|
||||
y1 = 0;
|
||||
y2 = h - 1;
|
||||
start = micros();
|
||||
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
|
||||
x2 = 0;
|
||||
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
|
||||
t += micros() - start;
|
||||
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
delay(0);
|
||||
|
||||
x1 = 0;
|
||||
y1 = h - 1;
|
||||
y2 = 0;
|
||||
start = micros();
|
||||
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
|
||||
x2 = w - 1;
|
||||
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
|
||||
t += micros() - start;
|
||||
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
delay(0);
|
||||
|
||||
x1 = w - 1;
|
||||
y1 = h - 1;
|
||||
y2 = 0;
|
||||
start = micros();
|
||||
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
|
||||
x2 = 0;
|
||||
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
|
||||
|
||||
return micros() - start;
|
||||
}
|
||||
|
||||
unsigned long testFastLines(uint16_t color1, uint16_t color2) {
|
||||
unsigned long start;
|
||||
int x, y, w = tft.width(), h = tft.height();
|
||||
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
start = micros();
|
||||
for(y=0; y<h; y+=5) tft.drawFastHLine(0, y, w, color1);
|
||||
for(x=0; x<w; x+=5) tft.drawFastVLine(x, 0, h, color2);
|
||||
|
||||
return micros() - start;
|
||||
}
|
||||
|
||||
unsigned long testRects(uint16_t color) {
|
||||
unsigned long start;
|
||||
int n, i, i2,
|
||||
cx = tft.width() / 2,
|
||||
cy = tft.height() / 2;
|
||||
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
n = min(tft.width(), tft.height());
|
||||
start = micros();
|
||||
for(i=2; i<n; i+=6) {
|
||||
i2 = i / 2;
|
||||
tft.drawRect(cx-i2, cy-i2, i, i, color);
|
||||
}
|
||||
|
||||
return micros() - start;
|
||||
}
|
||||
|
||||
unsigned long testFilledRects(uint16_t color1, uint16_t color2) {
|
||||
unsigned long start, t = 0;
|
||||
int n, i, i2,
|
||||
cx = tft.width() / 2 - 1,
|
||||
cy = tft.height() / 2 - 1;
|
||||
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
n = min(tft.width(), tft.height());
|
||||
for(i=n; i>0; i-=6) {
|
||||
delay(0);
|
||||
i2 = i / 2;
|
||||
start = micros();
|
||||
tft.fillRect(cx-i2, cy-i2, i, i, color1);
|
||||
t += micros() - start;
|
||||
// Outlines are not included in timing results
|
||||
tft.drawRect(cx-i2, cy-i2, i, i, color2);
|
||||
}
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
|
||||
unsigned long start;
|
||||
int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;
|
||||
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
start = micros();
|
||||
for(x=radius; x<w; x+=r2) {
|
||||
for(y=radius; y<h; y+=r2) {
|
||||
tft.fillCircle(x, y, radius, color);
|
||||
}
|
||||
}
|
||||
|
||||
return micros() - start;
|
||||
}
|
||||
|
||||
unsigned long testCircles(uint8_t radius, uint16_t color) {
|
||||
unsigned long start;
|
||||
int x, y, r2 = radius * 2,
|
||||
w = tft.width() + radius,
|
||||
h = tft.height() + radius;
|
||||
|
||||
// Screen is not cleared for this one -- this is
|
||||
// intentional and does not affect the reported time.
|
||||
start = micros();
|
||||
for(x=0; x<w; x+=r2) {
|
||||
for(y=0; y<h; y+=r2) {
|
||||
tft.drawCircle(x, y, radius, color);
|
||||
}
|
||||
}
|
||||
|
||||
return micros() - start;
|
||||
}
|
||||
|
||||
unsigned long testTriangles() {
|
||||
unsigned long start;
|
||||
int n, i, cx = tft.width() / 2 - 1,
|
||||
cy = tft.height() / 2 - 1;
|
||||
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
n = min(cx, cy);
|
||||
start = micros();
|
||||
for(i=0; i<n; i+=5) {
|
||||
tft.drawTriangle(
|
||||
cx , cy - i, // peak
|
||||
cx - i, cy + i, // bottom left
|
||||
cx + i, cy + i, // bottom right
|
||||
tft.color565(0, 0, i));
|
||||
}
|
||||
|
||||
return micros() - start;
|
||||
}
|
||||
|
||||
unsigned long testFilledTriangles() {
|
||||
unsigned long start, t = 0;
|
||||
int i, cx = tft.width() / 2 - 1,
|
||||
cy = tft.height() / 2 - 1;
|
||||
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
start = micros();
|
||||
for(i=min(cx,cy); i>10; i-=5) {
|
||||
start = micros();
|
||||
tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
|
||||
tft.color565(0, i, i));
|
||||
t += micros() - start;
|
||||
tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
|
||||
tft.color565(i, i, 0));
|
||||
}
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
unsigned long testRoundRects() {
|
||||
unsigned long start;
|
||||
int w, i, i2,
|
||||
cx = tft.width() / 2 - 1,
|
||||
cy = tft.height() / 2 - 1;
|
||||
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
w = min(tft.width(), tft.height());
|
||||
start = micros();
|
||||
for(i=0; i<w; i+=6) {
|
||||
i2 = i / 2;
|
||||
tft.drawRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(i, 0, 0));
|
||||
delay(0);
|
||||
}
|
||||
|
||||
return micros() - start;
|
||||
}
|
||||
|
||||
unsigned long testFilledRoundRects() {
|
||||
unsigned long start;
|
||||
int i, i2,
|
||||
cx = tft.width() / 2 - 1,
|
||||
cy = tft.height() / 2 - 1;
|
||||
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
start = micros();
|
||||
for(i=min(tft.width(), tft.height()); i>20; i-=6) {
|
||||
i2 = i / 2;
|
||||
tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
|
||||
delay(0);
|
||||
}
|
||||
|
||||
return micros() - start;
|
||||
}
|
||||
|
||||
|
||||
void setup() {
|
||||
SERIAL_OUT.begin(921600);
|
||||
SERIAL_OUT.println("ILI9341 Test!");
|
||||
|
||||
tft.begin();
|
||||
|
||||
// read diagnostics (optional but can help debug problems)
|
||||
uint8_t x = tft.readcommand8(ILI9341_RDMODE);
|
||||
SERIAL_OUT.print("Display Power Mode: 0x"); SERIAL_OUT.println(x, HEX);
|
||||
x = tft.readcommand8(ILI9341_RDMADCTL);
|
||||
SERIAL_OUT.print("MADCTL Mode: 0x"); SERIAL_OUT.println(x, HEX);
|
||||
x = tft.readcommand8(ILI9341_RDPIXFMT);
|
||||
SERIAL_OUT.print("Pixel Format: 0x"); SERIAL_OUT.println(x, HEX);
|
||||
x = tft.readcommand8(ILI9341_RDIMGFMT);
|
||||
SERIAL_OUT.print("Image Format: 0x"); SERIAL_OUT.println(x, HEX);
|
||||
x = tft.readcommand8(ILI9341_RDSELFDIAG);
|
||||
SERIAL_OUT.print("Self Diagnostic: 0x"); SERIAL_OUT.println(x, HEX);
|
||||
|
||||
SERIAL_OUT.println(F("Benchmark Time (microseconds)"));
|
||||
|
||||
SERIAL_OUT.print(F("Screen fill "));
|
||||
SERIAL_OUT.println(testFillScreen());
|
||||
delay(500);
|
||||
|
||||
SERIAL_OUT.print(F("Text "));
|
||||
SERIAL_OUT.println(testText());
|
||||
delay(3000);
|
||||
|
||||
SERIAL_OUT.print(F("Lines "));
|
||||
SERIAL_OUT.println(testLines(ILI9341_CYAN));
|
||||
delay(500);
|
||||
|
||||
SERIAL_OUT.print(F("Horiz/Vert Lines "));
|
||||
SERIAL_OUT.println(testFastLines(ILI9341_RED, ILI9341_BLUE));
|
||||
delay(500);
|
||||
|
||||
SERIAL_OUT.print(F("Rectangles (outline) "));
|
||||
SERIAL_OUT.println(testRects(ILI9341_GREEN));
|
||||
delay(500);
|
||||
|
||||
SERIAL_OUT.print(F("Rectangles (filled) "));
|
||||
SERIAL_OUT.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA));
|
||||
delay(500);
|
||||
|
||||
SERIAL_OUT.print(F("Circles (filled) "));
|
||||
SERIAL_OUT.println(testFilledCircles(10, ILI9341_MAGENTA));
|
||||
|
||||
SERIAL_OUT.print(F("Circles (outline) "));
|
||||
SERIAL_OUT.println(testCircles(10, ILI9341_WHITE));
|
||||
delay(500);
|
||||
|
||||
SERIAL_OUT.print(F("Triangles (outline) "));
|
||||
SERIAL_OUT.println(testTriangles());
|
||||
delay(500);
|
||||
|
||||
SERIAL_OUT.print(F("Triangles (filled) "));
|
||||
SERIAL_OUT.println(testFilledTriangles());
|
||||
delay(500);
|
||||
|
||||
SERIAL_OUT.print(F("Rounded rects (outline) "));
|
||||
SERIAL_OUT.println(testRoundRects());
|
||||
delay(500);
|
||||
|
||||
SERIAL_OUT.print(F("Rounded rects (filled) "));
|
||||
SERIAL_OUT.println(testFilledRoundRects());
|
||||
delay(500);
|
||||
|
||||
SERIAL_OUT.println(F("Done!"));
|
||||
|
||||
}
|
||||
|
||||
|
||||
void loop(void) {
|
||||
for(uint8_t rotation=0; rotation<4; rotation++) {
|
||||
tft.setRotation(rotation);
|
||||
testText();
|
||||
delay(1000);
|
||||
}
|
||||
}
|
||||
|
125
libraries/Adafruit_ILI9341/examples/onoffbutton/onoffbutton.ino
Normal file
125
libraries/Adafruit_ILI9341/examples/onoffbutton/onoffbutton.ino
Normal file
@ -0,0 +1,125 @@
|
||||
//This example implements a simple sliding On/Off button. The example
|
||||
// demonstrates drawing and touch operations.
|
||||
//
|
||||
//Thanks to Adafruit forums member Asteroid for the original sketch!
|
||||
//
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <SPI.h>
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_ILI9341.h>
|
||||
#include <Adafruit_STMPE610.h>
|
||||
|
||||
// This is calibration data for the raw touch data to the screen coordinates
|
||||
#define TS_MINX 150
|
||||
#define TS_MINY 130
|
||||
#define TS_MAXX 3800
|
||||
#define TS_MAXY 4000
|
||||
|
||||
#define STMPE_CS 8
|
||||
Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS);
|
||||
#define TFT_CS 10
|
||||
#define TFT_DC 9
|
||||
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
|
||||
|
||||
boolean RecordOn = false;
|
||||
|
||||
#define FRAME_X 210
|
||||
#define FRAME_Y 180
|
||||
#define FRAME_W 100
|
||||
#define FRAME_H 50
|
||||
|
||||
#define REDBUTTON_X FRAME_X
|
||||
#define REDBUTTON_Y FRAME_Y
|
||||
#define REDBUTTON_W (FRAME_W/2)
|
||||
#define REDBUTTON_H FRAME_H
|
||||
|
||||
#define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W)
|
||||
#define GREENBUTTON_Y FRAME_Y
|
||||
#define GREENBUTTON_W (FRAME_W/2)
|
||||
#define GREENBUTTON_H FRAME_H
|
||||
|
||||
void drawFrame()
|
||||
{
|
||||
tft.drawRect(FRAME_X, FRAME_Y, FRAME_W, FRAME_H, ILI9341_BLACK);
|
||||
}
|
||||
|
||||
void redBtn()
|
||||
{
|
||||
tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_RED);
|
||||
tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_BLUE);
|
||||
drawFrame();
|
||||
tft.setCursor(GREENBUTTON_X + 6 , GREENBUTTON_Y + (GREENBUTTON_H/2));
|
||||
tft.setTextColor(ILI9341_WHITE);
|
||||
tft.setTextSize(2);
|
||||
tft.println("ON");
|
||||
RecordOn = false;
|
||||
}
|
||||
|
||||
void greenBtn()
|
||||
{
|
||||
tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_GREEN);
|
||||
tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_BLUE);
|
||||
drawFrame();
|
||||
tft.setCursor(REDBUTTON_X + 6 , REDBUTTON_Y + (REDBUTTON_H/2));
|
||||
tft.setTextColor(ILI9341_WHITE);
|
||||
tft.setTextSize(2);
|
||||
tft.println("OFF");
|
||||
RecordOn = true;
|
||||
}
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(9600);
|
||||
tft.begin();
|
||||
if (!ts.begin()) {
|
||||
Serial.println("Unable to start touchscreen.");
|
||||
}
|
||||
else {
|
||||
Serial.println("Touchscreen started.");
|
||||
}
|
||||
|
||||
tft.fillScreen(ILI9341_BLUE);
|
||||
// origin = left,top landscape (USB left upper)
|
||||
tft.setRotation(1);
|
||||
redBtn();
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
// See if there's any touch data for us
|
||||
if (!ts.bufferEmpty())
|
||||
{
|
||||
// Retrieve a point
|
||||
TS_Point p = ts.getPoint();
|
||||
// Scale using the calibration #'s
|
||||
// and rotate coordinate system
|
||||
p.x = map(p.x, TS_MINY, TS_MAXY, 0, tft.height());
|
||||
p.y = map(p.y, TS_MINX, TS_MAXX, 0, tft.width());
|
||||
int y = tft.height() - p.x;
|
||||
int x = p.y;
|
||||
|
||||
if (RecordOn)
|
||||
{
|
||||
if((x > REDBUTTON_X) && (x < (REDBUTTON_X + REDBUTTON_W))) {
|
||||
if ((y > REDBUTTON_Y) && (y <= (REDBUTTON_Y + REDBUTTON_H))) {
|
||||
Serial.println("Red btn hit");
|
||||
redBtn();
|
||||
}
|
||||
}
|
||||
}
|
||||
else //Record is off (RecordOn == false)
|
||||
{
|
||||
if((x > GREENBUTTON_X) && (x < (GREENBUTTON_X + GREENBUTTON_W))) {
|
||||
if ((y > GREENBUTTON_Y) && (y <= (GREENBUTTON_Y + GREENBUTTON_H))) {
|
||||
Serial.println("Green btn hit");
|
||||
greenBtn();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Serial.println(RecordOn);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -0,0 +1,133 @@
|
||||
//This example implements a simple sliding On/Off button. The example
|
||||
// demonstrates drawing and touch operations.
|
||||
//
|
||||
//Thanks to Adafruit forums member Asteroid for the original sketch!
|
||||
//
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <SPI.h>
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_ILI9341.h>
|
||||
#include <TouchScreen.h>
|
||||
|
||||
//Touchscreen X+ X- Y+ Y- pins
|
||||
#define YP A3 // must be an analog pin, use "An" notation!
|
||||
#define XM A2 // must be an analog pin, use "An" notation!
|
||||
#define YM 5 // can be a digital pin
|
||||
#define XP 4 // can be a digital pin
|
||||
|
||||
// This is calibration data for the raw touch data to the screen coordinates
|
||||
#define TS_MINX 150
|
||||
#define TS_MINY 120
|
||||
#define TS_MAXX 920
|
||||
#define TS_MAXY 940
|
||||
|
||||
#define MINPRESSURE 10
|
||||
#define MAXPRESSURE 1000
|
||||
|
||||
// For better pressure precision, we need to know the resistance
|
||||
// between X+ and X- Use any multimeter to read it
|
||||
// For the one we're using, its 300 ohms across the X plate
|
||||
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
|
||||
|
||||
|
||||
#define TFT_CS 10
|
||||
#define TFT_DC 9
|
||||
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
|
||||
|
||||
boolean RecordOn = false;
|
||||
|
||||
#define FRAME_X 210
|
||||
#define FRAME_Y 180
|
||||
#define FRAME_W 100
|
||||
#define FRAME_H 50
|
||||
|
||||
#define REDBUTTON_X FRAME_X
|
||||
#define REDBUTTON_Y FRAME_Y
|
||||
#define REDBUTTON_W (FRAME_W/2)
|
||||
#define REDBUTTON_H FRAME_H
|
||||
|
||||
#define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W)
|
||||
#define GREENBUTTON_Y FRAME_Y
|
||||
#define GREENBUTTON_W (FRAME_W/2)
|
||||
#define GREENBUTTON_H FRAME_H
|
||||
|
||||
void drawFrame()
|
||||
{
|
||||
tft.drawRect(FRAME_X, FRAME_Y, FRAME_W, FRAME_H, ILI9341_BLACK);
|
||||
}
|
||||
|
||||
void redBtn()
|
||||
{
|
||||
tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_RED);
|
||||
tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_BLUE);
|
||||
drawFrame();
|
||||
tft.setCursor(GREENBUTTON_X + 6 , GREENBUTTON_Y + (GREENBUTTON_H/2));
|
||||
tft.setTextColor(ILI9341_WHITE);
|
||||
tft.setTextSize(2);
|
||||
tft.println("ON");
|
||||
RecordOn = false;
|
||||
}
|
||||
|
||||
void greenBtn()
|
||||
{
|
||||
tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_GREEN);
|
||||
tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_BLUE);
|
||||
drawFrame();
|
||||
tft.setCursor(REDBUTTON_X + 6 , REDBUTTON_Y + (REDBUTTON_H/2));
|
||||
tft.setTextColor(ILI9341_WHITE);
|
||||
tft.setTextSize(2);
|
||||
tft.println("OFF");
|
||||
RecordOn = true;
|
||||
}
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(9600);
|
||||
tft.begin();
|
||||
|
||||
tft.fillScreen(ILI9341_BLUE);
|
||||
// origin = left,top landscape (USB left upper)
|
||||
tft.setRotation(1);
|
||||
redBtn();
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
// Retrieve a point
|
||||
TSPoint p = ts.getPoint();
|
||||
|
||||
// See if there's any touch data for us
|
||||
if (p.z > MINPRESSURE && p.z < MAXPRESSURE)
|
||||
{
|
||||
// Scale using the calibration #'s
|
||||
// and rotate coordinate system
|
||||
p.x = map(p.x, TS_MINY, TS_MAXY, 0, tft.height());
|
||||
p.y = map(p.y, TS_MINX, TS_MAXX, 0, tft.width());
|
||||
int y = tft.height() - p.x;
|
||||
int x = p.y;
|
||||
|
||||
if (RecordOn)
|
||||
{
|
||||
if((x > REDBUTTON_X) && (x < (REDBUTTON_X + REDBUTTON_W))) {
|
||||
if ((y > REDBUTTON_Y) && (y <= (REDBUTTON_Y + REDBUTTON_H))) {
|
||||
Serial.println("Red btn hit");
|
||||
redBtn();
|
||||
}
|
||||
}
|
||||
}
|
||||
else //Record is off (RecordOn == false)
|
||||
{
|
||||
if((x > GREENBUTTON_X) && (x < (GREENBUTTON_X + GREENBUTTON_W))) {
|
||||
if ((y > GREENBUTTON_Y) && (y <= (GREENBUTTON_Y + GREENBUTTON_H))) {
|
||||
Serial.println("Green btn hit");
|
||||
greenBtn();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Serial.println(RecordOn);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -0,0 +1,189 @@
|
||||
/***************************************************
|
||||
This is our Bitmap drawing example for the Adafruit ILI9341 Breakout and Shield
|
||||
----> http://www.adafruit.com/products/1651
|
||||
|
||||
Check out the links above for our tutorials and wiring diagrams
|
||||
These displays use SPI to communicate, 4 or 5 pins are required to
|
||||
interface (RST is optional)
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
MIT license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
|
||||
#include <Adafruit_GFX.h> // Core graphics library
|
||||
#include "Adafruit_ILI9341.h" // Hardware-specific library
|
||||
#include <SPI.h>
|
||||
#include <SD.h>
|
||||
|
||||
// TFT display and SD card will share the hardware SPI interface.
|
||||
// Hardware SPI pins are specific to the Arduino board type and
|
||||
// cannot be remapped to alternate pins. For Arduino Uno,
|
||||
// Duemilanove, etc., pin 11 = MOSI, pin 12 = MISO, pin 13 = SCK.
|
||||
|
||||
#define TFT_DC 9
|
||||
#define TFT_CS 10
|
||||
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
|
||||
|
||||
#define SD_CS 4
|
||||
|
||||
void setup(void) {
|
||||
Serial.begin(9600);
|
||||
|
||||
tft.begin();
|
||||
tft.fillScreen(ILI9341_BLUE);
|
||||
|
||||
Serial.print("Initializing SD card...");
|
||||
if (!SD.begin(SD_CS)) {
|
||||
Serial.println("failed!");
|
||||
}
|
||||
Serial.println("OK!");
|
||||
|
||||
bmpDraw("purple.bmp", 0, 0);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
}
|
||||
|
||||
// This function opens a Windows Bitmap (BMP) file and
|
||||
// displays it at the given coordinates. It's sped up
|
||||
// by reading many pixels worth of data at a time
|
||||
// (rather than pixel by pixel). Increasing the buffer
|
||||
// size takes more of the Arduino's precious RAM but
|
||||
// makes loading a little faster. 20 pixels seems a
|
||||
// good balance.
|
||||
|
||||
#define BUFFPIXEL 20
|
||||
|
||||
void bmpDraw(char *filename, uint8_t x, uint16_t y) {
|
||||
|
||||
File bmpFile;
|
||||
int bmpWidth, bmpHeight; // W+H in pixels
|
||||
uint8_t bmpDepth; // Bit depth (currently must be 24)
|
||||
uint32_t bmpImageoffset; // Start of image data in file
|
||||
uint32_t rowSize; // Not always = bmpWidth; may have padding
|
||||
uint8_t sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel)
|
||||
uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer
|
||||
boolean goodBmp = false; // Set to true on valid header parse
|
||||
boolean flip = true; // BMP is stored bottom-to-top
|
||||
int w, h, row, col;
|
||||
uint8_t r, g, b;
|
||||
uint32_t pos = 0, startTime = millis();
|
||||
|
||||
if((x >= tft.width()) || (y >= tft.height())) return;
|
||||
|
||||
Serial.println();
|
||||
Serial.print(F("Loading image '"));
|
||||
Serial.print(filename);
|
||||
Serial.println('\'');
|
||||
|
||||
// Open requested file on SD card
|
||||
if ((bmpFile = SD.open(filename)) == NULL) {
|
||||
Serial.print(F("File not found"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Parse BMP header
|
||||
if(read16(bmpFile) == 0x4D42) { // BMP signature
|
||||
Serial.print(F("File size: ")); Serial.println(read32(bmpFile));
|
||||
(void)read32(bmpFile); // Read & ignore creator bytes
|
||||
bmpImageoffset = read32(bmpFile); // Start of image data
|
||||
Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC);
|
||||
// Read DIB header
|
||||
Serial.print(F("Header size: ")); Serial.println(read32(bmpFile));
|
||||
bmpWidth = read32(bmpFile);
|
||||
bmpHeight = read32(bmpFile);
|
||||
if(read16(bmpFile) == 1) { // # planes -- must be '1'
|
||||
bmpDepth = read16(bmpFile); // bits per pixel
|
||||
Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth);
|
||||
if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed
|
||||
|
||||
goodBmp = true; // Supported BMP format -- proceed!
|
||||
Serial.print(F("Image size: "));
|
||||
Serial.print(bmpWidth);
|
||||
Serial.print('x');
|
||||
Serial.println(bmpHeight);
|
||||
|
||||
// BMP rows are padded (if needed) to 4-byte boundary
|
||||
rowSize = (bmpWidth * 3 + 3) & ~3;
|
||||
|
||||
// If bmpHeight is negative, image is in top-down order.
|
||||
// This is not canon but has been observed in the wild.
|
||||
if(bmpHeight < 0) {
|
||||
bmpHeight = -bmpHeight;
|
||||
flip = false;
|
||||
}
|
||||
|
||||
// Crop area to be loaded
|
||||
w = bmpWidth;
|
||||
h = bmpHeight;
|
||||
if((x+w-1) >= tft.width()) w = tft.width() - x;
|
||||
if((y+h-1) >= tft.height()) h = tft.height() - y;
|
||||
|
||||
// Set TFT address window to clipped image bounds
|
||||
tft.setAddrWindow(x, y, x+w-1, y+h-1);
|
||||
|
||||
for (row=0; row<h; row++) { // For each scanline...
|
||||
|
||||
// Seek to start of scan line. It might seem labor-
|
||||
// intensive to be doing this on every line, but this
|
||||
// method covers a lot of gritty details like cropping
|
||||
// and scanline padding. Also, the seek only takes
|
||||
// place if the file position actually needs to change
|
||||
// (avoids a lot of cluster math in SD library).
|
||||
if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
|
||||
pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
|
||||
else // Bitmap is stored top-to-bottom
|
||||
pos = bmpImageoffset + row * rowSize;
|
||||
if(bmpFile.position() != pos) { // Need seek?
|
||||
bmpFile.seek(pos);
|
||||
buffidx = sizeof(sdbuffer); // Force buffer reload
|
||||
}
|
||||
|
||||
for (col=0; col<w; col++) { // For each pixel...
|
||||
// Time to read more pixel data?
|
||||
if (buffidx >= sizeof(sdbuffer)) { // Indeed
|
||||
bmpFile.read(sdbuffer, sizeof(sdbuffer));
|
||||
buffidx = 0; // Set index to beginning
|
||||
}
|
||||
|
||||
// Convert pixel from BMP to TFT format, push to display
|
||||
b = sdbuffer[buffidx++];
|
||||
g = sdbuffer[buffidx++];
|
||||
r = sdbuffer[buffidx++];
|
||||
tft.pushColor(tft.color565(r,g,b));
|
||||
} // end pixel
|
||||
} // end scanline
|
||||
Serial.print(F("Loaded in "));
|
||||
Serial.print(millis() - startTime);
|
||||
Serial.println(" ms");
|
||||
} // end goodBmp
|
||||
}
|
||||
}
|
||||
|
||||
bmpFile.close();
|
||||
if(!goodBmp) Serial.println(F("BMP format not recognized."));
|
||||
}
|
||||
|
||||
// These read 16- and 32-bit types from the SD card file.
|
||||
// BMP data is stored little-endian, Arduino is little-endian too.
|
||||
// May need to reverse subscript order if porting elsewhere.
|
||||
|
||||
uint16_t read16(File &f) {
|
||||
uint16_t result;
|
||||
((uint8_t *)&result)[0] = f.read(); // LSB
|
||||
((uint8_t *)&result)[1] = f.read(); // MSB
|
||||
return result;
|
||||
}
|
||||
|
||||
uint32_t read32(File &f) {
|
||||
uint32_t result;
|
||||
((uint8_t *)&result)[0] = f.read(); // LSB
|
||||
((uint8_t *)&result)[1] = f.read();
|
||||
((uint8_t *)&result)[2] = f.read();
|
||||
((uint8_t *)&result)[3] = f.read(); // MSB
|
||||
return result;
|
||||
}
|
146
libraries/Adafruit_ILI9341/examples/touchpaint/touchpaint.ino
Normal file
146
libraries/Adafruit_ILI9341/examples/touchpaint/touchpaint.ino
Normal file
@ -0,0 +1,146 @@
|
||||
/***************************************************
|
||||
This is our touchscreen painting example for the Adafruit ILI9341 Shield
|
||||
----> http://www.adafruit.com/products/1651
|
||||
|
||||
Check out the links above for our tutorials and wiring diagrams
|
||||
These displays use SPI to communicate, 4 or 5 pins are required to
|
||||
interface (RST is optional)
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
MIT license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
|
||||
#include <Adafruit_GFX.h> // Core graphics library
|
||||
#include <SPI.h>
|
||||
#include <Wire.h> // this is needed even tho we aren't using it
|
||||
#include <Adafruit_ILI9341.h>
|
||||
#include <Adafruit_STMPE610.h>
|
||||
|
||||
// This is calibration data for the raw touch data to the screen coordinates
|
||||
#define TS_MINX 150
|
||||
#define TS_MINY 130
|
||||
#define TS_MAXX 3800
|
||||
#define TS_MAXY 4000
|
||||
|
||||
// The STMPE610 uses hardware SPI on the shield, and #8
|
||||
#define STMPE_CS 8
|
||||
Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS);
|
||||
|
||||
// The display also uses hardware SPI, plus #9 & #10
|
||||
#define TFT_CS 10
|
||||
#define TFT_DC 9
|
||||
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
|
||||
|
||||
// Size of the color selection boxes and the paintbrush size
|
||||
#define BOXSIZE 40
|
||||
#define PENRADIUS 3
|
||||
int oldcolor, currentcolor;
|
||||
|
||||
void setup(void) {
|
||||
// while (!Serial); // used for leonardo debugging
|
||||
|
||||
Serial.begin(9600);
|
||||
Serial.println(F("Touch Paint!"));
|
||||
|
||||
tft.begin();
|
||||
|
||||
if (!ts.begin()) {
|
||||
Serial.println("Couldn't start touchscreen controller");
|
||||
while (1);
|
||||
}
|
||||
Serial.println("Touchscreen started");
|
||||
|
||||
tft.fillScreen(ILI9341_BLACK);
|
||||
|
||||
// make the color selection boxes
|
||||
tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED);
|
||||
tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW);
|
||||
tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN);
|
||||
tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN);
|
||||
tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE);
|
||||
tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA);
|
||||
|
||||
// select the current color 'red'
|
||||
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
currentcolor = ILI9341_RED;
|
||||
}
|
||||
|
||||
|
||||
void loop()
|
||||
{
|
||||
// See if there's any touch data for us
|
||||
if (ts.bufferEmpty()) {
|
||||
return;
|
||||
}
|
||||
/*
|
||||
// You can also wait for a touch
|
||||
if (! ts.touched()) {
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
// Retrieve a point
|
||||
TS_Point p = ts.getPoint();
|
||||
|
||||
/*
|
||||
Serial.print("X = "); Serial.print(p.x);
|
||||
Serial.print("\tY = "); Serial.print(p.y);
|
||||
Serial.print("\tPressure = "); Serial.println(p.z);
|
||||
*/
|
||||
|
||||
// Scale from ~0->4000 to tft.width using the calibration #'s
|
||||
p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
|
||||
p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
|
||||
|
||||
/*
|
||||
Serial.print("("); Serial.print(p.x);
|
||||
Serial.print(", "); Serial.print(p.y);
|
||||
Serial.println(")");
|
||||
*/
|
||||
|
||||
if (p.y < BOXSIZE) {
|
||||
oldcolor = currentcolor;
|
||||
|
||||
if (p.x < BOXSIZE) {
|
||||
currentcolor = ILI9341_RED;
|
||||
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
} else if (p.x < BOXSIZE*2) {
|
||||
currentcolor = ILI9341_YELLOW;
|
||||
tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
} else if (p.x < BOXSIZE*3) {
|
||||
currentcolor = ILI9341_GREEN;
|
||||
tft.drawRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
} else if (p.x < BOXSIZE*4) {
|
||||
currentcolor = ILI9341_CYAN;
|
||||
tft.drawRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
} else if (p.x < BOXSIZE*5) {
|
||||
currentcolor = ILI9341_BLUE;
|
||||
tft.drawRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
} else if (p.x < BOXSIZE*6) {
|
||||
currentcolor = ILI9341_MAGENTA;
|
||||
tft.drawRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
|
||||
}
|
||||
|
||||
if (oldcolor != currentcolor) {
|
||||
if (oldcolor == ILI9341_RED)
|
||||
tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED);
|
||||
if (oldcolor == ILI9341_YELLOW)
|
||||
tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW);
|
||||
if (oldcolor == ILI9341_GREEN)
|
||||
tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN);
|
||||
if (oldcolor == ILI9341_CYAN)
|
||||
tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN);
|
||||
if (oldcolor == ILI9341_BLUE)
|
||||
tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE);
|
||||
if (oldcolor == ILI9341_MAGENTA)
|
||||
tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA);
|
||||
}
|
||||
}
|
||||
if (((p.y-PENRADIUS) > BOXSIZE) && ((p.y+PENRADIUS) < tft.height())) {
|
||||
tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor);
|
||||
}
|
||||
}
|
9
libraries/Adafruit_ILI9341/library.properties
Normal file
9
libraries/Adafruit_ILI9341/library.properties
Normal file
@ -0,0 +1,9 @@
|
||||
name=Adafruit ILI9341
|
||||
version=1.0.0
|
||||
author=Adafruit
|
||||
maintainer=Adafruit <info@adafruit.com>
|
||||
sentence=Library for Adafruit ILI9341 displays
|
||||
paragraph=Library for Adafruit ILI9341 displays
|
||||
category=Display
|
||||
url=https://github.com/adafruit/Adafruit_ILI9341
|
||||
architectures=*
|
Reference in New Issue
Block a user