stm32 觸控螢幕 XPT2046

2021-08-07 07:53:48 字數 3403 閱讀 5110

引腳功能描述

控制字的控制位命令

控制位元組各位描述

單端模式輸入配置

差分模式輸入配置

時序

前8個時鐘用來通過din引腳輸入控制位元組,接著的12個時鐘週期將完成真正的模數轉換,剩下的3個多時鐘週期將用來完成被轉換器忽略的最後位元組(dout置低)

舉例

#define touch_read_times    40 //讀取次數

#define touch_err_range 20 //誤差範圍

#define touch_x_cmd 0xd0 //讀取x軸

#define touch_y_cmd 0x90 //讀取y軸

#define touch_continue_read 0xff

#define touch_x_max 4000 //x最大值

#define touch_x_min 100 //x最小值

#define touch_y_max 4000 //y最大值

#define touch_y_min 100 //x最小值

#define lcd_calx_min (10) //校準點最小值x

#define lcd_calx_max (tftlcd_data.width - lcd_calx_min) //校準點最大值x

#define lcd_caly_min (10) //校準點最小值y

#define lcd_caly_max (tftlcd_data.height - lcd_caly_min) //校準點最大值y

#define lcd_cal_x (lcd_calx_max - lcd_calx_min) //方框的寬度

#define lcd_cal_y (lcd_caly_max - lcd_caly_min) //方框的高度

#define touch_cal_ok 'y' //校準ok標誌

#define touch_cal_addr 200 //校準引數在at24c02的儲存位址

typedef

struct

calibrate_t;

calibrate_t calibrate = ;

u16 touchx;

u16 touchy;

void touch_init()

; gpio_inittypedef gpiod6 =

;gpio_inittypedef gpiod7 =

;spi_inittypedef spi =

;rcc_apb2periphclockcmd(rcc_apb2periph_spi1 | rcc_apb2periph_gpioa | rcc_apb2periph_gpiod, enable);

gpio_init(gpioa, &gpioa);

gpio_init(gpiod, &gpiod6);

gpio_init(gpiod, &gpiod7);

spi_init(spi1, &spi); //初始化spi

spi_cmd(spi1, enable); //使能spi

}u16 touch_read(u16 cmd)

; u32 total_value = 0;

spi1_setspeed(spi_baudrateprescaler_32); //設定spi速度

for(i = 0; i < touch_read_times; i++) //讀取次數

for (i = 0; i < touch_read_times; i++) //排序}}

for (i = 1; i < touch_read_times - 1; i++) //去掉乙個最大值,乙個最小值

total_value /= (touch_read_times - 2); //求平均值

return total_value;

}u8 touch_readxy(u16 *x, u16 *y)

*x = (valuex1 + valuex2) / 2;

*y = (valuey1 + valuey2) / 2;

if((*x < touch_x_min || *x > touch_x_max) || //判斷邊界範圍

(*y < touch_y_min || *y > touch_y_max))

return0;}

void touch_start_calibrate(u16 x, u16 y, u16 *valuex,u16 *valuey) //開始校準}}

}void touch_calibrate()

u8 touch_scan() //檢視是否觸控

//根據物理座標,計算彩屏座標

touchx = valuex * calibrate.xfactor + calibrate.xoffset;

touchy = valuey * calibrate.yfactor + calibrate.yoffset;

if((touchx > tftlcd_data.width) || (touchy > tftlcd_data.height))

return0;}

int main(void)

lcd_showstring(tftlcd_data.width-40,0,tftlcd_data.width,tftlcd_data.height,16,"clear");

while(1)}}

}

arduion 下stm32 觸控螢幕

觸控螢幕我的是電阻屏,基本上也可以直接拷stm32的原 稍做修改即可 主要完成spi的初始化,u8 read once void 函式,讀取資料即可 void spi1 init 讀取一次x,y值 讀到的x,y座標值必須都大於100 成功返回1,不成功返回0 讀數限制在100 4000之間.u8 r...

STM32 電容觸控螢幕I2C轉USB實現

最近有個需求要把乙個電容式觸控螢幕轉為標準usb hid tp裝置,同時需要把tp資料通過串列埠輸出到mcu。市面方案大多採用ch554e做i2c usb轉換,沒有多餘的uart口。問了幾家 商都說做不了,只好自己搞了。然後跟 商要到介面文件和初始化暫存器配置 配置configdescriptor ...

嵌入式系統學習 STM32之電容型觸控螢幕

觸控螢幕 touch screen 又稱為 觸控螢幕 觸控面板 是一種可接收觸頭等輸入訊號的感應式裝置。作為一種新型的電腦輸入裝置,可以用來取代傳統的機械按鍵等輸入裝置。它是目前最簡單 方便 自然的一種人機互動方式。主要應用於公共資訊的查詢 領導辦公 工業控制 軍事指揮 電子遊戲 點歌點菜 多 教學...