1、讓懸掛物體走直線。
2、讓懸掛物體畫圓。
3、在TFT屏上設定座標並讓懸掛物從原點走到該座標。
4、在TFT屏上觸摸一點顯示出該點座標並使懸掛物從原點運動到該座標。
http://blog.csdn.net/a18716374124/article/details/10372529
for(i=1; i<100; i++)//第一象限
{
now_x1 = x0 + Circle_rx*i;
now_y1 = sqrt( r*r - (Circle_rx*i)*(Circle_rx*i) ) + y0;
Draw_Line( now_x0, now_y0, now_x1, now_y1);
Delay_ms(30);
now_x0 = now_x1;
now_y0 = now_y1;
x =
y =
}
其中now_x0 、
在然後就是設定座標,調用STM32開發板光碟片
之後就是第四個,觸屏點的實現,使用TFT屏上面內建的AD
//實現功能:ADS7843啟動
*****************************************************************************/
void start_7843(void)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_8); //TPCLK置低
GPIO_SetBits(GPIOC, GPIO_Pin_9); //TPCS置高
GPIO_SetBits(GPIOA, GPIO_Pin_8); //TPDI置高
GPIO_SetBits(GPIOC, GPIO_Pin_8); //TPCLK置高
GPIO_ResetBits(GPIOC, GPIO_Pin_9); //TPCS置低
}
/*****************************************************************************
//實現功能:寫8位命令到觸摸控制IC
//輸入參數: temp 需要寫入的8位控制命令
*****************************************************************************/
void Write_7843(uchar temp) //SPI寫8位命令到觸摸控制IC
{
uchar i=0;
for(i=0;i<8;i++) //迴圈8次寫入一位元組
{
if(temp&0x80)
GPIO_SetBits(GPIOA, GPIO_Pin_8); //TPDI置高
else
GPIO_ResetBits(GPIOA, GPIO_Pin_8); //判斷最高位是否為1,為1則向資料位元寫1
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
delay(1); //送一個脈衝,上升沿有效,將DIN位元據送入到IC
GPIO_SetBits(GPIOC, GPIO_Pin_8);
delay(1);
temp<<=1; //待寫資料左移1位,準備好寫下一位元據
}
}
/*****************************************************************************
//實現功能:從觸摸控制IC讀8位元據到控制器
//返回參數: temp 需要寫入的8位控制命令
*****************************************************************************/
uint Read_7843(void) //SPI 讀資料
{
uchar i=0;
uint temp=0;
for(i=0;i<12;i++) //迴圈12次讀取12位結果
{
temp<<=1; //temp左移一位,準備讀取下一位
GPIO_SetBits(GPIOC, GPIO_Pin_8);
delay(1); //下降沿有效
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
delay(1);
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11))
temp++; //判斷控制IC送出的一位元據是否為1,如果為1,賦給temp的最低位
}
return(temp); //返回結果
}
/*****************************************************************************
//實現功能:讀取觸摸點X軸和Y軸電壓值
//返回參數:pix 讀取到的觸摸點電壓值
*****************************************************************************/
struct struct1 AD7843()
{
struct struct1 pix;
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
Write_7843(0x90); //送控制字 10010000 即用差分方式讀X座標,詳細請見有關資料
GPIO_SetBits(GPIOC, GPIO_Pin_8);
delay(1);
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
delay(1);
pix.y=Read_7843();
Write_7843(0xD0); //送控制字 11010000 即用差分方式讀Y座標 詳細請見有關資料
GPIO_SetBits(GPIOC, GPIO_Pin_8);
delay(1);
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
delay(1);
pix.x=Read_7843();
GPIO_SetBits(GPIOC, GPIO_Pin_9);
return pix;
}
/*****************************************************************************
//實現功能:軟體濾波,濾掉波動過大的採樣點
//返回參數:flag 採集資料是否有效標誌,flag=1;則資料有效
*****************************************************************************/
uchar pix_filter(struct struct1 pix1,struct struct1 pix2)
{
uchar flag=0;
int x=pix1.x>pix2.x?pix1.x-pix2.x:pix2.x-pix1.x; //X軸兩次採樣絕對值
int y=pix1.y>pix2.y?pix1.y-pix2.y:pix2.y-pix1.y; //Y軸兩次採樣絕對值
if(x<10&&y<10) //軟體濾波,2次取樣的值相差太大的視為雜訊
{
flag=1;
coordinate.x=(pix1.x+pix2.x)/2; //求兩次採樣平均值
coordinate.y=(pix1.y+pix2.y)/2;
}
return flag;
}
/*****************************************************************************
//實現功能:讀取採集結果,兩次取均值
*****************************************************************************/
uchar Getpix(void) //取採樣值,此處使用軟體濾波,2次取樣的值相差太大的視為雜訊
{
uchar flag=0;
struct struct1 pix1;
struct struct1 pix2;
if (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12)==0)
{
pix1=AD7843();
pix2=AD7843();
if(pix_filter(pix1,pix2)==1) //得到當前TP的取樣值,此處使用軟體濾波,2次取樣的值相差太大的視為雜訊
{
if((coordinate.x>Xmin)&&(coordinate.y>Ymin))
{
lx=(uint)(240.0*(coordinate.x-Xmin)/(Xmax-Xmin)); //座標轉換,即根據採樣值計算實際座標值
ly=(uint)(320.0*(coordinate.y-Ymin)/(Ymax-Ymin)); //Xmin、max和Ymin、Ymax分別是觸控螢幕橫縱座標的最小/最大值
flag=1;
}
}
}
return flag;
}