在刚刚接触到TFT选视屏时,确实对他产生过恐惧感,但是韩式坚持学习下去;在最后用它打出点时一切问题都迎刃而解
!!因为会打点了,也就会划线了,会划线了也就会画出自己的坐标系了!!
还是之前的那句话,越是高级的外围设备,它在出厂时都会有自己的一套驱动程序!只要掌握了就可以对他进行操作了,而不需要你去写程序!!
所以从一定意义上来讲,玩转TFT的难度要比你玩转四位数码管的难度小!!确实如此!其中的乐趣只有自己去做才能体会!
#include
#define uint unsigned int
#define uchar unsigned char
#define TYPE_LCD_DATA 1
#define TYPE_LCD_COMMAND 0
#define LCD_SIZE_X 128
#define LCD_SIZE_Y 160
#define DATA P0
sbit LCD_RST = P2^7; //RST 引脚定义
sbit LCD_RD = P3^2; //RD 引脚定义
sbit LCD_WR = P3^3; //WR 引脚定义
sbit LCD_RS = P2^5; //RS 引脚定义
sbit LCD_CS = P2^6; //CS 引脚定义
//想玩转任何一种外围设备都必须首先了解他的引脚的作用,才能随心所欲的移植代码,按自己的要求去操作!!
//以下函数大多部分都是TFT的驱动函数,都有自己的功能注解,了解功能后就可使用!!
uint colors[]=
{
0xf800,0x07e0,0x001f,0xffe0,0x0000,0x07ff,0xf81f,0xffff
};
void delay_ms(uint ms)
{
unsigned char k;
while (ms--)
{
for (k = 0; k < 228; k++)
;
}
}
void LCD_Write(uchar type, uint value)
{
LCD_CS = 0;
LCD_RS = type; // 0: command 1: data
LCD_WR = 0;
DATA = (uchar)value;;
LCD_WR = 1;
LCD_CS = 1;
}
void LCD_Wirte_Data16(uint value) // color data
{
LCD_CS = 0;
LCD_RS = 1;
LCD_WR = 0;
DATA = (uchar)value;
LCD_WR = 1;
LCD_WR = 0;
DATA = (uchar)(value>>8) ;
LCD_WR = 1;
LCD_CS = 1;
}
void Reg_Write(uint reg,uint value)
{
LCD_Write(TYPE_LCD_COMMAND,reg);
LCD_Write(TYPE_LCD_DATA,value);
}
void LCD_SetRamAddr(uint xStart, uint xEnd, uint yStart, uint yEnd)
{
Reg_Write(0x09, xStart);
Reg_Write(0x10, yStart);
Reg_Write(0x11, xEnd);
Reg_Write(0x12, yEnd);
Reg_Write(0x18, xStart);
Reg_Write(0x19, yStart);
LCD_Write(TYPE_LCD_COMMAND,0x22); // 0x22
}
void LCD_init(void)
{
uint num;
Reg_Write(0x0001,0x0002); //MODE_SEL1
Reg_Write(0x0002,0x0012); //MODE_SEL2
Reg_Write(0x0003,0x0000); //MODE_SEL3
Reg_Write(0x0004,0x0010); //MODE_SEL3
LCD_SetRamAddr(0,127, 0,159);
for(num=20480;num>0;num--)
LCD_Wirte_Data16(0xffff);
Reg_Write(0x0005,0x0008); //VCO_MODE
Reg_Write(0x0007,0x007f); //VCOMHT_CTRL
Reg_Write(0x0008,0x0017); //VCOMLT_CTRL
Reg_Write(0x0009,0x0000); //write SRAM window start X point
Reg_Write(0x0010,0x0000); //write SRAM window start y point
Reg_Write(0x0011,0x0083); //write SRAM window end x point
Reg_Write(0x0012,0x009f); //write SRAM window end y point
Reg_Write(0x0017,0x0000); //SRAM contrl
Reg_Write(0x0018,0x0000); //SRAM x position
Reg_Write(0x0019,0x0000); //SRAM y position
Reg_Write(0x0006,0x00c5); //DAC_OP_CTRL2
delay_ms(10); //延时
}
void LCD_clear(uchar n)
{
uint num;
LCD_SetRamAddr(0,127, 0,159);
for(num=20480;num>0;num--) //160*128=20480
{
LCD_Wirte_Data16(colors[n]);
}
}
//===============================================================
//设定当前显示坐标
//入口参数: x,y为当前显示坐标。
//出口参数: 无
//说明:本函数实际上是LCD_setwindow函数的一个特例,显示窗口为最小,仅是一个像素点。
void LCD_setxy(unsigned char x,unsigned int y)
{
LCD_SetRamAddr(x,y,x,y);
}
void GUI_Point(uchar x, uint y, uint n)
{
LCD_setxy(x,y);
LCD_Wirte_Data16(colors[n]);
}
void main()
{
uint num;
P2 = 0xff;
P0 = 0xff;
LCD_init();
while(1)
{
LCD_SetRamAddr(50,100, 50,50);
for(num=2500;num>0;num--) //160*128=20480
{
LCD_Wirte_Data16(colors[2]);//比如此函数只需知道是用来设置点的颜色即可,以及其参数是colors[]
}
}
}