⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tchscr.c

📁 u-us/os2系统
💻 C
字号:
#include "../inc/drivers.h"
#include "../inc/bitfield.h"
#include "ucos-ii/ucos_ii.h"
#include "ucos-ii/includes.h"
#include "lib.h"
#include "gpio.h"
#include "inc/spi.h"
#include "inc/sys/tchScr.h"
#include <stdio.h>

#define DPRINTF(...)		//printfNULL

#define ADS7843_PIN_PEN		(GPIO_MODE_IN | GPIO_PULLUP_EN | GPIO_F5)
#define GPFDAT (*(volatile unsigned *)0x56000054)
#define TCHSCR_IsPenNotDown		(GPFDAT&(1<<5))
#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)

#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
#define GPFCON (*(volatile unsigned *)0x56000050)
#define GPFUP (*(volatile unsigned *)0x56000058)

#define LCDWIDTH 640
#define LCDHEIGHT 480

int TchScr_Xmin=114,TchScr_Xmax=850,
    TchScr_Ymin=136,TchScr_Ymax=909; 
    
OS_EVENT *pevent;   
 
 void irq_TCHSCR(void);
//void TchScr_GetScrXY(int *x, int *y,int lable);
 
__inline static void set7843toIRQmode(void)
{
	enable_7843();
	SPISend(ADS7843_CMD_X, ADS7843_SPI_CHANNEL);
	SPIRecv(ADS7843_SPI_CHANNEL);
	SPIRecv(ADS7843_SPI_CHANNEL);
	disable_7843();
}

 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_INT | 
		SPCON_ENSCK | SPCON_MSTR |SPCON_CPOL_HIGH | 
		SPCON_CPHA_FMTA, 33, 2, NULL, NULL, NULL);
	GPFCON=0xfbff;
	GPFUP=GPFUP&0xdf;	
	
	
    SetISR_Interrupt(IRQ_EINT5,(Interrupt_func_t)irq_TCHSCR, (void *)0);
}

 void TchScr_init1()
{
	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);
	GPFCON=0xf3ff;
	GPFUP=GPFUP&0xdf;	
	
	
}
   
#define CLOCK_DELAY()		do{int i; for(i=0; i<10; i++);}while(0)


void TchScr_GetScrXY(int *x,int *y)
{
	unsigned int temp;

	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);
	*x=temp;

	temp=SendReadData(0, ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL) >>3);
	*x+=temp;

	temp=SendReadData(0, ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
	*x+=temp;

	temp=SendReadData(0,ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
	*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);
	*y=temp;

	temp=SendReadData(0, ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL) >>3);
	*y+=temp;
	
	temp=SendReadData(0, ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL) >>3);
	*y+=temp;

	temp=SendReadData(0, ADS7843_SPI_CHANNEL);
	temp<<=5;
	temp|= (SendReadData(0, ADS7843_SPI_CHANNEL)>>3);
	*y+=temp;
	*y>>=4;		//y=y/4/4;
	
	
     
	disable_7843();
	//return 0;
}


U32 TchScr_GetOSXY(int *x, int *y,int lable)
{//获得触摸点坐标并返回触摸动作
	static U32 mode=0;
	static int oldx,oldy;
	
	int i,j;
	
	
	for(;;){
	if((mode!=TCHSCR_ACTION_DOWN) && (mode!=TCHSCR_ACTION_MOVE)){
			if(!TCHSCR_IsPenNotDown){//有触摸动作
				TchScr_GetScrXY(x, y);//得到触摸点坐标
				for(i=0;i<40;i++){
					if(TCHSCR_IsPenNotDown)//抬起
						break;
					//Delay(100);
					hudelay(20);
				}
				if(i<40){	//在规定的双击时间之内抬起,检测是不是及时按下
					for(i=0;i<60;i++){
						if(!TCHSCR_IsPenNotDown){
                            if (i<10) {i=60;break;}//如果单击后很短时间内按下,不视为双击
                                
							mode=TCHSCR_ACTION_DBCLICK;
							for(j=0;j<40;j++) hudelay(50);//检测到双击后延时,防止拖尾
                            break;
						}
					hudelay(20);	
                   // Delay(100);
					}
					if(i==60)		//没有在规定的时间内按下
						mode=TCHSCR_ACTION_CLICK;
				}
				else{	//没有在规定的时间内抬起
					mode=TCHSCR_ACTION_DOWN;
				}
			  	
              break;
			}
		}
		else{
			if(TCHSCR_IsPenNotDown){	//抬起
				mode=TCHSCR_ACTION_UP;
				*x=oldx;
				*y=oldy;
				return mode;
			}
			else{
				TchScr_GetScrXY(x, y);
				if(ABS(oldx-*x)>25 ||ABS( oldy-*y)>25){//有移动动作
					mode=TCHSCR_ACTION_MOVE;
					break;
				}
			}
		}
		//Delay(50);
		hudelay(10);
	}
    oldx=*x;
	oldy=*y;
	
	if(lable)
	{
	 *x=(*x-TchScr_Xmin)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin);
     *y=(*y-TchScr_Ymin)*LCDHEIGHT/(TchScr_Ymax-TchScr_Ymin);	
     }
	return mode;
}

void TchScr_Clibrate()
{
	U32 mode;
	int x,y;
	
	Uart_Printf(0,"please touch the screen\n");
   
    drawline(0,10,20,1,0xf818);  //左上角。
	drawline(10,0,20,0,0xf818);
    drawline(0,470,20,1,0xf818);  //坐下角
	drawline(10,460,20,0,0xf818);
	drawline(620,470,20,1,0xf818);  //右下角
	drawline(630,460,20,0,0xf818);
	drawline(620,10,20,1,0xf818); //右上角
	drawline(630,0,20,0,0xf818);
	
	for(;;){
		mode=TchScr_GetOSXY(&x, &y,0);   //不进行坐标转换
		switch(mode){
		case TCHSCR_ACTION_CLICK:	
		  	Uart_Printf(0,"Action=click:x=%d,\ty=%d\n",x,y);
			break;
		case TCHSCR_ACTION_DBCLICK:	
						
			Uart_Printf(0,"Action=double click:x=%d,\ty=%d\n",x,y);
			break;
		case TCHSCR_ACTION_DOWN:
		   				
			Uart_Printf(0,"Action=down:x=%d,\ty=%d\n",x,y);
			break;
		case TCHSCR_ACTION_UP:	
		     Uart_Printf(0,"Action=up:x=%d,\ty=%d\n",x,y);
			break;
		case TCHSCR_ACTION_MOVE:	
		  		
             Uart_Printf(0,"Action=move:x=%d,\ty=%d\n",x,y);
			break;
		}
		
		hudelay(1000);
	}
}


void getkey(int x,int y)
{

  if((x>100)&(x<210)&(y>310)&(y<410))
     
  {
   Uart_SendByte(0,'1');
   draw_charline('1',0xf818);
  }
   if((x>210)&(x<330)&(y>310)&(y<410))
     
  {
   Uart_SendByte(0,'2');
   draw_charline('2',0xf818);
  }
   if((x>330)&(x<455)&(y>310)&(y<410))
     
  {
   Uart_SendByte(0,'3');
   draw_charline('3',0xf818);
  }
   if((x>455)&(x<580)&(y>310)&(y<410))
     
  {
   //function="F1";
    Uart_SendString(0,"Calling...\n");
    draw_stringline("Calling.......\n",0xf818); 
  }
  
  if((x>100)&(x<210)&(y>234)&(y<320))
     
  {
   Uart_SendByte(0,'4');
  draw_charline ('4',0xf818);
  }
  if((x>215)&(x<325)&(y>234)&(y<320))
     
  {
   Uart_SendByte(0,'5');
   draw_charline('5',0xf818);
  }
  if((x>325)&(x<455)&(y>234)&(y<320))
     
  {
   Uart_SendByte(0,'6');
   draw_charline('6',0xf818);
  }
   
   if((x>455)&(x<580)&(y>234)&(y<320))
     
  {
   Uart_SendString(0,"holding...\n");
  // draw_stringline("Holding.......\n",0xf818); 
    
  }
  if((x>100)&(x<210)&(y>144)&(y<234))
     
  {
   Uart_SendByte(0,'7');
   draw_charline('7',0xf818);
   
  } 
    if((x>215)&(x<325)&(y>144)&(y<234))
     
  {
   Uart_SendByte(0,'8');
   draw_charline('8',0xf818);
  } 
  
   if((x>325)&(x<455)&(y>144)&(y<234))
     
  {
   Uart_SendByte(0,'9');
   draw_charline('9',0xf818);
  } 
   if((x>455)&(x<580)&(y>144)&(y<234))
     
  {
   Uart_SendString(0,"sending...\n");
   draw_stringline("Send message..\n",0xf818); 
    //function="F3";
  } 
  if((x>100)&(x<210)&(y>65)&(y<155))
     
  {
   Uart_SendByte(0,'0');
   draw_charline('0',0xf818);
  } 
  if((x>215)&(x<325)&(y>65)&(y<155))
     
  {
   Uart_SendByte(0,'*');
   draw_charline('*',0xf818);
  }   
  if((x>325)&(x<455)&(y>65)&(y<155))
     
  {
   Uart_SendByte(0,'#');
   draw_charline('#',0xf818);
  }  
   
   if((x>455)&(x<580)&(y>65)&(y<155))
     
  {
   Uart_SendString(0,"cancle\n");
   
   // function="F4";
  } 
  }
  
char getphonenum(int x,int y)
{
  static char c;
  
  if((x>100)&(x<210)&(y>310)&(y<410))
     
  {
   c='1';
  }
   if((x>210)&(x<330)&(y>310)&(y<410))
     
  {
   c='2';
  }
   if((x>330)&(x<455)&(y>310)&(y<410))
     
  {
   c='3';
  }
   if((x>455)&(x<580)&(y>310)&(y<410))
     
  {
   c='C';      //call
    
  }
  
  if((x>100)&(x<210)&(y>234)&(y<320))
     
  {
    c='4';
  }
  if((x>215)&(x<325)&(y>234)&(y<320))
     
  {
    c='5';
  }
  if((x>325)&(x<455)&(y>234)&(y<320))
     
  {
    c='6';
  }
   
   if((x>455)&(x<580)&(y>234)&(y<320))
     
  {
   c='H';   //hold
  }
  if((x>100)&(x<210)&(y>144)&(y<234))
     
  {
    c='7';
  } 
    if((x>215)&(x<325)&(y>144)&(y<234))
     
  {
    c='8';
  } 
  
   if((x>325)&(x<455)&(y>144)&(y<234))
     
  {
    c='9';
  } 
   if((x>455)&(x<580)&(y>144)&(y<234))
     
  {
   c='S';  //send
  } 
  if((x>100)&(x<210)&(y>65)&(y<155))
     
  {
   c='0';
  } 
  if((x>215)&(x<325)&(y>65)&(y<155))
     
  {
   c='*';
  }   
  if((x>325)&(x<455)&(y>65)&(y<155))
     
  {
   c='#';
  }  
   
   if((x>455)&(x<580)&(y>65)&(y<155))
     
  {
   c='F';     //cancel
  } 
  
  return c;
  }
  

void irq_TCHSCR(void)

{
   
   OSMboxPost(pevent,(void *)0);	   
}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -