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

📄 main.c

📁 magic arm2200 Ucos2+Gprs发短信和打电话程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"

/********************add by yehaoben ***********/
#define	TaskStkGPSLengh	164			//Define the Task0 stack length 定义用户任务0的堆栈长度
 
OS_STK	TaskStkGPS [TaskStkGPSLengh];		//Define the Task0 stack 定义用户任务0的堆栈


void 	TaskGPS(void *pdata);			//Task0 任务0
/************************** end ****************/


extern void minigui_app_entry (void);

// 定义输入消息数据结构
typedef  struct  TOUCH_KEY
{   uint8  sta;     // 状态字,d1位为1时表示按键输入,d0为1时表示触摸屏输入;
                    // d7为1时表示按键/触摸屏按下,为0时表示放开。
    uint8  key;     // 按键码(0--15)
    
    // 触摸屏输入的坐标
    uint16  x;      
    uint16  y;
}  TouchKey_Sta;


// 定义用于保存触摸屏(0,0)和两个校准点的坐标的电压值
uint16  g_vx_min, g_vy_min;
uint16  g_vinx0, g_viny0;
uint16  g_vinx1, g_viny1;
uint16  touch_wide, touch_high;

/* 按键消息邮箱 */
OS_EVENT  *TouchKeyMbox = NULL;          // 按键消息邮箱


#define	TaskStkLengh	64			// Define the Task0 stack length 定义用户任务0的堆栈长度
OS_STK	TaskStk [TaskStkLengh];		// Define the Task0 stack 定义用户任务0的堆栈
void 	Task0(void *pdata);			// Task0 任务0

OS_STK	Task1Stk [TaskStkLengh];    // Define the Task1 stack 定义用户任务1的堆栈
void 	Task1(void *pdata);			// Task0 任务1

int  main(void)
{
	OSInit ();																										
	OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 10);		
	minigui_app_entry();
	
	TouchKeyMbox = OSMboxCreate(NULL);   // 建立一个邮箱,用于传递按键消息
	OSStart();
	
	return(0);															
}


/****************************************************************************
* 名称:TestTouch()
* 功能:
* 入口参数:无
* 出口参数:返回1表示已校准过,返回0表示没有校准。
* 说明:E2PROM中的数据结构定义如下。
*       0xE0、0xE1保存触摸屏是否校准标志,为0x5A、0xA5时表示校准过;
*
*       0xE2、0xE3保存(0,0)点坐标的电压转换值g_vx_min; 
*       0xE4、0xE5保存(0,0)点坐标的电压转换值g_vy_min;
*       0xE6、0xE7保存第1个校验点的电压转换值g_vinx0;
*       0xE8、0xE9保存第1个校验点的电压转换值g_viny0;
*       0xEA、0xEB保存第2个校验点的电压转换值g_vinx1;
*       0xEC、0xED保存第2个校验点的电压转换值g_viny1;
*
*       0xF0、0xF1保存第1、2校验点之间的x轴点数wide;
*       0xF2、0xF4保存第1、2校验点之间的y轴点数high;
****************************************************************************/ 
uint8  TestTouch(void)
{   uint8  dat_buf1[20];
    uint8  adr_buf[2];

    // 读出E2PROM中的数据
    adr_buf[0] = 0xE0;
    I2cRead(CAT1025, dat_buf1, adr_buf, 1, 14);    
    adr_buf[0] = 0xF0;
    I2cRead(CAT1025, &dat_buf1[14], adr_buf, 1, 4);
    
    // 取得参数
    g_vx_min = (dat_buf1[2] << 8) + dat_buf1[3];
    g_vy_min = (dat_buf1[4] << 8) + dat_buf1[5];
    g_vinx0  = (dat_buf1[6] << 8) + dat_buf1[7];
    g_viny0  = (dat_buf1[8] << 8) + dat_buf1[9];
    g_vinx1  = (dat_buf1[10] << 8) + dat_buf1[11];
    g_viny1  = (dat_buf1[12] << 8) + dat_buf1[13];    
    touch_wide = (dat_buf1[14] << 8) + dat_buf1[15];
    touch_high = (dat_buf1[16] << 8) + dat_buf1[17];
    
    // 判断是否已经校准过
    if((dat_buf1[0] == 0x5A) && (dat_buf1[1] == 0xA5)) return(1);
        else  return(0);    
}


/****************************************************************************
* 名称:GetLCD_XY()
* 功能:读取触摸屏上触摸点的坐标。
*       程序会一直等待,直到有触摸输入。
* 入口参数:x       用于保存触摸点x坐标(LCD)的变量指针
*           y       用于保存触摸点y坐标(LCD)的变量指针
* 出口参数:无
* 说明:先通测量y轴的触摸输入,判断是否有触摸动作。如果有,则进行6次数据
*       采集,并进行去极值平均滤波处理。最后还要判断触摸输入是否合法,只有
*       当触摸输入合法时才返回。
****************************************************************************/
uint8  GetLCD_XY(uint16 *vx, uint16 *vy)
{   uint16  vx_dat, vy_dat;
    uint16  vx_dat1, vy_dat1;
    int     i;           
    
    // 判断是否有触摸动作(通过ADS7843的PENIRQ引脚进行判断)
    for(i=0; i<3; i++)
    {   vy_dat = ADS7843_WriteRead(AIN_Y);
        *vy = vy_dat;               // 初始化vy,以便于判断无触摸输入(vy=0)
        
        if(vy_dat != 0) break;
    } // end of while(1)...
    if(i>=3) return(0);
    
    // 进行数据采集
    vx_dat = ADS7843_WriteRead(AIN_X);
    vy_dat = ADS7843_WriteRead(AIN_Y);
    for(i=0; i<100; i++);
    vx_dat1 = ADS7843_WriteRead(AIN_X);
    vy_dat1 = ADS7843_WriteRead(AIN_Y);
        
    if((vy_dat<3) || (vy_dat1<3)) return(0);   
         
    if(vx_dat>vx_dat1) 
    {   if((vx_dat-vx_dat1) > 13) return(0);
    }
    else
    {   if((vx_dat1-vx_dat) > 13) return(0); 
    }
        
    if(vy_dat>vy_dat1) 
    {   if((vy_dat-vy_dat1) > 18) return(0);
    }
    else
    {   if((vy_dat1-vy_dat) > 18) return(0); 
    } 
        
    *vx = (vx_dat+vx_dat1) >> 1;
    *vy = (vy_dat+vy_dat1) >> 1;                          
    return(1);
}


/*********************************************************************************************************
**                            Task0 任务0
** 键盘驱动任务。读取ZLG7290扫描的按键值,然后把键值发送到TouchKeyMbox邮箱。
** 由MiniGUI的"comm" IAL输入引擎接收TouchKeyMbox邮箱的消息,然后进行相应的处理。
********************************************************************************************************/
void  Task0(void *pdata)
{   static uint8  s_enter_sta = 0;   
    static TouchKey_Sta  s_event_input;
    uint16  key;    
    
	pdata = pdata;		
	TargetInit();
	

		
	if(TestTouch() == 0)            // 读取触摸屏校准参数,判断触摸屏是否已校准
	{   // 若触摸屏没有校准,则控制数码管显示"Error 01"
	    ZLG7290ShowChar(7, 0x0E);
        OSTimeDly(OS_TICKS_PER_SEC / 100);
        ZLG7290ShowChar(6, 0x18);
        OSTimeDly(OS_TICKS_PER_SEC / 100);
        ZLG7290ShowChar(5, 0x18);
        OSTimeDly(OS_TICKS_PER_SEC / 100);
        ZLG7290ShowChar(4, 0x15);
        OSTimeDly(OS_TICKS_PER_SEC / 100);
        ZLG7290ShowChar(3, 0x18);
        OSTimeDly(OS_TICKS_PER_SEC / 100);
        ZLG7290ShowChar(2, 0x1F);
        OSTimeDly(OS_TICKS_PER_SEC / 100);
        ZLG7290ShowChar(1, 0x00);
        OSTimeDly(OS_TICKS_PER_SEC / 100);
        ZLG7290ShowChar(0, 0x01);
        OSTimeDly(OS_TICKS_PER_SEC / 100);
	}
	
	// 创建触摸屏输入检测任务
	OSTaskCreate (Task1,(void *)0, &Task1Stk[TaskStkLengh - 1], 9);	
       	
	while (1)
	{   key = ZLG7290GetKey();  // 扫描键盘输入			        
		    
	    if(key&0x00FF)          // 如果有按键,则判断是否要发送按下消息
	    {   if(s_enter_sta == 0) // 按键单击	          	        
	        {   // 设置消息中的按键值
                s_event_input.sta = 0x82;
                s_event_input.key = (key-1)&0x000F;   // 原按键值为1-16,所以要减1变为0-15	          
	            OSMboxPost(TouchKeyMbox, (void *)&s_event_input);
	            
	            s_enter_sta = 1;  
	        }	        
	    }
	    else    // 如果是没有按键,则判断是否要发送放开消息	       
	    {   if(s_enter_sta != 0)  // 按键放开,则发送按键放开消息
	        {   s_event_input.sta = 0x02;
	            OSMboxPost(TouchKeyMbox, (void *)&s_event_input);             	            
	        }	
	        
	        s_enter_sta = 0;        
	    } // end of if(key&0x00FF)...else...
	    
		OSTimeDly(1);   
	}
}


/*********************************************************************************************************
**                            Task1 任务1
** 键盘驱动任务。读取触摸屏的触摸输入,然后把键值发送到TouchKeyMbox邮箱。
** 由MiniGUI的"comm" IAL输入引擎接收TouchKeyMbox邮箱的消息,然后进行相应的处理。
********************************************************************************************************/
void  Task1(void *pdata)
{   static uint8  s_enter_sta = 0;   
    static TouchKey_Sta  s_event_input;
    uint16  vx1, vy1;
    int     x1, y1;    
    
	pdata = pdata;			
    /************************************************************/
    OSTaskCreate (TaskGPS,(void *)0, &TaskStkGPS[TaskStkGPSLengh - 1], 14);
     /************************************************************/
   	
	while (1)
	{   // 判断是否有触摸屏输入 
	    if(GetLCD_XY(&vx1, &vy1)==1)
	    {   // 触摸屏按下,转换坐标值(为了实现拖动,不对s_enter_sta进行判断)
            x1 = (vx1 - g_vx_min) * touch_wide / (g_vinx1 - g_vinx0);
            y1 = (vy1 - g_vy_min) * touch_high / (g_viny1 - g_viny0);
            if(x1<0) x1 = 0;
            if(y1<0) y1 = 0;        
            if(x1>319) x1 = 319;
            if(y1>239) y1 = 239;                        	    
              
            // 设置消息中的坐标值  
            s_event_input.sta = 0x81;
            s_event_input.x = x1;
            s_event_input.y = y1;
            OSMboxPost(TouchKeyMbox, (void *)&s_event_input);
                
            s_enter_sta = 1;            	        
	    }   
	    else
	    {   if(vy1 == 0)
	        {   if(s_enter_sta != 0)     // 若是松开触摸点,则发送放开消息
	            {   s_event_input.sta = 0x01;
	                OSMboxPost(TouchKeyMbox, (void *)&s_event_input);	            
	            }
	            s_enter_sta = 0;
	        } // end of if(vy1 == 0)...
	    } // end of if(GetLCD_XY(&vx1, &vy1)==1)...else...
	    
		OSTimeDly(5);   
	}
}
/************************************************************/
		void TaskGPS	(void *pdata)
{
	ModemInit(19200);
	while(1)
	OSTimeDly(10);

}
/************************************************************/


   
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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