📄 main.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 + -