📄 ssd1289.c
字号:
/*============================================= */
/* IC: ST7787 */
/* 8080 series TFT 176RGB*220 Dots 8BIT */
/*
/* 2006/7/13 He Jianghuai
/*================================================*/
#include "reg51.h"
#include "stdio.h"
#include "intrins.h"
//#include "map.h"
#define WORD unsigned int
#define BYTE unsigned char
#define DB_L P0
#define DB_H P1
/***********************************************/
sbit touch =P3^0;
sbit test =P3^1;
sbit CSB =P3^1;
sbit RSB =P3^6;
sbit WRB =P3^3;
sbit RDB =P3^5;
sbit res=P3^4;
/*IC ADS7843 脚定义*/
sbit DOUT=P2^3 ;
sbit BUSY=P2^4 ;
sbit DIN=P2^5 ;
sbit DCLK=P2^7 ;
sbit CS2=P2^6;
/*********************************************/
void delay(unsigned int tt);//廷时子程序
void delay1(unsigned int tt);//廷时子程序
void delayms(unsigned int delay);
void WriteCOM(BYTE DBH,BYTE DBL);
void WriteDAT(BYTE DBH,BYTE DBL);
void Initial_IC(void);
void convert(void);
unsigned long int XTP=0,XTP1,YTP=0,YTP1;
unsigned long int XLCD=0,YLCD=0,XLCDH,YLCDH;
/*****************************************************/
void delay(unsigned int tt)
{
while(tt>0)
{
tt--;
}
}
/*****************************************************/
void delay1(unsigned int tt)
{
while(tt>0)
{
tt--;
convert();
}
}
/*****************************************************/
void delayms(unsigned int delay)
{
unsigned int i, j;
for (i=0; i<delay; i++)
for (j=0; j<100; j++)
{
;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
void WriteCOM(BYTE DBH,BYTE DBL)
{
CSB=0;
RSB=0;
RDB=1;
WRB=1;
DB_H=DBH;
DB_L=DBL;
WRB=0;
WRB=1;
RSB=1;
CSB=1;
}
void WriteDAT(BYTE DBH,BYTE DBL)
{
CSB=0;
RSB=1;
RDB=1;
WRB=1;
DB_H=DBH;
DB_L=DBL;
WRB=0;
WRB=1;
RSB=0;
CSB=1;
}
//----------------------initialize IC----------------------------//
void Initial_IC(void)
{
WriteCOM(0x00,0x10); //Sleep Mode
WriteDAT(0x00,0x00); //SLP=0,the driver leaves the sleep mode
delayms(5);
WriteCOM(0x00,0x00); //Oscillator turn on
WriteDAT(0x00,0x01); //OSCEN=1
delayms(5);
WriteCOM(0x00,0x01); //Driver Output Control
WriteDAT(0x2b,0x3f); //default=xx3fh
WriteCOM(0x00,0x02); //LCD Driving-Waveform Control
WriteDAT(0x06,0x00); //default=0000h
WriteCOM(0x00,0x03); //Power Control 1
WriteDAT(0x66,0x64); //default=6664h
// WriteCOM(0x00,0x05); //Compare register
// WriteDAT(0x00,0x00); //default=0000h
// WriteCOM(0x00,0x06); //Compare register
// WriteDAT(0x00,0x00); //default=0000h
WriteCOM(0x00,0x0b); //Frame Cycle Control **
WriteDAT(0x53,0x05); //default=5308h 5305h=75Hz 5308h=65Hz
WriteCOM(0x00,0x0c); //Power Control 2
WriteDAT(0x00,0x04); //default=0004h
WriteCOM(0x00,0x0d); //Power Control 3
WriteDAT(0x00,0x09); //default=0009h
WriteCOM(0x00,0x0e); //Power Control 4
WriteDAT(0x32,0x00); //default=3200h
WriteCOM(0x00,0x0f); //Gate Scan Position
WriteDAT(0x00,0x00); //default=0000h
WriteCOM(0x00,0x11); //Entry Mode
WriteDAT(0x68,0x30); //default=6830h
// WriteCOM(0x00,0x16); //Horizontal Porch
// WriteDAT(0xef,0x1c); //default=ef1ch
// WriteCOM(0x00,0x17); //Vertical Porch
// WriteDAT(0x01,0x03); //default=0103h
WriteCOM(0x00,0x1e); //Power Control 5
WriteDAT(0x00,0x29); //default=0029h
// WriteCOM(0x00,0x23); //RAM Write Data Mask
// WriteDAT(0x00,0x00); //default=0000h
// WriteCOM(0x00,0x24); //RAM Write Data Mask
// WriteDAT(0x00,0x00); //default=0000h
WriteCOM(0x00,0x25); //Frame Frequency Control
WriteDAT(0x80,0x00); //default=8000h OSC=510K
//Gamma_control
WriteCOM(0x00,0x30);
WriteDAT(0x07,0x07);
WriteCOM(0x00,0x31);
WriteDAT(0x02,0x04);
WriteCOM(0x00,0x32);
WriteDAT(0x02,0x04);
WriteCOM(0x00,0x33);
WriteDAT(0x05,0x02);
WriteCOM(0x00,0x34);
WriteDAT(0x05,0x07);
WriteCOM(0x00,0x35);
WriteDAT(0x02,0x04);
WriteCOM(0x00,0x36);
WriteDAT(0x02,0x04);
WriteCOM(0x00,0x37);
WriteDAT(0x05,0x02);
WriteCOM(0x00,0x3a);
WriteDAT(0x03,0x02);
WriteCOM(0x00,0x3b);
WriteDAT(0x03,0x02);
// WriteCOM(0x00,0x41); //Vertical Scroll Control
// WriteDAT(0x00,0x00); //default=0000h
// WriteCOM(0x00,0x42); //Vertical Scroll Control
// WriteDAT(0x00,0x00); //default=0000h
//Horizontal RAM Address Position
WriteCOM(0x00,0x44); //
WriteDAT(0xef,0x00); //default=ef00h
//Vertical RAM Address Position
WriteCOM(0x00,0x45); //
WriteDAT(0x00,0x00);
WriteCOM(0x00,0x46); //
WriteDAT(0x01,0x3f);
/*
//1st Screen Driving Position
WriteCOM(0x00,0x48);
WriteDAT(0x00,0x00);
WriteCOM(0x00,0x49);
WriteDAT(0x00,0x00);
//2nd Screen Driving Position
WriteCOM(0x00,0x4a);
WriteDAT(0x00,0x00);
WriteCOM(0x00,0x4b);
WriteDAT(0x00,0x00);
*/
//RAM Address Set
WriteCOM(0x00,0x4e); //RAM Address X
WriteDAT(0x00,0x00);
WriteCOM(0x00,0x4f); //RAM Address Y
WriteDAT(0x00,0x00);
//Display Control
WriteCOM(0x00,0x07); //Display Control
WriteDAT(0x00,0x00); //default=0000h
delayms(5);
WriteCOM(0x00,0x07); //Display Control
WriteDAT(0x00,0x01); //default=0000h
delayms(5);
WriteCOM(0x00,0x07); //Display Control
WriteDAT(0x00,0x21); //default=0000h
delayms(5);
WriteCOM(0x00,0x07); //Display Control
WriteDAT(0x00,0x23); //default=0000h
delayms(5);
WriteCOM(0x00,0x07); //Display Control
WriteDAT(0x00,0x33); //default=0000h
delayms(5);
}
//////////////////////////////////////////////////////
void Set_address()
{
WriteCOM(0x00,0x4e); //
WriteDAT(0x00,0x00);
WriteCOM(0x00,0x4f); //
WriteDAT(0x00,0x00);
WriteCOM(0x00,0x44); //
WriteDAT(0xef,0x00);
WriteCOM(0x00,0x45); //
WriteDAT(0x00,0x00);
WriteCOM(0x00,0x46); //
WriteDAT(0x01,0x3f);
WriteCOM(0x00,0x22);
}
////////////////////////////////////////////////////////////////
void Show_RGB(BYTE dat1,BYTE dat2)//65K color
{
BYTE i;
WORD j;
Set_address();//Set start address
for(i=0;i<240;i++)
{
for (j=0;j<320;j++)
{
WriteDAT(dat1,dat2);
}
}
delayms(50);
}
////////////////////////////////////////////////////////////////////////////////////////////
code unsigned char colorbar[16]=
{0xff,0xff,0xf8,0x00,0x07,0xe0,0x00,0x1f,0x07,0xff,0xf8,0x1f,0xff,0xe0,0x00,0x00
};
void Show_Colorbar(void)
{
WORD i;
BYTE j,k;
Set_address();//Set start address
CSB=0;
for(i=0;i<320;i++)
{
for(j=0;j<8;j++)
{
for(k=0;k<30;k++)
{
DB_H=colorbar[j*2];
// WRB=0;
// WRB=1;
DB_L=colorbar[j*2+1];
WRB=0;
WRB=1;
}
}
}
CSB=1;
delayms(50);
}
/************************************************/
void grayscale(void)
{
unsigned char data c,s;
Set_address();//Set start address
for(c=0;c<160;c++)//128/2个点=64
{
for(s=0;s<15;s++){WriteDAT(0xff,0xff);}
for(s=0;s<15;s++){WriteDAT(0xef,0x7d);}
for(s=0;s<15;s++){WriteDAT(0xd6,0x9a);}
for(s=0;s<15;s++){WriteDAT(0xc6,0x18);}
for(s=0;s<15;s++){WriteDAT(0xb5,0x96);}
for(s=0;s<15;s++){WriteDAT(0xa5,0x14);}
for(s=0;s<15;s++){WriteDAT(0x94,0x92);}
for(s=0;s<15;s++){WriteDAT(0x84,0x10);}
for(s=0;s<15;s++){WriteDAT(0x73,0x8e);}
for(s=0;s<15;s++){WriteDAT(0x63,0x0c);}
for(s=0;s<15;s++){WriteDAT(0x52,0x8a);}
for(s=0;s<15;s++){WriteDAT(0x42,0x08);}
for(s=0;s<15;s++){WriteDAT(0x31,0x86);}
for(s=0;s<15;s++){WriteDAT(0x21,0x04);}
for(s=0;s<15;s++){WriteDAT(0x10,0x82);}
for(s=0;s<15;s++){WriteDAT(0x00,0x00);}
}
for(c=0;c<40;c++)
{
for(s=0;s<120;s++){WriteDAT(0xff,0xff);}
for(s=0;s<120;s++){WriteDAT(0x00,0x00);}
}
for(c=0;c<80;c++)
{
for(s=0;s<30;s++) {WriteDAT(0xff,0xff);}
for(s=0;s<60;s++) {WriteDAT(0xd6,0x9a);}
for(s=0;s<30;s++) {WriteDAT(0xff,0xff);}
for(s=0;s<30;s++) {WriteDAT(0x00,0x00);}
for(s=0;s<60;s++) {WriteDAT(0x21,0x04);}
for(s=0;s<30;s++) {WriteDAT(0x00,0x00);}
}
for(c=0;c<40;c++)
{
for(s=0;s<120;s++){WriteDAT(0xff,0xff);}
for(s=0;s<120;s++){WriteDAT(0x00,0x00);}
}
delay1(600);//廷时大约2S
//delay1(60000);
}
/************************************************/
void grayscale_16(void)
{
unsigned int c,s;
Set_address();//Set start address
for(c=0;c<320;c++)//128/2个点=64
{
for(s=0;s<15;s++){WriteDAT(0xff,0xff);}
for(s=0;s<15;s++){WriteDAT(0xef,0x7d);}
for(s=0;s<15;s++){WriteDAT(0xd6,0x9a);}
for(s=0;s<15;s++){WriteDAT(0xc6,0x18);}
for(s=0;s<15;s++){WriteDAT(0xb5,0x96);}
for(s=0;s<15;s++){WriteDAT(0xa5,0x14);}
for(s=0;s<15;s++){WriteDAT(0x94,0x92);}
for(s=0;s<15;s++){WriteDAT(0x84,0x10);}
for(s=0;s<15;s++){WriteDAT(0x73,0x8e);}
for(s=0;s<15;s++){WriteDAT(0x63,0x0c);}
for(s=0;s<15;s++){WriteDAT(0x52,0x8a);}
for(s=0;s<15;s++){WriteDAT(0x42,0x08);}
for(s=0;s<15;s++){WriteDAT(0x31,0x86);}
for(s=0;s<15;s++){WriteDAT(0x21,0x04);}
for(s=0;s<15;s++){WriteDAT(0x10,0x82);}
for(s=0;s<15;s++){WriteDAT(0x00,0x00);}
}
delay1(600);//廷时大约2S
//delay1(60000);
}
/********************************************************************/
void displayshow1(void)
{
unsigned char data i,c,s;
Set_address();//Set start address
for(i=0;i<160;i++)
{
for(c=0;c<1;c++)
{
for(s=0;s<120;s++) {WriteDAT(0xff,0xff);
WriteDAT(0x00,0x00);}
}
for(c=0;c<1;c++)
{
for(s=0;s<120;s++) {WriteDAT(0x00,0x00);
WriteDAT(0xff,0xff);}
}
}
delay1(600);//廷时大约2S
//delay1(60000);
}
/********************************************************************/
void displayshow(void)
{
unsigned char data i,c,s;
Set_address();//Set start address
for(i=0;i<160;i++)
{
for(c=0;c<1;c++)
{
for(s=0;s<120;s++) {WriteDAT(0x00,0x00);
WriteDAT(0xff,0xff);}
}
for(c=0;c<1;c++)
{
for(s=0;s<120;s++) {WriteDAT(0xff,0xff);
WriteDAT(0x00,0x00);}
}
}
delay1(600);//廷时大约2S
//delay1(60000);
}
/******************************************************/
void displaypic(unsigned char d1,unsigned char d2)
{
unsigned int c,s;
Set_address();//Set start address
for(c=0;c<320;c++)
{ for(s=0;s<240;s++)
{
WriteDAT(d1,d2);
}
}
while(1)
{
convert();
}
}
//*****************************************************************/
/*
void picture(void)//PICTURE
{
BYTE i,j;
Set_address();//Set start address
for(i=0;i<10;i++)
{
for (j=0;j<320;j++)
{
WriteDAT(0xff,0xff);
}
}
for(i=0;i<100;i++)
{
for (j=0;j<320;j++)
{
WriteDAT(gImage_240100[640*i+2*j],gImage_240100[640*i+2*j+1]);
}
}
for(i=0;i<100;i++)
{
for (j=0;j<320;j++)
{
WriteDAT(gImage_240100[640*i+2*j],gImage_240100[640*i+2*j+1]);
}
}
for(i=0;i<100;i++)
{
for (j=0;j<320;j++)
{
WriteDAT(gImage_240100[640*i+2*j],gImage_240100[640*i+2*j+1]);
}
}
for(i=0;i<10;i++)
{
for (j=0;j<320;j++)
{
WriteDAT(0xff,0xff);
}
}
}
*/
//*****************************************************************/
void testpic(void)
{
grayscale();//OTP TEST
grayscale_16();
Show_RGB(0xf8,0x00); //Display Red for 65K
Show_RGB(0x07,0xe0); //Display Green for 65K
Show_RGB(0x00,0x1f); //Display Blue for 65K
Show_RGB(0x00,0x00); //Display black FULL
Show_Colorbar();
displayshow1();//SHOW
displayshow();
//picture();
Show_RGB(0xff,0xff); //Display white FULL
}
/*****************************************************///SPI开始
void start()
{
DCLK=0 ;
CS2=1 ;
DIN=1 ;
DCLK=1 ;
CS2=0 ;
}
//*****************************************************//SPI写数据
WriteCharTo7843(unsigned char num)
{
unsigned char count=0 ;
DCLK=0 ;
for(count=0;count<8;count++)
{
num<<=1 ;
DIN=CY ;
DCLK=0 ;
_nop_();
_nop_();
_nop_();
//上升沿有效
DCLK=1 ;
_nop_();
_nop_();
_nop_();
}
}
//*****************************************************//SPI 读数据
long ReadFromCharFrom7843()
{
unsigned char count=0 ;
unsigned int Num=0 ;
for(count=0;count<12;count++)
{
Num<<=1 ;
DCLK=1 ;
_nop_();
_nop_();
_nop_();
//下降沿有效
DCLK=0 ;
_nop_();
_nop_();
_nop_();
if(DOUT)Num++;
}
return(Num);
}
/*****************************************************************/
void convert(void)
{ if(touch==0)
displaypic(0xff,0xff); //white FULL
if(test==0)
testpic();
}
//*****************************************************************/
main()
{
IT0=0;
IT1=0;
EX0=1;
EA=1;
res=1;
delay(400);
res=0;
delay(400);
res=1;
delay(400);
Initial_IC();
for(;;)
{
testpic();
}
}
/*****************************************************外部中断0 用来接受键盘发来的数据*/
void ZhongDuan()interrupt 0
{
delay(700);//中断后延时以消除抖动,使得采样数据更准确
start(); //启动SPI
WriteCharTo7843(0x90);//送控制字 10010000 即用差分方式读X坐标
DCLK=1 ;
DCLK=0 ;
YTP=-ReadFromCharFrom7843(); //读X轴坐标
WriteCharTo7843(0xD0);//送控制字 11010000 即用差分方式读Y坐标
DCLK=1 ;
DCLK=0 ;
XTP=-ReadFromCharFrom7843(); //读Y轴坐标
CS2=1 ;
XTP1= (XTP-250)*240;
XLCD= XTP1/3500-100; //触摸点X坐标
YTP1= (YTP-50)*300;
YLCD= YTP1/3500-50; //触摸点Y坐标 06.11.22
XLCDH=XLCD>>8;
YLCDH=YLCD>>8;
WriteCOM(0x00,0x4e);
WriteDAT(XLCDH,XLCD);
// WriteDAT(XLCDH,XLCD);
WriteCOM(0x00,0x4f);
WriteDAT(YLCDH,YLCD);
// WriteDAT(YLCDH,YLCD);
WriteCOM(0x00,0x22);
WriteDAT(0xf8,0x00);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -