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

📄 nedu_drive_tch.c

📁 一个基于单片机的小型操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************************
*                 东软培训中心教学项目:基于ARM和uc/os-II的PDA系统
*
*                      (c) Copyright 2005, 东软培训中心
*                             All Rights Reserved
*
* 模块名称:驱动程序模块
* 文件名:NEDU_DRIVE_TCH.C
* 作者:朱成果
* 时间:2006年9月20日
* 版本:V0.01
**********************************************************************************************************************
*/

#include "44b.h"
#include "driven.h"
#include "maro.h"
#include "uhal.h"
#include "ucos_ii.h"

#define ADS7843_CMD_X	(ADS7843_CTRL_START|ADS7843_GET_X|ADS7843_CTRL_12MODE|ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)
//采样x轴电压值,数据为12位,参考电压输入模式为差分模式,允许省电模式
#define ADS7843_CMD_Y	(ADS7843_CTRL_START|ADS7843_GET_Y|ADS7843_CTRL_12MODE|ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)

int TchScr_Xmax=1760,TchScr_Xmin=330,
	TchScr_Ymax=287,TchScr_Ymin=1775;//触摸屏返回电压值范围
	
int x,y;//得到的接触屏的x,y的坐标
extern U32 Sub_Mode;
extern U8 state;

/*
**********************************************************************************************************************
*                       TCHSCR_GETSCRXY
*
* 作者:北京博创兴业科技股份有限公司
*
* 时间:2004年
*
* 描述:获得触摸点坐标。
*
* 参数:*x:x坐标变量的地址;*y:y坐标变量的地址;bCal:折算成屏幕坐标请求
*
* 返回值:无
* 
***********************************************************************************************************************
*/
void TchScr_GetScrXY(int *x, int *y, U8 bCal)
{//获得触摸点坐标
	unsigned int temp;

	rPDATF&=~ADS7843_PIN_CS;//打开ADS7843

	SendSIOData(ADS7843_CMD_X);//发送读取x电压值控制字
	SendSIOData(0);//等待8个时钟节拍,因为完成一转换需要16个时钟
	temp=ReadSIOData();//读取采样值高8位
	SendSIOData(ADS7843_CMD_X);
	temp<<=8;
	temp|=ReadSIOData();//读取低8位并与以前高8位组成16位数据
	*x=(temp>>4);//去掉低4位,保留12位有效数据

	SendSIOData(0);
	temp=ReadSIOData();
	SendSIOData(ADS7843_CMD_X);
	temp<<=8;
	temp|=ReadSIOData();
	*x+=(temp>>4);

	SendSIOData(0);
	temp=ReadSIOData();
	SendSIOData(ADS7843_CMD_X);
	temp<<=8;
	temp|=ReadSIOData();
	*x+=(temp>>4);

	SendSIOData(0);
	temp=ReadSIOData();
	SendSIOData(ADS7843_CMD_Y);
	temp<<=8;
	temp|=ReadSIOData();
	*x+=(temp>>4);
	*x>>=2;		//采样4次取平均值
	//读取y电压值
	SendSIOData(0);
	temp=ReadSIOData();
	SendSIOData(ADS7843_CMD_Y);
	temp<<=8;
	temp|=ReadSIOData();
	*y=(temp>>4);

	SendSIOData(0);
	temp=ReadSIOData();
	SendSIOData(ADS7843_CMD_Y);
	temp<<=8;
	temp|=ReadSIOData();
	*y+=(temp>>4);
	
	SendSIOData(0);
	temp=ReadSIOData();
	SendSIOData(ADS7843_CMD_Y);
	temp<<=8;
	temp|=ReadSIOData();
	*y+=(temp>>4);

	SendSIOData(0);
	temp=ReadSIOData();
	SendSIOData(0);
	temp<<=8;
	temp|=ReadSIOData();
	*y+=(temp>>4);
	*y>>=2;		

	rPDATF|=ADS7843_PIN_CS;//关闭ADS7843

	if(bCal){//对采样结果进行转换
		*x=(*x-TchScr_Xmin)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin);
		*y=(*y-TchScr_Ymin)*LCDHEIGHT/(TchScr_Ymax-TchScr_Ymin);
	}
}
/*
**********************************************************************************************************************
*                       TCHSCR_GETOSXY
*
* 作者:朱成果
*
* 时间:2007年6月6日
*
* 描述:获得触摸点坐标。
*
* 参数:*x:x坐标变量的地址;*y:y坐标变量的地址
*
* 返回值:在坐标变量中
* 
***********************************************************************************************************************
*/
void TchScr_GetOSXY(int *x, int *y)
{

	while(1)
	{
		TchScr_GetScrXY(x, y,TRUE);
		if(*x<0 || *y<0)
			OSTimeDly(10);
		else
		{
			OSTimeDly(100);
			return;
		}
	}
}
/*
**********************************************************************************************************************
*                       GETMAINXY
*
* 作者:朱成果
*
* 时间:2007年6月1日
*
* 描述:确定状态机最上层坐标定位。
*
* 修改: (0709)去掉局部变量x,y.直接用GetTCHXY赋的值
*
* 参数:无
*
* 返回值:主菜单选项编号
* 
***********************************************************************************************************************
*/
U32 GetMainXY(void)
{
	U32 kl;
	//int x,y;
	
	//TchScr_GetOSXY(&x, &y);
	
			if(x>69 && x<250)
				if(y>57 && y<83)
					kl = DISTIME;
				else if(y>95 && y<121)
					kl = DISDATE;
				else if(y>133 && y<159)
					kl = DISREC;
				else if(y>170 && y<196)
					kl = SETRTC;
				else if(y>209 && y<234)
					kl = SETREC;
				else
					kl = NORMAL;
			else
				kl = NORMAL;
			
	Uart_Printf("\nGetMainXY:x=%d,\ty=%d  Mode=%d",x,y,kl);	
	return(kl);
}
/*
**********************************************************************************************************************
*                       GETTIMEXY
*
* 作者:朱成果
*
* 时间:2007年6月1日
*
* 描述:确定显示系统时间子状态机坐标。
*
* 修改: (0709)去掉局部变量x,y.直接用GetTCHXY赋的值
*
* 参数:无
*
* 返回值:无
* 
***********************************************************************************************************************
*/
void GetTimeXY(void)
{
	OS_CPU_SR  cpu_sr;
	//int x,y;
	//while(state != NORMAL)
	//{
	//TchScr_GetOSXY(&x, &y);
			if(x>85 && x<245)
				if(y>200 && y<227)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_RETURN;
					OS_EXIT_CRITICAL(); 
					return;
				}
				
	Uart_Printf("\nGetTimeXY:x=%d\ty=%d\tState=%d",x,y,state);
	//OSTimeDly(500);
	//}
	return;
}
/*
**********************************************************************************************************************
*                       GETDATEXY
*
* 作者:胡仲华 曹攀
*
* 时间:2007年7月3日
*
* 描述:确定显示系统日历子状态机坐标。
*
* 修改: (0709)去掉局部变量x,y.直接用GetTCHXY赋的值
*
* 参数:无
*
* 返回值:无
* 
***********************************************************************************************************************
*/
void GetDateXY(void)
{
	OS_CPU_SR  cpu_sr;
	//int x,y;
	//while(state != NORMAL)
	//{
	//TchScr_GetOSXY(&x, &y);
			if(x>210 && x<312)
			{
				if(y>184 && y<218)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_RETURN;
					OS_EXIT_CRITICAL(); 
					return;
				}
				else if(y>140 && y<170)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_NEXT;
					OS_EXIT_CRITICAL(); 
				}
				else if(y>90 && y<120)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_PREV;
					OS_EXIT_CRITICAL(); 
				}
			}
	
	Uart_Printf("\nGetDateXY:x=%d\ty=%d\tState=%d",x,y,state);  
	//OSTimeDly(500);
	//}
	return;
}
/*
**********************************************************************************************************************
*                       GETRECXY
*
* 作者:邹海英
*
* 时间:2007年7月3日
*
* 描述:确定显示系统客户信息子状态机坐标。
*
* 修改: (0709)去掉局部变量x,y.直接用GetTCHXY赋的值
*
* 参数:无
*
* 返回值:无
* 
***********************************************************************************************************************
*/
void GetRECXY(void)
{
	OS_CPU_SR  cpu_sr;
	//int x,y;
		
		
		
		if(y>186 && y<220)  
		{  // changed
			if(x>20 && x<80)				//点击上一条
			{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_PREV;
					OS_EXIT_CRITICAL(); 
					
			}
			else if(x>90 && x<150)			//点击下一条
			{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_NEXT;
					OS_EXIT_CRITICAL(); 
					
			}
			else if(x>160 && x<220)			//点击删除/OK
			{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_DELETE;
					OS_EXIT_CRITICAL(); 
			}
			else if(x>226 && x<293)			//点击返回
			{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_RETURN;
					OS_EXIT_CRITICAL(); 
			}
		}
		
		while(Sub_Mode == TCH_DELETE||Sub_Mode==TCH_K_Del)
		{
			OSTimeDly(200);
			Uart_Printf("in get del mode");
			TchScr_GetOSXY(&x, &y);
			if(y>126&&y<162)
			{
				if(x>55 && x<135)				//点击上一条
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_DEL_YES;
					OS_EXIT_CRITICAL(); 
				}
				else if(x>185 && x<265)			//点击下一条
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_DEL_NO;
					OS_EXIT_CRITICAL(); 
				}
			}
		}//end while
	Uart_Printf("\nGetRECXY:x=%d\ty=%d\tSmode=%d\tState=%d",x,y,Sub_Mode,state);
}


/*
**********************************************************************************************************************
*                       GETNORECORDXY
*
* 作者:孙周旋
*
* 时间:2007年7月10日
*
* 描述:确定无记录显示子状态机坐标。
*
* 参数:无
*
* 返回值:无
* 
***********************************************************************************************************************
*/
void GetNoRecordXY(void){

	OS_CPU_SR  cpu_sr;
	
	if(x>230&&x<290)  						//确定返回坐标
		{  // changed
			if(y>200 && y<230)				//点击返回
			{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_RETURN;	//子状态为返回
					OS_EXIT_CRITICAL();
					return;
			}
			
		}
	Uart_Printf("\nGetNoRecordXY:x=%d\ty=%d\tSmode=%d\tState=%d",x,y,Sub_Mode,state);
}



/*
**********************************************************************************************************************
*                       GETSETRTCXY
*
* 作者:胡仲华 曹攀
*
* 时间:2007年7月9日
*
* 描述:确定显示系统日历子状态机坐标。
*
* 修改: (0709)去掉局部变量x,y.直接用GetTCHXY赋的值
*
* 参数:无
*
* 返回值:无
* 
***********************************************************************************************************************
*/
void GetSETRTCXY(void)
{
	OS_CPU_SR  cpu_sr;
	//int x,y;
	//while(state != NORMAL)
	//{
	//TchScr_GetOSXY(&x, &y);
			
			if(x>230 && x<292)
			{
				if(y>185 && y<214)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_RETURN;
					OS_EXIT_CRITICAL(); 
					return;
				}
				if(y>160 && y<185)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_K_Del;			//退
					OS_EXIT_CRITICAL(); 
				}
				if(y>131 && y<160)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_K_ENTER;			//确定
					OS_EXIT_CRITICAL(); 
					return;
				}
			}
			if(y>160&&y<185)
			{
				if(x>50&&x<80)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_K_1;				//1
					OS_EXIT_CRITICAL(); 
				}
				if(x>80&&x<110)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_K_2;				//2
					OS_EXIT_CRITICAL(); 
				}
				if(x>110&&x<140)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_K_3;				//3
					OS_EXIT_CRITICAL(); 
				}
				if(x>140&&x<170)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_K_4;				//4
					OS_EXIT_CRITICAL(); 
				}
				if(x>170&&x<200)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_K_5;				//5
					OS_EXIT_CRITICAL(); 
				}
			}
			if(y>185&&y<210)
			{

⌨️ 快捷键说明

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