📄 tft_lcd.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 + -