UCOS-II+MINI2440+触摸屏

前面已经完成了UCOS-II到mini2440的移植

现在来进行基本的应用程序设计

已经完成4个LED程序,用来测试移植是否成功

下面把裸奔的触摸屏程序移植上来。

1.创建Touch任务

(1)、设置好任务堆栈长度

#define TaskStkLengh     1024

(2)、设置好任务优先级

#define NormalTaskPrio       5
#define Task0Prio 		NormalTaskPrio+1

(3)、设置好任务堆栈

OS_STK TaskTouchStk[Task2StkLengh];   

然后声明

void TaskLCD(void *pdata);

最后在main任务中创建任务:

OSTaskCreate(TaskTouch,(void *)0,&TaskTouchStk[Task2StkLengh-1],Task2Prio); 


 
  
void TaskTouch(void *pdata)
{
   #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
   OS_CPU_SR  cpu_sr;
   #endif
   
	OS_ENTER_CRITICAL();
Touch_Init();
OS_EXIT_CRITICAL();
    while(1)


    {
        Uart_Printf("\nEnter Task Touch\n");
   	rGPBDAT&=LED3_ON;            //LED亮
        OSTimeDly(400);           //延时20个节拍
        rGPBDAT|=LED3_OFF;           //LED灭
        OSTimeDly(400);           //延时20个节拍
    }
}       

下面是touch的驱动程序,这里千万要注意一点,在UCOS-II下用中断函数不要加__irq,即static void  AdcTsIntHandle(void)。下面贴出初始化函数与中断函数。

void Touch_Init(void)
{
	rADCDLY = 50000;
	rADCCON = PRESCALE_EN | PRSCVL(9);
	wait_down_int();    /* 进入"等待中断模式",等待触摸屏被按下 */


    	pISR_ADC = (int)AdcTsIntHandle;    // 设置ADC中断服务程序
    	rINTMSK &= ~BIT_ADC;          // 开启ADC总中断
    	rINTSUBMSK &= ~(BIT_SUB_TC);  // 开启INT_TC中断,即触摸屏被按下或松开时产生中断
}
static void  AdcTsIntHandle(void)
{
	#if OS_CRITICAL_METHOD == 3     
	 OS_CPU_SR  cpu_sr;
	#endif
	OS_ENTER_CRITICAL();	
         if(rADCDAT0&0x8000)
   	 {
   	 	 rSUBSRCPND|=BIT_SUB_TC;
	 	ClearPending(BIT_ADC);//清A/D中断,开启A/D中断屏蔽
		//Uart_Printf("\nStylus Up!!\n");
		wait_down_int();    /* 进入"等待中断模式",等待触摸屏被按下 */
		//rADCTSC&=0xff;	// Set stylus down interrupt bit
   	 }
   	 else
   	 {
        mode_auto_xy();     /* 进入自动(连续) X/Y轴坐标转换模式 */
        rADCDLY = 40000;                    //延时
        /* 设置位[0]为1,启动A/D转换
         * 注意:ADCDLY为50000,PCLK = 50MHz,
         *       要经过(1/50MHz)*50000=1ms之后才开始转换X坐标
         *       再经过1ms之后才开始转换Y坐标
         */
        rADCCON |= ADC_START;
        while(rADCCON & 0x1);                           //检查A/D转换是否开始
       while(!(rADCCON & 0x8000));                      //等待A/D转换的结束
       while(!(rSRCPND & (BIT_ADC)));                  //判断A/D中断的悬挂位
       
   	xdata=(rADCDAT0&0x3ff);
        ydata=(rADCDAT1&0x3ff);
     // 打印X、Y坐标值    	
    wait_up_int();//再次设置等待中断模式,这一次是判断触笔的抬起
       				//设置触笔抬起中断
 Uart_Printf("xdata = %d, ydata = %d\n", xdata, ydata);
rSUBSRCPND|=BIT_SUB_TC;
ClearPending(BIT_ADC);//清A/D中断,开启A/D中断屏蔽   
OS_EXIT_CRITICAL();
}

你可能感兴趣的:(OS,测试,UP,任务)