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

📄 nedu_drive_tch.c.bak

📁 一个基于单片机的小型操作系统
💻 BAK
字号:
/*
*********************************************************************************************************************
*                 东软培训中心教学项目:基于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;//触摸屏返回电压值范围
	
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日
*
* 描述:确定状态机最上层坐标定位。
*
* 参数:无
*
* 返回值:主菜单选项编号
* 
***********************************************************************************************************************
*/
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日
*
* 描述:确定显示系统时间子状态机坐标。
*
* 参数:无
*
* 返回值:无
* 
***********************************************************************************************************************
*/
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
*
* 作者:
*
* 时间:
*
* 描述:确定显示系统日历子状态机坐标。
*
* 参数:无
*
* 返回值:无
* 
***********************************************************************************************************************
*/
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>146 && y<180)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_NEXT;
					OS_EXIT_CRITICAL(); 
					return;
				}
				else if(y>108 && y<142)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_PREV;
					OS_EXIT_CRITICAL(); 
					return;
				}
	
	Uart_Printf("\nGetDateXY:x=%d\ty=%d\tState=%d",x,y,state);  
	OSTimeDly(500);
	}
	return;
}
/*
**********************************************************************************************************************
*                       GETRECXY
*
* 作者:
*
* 时间:
*
* 描述:确定显示系统客户信息子状态机坐标。
*
* 参数:无
*
* 返回值:无
* 
***********************************************************************************************************************
*/
void GetRECXY(void)
{
	OS_CPU_SR  cpu_sr;
	int x,y;
	while(state != NORMAL)
	{
	TchScr_GetOSXY(&x, &y);
			if(x>226 && x<293)
				if(y>186 && y<220)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_RETURN;
					OS_EXIT_CRITICAL(); 
					return;
				}
	
	Uart_Printf("\nGetRECXY:x=%d\ty=%d\tSmode=%d\tState=%d",x,y,Sub_Mode,state);
	OSTimeDly(500);
	} 
	return;
}
/*
**********************************************************************************************************************
*                       GETSETRTCXY
*
* 作者:
*
* 时间:
*
* 描述:确定显示系统日历子状态机坐标。
*
* 参数:无
*
* 返回值:无
* 
***********************************************************************************************************************
*/
void GetSETRTCXY(void)
{
	OS_CPU_SR  cpu_sr;
	int x,y;
	while(state != NORMAL)
	{
	TchScr_GetOSXY(&x, &y);
			if(y>131 && y<214)
				if(x>230 && x<292)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_RETURN;
					OS_EXIT_CRITICAL(); 
					return;
				}
	Uart_Printf("\nSetRTCXY:x=%d\ty=%d\tKey=0x%x\tState=%d",x,y,Sub_Mode,state);
	OSTimeDly(500);
	} 
	return;
}
/*
**********************************************************************************************************************
*                       GETSETRECXY
*
* 作者:
*
* 时间:
*
* 描述:确定显示系统日历子状态机坐标。
*
* 参数:无
*
* 返回值:无
* 
***********************************************************************************************************************
*/
void GetSETRECXY(void)
{
	OS_CPU_SR  cpu_sr;
	int x,y;
	while(state != NORMAL)
	{
	TchScr_GetOSXY(&x, &y);
			if(x>12 && x<310)
				if(y>140 && y<232)
				{
					OS_ENTER_CRITICAL();
					Sub_Mode = TCH_RETURN;
					OS_EXIT_CRITICAL(); 
					return;
				}
			
	Uart_Printf("\nSetRECXY:x=%d\ty=%d\tKey=0x%x\tState=%d",x,y,Sub_Mode,state);
	OSTimeDly(500);
	} 
	return;
}
//end of nedu_drive_tch

⌨️ 快捷键说明

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