屏


main.c
#include "stc15w4k56s4.h"
#define DC P54
#define SDI P43
#define RST P42
#define SCK P41
#define CS P40
enum {
SSD1351_CMD_SETCOLUMNADDRESS = 0x15,
SSD1351_CMD_SETROWADDRESS = 0x75,
SSD1351_CMD_WRITERAM = 0x5c,
SSD1351_CMD_READRAM = 0x5d,
SSD1351_CMD_COLORDEPTH = 0xa0,
SSD1351_CMD_SETDISPLAYSTARTLINE = 0xa1,
SSD1351_CMD_SETDISPLAYOFFSET = 0xa2,
SSD1351_CMD_SETDISPLAYMODE_ALLOFF = 0xa4,
SSD1351_CMD_SETDISPLAYMODE_ALLON = 0xa5,
SSD1351_CMD_SETDISPLAYMODE_RESET = 0xa6,
SSD1351_CMD_SETDISPLAYMODE_INVERT = 0xa7,
SSD1351_CMD_FUNCTIONSELECTION = 0xab,
SSD1351_CMD_SLEEPMODE_DISPLAYOFF = 0xae,
SSD1351_CMD_SLEEPMODE_DISPLAYON = 0xaf,
SSD1351_CMD_SETPHASELENGTH = 0xb1,
SSD1351_CMD_ENHANCEDDRIVINGSCHEME = 0xb2,
SSD1351_CMD_SETFRONTCLOCKDIV = 0xb3,
SSD1351_CMD_SETSEGMENTLOWVOLTAGE = 0xb4,
SSD1351_CMD_SETGPIO = 0xb5,
SSD1351_CMD_SETSECONDPRECHARGEPERIOD = 0xb6,
SSD1351_CMD_GRAYSCALELOOKUP = 0xb8,
SSD1351_CMD_LINEARLUT = 0xb9,
SSD1351_CMD_SETPRECHARGEVOLTAGE = 0xbb,
SSD1351_CMD_SETVCOMHVOLTAGE = 0xbe,
SSD1351_CMD_SETCONTRAST = 0xc1,
SSD1351_CMD_MASTERCONTRAST = 0xc7,
SSD1351_CMD_SETMUXRRATIO = 0xca,
SSD1351_CMD_NOP3 = 0xd1,
SSD1351_CMD_NOP4 = 0xe3,
SSD1351_CMD_SETCOMMANDLOCK = 0xfd,
SSD1351_CMD_HORIZONTALSCROLL = 0x96,
SSD1351_CMD_STOPMOVING = 0x9e,
SSD1351_CMD_STARTMOVING = 0x9f
};
void delayms(unsigned int ms)
{
unsigned int cnt = 0;
while (ms--) {
for (cnt = 0; cnt < 1000; cnt++) {
}
}
}
void CMD(char cmd)
{
int i = 0;
CS = 0;
DC = 0;
for (i = 0; i < 8; i++) {
SCK = 0;
if ((cmd & 0x80) == 0x80) {
SDI = 1;
}
else {
SDI = 0;
}
cmd <<= 1;
SCK = 1;
}
CS = 1;
}
void DATA(char dat)
{
int i = 0;
CS = 0;
DC = 1;
for (i = 0; i < 8; i++) {
SCK = 0;
if ((dat & 0x80) == 0x80) {
SDI = 1;
}
else {
SDI = 0;
}
dat <<= 1;
SCK = 1;
}
CS = 1;
}
void cursor(unsigned char x, unsigned char y)
{
CMD(SSD1351_CMD_WRITERAM);
CMD(SSD1351_CMD_SETCOLUMNADDRESS);
DATA(x);
DATA(127);
CMD(SSD1351_CMD_SETROWADDRESS);
DATA(y);
DATA(127);
CMD(SSD1351_CMD_WRITERAM);
}
void reset(void)
{
RST = 0;
delayms(100);
RST = 1;
delayms(100);
}
void init(void)
{
CMD(SSD1351_CMD_SETCOMMANDLOCK);
DATA(0x12);
CMD(SSD1351_CMD_SETCOMMANDLOCK);
DATA(0xb1);
CMD(SSD1351_CMD_SLEEPMODE_DISPLAYOFF);
CMD(SSD1351_CMD_SETFRONTCLOCKDIV);
DATA(0xf1);
CMD(SSD1351_CMD_SETMUXRRATIO);
DATA(0x7f);
CMD(SSD1351_CMD_COLORDEPTH);
DATA(0x74);
CMD(SSD1351_CMD_SETCOLUMNADDRESS);
DATA(0x00);
DATA(0x7f);
CMD(SSD1351_CMD_SETROWADDRESS);
DATA(0x00);
DATA(0x7f);
CMD(SSD1351_CMD_SETDISPLAYSTARTLINE);
DATA(0x00);
CMD(SSD1351_CMD_SETDISPLAYOFFSET);
DATA(0x00);
CMD(SSD1351_CMD_SETGPIO);
DATA(0x00);
CMD(SSD1351_CMD_FUNCTIONSELECTION);
DATA(0x01);
CMD(SSD1351_CMD_SETPHASELENGTH);
DATA(0x32);
CMD(SSD1351_CMD_SETSEGMENTLOWVOLTAGE);
DATA(0xa0);
DATA(0xb5);
DATA(0x55);
CMD(SSD1351_CMD_SETPRECHARGEVOLTAGE);
DATA(0x17);
CMD(SSD1351_CMD_SETVCOMHVOLTAGE);
DATA(0x05);
CMD(SSD1351_CMD_SETCONTRAST);
DATA(0xc8);
DATA(0x80);
DATA(0xc8);
CMD(SSD1351_CMD_MASTERCONTRAST);
DATA(0x0f);
CMD(SSD1351_CMD_SETSECONDPRECHARGEPERIOD);
DATA(0x01);
CMD(SSD1351_CMD_SETDISPLAYMODE_RESET);
CMD(SSD1351_CMD_GRAYSCALELOOKUP);
DATA(0x05);
DATA(0x06);
DATA(0x07);
DATA(0x08);
DATA(0x09);
DATA(0x0a);
DATA(0x0b);
DATA(0x0c);
DATA(0x0d);
DATA(0x0e);
DATA(0x0f);
DATA(0x10);
DATA(0x11);
DATA(0x12);
DATA(0x13);
DATA(0x14);
DATA(0x15);
DATA(0x16);
DATA(0x18);
DATA(0x1a);
DATA(0x1b);
DATA(0x1c);
DATA(0x1d);
DATA(0x1f);
DATA(0x21);
DATA(0x23);
DATA(0x25);
DATA(0x27);
DATA(0x2a);
DATA(0x2d);
DATA(0x30);
DATA(0x33);
DATA(0x36);
DATA(0x39);
DATA(0x3c);
DATA(0x3f);
DATA(0x42);
DATA(0x45);
DATA(0x48);
DATA(0x4c);
DATA(0x50);
DATA(0x54);
DATA(0x58);
DATA(0x5c);
DATA(0x60);
DATA(0x64);
DATA(0x68);
DATA(0x6c);
DATA(0x70);
DATA(0x74);
DATA(0x78);
DATA(0x7d);
DATA(0x82);
DATA(0x87);
DATA(0x8c);
DATA(0x91);
DATA(0x96);
DATA(0x9B);
DATA(0xa0);
DATA(0xa5);
DATA(0xaa);
DATA(0xaf);
DATA(0xb4);
CMD(SSD1351_CMD_SLEEPMODE_DISPLAYON);
}
void color(void)
{
int i, j;
unsigned char r = 0x00;
unsigned char g = 0x00;
unsigned char b = 0xff;
unsigned char data1 = (r & 0xF8) | (g >> 5);
unsigned char data2 = (b >> 3) | ((g >> 2) << 5);
cursor(0, 0);
for (i = 0; i < 128; i++) {
for (j = 0; j < 128; j++) {
DATA(data1);
DATA(data2);
}
}
}
void gpio_init(void)
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
}
void main(void)
{
gpio_init();
AUXR |= 0x80;
reset();
init();
color();
while (1) {
P55 = 0;
delayms(1000);
P55 = 1;
delayms(1000);
}
}
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
完成