三线SPI的屏
P32 接CLK
P54 接SDA
P55 接CS
VCC接3.3V,GND接地, RES我是直接串4.7K电阻接VCC
#include "stc8g.h"
void Timer0_Init(void) //1微秒@11.0592MHz
{AUXR |= 0x80; //定时器时钟1T模式TMOD &= 0xF0; //设置定时器模式TL0 = 0xF5; //设置定时初始值TH0 = 0xFF; //设置定时初始值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时// 等待定时器溢出while (!TF0); // 等待TF0置位
// 停止定时器并清除溢出标志TR0 = 0; // 停止定时器0TF0 = 0; // 清除TF0标志
}void delay_us(int us){//延迟微秒int t =0;while(t<us){Timer0_Init(); t++;}
}#define LCD_CS P55;
#define LCD_SDA P54;
#define LCD_SCL P32;
#define LCD_CS_CLR P55=0;
#define LCD_CS_SET P55=1;
#define LCD_SPI_SDA_CLR P54=0;
#define LCD_SPI_SDA_SET P54=1;
#define LCD_SPI_SCL_CLR P32=0;
#define LCD_SPI_SCL_SET P32=1;
#define LCD_RD_SET 0;
#define LCD_RS_SET 1;// 初始化端口为输出
void LCD_InitPins(void) {P5M0 = 0xFF; // 设置P5为推挽输出P5M1 = 0x00;P3M0 = 0x0F; // 设置P3相关位为推挽输出P3M1 = 0x00;LCD_CS_SET; // 初始时CS为高电平
}void SendDataSPI(unsigned char dat)
{ unsigned char i;for(i=0; i<8; i++) { if( (dat&0x80)==0x80 ){LCD_SPI_SDA_SET;}else{LCD_SPI_SDA_CLR;}dat <<= 1;LCD_SPI_SCL_CLR;LCD_SPI_SCL_SET; }
}void WriteComm(unsigned char dt)
{ LCD_CS_CLR;LCD_SPI_SDA_CLR;LCD_SPI_SCL_CLR;LCD_SPI_SCL_SET; SendDataSPI(dt);LCD_CS_SET;
}
void WriteData(unsigned char dt)
{LCD_CS_CLR;LCD_SPI_SDA_SET;LCD_SPI_SCL_CLR;LCD_SPI_SCL_SET; SendDataSPI(dt);LCD_CS_SET;
}
void LCD_IC_Init(void)
{// ILI9163C, 用于 LB1.41WriteComm(0x11); // 退出睡眠模式delay_us(50000);WriteComm(0x26); // 设置默认伽马值WriteData(0x04);WriteComm(0xB1); // 设置帧率WriteData(0x0C);WriteData(0x14);WriteComm(0xC0); // 设置 VRH1[4:0] & VC[2:0] 用于 VCI1 & GVDDWriteData(0x0C);WriteData(0x05);WriteComm(0xC1); // 设置 BT[2:0] 用于 AVDD & VCL & VGH & VGLWriteData(0x02); // 0x00WriteComm(0xC5); // 设置 VMH[6:0] & VML[6:0] 用于 VOMH & VCOMLWriteData(0x29); // 31 21 29WriteData(0x43); // 58 48 43WriteComm(0xC7);WriteData(0x40);WriteComm(0x3a); // 设置颜色格式WriteData(0x05);WriteComm(0x2A); // 设置列地址WriteData(0x00);WriteData(0x00);WriteData(0x00);WriteData(0x7F);WriteComm(0x2B); // 设置页地址WriteData(0x00);WriteData(0x00);WriteData(0x00);WriteData(0x9F);WriteComm(0x36); // 设置扫描方向WriteData(0xC8); // 0xc8WriteComm(0xB7); // 设置源输出方向WriteData(0x00);WriteComm(0xF2); // 启用伽马位WriteData(0x01);WriteComm(0xE0);WriteData(0x36); // p1WriteData(0x29); // p2WriteData(0x12); // p3WriteData(0x22); // p4WriteData(0x1C); // p5WriteData(0x15); // p6WriteData(0x42); // p7WriteData(0xB7); // p8WriteData(0x2F); // p9WriteData(0x13); // p10WriteData(0x12); // p11WriteData(0x0A); // p12WriteData(0x11); // p13WriteData(0x0B); // p14WriteData(0x06); // p15WriteComm(0xE1);WriteData(0x09); // p1WriteData(0x16); // p2WriteData(0x2D); // p3WriteData(0x0D); // p4WriteData(0x13); // p5WriteData(0x15); // p6WriteData(0x40); // p7WriteData(0x48); // p8WriteData(0x53); // p9WriteData(0x0C); // p10WriteData(0x1D); // p11WriteData(0x25); // p12WriteData(0x2E); // p13WriteData(0x34); // p14WriteData(0x39); // p15WriteComm(0x29); // 显示开启WriteComm(0x2c);
}#define COL 128
#define ROW 128
#define COL_Pre 00
#define ROW_Pre 0 void SendData(unsigned int color)
{WriteData(color>>8);WriteData(color);
}void BlockWrite(unsigned int Xstart,unsigned int Xend,unsigned int Ystart,unsigned int Yend) //
{WriteComm(0x2a);WriteData((Xstart)>>8);WriteData((Xstart));WriteData((Xend)>>8);WriteData(Xend);WriteComm(0x2b);WriteData((Ystart)>>8);WriteData((Ystart));WriteData((Yend)>>8);WriteData(Yend);WriteComm(0x2c);
}void DispFrame(void)//绘制边框
{unsigned int i,j;BlockWrite(COL_Pre,COL+COL_Pre-1,ROW_Pre,ROW+ROW_Pre-1);LCD_CS_CLR;//LCD_RS_SET;//LCD_RD_SET;SendData(0xf800);for(i=0;i<COL-2;i++){SendData(0xFFFF);}SendData(0x001f);for(j=0;j<ROW-2;j++){SendData(0xf800);for(i=0;i<COL-2;i++){SendData(0x0000);}SendData(0x001F);}SendData(0xf800);for(i=0;i<COL-2;i++){SendData(0xFFFF);}SendData(0x001F);LCD_CS_SET;
}
void DispGrayHor16(void) //灰阶图
{int i,j,k;BlockWrite(COL_Pre,COL+COL_Pre-1,ROW_Pre,ROW+ROW_Pre-1);LCD_CS_CLR;
// LCD_RD_SET;
// LCD_RS_SET; for(i=0;i<ROW;i++){for(j=0;j<COL%16;j++){SendData(0);}for(j=0;j<16;j++){for(k=0;k<COL/16;k++){ SendData(((((j*2)<<3)|((j*4)>>3))<<8)|(((j*4)<<5)|(j*2))); } }}LCD_CS_SET;
}#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0XBC40 //טɫ
#define BRRED 0XFC07 //טº쉫
#define GRAY 0X8430 //»҉«
#define GRAY25 0xADB5void DispColor(unsigned int color)//显示颜色
{unsigned int i,j;BlockWrite(COL_Pre,COL+COL_Pre-1,ROW_Pre,ROW+ROW_Pre-1);LCD_CS_CLR;LCD_RS_SET;LCD_RD_SET;for(i=0;i<ROW;i++){for(j=0;j<COL;j++){ SendData(color);}}LCD_CS_SET;
} void DispBand(void)
{int i,j,k;//unsigned int color[8]={0x001f,0x07e0,0xf800,0x07ff,0xf81f,0xffe0,0x0000,0xffff};unsigned int color[8]={0xf800,0xf800,0x07e0,0x07e0,0x001f,0x001f,0xffff,0xffff};//0x94B2//unsigned int gray16[]={0x0000,0x1082,0x2104,0x3186,0x42,0x08,0x528a,0x630c,0x738e,0x7bcf,0x9492,0xa514,0xb596,0xc618,0xd69a,0xe71c,0xffff};BlockWrite(COL_Pre,COL+COL_Pre-1,ROW_Pre,ROW+ROW_Pre-1);LCD_CS_CLR;LCD_RD_SET;LCD_RS_SET; for(i=0;i<8;i++){for(j=0;j<ROW/8;j++){for(k=0;k<COL;k++){SendData(color[i]); } }}for(j=0;j<ROW%8;j++){for(k=0;k<COL;k++){SendData(color[7]); } }LCD_CS_SET;
}void main(){delay_us(72000);LCD_InitPins();//端口初始化LCD_IC_Init();//屏幕初始化while(1){//DispFrame();//边框DispGrayHor16();//灰阶图//DispGrayHor16();DispBand();//彩虹条//DispColor(RED);//DispColor(GREEN);//DispColor(BLUE);}}
ili9163c