三线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; // 停止定时器0
TF0 = 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.41
WriteComm(0x11); // 退出睡眠模式
delay_us(50000);
WriteComm(0x26); // 设置默认伽马值
WriteData(0x04);
WriteComm(0xB1); // 设置帧率
WriteData(0x0C);
WriteData(0x14);
WriteComm(0xC0); // 设置 VRH1[4:0] & VC[2:0] 用于 VCI1 & GVDD
WriteData(0x0C);
WriteData(0x05);
WriteComm(0xC1); // 设置 BT[2:0] 用于 AVDD & VCL & VGH & VGL
WriteData(0x02); // 0x00
WriteComm(0xC5); // 设置 VMH[6:0] & VML[6:0] 用于 VOMH & VCOML
WriteData(0x29); // 31 21 29
WriteData(0x43); // 58 48 43
WriteComm(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); // 0xc8
WriteComm(0xB7); // 设置源输出方向
WriteData(0x00);
WriteComm(0xF2); // 启用伽马位
WriteData(0x01);
WriteComm(0xE0);
WriteData(0x36); // p1
WriteData(0x29); // p2
WriteData(0x12); // p3
WriteData(0x22); // p4
WriteData(0x1C); // p5
WriteData(0x15); // p6
WriteData(0x42); // p7
WriteData(0xB7); // p8
WriteData(0x2F); // p9
WriteData(0x13); // p10
WriteData(0x12); // p11
WriteData(0x0A); // p12
WriteData(0x11); // p13
WriteData(0x0B); // p14
WriteData(0x06); // p15
WriteComm(0xE1);
WriteData(0x09); // p1
WriteData(0x16); // p2
WriteData(0x2D); // p3
WriteData(0x0D); // p4
WriteData(0x13); // p5
WriteData(0x15); // p6
WriteData(0x40); // p7
WriteData(0x48); // p8
WriteData(0x53); // p9
WriteData(0x0C); // p10
WriteData(0x1D); // p11
WriteData(0x25); // p12
WriteData(0x2E); // p13
WriteData(0x34); // p14
WriteData(0x39); // p15
WriteComm(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 0xADB5
void 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