文档库 最新最全的文档下载
当前位置:文档库 › 基于51单片机的2.4TFT触摸划线程序

基于51单片机的2.4TFT触摸划线程序

/*********************************************************************

* *

* 触摸画线实验程序*

* (普中科技)*

* *

* 实验目的:1.掌握触摸IC驱动程序的编写、*

2.了解掌握DDA画线算法,称为数值微分画线算法*

3.了解掌握触摸的防抖处理方法*

* *

*实验现象:在彩屏上用有手或触摸笔滑动时,会生成对应线条*

* *

* 技术论坛:https://www.wendangku.net/doc/1a10151956.html, *

* 官方网站: https://www.wendangku.net/doc/1a10151956.html, *

* 技术支持电话:0755-******** *

***********************************************************************/

#include

#include

#include"LCD_driver.h"

#include "touch.h"

#define u16 unsigned int

#define u8 unsigned char

unsigned int TP_X,TP_Y;

u16 X_Addata,Y_Addata;

int TchScr_Xmax=3859,TchScr_Xmin=26,

TchScr_Ymax=3842,TchScr_Ymin=38;//触摸屏返回电压值范围

void LineDDA(int x0,int y0,int x1,int y1);

main()

{ unsigned char xdata ss[6];

unsigned int lx,ly,temp_x = 0,temp_y = 0 , a =0 ,flag = 0;

unsigned long i,j;

char xdata X[6] = {0,0,0,0,0,0,},Y[6]= {0,0,0,0,0,0,};

LCD_Init(); //TFT初始化

AD7843(CMD_RDX);

AD7843(CMD_RDY);

Pant(0xFF,0xFF); //蓝色

LCD_CS =0; //打开片选使能

ChineseChar(14+46,10,2,colors[2],colors[7],1); //普ChineseChar(46+46,10,2,colors[2],colors[7],2); //中ChineseChar(78+46,10,2,colors[2],colors[7],3); //科ChineseChar(110+46,10,2,colors[2],colors[7],4); //技

ChineseChar(68,60,1,colors[0],colors[7],1); //触

ChineseChar(92,60,1,colors[0],colors[7],2); //摸

ChineseChar(116,60,1,colors[0],colors[7],3); //屏

ChineseChar(140,60,1,colors[0],colors[7],4); //测

ChineseChar(164,60,1,colors[0],colors[7],5); //试

//LCD_ShowString(0,90,colors[0],colors[5],"https://www.wendangku.net/doc/1a10151956.html,");

LCD_CS =1; //关闭片选使能

while(1)

{

LCD_CS =0; //打开片选使能

if (IRQ == 0)

{

Read_ADS2(&X_Addata,&Y_Addata);

inttostr(X_Addata,ss);

LCD_ShowString(0,295,0xf800,0xfff0,"X:");

LCD_ShowString(32,295,0xf800,0xfff0,ss); //显示字符串

inttostr(Y_Addata,ss);

LCD_ShowString(120,295,0xf800,0xfff0,"Y:");

LCD_ShowString(152,295,0xf800,0xfff0,ss); //显示字符串

//对采样结果进行转换

//lx=(X_Addata)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin);

j = X_Addata;

j = j*240;

i = TchScr_Xmax-TchScr_Xmin ;

lx= j/i;

if(lx > 240) lx = 240;

if(lx <= 240) lx = 240 - lx;

X[0] = (lx%100000)/1000 + 0x30;

X[1] = (lx%10000)/1000 + 0x30;

X[2] = (lx%1000)/100 + 0x30;

X[3] = (lx%100)/10 + 0x30;

X[4] = lx%10 + 0x30;

LCD_ShowString(0,270,0xf800,0xfff0,"x:"); //显示LCD像素点X坐标LCD_ShowString(32,270,0xf800,0xfff0,X); //显示字符串

// Y_Addata = 3634;

j = Y_Addata;

j = (j*320);

i = TchScr_Ymax-TchScr_Ymin;

ly=j/i;

if(ly > 320) ly = 320;

if(ly <= 320) ly = 320 - ly;

Y[0] = (ly%100000)/10000 + 0x30;

Y[1] = (ly%10000)/1000 + 0x30;

Y[2] = (ly%1000)/100 + 0x30;

Y[3] = (ly%100)/10 + 0x30;

Y[4] = ly%10 + 0x30;

LCD_ShowString(120,270,0xf800,0xfff0,"y:");//显示LCD像素点Y坐标LCD_ShowString(152,270,0xf800,0xfff0,Y); //显示字符串

if (flag)

{

LineDDA(temp_x,temp_y,lx,ly);

}

flag = 1;

temp_x = lx;

temp_y = ly;

//delayms(10);

}

LCD_CS =1; //关闭片选使能

}

}

/****************************************************************************** **************

DDA称为数值微分画线算法,是直线生成算法中最简单的一种。原理相当简单,就是最直观的根据斜率的

偏移程度,决定是以x为步进方向还是以y为步进方向。然后在相应的步进方向上,步进变量每次增加一个

像素,而另一个相关坐标变量则为Yk_1=Yk+m(以x为步进变量为例,m为斜率)

******************************************************************************* *************/

void LineDDA(int x0,int y0,int x1,int y1)

{

float dy,dx,x,y,m;

dx=x1-x0;

dy=y1-y0;

m=dy/dx;

if(x0

{

if(m<=1&&m>=-1)

{

y=y0;

for(x=x0;x<=x1;x++)

{

Address_set(x,y+0.5,x+1,y+1+0.5);

LCD_Write_DATA(0,255);

y+=m;

}

}

}

if(x0>x1)

{

if(m<=1&&m>=-1)

{

y=y0;

for(x=x0;x>=x1;x--)

{

Address_set(x,y+0.5,x+1,y+1+0.5);

LCD_Write_DATA(0,255);

y-=m;

}

}

}

if(y0

{

if(m>=1||m<=-1)

{

m=1/m;

x=x0;

for(y=y0;y<=y1;y++)

{

Address_set(x+0.5,y,x+1+0.5,y+1);

LCD_Write_DATA(0,255);

x+=m;

}

}

}

if(y0>y1)

{

if(m<=-1||m>=1)

{

m=1/m;

x=x0;

for(y=y0;y>=y1;y--)

{

Address_set(x+0.5,y,x+1+0.5,y+1);

LCD_Write_DATA(0,255);

x-=m;

}

}

}

}

相关文档
相关文档 最新文档