#define Task0StkLengh 512 // 定义用户任务0的堆栈长度
#define Task1StkLengh 256 // 定义用户任务1的堆栈长度
#define Task2StkLengh 256 // 定义用户任务1的堆栈长度
#define Task3StkLengh 256 // 定义用户任务1的堆栈长度
OS_STK Task0Stk [Task0StkLengh]; // 定义用户任务0的堆栈
OS_STK Task1Stk [Task1StkLengh]; // 定义用户任务1的堆栈
OS_STK Task2Stk [Task2StkLengh]; // 定义用户任务2的堆栈
OS_STK Task3Stk [Task3StkLengh]; // 定义用户任务3的堆栈
void Task0(void *pdata); // Task0 任务0
void Task1(void *pdata); // Task1 任务1
void Task2(void *pdata); // Task1 任务2
void Task3(void *pdata); // Task1 任务3
void RunBeep(void);
void LED_DispNum(uint32 dat);
void TouchInit(void);
void IRQ_AdcTouch(void);
void AdcTouch(void);
int TestTouchDown(void);
void ViewXY(void);
void ShowTime(void);
void EINT_init(void);
void IRQ_Eint4(void);
void KeyPro(uint8 KeyNum);
/************************************************************************* name: main
** Deions: 主函数,uCOS/II移植实验范例
** Input: 无
** Output: 系统返回值0
***********************************************************************/
int main (void)
{
uint8 err;
OSInit ();
GUI_Init();
InitI2C(); //初始化I2c寄存器
UART_Select(0); //选择串口0
UART_Init(115200); //初始化串口0
TargetInit ();
EINT_init();
UART_SendStr("The System is Start Runing!!!!!\n");
rGPHDAT = rGPHDAT | BEEP; // BEEP = 1
TouchInit(); // 初始化触摸屏(ADC)
IRQEnable(); // 使能IRQ中断(CPSR)
OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], 2);
OSTaskCreate (Task1,(void *)0, &Task1Stk[Task1StkLengh - 1], 3);
OSTaskCreate (Task2,(void *)0, &Task2Stk[Task2StkLengh - 1], 4);
OSTaskCreate (Task3,(void *)0, &Task3Stk[Task3StkLengh - 1], 5);
KeyStatus = OSFlagCreate(0x00,&err);
ConMsg = OSMboxCreate(NULL);
OSStart ();
return 0;
}
/***********************************************************************/
void ShowTime(void)
{
uint8 err;
uint8 suba[2];
uint8 sd[3];
uint8 dong[4];
uint8 symbol="0";
time=OSTimeGet();
TimeBuf[2]=duanma[(time/200)%10]; //秒的个位
TimeBuf[3]=duanma[(time%12000)/2000]; //秒的十位
TimeBuf[4]=duanma[(time/12000)%10]; //分钟个位
TimeBuf[5]=duanma[(time%720000)/120000]; //分钟十位
TimeBuf[6]=duanma[(time/720000)%10]; //小时个位
TimeBuf[7]=duanma[(time%72000000)/7200000]; //小时十位
suba[0] = 1; // 1位子地址
suba[1] = 0x10; // 子地址
ISendStr(zlg7290,suba, TimeBuf, 8); // 显示当前时间
dong[0] = 0x11;
ISendStr(zlg7290,suba,dong,1);
}
/***********************************************************************
** name: IRQ_Eint4
** Deions: Eint4中断服务程序。把LED1控制口输出信号取反。
** Input: 无
** Output: 无
**********************************************************************/
void IRQ_Eint4(void)
{
int i;
uint8 suba[2];
rGPFCON = rGPFCON | (0x02<<8); // 设置回EINT4中断口
suba[0] = 1; // 1位子地址
suba[1] = 0x01; // 子地址
IRcvStr(zlg7290,suba,sd,3) ; // 读按键的值
KeyNum = sd[0]; // 普通键键值
low = KeyNum%10; // 键值的低字节
high = KeyNum/10 ; // 键值的高字节
TimeBuf[0] = duanma[low];
TimeBuf[1] = duanma[high];
if(KeyNum!=0)
{
//RunBeep(); // 有普通键按下
suba[0] = 1; // 1位子地址
suba[1] = 0x10; // 子地址
ISendStr(zlg7290, suba,TimeBuf, 8); // 输出键值低字节
}
rGPFCON = rGPFCON | (0x02<<8); // 设置回EINT4中断口
// 清除中断标志
rEINTPEND = (1<<4);
rSRCPND = (1<<4);
rINTPND = rINTPND;
}
void KeyPro(uint8 KeyNum)
{
switch(KeyNum)
{
case 0: UART_SendByte(64); ; break;
case 1: UART_SendByte(65); ; break;
case 2: UART_SendByte(66); ; break;
case 3: UART_SendByte(67); ; break;
case 4: UART_SendByte(68); ; break;
}
}
/************************************************************************
** name: EINT_init
** Deions: 外部中断初始化。设置GPF4引脚为外部中断EINT4功能,下降沿触发模式,并使能中断允许。
** Input: 无
** Output: 无
************************************************************************/
void EINT_init(void)
{
rGPFCON = (rGPFCON & 0xFFFFFCFF) | (0x02<<8); // 设置GPF4引脚为外部中断EINT4功能
rEXTINT0 = (0x2<<16); // 外部中断EINT4设置为下降沿触发
VICVectAddr[4] = (uint32) IRQ_Eint4; // 中断向量地址设置
rPRIORITY = 0x00000000; // 使用默认的固定的优先级
rINTMOD = 0x00000000; // 所有中断均为IRQ中断
rINTMSK &= ~0x0000010; // 使能EINT4中断
rEINTMASK &= ~0x0000010;
}
/************************************************************************
** name: RunBeep
** Deions: 控制蜂鸣器Be一声音。
** Input: 无
** Output: 无
***********************************************************************/
void RunBeep(void)
{
rGPHDAT = rGPHDAT & BEEP_MASK; // BEEP = 0
OSTimeDly(OS_TICKS_PER_SEC/10);
rGPHDAT = rGPHDAT | BEEP; // BEEP = 1
OSTimeDly(OS_TICKS_PER_SEC/10);
}
/************************************************************************
** name: LED_DispNum
** Deions: 控制LED1~LED4显示指定16进制数值。LED4为最高位,
** LED1为最低为,点亮表示该位为1。
** Input: dat 显示数值(低4位有效)
** Output: 无
***********************************************************************/
void LED_DispNum(uint32 dat)
{
dat = dat & 0x0000000F; // 参数过滤
// 控制LED4、LED3显示(d3、d2位)
if(dat & 0x08) rGPHDAT = rGPHDAT | (0x01<<6);
else rGPHDAT = rGPHDAT & (~(0x01<<6));
if(dat & 0x04) rGPHDAT = rGPHDAT | (0x01<<4);
else rGPHDAT = rGPHDAT & (~(0x01<<4));
rGPEDAT = (rGPEDAT & (~(0x03<<11))) | ((dat&0x03) << 11); // 控制LED2、LED1显示(d1、d0位)
文章评论(0条评论)
登录后参与讨论