屏
main.c
#include "stc15w4k56s4.h" #define SDA P20 #define SCK P21 #define CS P22 #define DC P23 #define RST P24 #define BUSY P25 const unsigned char lut_vcom0[] = { 0x0E, 0x14, 0x01, 0x0A, 0x06, 0x04, 0x0A, 0x0A, 0x0F, 0x03, 0x03, 0x0C, 0x06, 0x0A, 0x00 }; const unsigned char lut_w[] = { 0x0E, 0x14, 0x01, 0x0A, 0x46, 0x04, 0x8A, 0x4A, 0x0F, 0x83, 0x43, 0x0C, 0x86, 0x0A, 0x04 }; const unsigned char lut_b[] = { 0x0E, 0x14, 0x01, 0x8A, 0x06, 0x04, 0x8A, 0x4A, 0x0F, 0x83, 0x43, 0x0C, 0x06, 0x4A, 0x04 }; const unsigned char lut_g1[] = { 0x8E, 0x94, 0x01, 0x8A, 0x06, 0x04, 0x8A, 0x4A, 0x0F, 0x83, 0x43, 0x0C, 0x06, 0x0A, 0x04 }; const unsigned char lut_g2[] = { 0x8E, 0x94, 0x01, 0x8A, 0x06, 0x04, 0x8A, 0x4A, 0x0F, 0x83, 0x43, 0x0C, 0x06, 0x0A, 0x04 }; const unsigned char lut_vcom1[] = { 0x03, 0x1D, 0x01, 0x01, 0x08, 0x23, 0x37, 0x37, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; const unsigned char lut_red0[] = { 0x83, 0x5D, 0x01, 0x81, 0x48, 0x23, 0x77, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; const unsigned char lut_red1[] = { 0x03, 0x1D, 0x01, 0x01, 0x08, 0x23, 0x37, 0x37, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; void delayms(unsigned int ms) { unsigned int cnt = 0; while (ms--) { for (cnt = 0; cnt < 1000; cnt++) { } } } void gpio_init(void) { P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P0 = 0xff; P1 = 0xff; P2 = 0xff; P3 = 0xff; P4 = 0xff; } void spi_cmd(unsigned char cmd) { unsigned char bit = 0; CS = 0; DC = 0; for (bit = 0; bit < 8; bit++) { SCK = 0; if ((cmd & 0x80) == 0x80) { SDA = 1; } else { SDA = 0; } SCK = 1; cmd <<= 1; } CS = 1; } void spi_dat(unsigned char dat) { unsigned char bit = 0; CS = 0; DC = 1; for (bit = 0; bit < 8; bit++) { SCK = 0; if ((dat & 0x80) == 0x80) { SDA = 1; } else { SDA = 0; } SCK = 1; dat <<= 1; } CS = 1; } void wait_busy(void) { do { delayms(1); } while(BUSY == 0); } void lcd_init(void) { spi_cmd(0x01); spi_dat(0x07); spi_dat(0x00); spi_dat(0x08); spi_dat(0x00); spi_cmd(0x06); spi_dat(0x07); spi_dat(0x07); spi_dat(0x07); spi_cmd(0x04); wait_busy(); spi_cmd(0x00); spi_dat(0xcf); spi_cmd(0x50); spi_dat(0xf0); spi_cmd(0x30); spi_dat(0x39); spi_cmd(0x61); spi_dat(0xc8); spi_dat(0x00); spi_dat(0xc8); spi_cmd(0x82); spi_dat(0x0e); } void lcd_clear(void) { unsigned int x = 0; unsigned int y = 0; spi_cmd(0x10); for (y = 0; y < 200; y++) { for (x = 0; x < (200 / 8); x++) { spi_dat(0xff); spi_dat(0xff); } } spi_cmd(0x13); for (y = 0; y < 200; y++) { for (x = 0; x < (200 / 8); x++) { spi_dat(0xff); } } spi_cmd(0x12); wait_busy(); } static void set_lut_bw(void) { unsigned int x = 0; spi_cmd(0x20); for (x = 0; x < 15; x++) { spi_dat(lut_vcom0[x]); } spi_cmd(0x21); for (x = 0; x < 15; x++) { spi_dat(lut_w[x]); } spi_cmd(0x22); for (x = 0; x < 15; x++) { spi_dat(lut_b[x]); } spi_cmd(0x23); for (x = 0; x < 15; x++) { spi_dat(lut_g1[x]); } spi_cmd(0x24); for (x = 0; x < 15; x++) { spi_dat(lut_g2[x]); } } void set_lut_red(void) { unsigned int x = 0; spi_cmd(0x25); for (x = 0; x < 15; x++) { spi_dat(lut_vcom1[x]); } spi_cmd(0x26); for (x = 0; x < 15; x++) { spi_dat(lut_red0[x]); } spi_cmd(0x27); for (x = 0; x < 15; x++) { spi_dat(lut_red1[x]); } } void main(void) { unsigned int x = 0; unsigned int y = 0; gpio_init(); AUXR |= 0x80; RST = 0; delayms(300); RST = 1; delayms(300); lcd_init(); lcd_clear(); set_lut_bw(); set_lut_red(); spi_cmd(0x10); for (y = 0; y < 200; y++) { for (x = 0; x < (200 / 8); x++) { if (y < 70) { spi_dat(0x00); spi_dat(0x00); } else { spi_dat(0xff); spi_dat(0xff); } } } spi_cmd(0x13); for (y = 0; y < 200; y++) { for (x = 0; x < (200 / 8); x++) { if ((y > 70) && (y < 140)) { spi_dat(0x00); } else{ spi_dat(0xff); } } } spi_cmd(0x12); wait_busy(); while (1) { P55 = 0; delayms(500); P55 = 1; delayms(500); } }
Makefile
all: sdcc main.c packihx main.ihx > main.hex flash: sudo stcgal -p /dev/ttyO2 -P stc15 -o clock_source=external main.hex clean: rm -rf main.ihx main.lst main.mem main.rst main.lk main.map main.rel main.sym main.hex
完成