- //////////////////////////////////////////////////////////////////////////////////
- //本程序只供学习使用,未经作者许可,不得用于其它任何用途
- //测试硬件:STC51
- //1.8寸TFT_ST7735液晶驱动
- //********************************************************************************
- #include<reg51.h>
- #include<absacc.h>
- #include<intrins.h>
- #include<string.h>
- #define uchar unsigned char
- #define uint unsigned int
- //测试硬件平台:STC12C5A60S2/STC12LE5A60S2
- //主频:12MHZ
- //单片机IO推挽输出设置定义
- //#define USE_LANDSCAPE//测试程序横竖屏切换,横屏请开启此宏,竖屏请屏蔽
- #define MCU_STC12//如果您使用的单片机不是STC12系列(如STC89C52)请屏蔽此宏定义
- #ifdef MCU_STC12
- sfr P3M1 = 0xB1; //P3M1.n,P3M0.n =00--->Standard, 01--->push-pull
- sfr P3M0 = 0xB2; // =10--->pure input, 11--->open drain
- #endif
- //---------------------------液晶屏接线说明-------------------------------------//
- //---------------------------液晶屏接线说明-------------------------------------//
- //接线前请参考液晶屏说明书第10页引脚定义
- sbit bl =P1^5;//接模块BL引脚,背光可以采用IO控制或者PWM控制,也可以直接接到高电平常亮
- sbit scl =P1^0;//接模块CLK引脚,接裸屏Pin9_SCL
- sbit sda =P1^1;//接模块DIN/MOSI引脚,接裸屏Pin8_SDA
- sbit rs =P1^3;//接模块D/C引脚,接裸屏Pin7_A0
- sbit cs =P1^4;//接模块CE引脚,接裸屏Pin12_CS
- sbit reset =P1^2;//接模块RST引脚,接裸屏Pin6_RES
- //---------------------------End of液晶屏接线---------------------------------//
- //定义常用颜色
- #define RED 0xf800
- #define GREEN 0x07e0
- #define BLUE 0x001f
- #define WHITE 0xffff
- #define BLACK 0x0000
- #define YELLOW 0xFFE0
- #define GRAY0 0xEF7D
- #define GRAY1 0x8410
- #define GRAY2 0x4208
- void Contrast_Adjust();
- uchar code Zk_ASCII8X16[];
- void Display_Desc();
- void Output_Pixel(uint x,uint y);
- void Display_ASCII8X16(uint x0,uint y0,uchar *s);
- void delay_ms(uint time)
- {
- uint i,j;
- for(i=0;i<time;i++)
- for(j=0;j<250;j++);
- }
- //向SPI总线传输一个8位数据
- void SPI_WriteData(uchar Data)
- {
- unsigned char i=0;
- for(i=8;i>0;i--)
- {
- if(Data&0x80)
- sda=1; //输出数据
- else sda=0;
- scl=0;
- scl=1;
- Data<<=1;
- }
- }
- //向液晶屏写一个8位指令
- void Lcd_WriteIndex(uchar Data)
- {
-
- cs=0;
- rs=0;
- SPI_WriteData(Data);
- cs=1;
- }
- //向液晶屏写一个8位数据
- void Lcd_WriteData(uchar Data)
- {
- unsigned char i=0;
- cs=0;
- rs=1;
- SPI_WriteData(Data);
- cs=1;
- }
- //向液晶屏写一个16位数据
- void LCD_WriteData_16Bit(unsigned int Data)
- {
- unsigned char i=0;
- cs=0;
- rs=1;
- SPI_WriteData(Data>>8); //写入高8位数据
- SPI_WriteData(Data); //写入低8位数据
- cs=1;
- }
- void Reset()
- {
- reset=0;
- delay_ms(100);
- reset=1;
- delay_ms(100);
- }
- //////////////////////////////////////////////////////////////////////////////////////////////
- //液晶屏初始化 for S6D02A1
- void lcd_initial()
- { Reset();//Reset before LCD Init.
-
- //LCD Init For 1.44Inch LCD Panel with ST7735R.
- Lcd_WriteIndex(0x11);//Sleep exit
- delay_ms (120);
-
- //ST7735R Frame Rate
- Lcd_WriteIndex(0xB1);
- Lcd_WriteData(0x01);
- Lcd_WriteData(0x2C);
- Lcd_WriteData(0x2D);
- Lcd_WriteIndex(0xB2);
- Lcd_WriteData(0x01);
- Lcd_WriteData(0x2C);
- Lcd_WriteData(0x2D);
- Lcd_WriteIndex(0xB3);
- Lcd_WriteData(0x01);
- Lcd_WriteData(0x2C);
- Lcd_WriteData(0x2D);
- Lcd_WriteData(0x01);
- Lcd_WriteData(0x2C);
- Lcd_WriteData(0x2D);
-
- Lcd_WriteIndex(0xB4); //Column inversion
- Lcd_WriteData(0x07);
-
- //ST7735R Power Sequence
- Lcd_WriteIndex(0xC0);
- Lcd_WriteData(0xA2);
- Lcd_WriteData(0x02);
- Lcd_WriteData(0x84);
- Lcd_WriteIndex(0xC1);
- Lcd_WriteData(0xC5);
- Lcd_WriteIndex(0xC2);
- Lcd_WriteData(0x0A);
- Lcd_WriteData(0x00);
- Lcd_WriteIndex(0xC3);
- Lcd_WriteData(0x8A);
- Lcd_WriteData(0x2A);
- Lcd_WriteIndex(0xC4);
- Lcd_WriteData(0x8A);
- Lcd_WriteData(0xEE);
-
- Lcd_WriteIndex(0xC5); //VCOM
- Lcd_WriteData(0x0E);
-
- Lcd_WriteIndex(0x36); //MX, MY, RGB mode
- Lcd_WriteData(0xC0);
- #ifdef USE_LANDSCAPE
- Lcd_WriteData(0xA8); //竖屏C8 横屏08 A8
- #else
- Lcd_WriteData(0xC8); //竖屏C8 横屏08 A8
- #endif
- //ST7735R Gamma Sequence
- Lcd_WriteIndex(0xe0);
- Lcd_WriteData(0x0f);
- Lcd_WriteData(0x1a);
- Lcd_WriteData(0x0f);
- Lcd_WriteData(0x18);
- Lcd_WriteData(0x2f);
- Lcd_WriteData(0x28);
- Lcd_WriteData(0x20);
- Lcd_WriteData(0x22);
- Lcd_WriteData(0x1f);
- Lcd_WriteData(0x1b);
- Lcd_WriteData(0x23);
- Lcd_WriteData(0x37);
- Lcd_WriteData(0x00);
- Lcd_WriteData(0x07);
- Lcd_WriteData(0x02);
- Lcd_WriteData(0x10);
- Lcd_WriteIndex(0xe1);
- Lcd_WriteData(0x0f);
- Lcd_WriteData(0x1b);
- Lcd_WriteData(0x0f);
- Lcd_WriteData(0x17);
- Lcd_WriteData(0x33);
- Lcd_WriteData(0x2c);
- Lcd_WriteData(0x29);
- Lcd_WriteData(0x2e);
- Lcd_WriteData(0x30);
- Lcd_WriteData(0x30);
- Lcd_WriteData(0x39);
- Lcd_WriteData(0x3f);
- Lcd_WriteData(0x00);
- Lcd_WriteData(0x07);
- Lcd_WriteData(0x03);
- Lcd_WriteData(0x10);
-
- Lcd_WriteIndex(0x2a);
- Lcd_WriteData(0x00);
- Lcd_WriteData(0x00+2);
- Lcd_WriteData(0x00);
- Lcd_WriteData(0x80+2);
- Lcd_WriteIndex(0x2b);
- Lcd_WriteData(0x00);
- Lcd_WriteData(0x00+3);
- Lcd_WriteData(0x00);
- Lcd_WriteData(0x80+3);
-
- Lcd_WriteIndex(0xF0); //Enable test command
- Lcd_WriteData(0x01);
- Lcd_WriteIndex(0xF6); //Disable ram power save mode
- Lcd_WriteData(0x00);
-
- Lcd_WriteIndex(0x3A); //65k mode
- Lcd_WriteData(0x05);
-
-
- Lcd_WriteIndex(0x29);//Display on
- }
- /*************************************************
- 函数名:LCD_Set_Region
- 功能:设置lcd显示区域,在此区域写点数据自动换行
- 入口参数:xy起点和终点
- 返回值:无
- *************************************************/
- void Lcd_SetRegion(unsigned int x_start,unsigned int y_start,unsigned int x_end,unsigned int y_end)
- {
- #ifdef USE_LANDSCAPE//使用横屏模式
- Lcd_WriteIndex(0x2a);
- Lcd_WriteData(0x02);
- Lcd_WriteData(x_start+2);
- Lcd_WriteData(0x02);
- Lcd_WriteData(x_end+2);
- Lcd_WriteIndex(0x2b);
- Lcd_WriteData(0x01);
- Lcd_WriteData(y_start+1);
- Lcd_WriteData(0x01);
- Lcd_WriteData(y_end+1);
- #else//竖屏模式
- Lcd_WriteIndex(0x2a);
- Lcd_WriteData(0x02);
- Lcd_WriteData(x_start+2);
- Lcd_WriteData(0x02);
- Lcd_WriteData(x_end+2);
- Lcd_WriteIndex(0x2b);
- Lcd_WriteData(0x01);
- Lcd_WriteData(y_start+1);
- Lcd_WriteData(0x01);
- Lcd_WriteData(y_end+1);
- #endif
- Lcd_WriteIndex(0x2c);
- }
- void PutPixel(uint x_start,uint y_start,uint color)
- {
- Lcd_SetRegion(x_start,y_start,x_start+1,y_start+1);
- LCD_WriteData_16Bit(color);
-
- }
- void dsp_single_colour(int color)
- {
- uchar i,j;
- Lcd_SetRegion(0,0,128-1,160-1);
- for (i=0;i<160;i++)
- for (j=0;j<128;j++)
- LCD_WriteData_16Bit(color);
- }
- void Display_Desc()
- {
- Display_ASCII8X16(10,10,"Welcome");
- Display_ASCII8X16(10,26,"Zhongguo");
- Display_ASCII8X16(10,42,"Dots:128*160");
- Display_ASCII8X16(10,58,"IC: ST7735");
- Display_ASCII8X16(10,74,"VA:6 o'clock");
- Display_ASCII8X16(10,90,"2015.10.26");
- }
- //显示一个英文字符
- void Display_ASCII8X16(uint x0,uint y0,uchar *s)
- {
- int i,j,k,x,y,xx;
-
- unsigned char qm;
-
- long int ulOffset;
-
- char ywbuf[32],temp[2];
- for(i = 0; i<strlen((char*)s);i++)
- {
- if(((unsigned char)(*(s+i))) >= 161)
- {
- temp[0] = *(s+i);
- temp[1] = '\0';
- return;
- }
-
- else
- {
- qm = *(s+i);
- ulOffset = (long int)(qm) * 16;
-
- for (j = 0; j < 16; j ++)
- {
- ywbuf[j]=Zk_ASCII8X16[ulOffset+j];
- }
-
- for(y = 0;y < 16;y++)
- {
- for(x=0;x<8;x++)
- {
- k=x % 8;
-
- if(ywbuf[y]&(0x80 >> k))
- {
- xx=x0+x+i*8;
- PutPixel(xx,y+y0,RED);
- }
-
- }
- }
- }
- }
- }
- main()
- {
- #ifdef MCU_STC12
- P3M1 &= ~(1<<2), P3M0 |= (1<<2); //P3.2 set as push-pull output mode
- #endif
- lcd_initial();
- bl=1;
- while(1)
- {
- dsp_single_colour(RED);//红色
- dsp_single_colour(GREEN);//绿色
- dsp_single_colour(BLUE);//蓝色
- delay_ms(500);
- dsp_single_colour(WHITE);//白色
- Display_Desc(); //版本
- delay_ms(500);
- }
- }
- uchar code Zk_ASCII8X16[]=
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 余下代码见附件
复制代码
1.8寸LCD-51(模拟SPI英文显示).rar
(67.44 KB, 下载次数: 94)
|