📄 tftlcd.h~
字号:
#ifndef _TFTLCD_INCLUDED_
#define _TFTLCD_INCLUDED_
#include<mega8.h>
#include <delay.h>
#include <math.h>
#include "font.h"
//#include "font.h"
#define LCD_CS PORTC.4
#define LCD_WR PORTC.2
#define LCD_RS PORTC.3
#define LCD_RD PORTC.0
#define LCD_RST PORTC.1
#define DATAOUT PORTD
#define DATAIN PIND
#define DATADDR DDRD
uint POINT_COLOR=0XF800;//默认红色
/*------------------------液晶说明------------------------------
液晶型号位置
大小:320*240
像素:65K色
VCC 3.3V
VCCIO 2.7~3.3V
数据线操作电压:3.3V
颜色排列:以一个十六位的数存放一个点的颜色 RGB:565 即:最高五位为红色
灰阶.中间六位为绿色灰阶.最低五位为蓝色灰阶.
例如:0XF800 纯红色
0X07E0 纯绿色
0X001F 纯蓝色
----------------------------------------------------------------*/
//写入8位数据
void LCD_WDATA(uchar data)
{
LCD_CS = 0;
DATAOUT = data;
LCD_WR = 0;
LCD_WR = 1;
LCD_CS = 1;
LCD_RS = 0;
}
//写8位数据函数
void LCD_WR_DATA(uchar data)
{
LCD_RS = 1;//写数据
LCD_WDATA(data);
}
//写寄存器地址函数
void LCD_WR_REG(uchar data)
{
LCD_RS = 0;//写地址
LCD_WDATA(data);
}
//写寄存器数据函数
//dbw:数据位数,1为16位,0为8位。
//index:寄存器编号
//val:值
//输入:dbw 数据位数,1为16位,0为8位。
void LCD_WR_CMD(uchar dbw,uchar index,uint val)
{
LCD_WR_REG(index);
if(dbw)
{
LCD_WR_DATA(val>>8);
}
LCD_WR_DATA(val&0xff);
}
/*
//有误!!!!!! (读不出数据)
//读16位寄存器数据函数
//输入:index 寄存器地址
unsigned int LCD_RD_REG16(uchar index)
{
unsigned int pd;
LCD_WR_REG(index);
LCD_RS = 1;//数据
LCD_CS = 0;//片选有效
DATADDR=0X00;//输入
DATAOUT = 0xFF;
LCD_RD = 0;
delay_us(2);
LCD_RD = 1;
pd = DATAIN;//读取高8位数据
pd = pd<<8;
LCD_CS = 1;//片选有效
LCD_RS = 0;//数据
LCD_RS = 1;
LCD_CS = 0;
LCD_RD = 0;
delay_us(2);
LCD_RD = 1;
pd = pd + DATAIN;//读取低8位数据
LCD_CS = 1;
LCD_RS = 0;
DATADDR=0Xff;//PORTD输出
return pd;
}
*/
//写16位数据函数
void LCD_WR_Data16(uint val)
{
LCD_WR_DATA(val>>8);
LCD_WR_DATA(val&0xff);
}
//清屏函数
//x,y:起始坐标
//len,wid:长宽
void LCD_CLEAR(uchar x,uint y,uchar len,uint wid)
{
ulong n,temp;
LCD_WR_CMD(0,0x2,x);//设置到原点
LCD_WR_CMD(1,0x3,y);
LCD_WR_CMD(0,0x04,x+len-1); //结束列数(0~239)
LCD_WR_CMD(1,0x05,y+wid-1);//结束行数(0~319)
LCD_WR_REG(0x0E);
temp=(ulong)len*wid;
for(n=0;n<temp;n++)LCD_WR_Data16(0xffff);//显示白色
}
//画点
//x:0~239
//y:0~319
//POINT_COLOR:此点的颜色
void LCD_DrawPoint(uchar x,uint y)
{
LCD_WR_CMD(0,0x2,x);//设置到原点
LCD_WR_CMD(1,0x3,y);
LCD_WR_REG(0x0E);
LCD_WR_Data16(POINT_COLOR);
}
//画线
//x1,y1:起点坐标
//x2,y2:终点坐标
void LCD_DrawLine(uchar x1, uint y1, uchar x2, uint y2)
{
uint x, y, t;
if((x1==x2)&&(y1==y2))LCD_DrawPoint(x1, y1);
else if(abs(y2-y1)>abs(x2-x1))//斜率大于1
{
if(y1>y2)
{
t=y1;
y1=y2;
y2=t;
t=x1;
x1=x2;
x2=t;
}
for(y=y1;y<y2;y++)//以y轴为基准
{
x=(ulong)(y-y1)*(x2-x1)/(y2-y1)+x1;
LCD_DrawPoint(x, y);
}
}
else //斜率小于等于1
{
if(x1>x2)
{
t=y1;
y1=y2;
y2=t;
t=x1;
x1=x2;
x2=t;
}
for(x=x1;x<x2;x++)//以x轴为基准
{
y =(ulong)(x-x1)*(y2-y1)/(x2-x1)+y1;
LCD_DrawPoint(x,y);
}
}
}
//在指定位置显示一个字符
//x:0~234
//y:0~308
//num:要显示的字符:" "--->"~"
void LCD_ShowChar(uchar x,uint y,uchar num)
{
#define MAX_CHAR_POSX 234
#define MAX_CHAR_POSY 308
uchar temp;
uchar pos,t;
if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return;
//设定一个字符所占的大小
//开辟空间
LCD_WR_CMD(0,0x2,x);//
LCD_WR_CMD(1,0x3,y);
LCD_WR_CMD(0,0x04,x+5); //结束列数(0~239)
LCD_WR_CMD(1,0x05,y+11);//结束行数(0~319)
LCD_WR_REG(0x0E);
num=num-' ';//得到偏移后的值
for(pos=0;pos<12;pos++)
{
temp=asc2[num][pos];
for(t=0;t<6;t++)
{
if(temp&0x01)LCD_WR_Data16(POINT_COLOR);
else LCD_WR_Data16(0xffff);//白色
temp>>=1;
}
}
}
//显示一个数字
//x,y:起点坐标
//num:数值(0~255);
void LCD_ShowNum(uchar x,uint y,uchar num)
{
LCD_ShowChar(x,y,num/100+'0');
LCD_ShowChar(x+6,y,(num/10)%10+'0');
LCD_ShowChar(x+12,y,num%10+'0');
}
//显示字符串
//x,y:起点坐标
//*p:字符串起始地址
void LCD_ShowString(uchar x,uint y,flash uchar *p)
{
while(*p!='\0')
{
if(x>MAX_CHAR_POSX){x=0;y+=12;}
if(y>MAX_CHAR_POSY){y=x=0;LCD_CLEAR(0,0,240,320);}
LCD_ShowChar(x,y,*p);
x+=6;
p++;
}
}
//显示一副图片
//x,y:图片起始位置
//lenth:图片的宽度(0~240)
//wide: 图片高度(0~320)
//*p:图片首地址
//不带范围判断
void LCD_ShowBmp(uchar x,uint y,uchar lenth,uint wide,flash uchar *p)
{
ulong size,temp;
//开辟窗口
LCD_WR_CMD(0,0x2,x);//起始坐标
LCD_WR_CMD(1,0x3,y);
LCD_WR_CMD(0,0x04,x+lenth-1); //结束列数(0~239)
LCD_WR_CMD(1,0x05,y+wide-1); //结束行数(0~319)
LCD_WR_REG(0x0E);
temp=(ulong)lenth*wide*2;
for(size=0;size<temp;size++)LCD_WR_DATA(p[size]);
}
//初始化函数
void LCD_Init()
{
//液晶接口初始化
DDRC=0XFF;
DDRD=0XFF;
PORTC=0XFF;
PORTD=0XFF;
LCD_RST = 0;//硬件复位
delay_ms(200);
LCD_RST = 1;
delay_ms(200);
//initializing funciton 1
LCD_WR_REG(0xA1);
LCD_WR_DATA(0x00);
delay_us(90);
LCD_WR_REG(0xA0);
LCD_WR_DATA(0x00);
delay_us(90);
LCD_WR_CMD(0,0x70,0xc8);//对亮度有影响
delay_ms(20);
LCD_WR_CMD(0,0x72,0xA3);
LCD_WR_CMD(0,0x73,0x04);
LCD_WR_CMD(0,0x75,0x45);
LCD_WR_CMD(0,0x76,0x23);
LCD_WR_CMD(0,0x77,0x08);
LCD_WR_CMD(0,0x78,0x08);
LCD_WR_CMD(0,0x79,0x00);
LCD_WR_CMD(0,0x7F,0xF0);
LCD_WR_CMD(0,0x71,0x81);
delay_ms(2);
LCD_WR_CMD(0,0x0D,0x23);
LCD_WR_CMD(0,0x11,0x00);
LCD_WR_CMD(0,0x12,0x00);
LCD_WR_CMD(0,0x21,0x37);
LCD_WR_CMD(0,0x22,0x02);
LCD_WR_CMD(0,0x23,0x24);
LCD_WR_CMD(0,0x24,0x13);
LCD_WR_CMD(0,0x25,0x0A);
LCD_WR_CMD(0,0x26,0x82);
LCD_WR_CMD(0,0x27,0x01);
LCD_WR_CMD(0,0x1E,0x25);
LCD_WR_CMD(0,0x1F,0x59);//有影响
//GAMMA设置
LCD_WR_CMD(1,0x30,0x0777);
LCD_WR_CMD(1,0x31,0x0444);
LCD_WR_CMD(1,0x32,0x0555);
LCD_WR_CMD(1,0x33,0x0444);
LCD_WR_CMD(1,0x34,0x0333);
LCD_WR_CMD(1,0x35,0x0333);
LCD_WR_CMD(1,0x36,0x0333);
LCD_WR_CMD(1,0x37,0x0333);
LCD_WR_CMD(1,0x38,0x0444);
LCD_WR_CMD(1,0x39,0x0555);
LCD_WR_CMD(1,0x3A,0x0666);
LCD_WR_CMD(1,0x3B,0x0666);
LCD_WR_CMD(1,0x3C,0x0777);
LCD_WR_CMD(1,0x3D,0x0777);
LCD_WR_CMD(1,0x3E,0x0777);
LCD_WR_CMD(1,0x3F,0x0777);
LCD_WR_CMD(1,0x40,0x0777);
LCD_WR_CMD(1,0x41,0x0777);
LCD_WR_CMD(1,0x42,0x0777);
LCD_WR_CMD(1,0x43,0x0777);
LCD_WR_CMD(1,0x44,0x0777);
LCD_WR_CMD(1,0x45,0x0777);
LCD_WR_CMD(1,0x46,0x0777);
LCD_WR_CMD(1,0x47,0x0777);
LCD_WR_CMD(1,0x48,0x0777);
LCD_WR_CMD(1,0x49,0x0777);
LCD_WR_CMD(1,0x4A,0x0777);
LCD_WR_CMD(1,0x4B,0x0777);
LCD_WR_CMD(1,0x4C,0x0777);
LCD_WR_CMD(1,0x4D,0x0666);
LCD_WR_CMD(1,0x4E,0x0666);
LCD_WR_CMD(1,0x4F,0x0666);
LCD_WR_CMD(0,0x00,0x04); //扫描方向控制
LCD_WR_CMD(0,0x01,0x07); //扫描方向控制
LCD_WR_CMD(0,0x02,0x00); //设置X坐标点
LCD_WR_CMD(1,0x03,0x0000); //设置Y坐标点
//面板大小设置
LCD_WR_CMD(0,0x04,0xEF); //结束列数(0~239)
LCD_WR_CMD(1,0x05,0x013F); //结束行数(0~319)
//窗口设置
LCD_WR_CMD(0,0x06,0x00); //水平起始位置
LCD_WR_CMD(1,0x07,0x0000); //垂直起始位置
LCD_WR_CMD(0,0x08,0xEF); //水平结束位置
LCD_WR_CMD(1,0x09,0x013F); //垂直结束位置
LCD_WR_CMD(0,0x0A,0x00);
LCD_WR_CMD(0,0x0B,0x00);
LCD_WR_CMD(0,0x0C,0x00);
LCD_WR_CMD(0,0x14,0x00);
LCD_WR_CMD(0,0x15,0x00);
LCD_WR_CMD(0,0x16,0x00);
LCD_WR_CMD(1,0x17,0x01FF);
LCD_WR_CMD(1,0x18,0x01FF);
LCD_WR_CMD(0,0x13,0x00);
LCD_WR_CMD(1,0x19,0x01FF);
LCD_WR_CMD(1,0x1B,0x01FF);
LCD_WR_CMD(1,0x1C,0x01FF);
LCD_WR_CMD(1,0x1A,0x01FF);
LCD_WR_CMD(0,0x1D,0x0E);//无影响
LCD_WR_CMD(0,0x10,0x06);//开显示
LCD_WR_REG(0x0E);
LCD_CLEAR(0,0,240,320);//清屏
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -