屏
main.c
#include "stc15w4k56s4.h" #define I2C_SDA P01 #define I2C_SCL P00 #define SSD1306_ADDRESS 0x78 #define SSD1306_LCDWIDTH 128 #define SSD1306_LCDHEIGHT 32 #define SSD1306_SETCONTRAST 0x81 #define SSD1306_DISPLAYALLOW_RESUME 0xA4 #define SSD1306_DISPLAYALLOW 0xA5 #define SSD1306_NORMALDISPLAY 0xA6 #define SSD1306_INVERTDISPLAY 0xA7 #define SSD1306_DISPLAYOFF 0xAE #define SSD1306_DISPLAYON 0xAF #define SSD1306_SETDISPLAYOFFSET 0xD3 #define SSD1306_SETCOMPINS 0xDA #define SSD1306_SETVCOMDETECT 0xDB #define SSD1306_SETDISPLAYCLOCKDIV 0xD5 #define SSD1306_SETPRECHARGE 0xD9 #define SSD1306_SETMULTIPLEX 0xA8 #define SSD1306_SETLOWCOLUMN 0x00 #define SSD1306_SETHIGHCOLUMN 0x10 #define SSD1306_SETSTARTLINE 0x40 #define SSD1306_MEMORYMODE 0x20 #define SSD1306_COLUMNADDR 0x21 #define SSD1306_PAGEADDR 0x22 #define SSD1306_COMSCANINC 0xC0 #define SSD1306_COMSCANDEC 0xC8 #define SSD1306_SEGREMAP 0xA0 #define SSD1306_CHARGEPUMP 0x8D #define SSD1306_EXTERNALVCC 0x01 #define SSD1306_SWITCHCAPVCC 0x02 void delay(unsigned cnt) { while(cnt--) { } } void i2c_start(void) { I2C_SDA = 1; I2C_SCL = 1; delay(10); I2C_SDA = 0; delay(10); I2C_SCL = 0; } void i2c_stop(void) { delay(10); I2C_SDA = 0; delay(10); I2C_SCL = 1; delay(10); I2C_SDA = 1; } unsigned char i2c_write(unsigned char val) { unsigned char i = 9; unsigned char ack = 0; while (--i) { delay(10); I2C_SDA = (val & 0x80) ? 1 : 0; delay(10); I2C_SCL = 1; delay(10); val <<= 1; I2C_SCL = 0; } delay(10); I2C_SDA = 1; delay(10); I2C_SCL = 1; delay(10); ack = I2C_SDA; delay(10); I2C_SCL = 0; return ack; } unsigned char i2c_read(unsigned char ack) { unsigned char i = 9; unsigned char val = 0; while (--i) { val <<= 1; delay(10); I2C_SCL = 1; delay(10); val |= I2C_SDA; delay(10); I2C_SCL = 0; } delay(10); I2C_SDA = ack; delay(10); I2C_SCL = 1; delay(10); I2C_SCL = 0; return val; } void i2c_write_byte(unsigned char saddr, unsigned char raddr, unsigned char val) { unsigned char i = 10; while (--i) { i2c_start(); if (i2c_write(saddr)) { continue; } if (i2c_write(raddr)) { continue; } if (i2c_write(val)) { continue; } i2c_stop(); break; } } unsigned char i2c_read_byte(unsigned char saddr, unsigned char raddr) { unsigned char i = 10; unsigned char value = 0; while (--i) { i2c_start(); if (i2c_write(saddr & 0xfe)) { continue; } if (i2c_write(raddr)) { continue; } i2c_start(); if (i2c_write(saddr | 1)) { continue; } value = i2c_read(1); i2c_stop(); break; } return value; } void gpio_init(void) { P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; } void ssd1306_cmd(unsigned char c) { i2c_start(); i2c_write(SSD1306_ADDRESS); i2c_write(0x00); i2c_write(c); i2c_stop(); } void ssd1306_data(unsigned char c) { i2c_start(); i2c_write(SSD1306_ADDRESS); i2c_write(0x40); i2c_write(c); i2c_stop(); } void ssd1306_init(void) { ssd1306_cmd(SSD1306_DISPLAYOFF); ssd1306_cmd(SSD1306_SETDISPLAYCLOCKDIV); ssd1306_cmd(0x80); ssd1306_cmd(SSD1306_SETMULTIPLEX); ssd1306_cmd(0x1F); ssd1306_cmd(SSD1306_SETDISPLAYOFFSET); ssd1306_cmd(0x00); ssd1306_cmd(SSD1306_SETSTARTLINE); ssd1306_cmd(SSD1306_CHARGEPUMP); ssd1306_cmd(0x14); ssd1306_cmd(SSD1306_MEMORYMODE); ssd1306_cmd(0x00); ssd1306_cmd(SSD1306_SEGREMAP | 0x01); ssd1306_cmd(SSD1306_COMSCANDEC); ssd1306_cmd(SSD1306_SETCOMPINS); ssd1306_cmd(0x02); ssd1306_cmd(SSD1306_SETCONTRAST); ssd1306_cmd(0x8F); ssd1306_cmd(SSD1306_SETPRECHARGE); ssd1306_cmd(0xF1); ssd1306_cmd(SSD1306_SETVCOMDETECT); ssd1306_cmd(0x40); ssd1306_cmd(SSD1306_DISPLAYALLOW_RESUME); ssd1306_cmd(SSD1306_NORMALDISPLAY); ssd1306_cmd(SSD1306_DISPLAYON); } void ssd1306_set_col_addr(void) { ssd1306_cmd(SSD1306_COLUMNADDR); ssd1306_cmd(0); ssd1306_cmd(SSD1306_LCDWIDTH-1); } void ssd1306_set_page_addr(void) { ssd1306_cmd(SSD1306_PAGEADDR); ssd1306_cmd(0); ssd1306_cmd((SSD1306_LCDHEIGHT/8)-1); } void main(void) { unsigned int i = 0; unsigned int col = 0; gpio_init(); AUXR |= 0x80; ssd1306_init(); while (1) { ssd1306_set_col_addr(); ssd1306_set_page_addr(); i2c_start(); i2c_write(SSD1306_ADDRESS); i2c_write(0x40); for (i = 0; i < 512; i++) { i2c_write(0xff); } i2c_stop(); } }
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
完成