/*********************************************************************
* *
* 触摸画线实验程序*
* (普中科技)*
* *
* 实验目的: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; } } } }