标题:
HC32F460单片机XPT2046触摸程序
[打印本页]
作者:
余金渠
时间:
2022-7-16 21:04
标题:
HC32F460单片机XPT2046触摸程序
中考结束,成绩不错重点高中,更新帖子。这次带来的是触摸的使用我用的是RTrobot 家的2.4寸带触摸屏幕(某一个宝找不到pdd有),MCU是HC32F460kcta。飞点也解决的比较好具体的大家看代码。
单片机xpt2046源程序如下
#include "xpt2046.h"
void XPT2046_init(void)
{
stc_port_init_t stcPortInit;
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcPortInit);
stcPortInit.enPinMode = Pin_Mode_Out;
stcPortInit.enExInt = Enable;
stcPortInit.enPullUp = Enable;
PORT_Init(XPT2046_PIN_PORT ,XPT2046_CS_PIN , &stcPortInit);
stcPortInit.enPinMode = Pin_Mode_In;
PORT_Init(XPT2046_PIN_PORT ,XPT2046_PEN_PIN , &stcPortInit);
PORT_Unlock();
M4_PORT->PSPCR = 0x0Bu;
PORT_Lock();
XPT2046_CS_Set();
}
void send_8way(uint8_t data)
{
while (Reset == SPI_GetFlag(SPI_UNIT, SpiFlagSpiIdle))
{}
SPI_SendData8(SPI_UNIT,data);
while (Reset == SPI_GetFlag(SPI_UNIT,SpiFlagReceiveBufferFull))
{}
SPI_ReceiveData8(SPI_UNIT);
}
uint8_t receiv_8way(void)
{
while (Reset == SPI_GetFlag(SPI_UNIT, SpiFlagSpiIdle))
{}
SPI_SendData8(SPI_UNIT,0x00);
while (Reset == SPI_GetFlag(SPI_UNIT,SpiFlagReceiveBufferFull))
{}
return SPI_ReceiveData8(SPI_UNIT);
}
int cmp(const void *a, const void *b)
{
return *(uint16_t *)a - *(uint16_t *)b; //从小到大排序(b-a则是从大到小)。需要与被测类型一致,否则排序乱七八糟
}
static const uint8_t count = REPEATED_SAMPLING_TIMES; //采集次数
u16 x_data[count], y_data[count];
void XPT2046_Rd_Addata(uint16_t *rxdata,uint16_t *rydata)
{
if(PORT_GetBit(XPT2046_PIN_PORT,XPT2046_PEN_PIN)==Reset)//触摸按下了
{
Ddl_Delay1ms(30);
if(PORT_GetBit(XPT2046_PIN_PORT,XPT2046_PEN_PIN)==Reset)
{
XPT2046_CS_Clr();
SPI_SetClockDiv(SPI_UNIT,SpiClkDiv32);
Ddl_Delay1us(10);
for (uint8_t i = 0; i < count; i++)
{
send_8way(0xd0); //发送命令
Ddl_Delay1us(8);
xdata = receiv_8way();
xdata <<= 8;
xdata |= receiv_8way();
xdata >>= 3;
x_data[i] = xdata & 0xFFF;
send_8way(0x90);
Ddl_Delay1us(8);
ydata = receiv_8way();
ydata <<= 8;
ydata |= receiv_8way();
ydata >>= 3;
y_data[i] = ydata & 0xFFF;
Ddl_Delay1us(200);
}
qsort(x_data, count, sizeof(x_data[0]), cmp); //stdlib.h里的排序函数
qsort(y_data, count, sizeof(y_data[0]), cmp);
*rydata = x_data[count >> 1]; //取中间值,因为是横屏所以XY是反的
*rxdata = y_data[count >> 1];
XPT2046_CS_Set();
}
}
}
void Show_circle(u16 x,u16 y,u16 c)
{
Draw_Circle(x,y,10,c);
LCD_DrawLine(x-10,y,x+10,y,c);
LCD_DrawLine(x,y-10,x,y+10,c);
}
void Touch_Adjust(float32_t *xdata,float32_t *ydata)
{
uint16_t x1_data,y1_data,x2_data,y2_data;
LCD_ShowString(0,200,"Please click on the red dot wait 5s",BLACK,WHITE,16,0);
Show_circle(10,10,RED);
Ddl_Delay1ms(3000);
XPT2046_Rd_Addata(&x1_data,&y1_data);
Ddl_Delay1ms(2000);
LCD_ShowString(0,200,"Please click on the green dot wait 5s",BLACK,WHITE,16,0);
Show_circle(310,230,GREEN);
Ddl_Delay1ms(3000);
XPT2046_Rd_Addata(&x2_data,&y2_data);
Ddl_Delay1ms(2000);
*xdata = (float32_t)(x2_data-x1_data)/(300);
*ydata = (float32_t)(y1_data-y2_data)/(220);
LCD_Fill(0,0,320,240,WHITE);
LCD_ShowString(0,200,"You are good",BLACK,WHITE,16,0);
}
void XPT2046_getPoint(u16 *x, u16 *y)
{
uint16_t xdata=0,ydata=0;
XPT2046_Rd_Addata(&xdata,&ydata);
*x = (u16)xdata/11.1633329-15;//由于扫描方式的不同这里的参数需要根据实际修改.
*y = (u16)ydata/-15.4863634+255;
}
复制代码
main
#include "hc32_ddl.h"
#include "Kthermocouple.h"
#include "userADC.h"
#include "userUSART.h"
#include "userSPI.h"
#include "userPWM.h"
#include "ev_hc32f460_lqfp100_v2.h"
#include "rtthread.h"
#include "lcd.h"
#include "xpt2046.h"
static void touch_thread_init(void);
static struct rt_thread touch_thread;
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t rt_touch_thread_stack[1024];
static void touch_thread_entry(void * para);
static rt_uint8_t touch_thread_priority = 6;
/**
*******************************************************************************
** \brief Main function of template project
**
** \param None
**
** \retval int32_t return value, if needed
**
******************************************************************************/
int32_t main(void)
{
SPI1_Init();
XPT2046_init();
LCD_Init();
LCD_Fill(0,0,320,240,WHITE);
Ddl_Delay1ms(1000);
touch_thread_init();
}
static void touch_thread_init(void)
{
rt_thread_init(&touch_thread,
"touch_thread",
touch_thread_entry,
RT_NULL,
&rt_touch_thread_stack,
sizeof(rt_touch_thread_stack),
touch_thread_priority,
20);//时间 20ms
rt_thread_startup(&touch_thread);
}
static void touch_thread_entry(void * para)
{
u16 tx=0,ty=0;
DDL_Printf("touch_thread_runing. \r\n");
while(1)
{
if(PORT_GetBit(XPT2046_PIN_PORT,XPT2046_PEN_PIN)==Reset)
{
XPT2046_getPoint(&tx,&ty);
LCD_Fill(tx-2,ty-2,tx+2,ty+2,RED);
}
}
}
复制代码
Keil代码下载:
HC32F460TOUCH工程.7z
(2.8 MB, 下载次数: 33)
2022-7-17 14:53 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1