⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tft_lcd.c

📁 我改写的在TFT上显示SD卡中BMP文件的程序
💻 C
字号:
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <string.h>
#include "TFT_LCD.h"
#include "portBit.h"
#include "mydelay.h"

//  作者:Jacky.L   13430733249
//  仅供学习使用.未经本人同意不得任意转载
//  请支持原创,谢谢!



/*  		     ------		
	 VCC	22	--|	 |--1	GND
	 VCC	21	--|	 |--2	GND
	 VCC	20	--|	 |--3	GND	
	VCCIO	19	--|	 |--4	#RST
	VCCIO	18	--|	 |--5	NC
	  D0	17	--|	 |--6	#RD
	  D1	16	--|	 |--7	#WR
	  D2	15	--|	 |--8	#CS
	  D3	14	--|	 |--9	RS
	  D4	13	--|	 |--10	D7
	  D5	12	--|	 |--11	D6
			     ------
VCC	:2.6~3.3V
VCCIO	:1.6~3.3V                                */


/*
void DelayUs(unsigned int t)
{
	t+=170;
	while(--t);
}

void DelayMs(unsigned int t)
{
	unsigned char i,j;
	while(--t)
	{
		j=8;
		while(--j)
			while(--i);
	}
}*/


 


//写寄存器地址函数
void LCD_WriteRegister(unsigned char index)
{

	L(CTL_PORT,LCD_RS);
	L(CTL_PORT,LCD_CS);

	DATA_PORT = index;

	L(CTL_PORT,LCD_WR );
	H(CTL_PORT,LCD_WR );

	H(CTL_PORT,LCD_CS );
//	LCD_RS = 0;
}

//写8位数据函数
void LCD_WriteByte(unsigned char pd)
{
//	DelayUs(10);

	H(CTL_PORT,LCD_RS);
	L(CTL_PORT,LCD_CS);

	DATA_PORT = pd;

	L(CTL_PORT,LCD_WR );
	H(CTL_PORT,LCD_WR );

	H(CTL_PORT,LCD_CS );
}

//写寄存器数据函数
//输入:dbw 数据位数,1为16位,0为8位。
void LCD_WriteCommand(unsigned char dbw,unsigned char index,unsigned int val)
{
	L(CTL_PORT,LCD_RS);
	L(CTL_PORT,LCD_CS);

	DATA_PORT = index;

	L(CTL_PORT,LCD_WR );
	H(CTL_PORT,LCD_WR );

	H(CTL_PORT,LCD_CS );

	DelayUs(1);

	if(dbw)
		{
		H(CTL_PORT,LCD_RS);
		L(CTL_PORT,LCD_CS);

		DATA_PORT = (unsigned char)(val>>8);

  	    L(CTL_PORT,LCD_WR );
	    H(CTL_PORT,LCD_WR );
	    H(CTL_PORT,LCD_CS );
		}

	DelayUs(1);

	H(CTL_PORT,LCD_RS);
	L(CTL_PORT,LCD_CS);

	DATA_PORT = (unsigned char)val;

	L(CTL_PORT,LCD_WR );
	H(CTL_PORT,LCD_WR );

	H(CTL_PORT,LCD_CS );
}


//写16位数据函数
void LCD_WriteWord(unsigned int val)
{
	H(CTL_PORT,LCD_RS);
	L(CTL_PORT,LCD_CS);

	DATA_PORT = (unsigned char)(val>>8);

	L(CTL_PORT,LCD_WR );
	H(CTL_PORT,LCD_WR );
	//H(CTL_PORT,LCD_CS );


	//H(CTL_PORT,LCD_RS);
	//L(CTL_PORT,LCD_CS);

	DATA_PORT = (unsigned char)val;

	L(CTL_PORT,LCD_WR );
	H(CTL_PORT,LCD_WR );

	H(CTL_PORT,LCD_CS );
}

//初始化函数
void LCD_Init()
{
	DATA_PORT_OUT;
	CTL_PORT_OUT;
	CTL_PORT_H;

	L(CTL_PORT,LCD_RST);
	DelayMs(200);
	H(CTL_PORT,LCD_RST);
	DelayMs(200);

	//initializing funciton 1
	DelayUs(10);
	LCD_WriteRegister(0xA1);
	DelayUs(16);
	LCD_WriteByte(0x00);
	DelayUs(90);
	LCD_WriteRegister(0xA0);
	DelayUs(10);
	LCD_WriteByte(0x00);
	DelayUs(10);
	LCD_WriteCommand(0,0x70,0xC8);

	DelayMs(20);
	
	LCD_WriteCommand(0,0x72,0xA3);
	DelayUs(10);
	LCD_WriteCommand(0,0x73,0x04);
	DelayUs(10);
	LCD_WriteCommand(0,0x75,0x45);
	DelayUs(10);
	LCD_WriteCommand(0,0x76,0x23);
	DelayUs(10);
	LCD_WriteCommand(0,0x77,0x08);
	DelayUs(10);
	LCD_WriteCommand(0,0x78,0x08);
	DelayUs(10);
	LCD_WriteCommand(0,0x79,0x00);
	DelayUs(10);
	LCD_WriteCommand(0,0x7F,0xF0);
	DelayUs(10);

	LCD_WriteCommand(0,0x71,0x81);	//

	DelayMs(2);

	LCD_WriteCommand(0,0x0D,0x23);
	DelayUs(10);
	LCD_WriteCommand(0,0x11,0x00);
	DelayUs(10);
	LCD_WriteCommand(0,0x12,0x00);
	DelayUs(10);
	LCD_WriteCommand(0,0x21,0x37);
	DelayUs(10);
	LCD_WriteCommand(0,0x22,0x02);
	DelayUs(10);
	LCD_WriteCommand(0,0x23,0x24);
	DelayUs(10);
	DelayUs(10);
	LCD_WriteCommand(0,0x24,0x13);
	DelayUs(10);
	LCD_WriteCommand(0,0x25,0x0A);
	DelayUs(10);
	LCD_WriteCommand(0,0x26,0x82);
	DelayUs(10);
	LCD_WriteCommand(0,0x27,0x01);
	DelayUs(10);
	LCD_WriteCommand(0,0x1E,0x25);
	DelayUs(10);
	LCD_WriteCommand(0,0x1F,0x59);
	DelayUs(10);

	//GAMMA设置
	LCD_WriteCommand(1,0x30,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x31,0x0444);
	DelayUs(10);
	LCD_WriteCommand(1,0x32,0x0555);
	DelayUs(10);
	LCD_WriteCommand(1,0x33,0x0444);
	DelayUs(10);
	LCD_WriteCommand(1,0x34,0x0333);
	DelayUs(10);
	LCD_WriteCommand(1,0x35,0x0333);
	DelayUs(10);
	LCD_WriteCommand(1,0x36,0x0333);
	DelayUs(10);
	LCD_WriteCommand(1,0x37,0x0333);
	DelayUs(10);
	LCD_WriteCommand(1,0x38,0x0444);
	DelayUs(10);
	LCD_WriteCommand(1,0x39,0x0555);
	DelayUs(10);
	LCD_WriteCommand(1,0x3A,0x0666);
	DelayUs(10);
	LCD_WriteCommand(1,0x3B,0x0666);
	DelayUs(10);
	LCD_WriteCommand(1,0x3C,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x3D,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x3E,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x3F,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x40,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x41,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x42,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x43,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x44,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x45,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x46,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x47,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x48,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x49,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x4A,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x4B,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x4C,0x0777);
	DelayUs(10);
	LCD_WriteCommand(1,0x4D,0x0666);
	DelayUs(10);
	LCD_WriteCommand(1,0x4E,0x0666);
	DelayUs(10);
	LCD_WriteCommand(1,0x4F,0x0666);

	DelayUs(400);

	LCD_WriteCommand(0,0x00,0x04);	//扫描方向控制
	DelayUs(10);
	LCD_WriteCommand(0,0x01,0x07);	//扫描方向控制
	DelayUs(10);

	LCD_WriteCommand(0,0x02,0x00);		//X
	LCD_WriteCommand(1,0x03,0x0000);	//Y

	//面板大小设置
	LCD_WriteCommand(0,0x04,0xEF);		//结束列数(0~239) 0xEF=239	
	LCD_WriteCommand(1,0x05,0x013F);	//结束行数(0~319) 0x13F=319

	//窗口设置
	LCD_WriteCommand(0,0x06,0x00);		//水平起始位置
	LCD_WriteCommand(1,0x07,0x0000);	//垂直起始位置
	LCD_WriteCommand(0,0x08,0xEF);		//水平结束位置
	LCD_WriteCommand(1,0x09,0x013F);	//垂直结束位置

	DelayUs(10);
	LCD_WriteCommand(0,0x0A,0x00);
	DelayUs(10);
	LCD_WriteCommand(0,0x0B,0x00);
	DelayUs(10);
	LCD_WriteCommand(0,0x0C,0x00);
	DelayUs(10);
	LCD_WriteCommand(0,0x14,0x00);
	DelayUs(10);
	LCD_WriteCommand(0,0x15,0x00);
	DelayUs(10);
	LCD_WriteCommand(0,0x16,0x00);
	DelayUs(10);
	LCD_WriteCommand(1,0x17,0x01FF);
	DelayUs(10);
	LCD_WriteCommand(1,0x18,0x01FF);
	DelayUs(10);	
	LCD_WriteCommand(0,0x13,0x00);
	DelayUs(10);
	LCD_WriteCommand(1,0x19,0x01FF);
	DelayUs(10);
	LCD_WriteCommand(1,0x1B,0x01FF);
	DelayUs(10);
	LCD_WriteCommand(1,0x1C,0x01FF);
	DelayUs(10);
	LCD_WriteCommand(1,0x1A,0x01FF);	
	DelayUs(10);
	LCD_WriteCommand(0,0x1D,0x0E);
	DelayUs(10);
	LCD_WriteCommand(0,0x10,0x06);		//开显示
	LCD_WriteRegister(0x0E);
	DelayUs(100);
}

void LCD_Start_Window(void)
{
	LCD_WriteCommand(0,0x2,0);        //0-239
	LCD_WriteCommand(1,0x3,0);        //0-319
	LCD_WriteCommand(0,0x04,239);	//结束列数(0~239)	
	LCD_WriteCommand(1,0x05,319);	//结束行数(0~319)
	LCD_WriteRegister(0x0E);
 	H(CTL_PORT,LCD_RS);
	L(CTL_PORT,LCD_CS);
}


void LCD_SetSCRN(unsigned int color)
{
	unsigned int n,num;
	/*
	LCD_Start_Window();
	for(n=0;n<320;n++)
		{
		for(num=0;num<240;num++)
			{
			DATA_PORT = 0;
			L(CTL_PORT,LCD_WR );
			H(CTL_PORT,LCD_WR );
			DATA_PORT = 0x1f;
			L(CTL_PORT,LCD_WR );
			H(CTL_PORT,LCD_WR );
			}
		}*/
    LCD_WriteCommand(0,0x02,0);		//X
	LCD_WriteCommand(1,0x03,0);		//Y
	LCD_WriteCommand(0,0x04,239);	//结束列数(0~239)	
	LCD_WriteCommand(1,0x05,319);	//结束行数(0~319)
	
	LCD_WriteRegister(0x0E);                //写显示数据区
	
	for(n=0;n<320;n++)
		{
		for(num=0;num<240;num++)
			{
			LCD_WriteWord(color);
			}
		}
}


/*********************************************
//画点函数
//(x,y)点的坐标量,color 点的颜色
**********************************************/
void  LCD_Point(unsigned char x, unsigned int y, unsigned int color)
{  
	LCD_WriteCommand(0,0x02,x);	      //X
	LCD_WriteCommand(1,0x03,y);       //Y
	LCD_WriteCommand(0,0x04,x);	      //结束列数(0~239)	
	LCD_WriteCommand(1,0x05,y);       //结束行数(0~319)
	
	LCD_WriteRegister(0x0E);          //写显示数据区
	LCD_WriteWord(color);
}


/**********************************************************
//画横线函数
//(x,y)开始点的坐标量,color 线的颜色, length 横线长度
************************************************************/
void  LCD_HLine(unsigned char x, unsigned int y, unsigned char length, unsigned int color) 
{  

   LCD_WriteCommand(0,0x02,x);	        //X
   LCD_WriteCommand(1,0x03,y);          //Y
   LCD_WriteCommand(0,0x04,x+length-1);	//结束列数(0~239)	
   LCD_WriteCommand(1,0x05,y);          //结束行数(0~319)
	
   LCD_WriteRegister(0x0E);             //写显示数据区
	
	do{  
		LCD_WriteWord(color);	       // 逐点显示,描出水平线
		length--;
	}while(length);
}

/**********************************************************
//画竖线函数
//(x,y)开始点的坐标量,color 线的颜色, high 竖线高度
************************************************************/
/*
void  LCD_RLine(unsigned char x, unsigned int y, unsigned int high, unsigned int color) 
{  
   
    LCD_WriteCommand(0,0x02,x);	        //X
	LCD_WriteCommand(1,0x03,y);         //Y
	LCD_WriteCommand(0,0x04,x);	        //结束列数(0~239)	
	LCD_WriteCommand(1,0x05,y+high-1);  //结束行数(0~319)
	
	LCD_WriteRegister(0x0E);          //写显示数据区
	
	do{  
		LCD_WriteWord(color);	          // 逐点显示,描出垂直线
		high--;
	}while(high);	
}

*/


/**********************************************************
//显示图片函数
//(x,y)开始点的坐标量
//length 图片长度, high 图片高度
//pic 图片数组的指针
************************************************************/
/*
void  LCD_DisPicture(unsigned char x, unsigned int y, unsigned char length, unsigned int high ,const unsigned char *pic)
{
    unsigned int temp,tmp=0,num=0;
    LCD_WriteCommand(0,0x02,x);	            //X
	LCD_WriteCommand(1,0x03,y);             //Y
	LCD_WriteCommand(0,0x04,x+length-1);	//结束列数(0~239)	
	LCD_WriteCommand(1,0x05,y+high-1);      //结束行数(0~319)
	num=length*high*2;
	
	LCD_WriteRegister(0x0E);                //写显示数据区
	
	do{  
		temp=pic[tmp]| pic[tmp+1]<<8;
		LCD_WriteWord(temp);	            // 逐点显示
		tmp+=2;
	}while(tmp<num);
}

*/















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -