標(biāo)題:
1.8寸LCD-51單片機(jī)(模擬SPI英文顯示)ST7735芯片
[打印本頁]
作者:
我是帥哥1
時間:
2021-1-24 13:46
標(biāo)題:
1.8寸LCD-51單片機(jī)(模擬SPI英文顯示)ST7735芯片
//////////////////////////////////////////////////////////////////////////////////
//本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
//測試硬件:STC51
//1.8寸TFT_ST7735液晶驅(qū)動
//********************************************************************************
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
//測試硬件平臺:STC12C5A60S2/STC12LE5A60S2
//主頻:12MHZ
//單片機(jī)IO推挽輸出設(shè)置定義
//#define USE_LANDSCAPE//測試程序橫豎屏切換,橫屏請開啟此宏,豎屏請屏蔽
#define MCU_STC12//如果您使用的單片機(jī)不是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位數(shù)據(jù)
void SPI_WriteData(uchar Data)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
if(Data&0x80)
sda=1; //輸出數(shù)據(jù)
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位數(shù)據(jù)
void Lcd_WriteData(uchar Data)
{
unsigned char i=0;
cs=0;
rs=1;
SPI_WriteData(Data);
cs=1;
}
//向液晶屏寫一個16位數(shù)據(jù)
void LCD_WriteData_16Bit(unsigned int Data)
{
unsigned char i=0;
cs=0;
rs=1;
SPI_WriteData(Data>>8); //寫入高8位數(shù)據(jù)
SPI_WriteData(Data); //寫入低8位數(shù)據(jù)
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
}
/*************************************************
函數(shù)名:LCD_Set_Region
功能:設(shè)置lcd顯示區(qū)域,在此區(qū)域?qū)扅c(diǎn)數(shù)據(jù)自動換行
入口參數(shù):xy起點(diǎn)和終點(diǎn)
返回值:無
*************************************************/
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);//藍(lán)色
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,
余下代碼見附件
復(fù)制代碼
1.8寸LCD-51(模擬SPI英文顯示).rar
(67.44 KB, 下載次數(shù): 94)
2021-1-24 13:45 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1