main.c
资源名称:GPRS_work.rar [点击查看]
上传用户:sdaoma
上传日期:2013-08-07
资源大小:3838k
文件大小:11k
源码类别:
GPS编程
开发平台:
C/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
- ********************************************************************************************************/