📄 touch_screen.c
字号:
/**************************************************************
Touch Screen control
**************************************************************/
#include "def.h"
#include "option.h"
#include "2410addr.h"
#include "2410lib.h"
#include "uart.h"
#include "interrupt.h"
#include "2410lib.h"
#include "touch_screen.h"
#include "240_320TFT_LCD.h"
#include "text.h"
#include "pwm_timer.h"
#define ST_IDENTIFY_BLANK 60
volatile static U32 ts_state;
volatile static int ts_lefttop_x;
volatile static int ts_lefttop_y;
volatile static int ts_righttop_x;
volatile static int ts_righttop_y;
volatile static int ts_leftbuttom_x;
volatile static int ts_leftbuttom_y;
volatile static int ts_rightbuttom_x;
volatile static int ts_rightbuttom_y;
volatile int xdata_lcd_width = -759;
volatile int ydata_lcd_heigth = -775;
volatile int xdata_at_first_block_middle = 509;
volatile int ydata_at_first_block_middle = 532;
volatile U8 stylus = STYLUS_UP ;
//*************************************************************
/**************************************************************
The interrupt function for Touch Screen
**************************************************************/
void __irq Touch_Screen(void)
{
int i;
int Ptx[6];
int Pty[6];
int ts_lcd_x;
int ts_lcd_y;
lcd_window_start_point lcd_window_start_point0;
rINTSUBMSK |= (BIT_SUB_ADC|BIT_SUB_TC); // Mask sub interrupt (ADC and TC)
// TC(Touch screen Control) Interrupt
if(rADCTSC & 0x100) //用到了rADCTSC保留的第八位。下面按下时下面中断程序将其设为一。
{
rADCTSC &= 0xff; // Set stylus down interrupt
// Uart_Printf("stylus up.......\n");
stylus = STYLUS_UP;
if(ts_state==TS_START) {
Text_Show_OnePage(0x001f);
}
}
else
{
stylus = STYLUS_DOWN;
// Uart_Printf("stylus down.......\n");
// <X-Position Read>
rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|(1);
// Down,Hi-Z,AIN5,GND,Ext vlt,Pullup Dis,Normal,X-position
for(i=0;i<LOOP;i++); //delay to set up the next channel
for(i=0;i<5;i++)
{
rADCCON|=0x1; // Start X-position conversion
while(rADCCON & 0x1); // Check if Enable_start is low
while(!(0x8000&rADCCON)); // Check ECFLG
Ptx[i]=(0x3ff&rADCDAT0);
}
Ptx[5]=(Ptx[0]+Ptx[1]+Ptx[2]+Ptx[3]+Ptx[4])/5;
// <Y-Position Read>
rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|(2);
// Down,GND,Ext vlt,Hi-Z,AIN7,Pullup Dis,Normal,Y-position
for(i=0;i<LOOP;i++); //delay to set up the next channel
for(i=0;i<5;i++)
{
rADCCON|=0x1; // Start X-position conversion
while(rADCCON & 0x1); // Check if Enable_start is low
while(!(0x8000&rADCCON)); // Check ECFLG
Pty[i]=(0x3ff&rADCDAT1);
}
Pty[5]=(Pty[0]+Pty[1]+Pty[2]+Pty[3]+Pty[4])/5;
rADCTSC=(1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
// Up,GND,AIN,Hi-z,AIN,Pullup En,Normal,Waiting mode
if(ts_state==TS_FIRST){
Lcd_ClearScr(0);
Uart_Printf("[1].Touch the LEFT TOP cross,please.......\n");
LCD_Puts(16*2,16*5,"1.请触摸屏幕的左上点",0xffff);
Lcd_Cross(LCD_CROSS_SIZE,LCD_CROSS_SIZE,0xffff);
ts_state=TS_JUTSTIFY_LEFTTOP;
}
else if(ts_state==TS_JUTSTIFY_LEFTTOP) {
ts_state=TS_JUTSTIFY_RIGHTTOP;
ts_lefttop_x = Ptx[5];
ts_lefttop_y = Pty[5];
Lcd_Cross(SCR_XSIZE_TFT_240_320/2-LCD_CROSS_SIZE-1,LCD_CROSS_SIZE,0xffff);
Uart_Printf("[2].Touch the RIGHT TOP cross,please.......\n");
LCD_Puts(16*2,16*7,"2.请触摸屏幕的右上点",0xffff);
Beep(50000000 ,400, 100);
}
else if(ts_state==TS_JUTSTIFY_RIGHTTOP) {
ts_righttop_x = Ptx[5];
ts_righttop_y = Pty[5];
if(abs(ts_righttop_x -ts_lefttop_x)<ST_IDENTIFY_BLANK && abs(ts_righttop_y -ts_lefttop_y)<ST_IDENTIFY_BLANK)
{ Beep(50000000 ,50, 100); return; }
Lcd_Cross(SCR_XSIZE_TFT_240_320/2-LCD_CROSS_SIZE-1,SCR_YSIZE_TFT_240_320/2-LCD_CROSS_SIZE-1,0xffff);
Uart_Printf("[3].Touch the RIGHT BOUTTOM cross,please.......\n");
LCD_Puts(16*2,16*9,"3.请触摸屏幕的右下点",0xffff);
ts_state=TS_JUTSTIFY_RIGHTBUTTOM;
Beep(50000000 ,400, 100);
}
else if(ts_state==TS_JUTSTIFY_RIGHTBUTTOM) {
ts_rightbuttom_x = Ptx[5];
ts_rightbuttom_y = Pty[5];
if(abs(ts_righttop_x -ts_rightbuttom_x)<ST_IDENTIFY_BLANK && abs(ts_righttop_y -ts_rightbuttom_y)<ST_IDENTIFY_BLANK)
{ Beep(50000000 ,50, 100); return; }
Lcd_Cross(LCD_CROSS_SIZE,SCR_YSIZE_TFT_240_320/2-LCD_CROSS_SIZE-1,0xffff);
Uart_Printf("[4].Touch the LEFT BOUTTOM cross,please.......\n");
LCD_Puts(16*2,16*11,"4.请触摸屏幕的左下点",0xffff);
ts_state=TS_JUTSTIFY_LEFTBUTTOM;
Beep(50000000 ,400, 100);
}
else if(ts_state==TS_JUTSTIFY_LEFTBUTTOM) {
ts_leftbuttom_x = Ptx[5];
ts_leftbuttom_y = Pty[5];
if(abs(ts_leftbuttom_x -ts_rightbuttom_x)<ST_IDENTIFY_BLANK && abs(ts_leftbuttom_y -ts_rightbuttom_y)<ST_IDENTIFY_BLANK)
{ Beep(50000000 ,50, 100); return; }
Uart_Printf("[5].Touch the CENTER cross,please.......\n");
LCD_Puts(16*2,16*13,"5.完成校正,点击继续",0xffff);
ts_state=TS_JUTSTIFY_MIDDLE;
Beep(50000000 ,400, 100);
}
else if(ts_state==TS_JUTSTIFY_MIDDLE) {
ts_state=TS_START;
Uart_Printf("[6].Touch screen has been justified !!!\n");
xdata_lcd_width = (ts_righttop_x - ts_lefttop_x + ts_rightbuttom_x -ts_leftbuttom_x)/2;
ydata_lcd_heigth = (ts_rightbuttom_y - ts_righttop_y +ts_leftbuttom_y - ts_lefttop_y)/2;
xdata_at_first_block_middle = (ts_righttop_x + ts_lefttop_x + ts_rightbuttom_x + ts_leftbuttom_x)/4;
ydata_at_first_block_middle = (ts_righttop_y + ts_lefttop_y + ts_rightbuttom_y + ts_leftbuttom_y)/4;
Uart_Printf(" xdata_lcd_width=%d ydata_lcd_heigth=%d\n",xdata_lcd_width,ydata_lcd_heigth);
Uart_Printf(" xdata_at_first_block_middle=%d ydata_at_first_block_middle=%d\n",xdata_at_first_block_middle,ydata_at_first_block_middle);
}
else if(ts_state==TS_START){
ts_lcd_x = ((Ptx[5] - xdata_at_first_block_middle)*(LCD_XSIZE_TFT_240_320 -2*LCD_CROSS_SIZE))*1.0/xdata_lcd_width + LCD_XSIZE_TFT_240_320/2;
ts_lcd_y = ((Pty[5] - ydata_at_first_block_middle)*(LCD_YSIZE_TFT_240_320 -2*LCD_CROSS_SIZE))*1.0/ydata_lcd_heigth + LCD_YSIZE_TFT_240_320/2;
if(ts_lcd_x >239 ) ts_lcd_x = 239;
if(ts_lcd_x <0 ) ts_lcd_x = 0;
if(ts_lcd_y >319 ) ts_lcd_y = 319;
if(ts_lcd_y <0 ) ts_lcd_y = 0;
lcd_window_start_point0=Get_LcdViewPort_StartPoint();
ts_lcd_x += lcd_window_start_point0.X ;
ts_lcd_y += lcd_window_start_point0.Y ;
LCD_String_Set(0,0,0xf800);
LCD_Printf(" 坐标:(%3d,%3d)",ts_lcd_x,ts_lcd_y);
// Uart_Printf("LCD position at (%3d , %3d)\n",ts_lcd_x,ts_lcd_y);
// Glib_FilledRectangle(ts_lcd_x,ts_lcd_y,ts_lcd_x+1,ts_lcd_y+1 ,0x0);
}
}
rSUBSRCPND |= BIT_SUB_TC;
rINTSUBMSK =~ (BIT_SUB_TC); // Unmask sub interrupt (TC)
ClearPending(BIT_ADC);
}
/**************************************************************
The Initial of Touch Screen
**************************************************************/
void Touch_Screen_Init(void)
{
Uart_Printf("[Touch Screen Test.]\n");
Uart_Printf("Separate X/Y position conversion mode test\n");
rADCDLY = (0x7fff); // ADC Start or Interval Delay
rADCCON = (1<<14)|(ADCPRS<<6)|(0<<3)|(0<<2)|(0<<1)|(0);
// Enable Prescaler,Prescaler,AIN7/5 fix,Normal,Disable read start,No operation
rADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
// Down,YM:GND,YP:AIN5,XM:Hi-z,XP:EXTENAL,XP pullup En,Normal,Waiting for interrupt mode
// 2410 427页上设置。为等待中断状态 xp : pull up and external V; xm : Hi-z ; YP :AIN[5] ; YM :GND
// 相当于 X导电片X+ X-都为高电平(xp : pull up and external;xm : Hi-z)
// 而Y-接地 ,Y+接ain[5],Y-、Y+为同一导电片,则Y+也为低电平,那么当接触时,Y+由低变高,
// 产生中断。
pISR_ADC = (unsigned)Touch_Screen;
EnableIrq(BIT_ADC);
EnableSubIrq(BIT_SUB_TC);
// ts_state=TS_FIRST;
ts_state=TS_START;
xdata_lcd_width = -759;
ydata_lcd_heigth = -775;
xdata_at_first_block_middle = 509;
ydata_at_first_block_middle = 532;
Lcd_ClearScr(0);
Lcd_MoveViewPort(0,0);
if(ts_state==TS_FIRST){
Glib_Rectangle(0,0,SCR_XSIZE_TFT_240_320/2-1,SCR_YSIZE_TFT_240_320/2-1,0x001f);
Uart_Printf("\nTouch the touch_sreen to begin touch_sreen justify !! .......\n");
LCD_Puts(16*3,16*9,"请触摸屏幕的任意点",0xffff);
while(1) {
if(ts_state==TS_START) break;
}
}
}
//*************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -