📄 tchscr.c
字号:
#include "../inc/drivers.h"
#include "../inc/sys/lib.h"
#include <includes.h>
#include "../ucos-ii/add/osaddition.h"
#include "../src/miniGUI/uhal/ucos2input.h"
#include <stdio.h>
//#define DPRINTF printf
#define DPRINTF(...) //printfNULL
#if OS_Touch_Screen_Task==1
#define IRQ_ADS7843 IRQ_EINT5 //IRQ_EINT5
#define ADS7843_PIN_PEN (GPIO_MODE_IN | GPIO_PULLUP_EN | GPIO_F5)
#define TS_OPEN_INT() set_external_irq(IRQ_ADS7843, EXT_LOWLEVEL, GPIO_PULLUP_EN)
#define TS_CLOSE_INT() set_gpio_ctrl(ADS7843_PIN_PEN)
#define ADS7843_PIN_CS (GPIO_MODE_OUT | GPIO_PULLUP_DIS | GPIO_G12)
#define ADS7843_CTRL_START 0x80
#define ADS7843_GET_X 0x50
#define ADS7843_GET_Y 0x10
#define ADS7843_CTRL_12MODE 0x0
#define ADS7843_CTRL_8MODE 0x8
#define ADS7843_CTRL_SER 0x4
#define ADS7843_CTRL_DFR 0x0
#define ADS7843_CTRL_DISPWD 0x3 // Disable power down
#define ADS7843_CTRL_ENPWD 0x0 // enable power down
#define ADS7843_CMD_X (ADS7843_CTRL_START|ADS7843_GET_X|ADS7843_CTRL_12MODE|ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)
#define ADS7843_CMD_Y (ADS7843_CTRL_START|ADS7843_GET_Y|ADS7843_CTRL_12MODE|ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)
static OS_EVENT* pTouchBeginSem=NULL;
static int penStatus=TCHSCR_ACTION_NULL;
//打开下面的坐标
//static int TchScr_Xmax=820,TchScr_Xmin=82, TchScr_Ymax=926,TchScr_Ymin=97;
// static int TchScr_Xmax=830,TchScr_Xmin=135, TchScr_Ymax=921,TchScr_Ymin=102;
static int TchScr_Xmax=874,TchScr_Xmin=61, TchScr_Ymax=923,TchScr_Ymin=85; //修正采样值后的数据
//extern U32 ConfigSysdata[];
//extern U8 isConfigsysLoad;
#define TCHSCR_PenDown() (!read_gpio_bit(ADS7843_PIN_PEN))
#define enable_7843() write_gpio_bit(ADS7843_PIN_CS, 0)
#define disable_7843() write_gpio_bit(ADS7843_PIN_CS, 1)
#define ADS7843_SPI_CHANNEL 0
__inline static void set7843toIRQmode(void)
{
enable_7843();
SPISend(ADS7843_CMD_X, ADS7843_SPI_CHANNEL);
SPIRecv(ADS7843_SPI_CHANNEL);
SPIRecv(ADS7843_SPI_CHANNEL);
disable_7843();
}
static void TchScr_init()
{
set_gpio_ctrl(ADS7843_PIN_CS);
write_gpio_bit(ADS7843_PIN_CS, 1);
SPI_initIO(ADS7843_SPI_CHANNEL);
Set_SIO_mode(ADS7843_SPI_CHANNEL, SPCON_SMOD_POLL |
SPCON_ENSCK | SPCON_MSTR |SPCON_CPOL_HIGH |
SPCON_CPHA_FMTA, 33, 2, NULL, NULL, NULL);
set7843toIRQmode();
}
#define CLOCK_DELAY() do{int i; for(i=0; i<10; i++);}while(0)
void TchScr_GetScrXY(int *x, int *y)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
unsigned int temp;
OS_ENTER_CRITICAL();
enable_7843();
SPISend (ADS7843_CMD_X, ADS7843_SPI_CHANNEL);
temp=SendReadData(0, ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n1x=%d",temp>>2);
//*x=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n2x=%d",temp>>2);
//*x+=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);//后加
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n2x=%d",temp>>2);
*x=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);//后加
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n2x=%d",temp>>2);
*x+=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);//后加
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n2x=%d",temp>>2);
*x+=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n3x=%d",temp>>2);
*x+=temp;
temp=SendReadData(0,ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n4x=%d",temp>>2);
//*x+=temp;
*x>>=4; //x=x/4/4; change to 10bit
temp=SendReadData(0, ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n1y=%d",temp>>2);
//*y=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n2y=%d",temp>>2);
//*y+=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);//后加
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n2y=%d",temp>>2);
*y=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);//后加
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n2y=%d",temp>>2);
*y+=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);//后加
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n2y=%d",temp>>2);
*y+=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n3y=%d",temp>>2);
*y+=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(0, ADS7843_SPI_CHANNEL)>>3);
//Uart_Printf(0,"\n4y=%d",temp>>2);
//*y+=temp;
*y>>=4; //y=y/4/4;
*x=(*x-TchScr_Xmin)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin);
*y=(TchScr_Ymax-*y)*LCDHEIGHT/(TchScr_Ymax-TchScr_Ymin);
disable_7843();
OS_EXIT_CRITICAL();
#if 0
{
calibrate_POINT dsppt, tchppt;
tchppt.x=*x;
tchppt.y=*y;
getDisplayPoint(&dsppt, &tchppt, &system_param.calibrate_matrix);
*x=dsppt.x;
*y=dsppt.y;
//*x=(*x-TchScr_Xmin)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin);
//*y=(*y-TchScr_Ymin)*LCDHEIGHT/(TchScr_Ymax-TchScr_Ymin);
}
#endif
}
static void Touch_Screen_ISR(int vector, void* data)
{
DPRINTF("Touch screen Interrupt\n");
TS_CLOSE_INT();
penStatus=TCHSCR_ACTION_DOWN;
OSSemPost(pTouchBeginSem);
}
extern OS_FLAG_GRP *Input_Flag;
tsdata tchscr_data;
#if USE_MINIGUI==1
#define SendTS(TchScrAction) do\
{ tchscr_data.action = TchScrAction; \
OSFlagPost(Input_Flag, UCOS2_MOUSEINPUT, OS_FLAG_SET, &err); \
}while(0)
#else
#define SendTS(TchScrAction) do{\
POSMSG pmsg=OSCreateMessage(NULL, OSM_TOUCH_SCREEN,(tchscr_data.y<<16)|(tchscr_data.x&0xffff), TchScrAction);\
SendMessage(pmsg); }while(0)
#endif
void Touch_Screen_Task(void *Id) //触摸屏任务
{
INT8U err,sta=0;
int i;
TchScr_init();
printk("begin TouchScreen Task\n");
pTouchBeginSem=OSSemCreate(0);
//设置触摸屏中断处理函数
TS_OPEN_INT();
SetISR_Interrupt(IRQ_ADS7843, Touch_Screen_ISR, NULL);
for(;;){
OSSemPend(pTouchBeginSem, 0, &err); //wait for Touch Screen Pen down
OSTimeDly(10);
for(;;){
if (TCHSCR_PenDown()){ //有触摸笔按下
TchScr_GetScrXY(&(tchscr_data.x), &(tchscr_data.y));
/*SendTS(penStatus);
penStatus=TCHSCR_ACTION_MOVE;*/
switch(sta)
{case 0: sta=1;break;
case 1: sta=3;
penStatus=TCHSCR_ACTION_DOWN;//连续两次检测到按下则认为DOWN
SendTS(penStatus);
break;
case 3: penStatus=TCHSCR_ACTION_MOVE;//连续三次检测到按下则认为MOVE
SendTS(penStatus);
break;
default : sta=0;break;
}
}
else{
// if(penStatus==TCHSCR_ACTION_DOWN)
// SendTS(TCHSCR_ACTION_CLICK);
/*if(penStatus!=TCHSCR_ACTION_DOWN && penStatus!=TCHSCR_ACTION_MOVE){
break;
}
penStatus=TCHSCR_ACTION_UP;
SendTS(penStatus);
TS_OPEN_INT();
break;*/
switch(sta)
{case 1: sta=0; // 如果释放前置检测到1次按下,开始分析单双击动作
for(i=0;i<7;i++)
{OSTimeDly(10);
if(TCHSCR_PenDown()) //在规定时间内又检测到按下则认为是双击
{TchScr_GetScrXY(&(tchscr_data.x), &(tchscr_data.y));
penStatus=TCHSCR_ACTION_DBCLICK;
SendTS(penStatus);
OSTimeDly(60);
break;
}
}
if(i==7) { //在规定时间内没有检测到新的按下动作认为是单击
penStatus=TCHSCR_ACTION_CLICK;
SendTS(penStatus);}
break;
case 3: sta=0; //在释放前检测到2次以上的按下动作认为是UP
penStatus=TCHSCR_ACTION_UP;
SendTS(penStatus);
break;
default: sta=0;break;
}
TS_OPEN_INT(); //打开触摸屏中断并退出查询状态
break;
}
OSTimeDly(100);
}
}
}
#endif //OS_Touch_Screen_Task==1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -