UCOS-II+TQ2440+触摸屏

 

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

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

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

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

1.创建Touch任务

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

view plain copy to clipboard print ?
  1. #define TaskStkLengh     1024  
#define TaskStkLengh 1024

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

view plain copy to clipboard print ?
  1. #define NormalTaskPrio       5  
#define NormalTaskPrio 5
view plain copy to clipboard print ?
  1. #define Task0Prio       NormalTaskPrio+1  
#define Task0Prio NormalTaskPrio+1

(3)、设置好任务堆栈

view plain copy to clipboard print ?
  1. OS_STK TaskTouchStk[Task2StkLengh];     
OS_STK TaskTouchStk[Task2StkLengh];

然后声明

view plain copy to clipboard print ?
  1. void TaskLCD(void *pdata);  
void TaskLCD(void *pdata);

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

view plain copy to clipboard print ?
  1. OSTaskCreate(TaskTouch,(void *)0,&TaskTouchStk[Task2StkLengh-1],Task2Prio);   
OSTaskCreate(TaskTouch,(void *)0,&TaskTouchStk[Task2StkLengh-1],Task2Prio);

view plain copy to clipboard print ?
  1. </pre></blockquote></blockquote><pre name="code" class="html">void TaskTouch(void *pdata)  
  2. {  
  3.    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */  
  4.    OS_CPU_SR  cpu_sr;  
  5.    #endif  
  6.      
  7.     OS_ENTER_CRITICAL();  
  8. Touch_Init();  
  9. OS_EXIT_CRITICAL();  
  10.     while(1)  
  11.   
  12.   
  13.     {  
  14.         Uart_Printf("\nEnter Task Touch\n");  
  15.     rGPBDAT&=LED3_ON;            //LED亮  
  16.         OSTimeDly(400);           //延时20个节拍  
  17.         rGPBDAT|=LED3_OFF;           //LED灭  
  18.         OSTimeDly(400);           //延时20个节拍  
  19.     }  
  20. }         
</pre></blockquote></blockquote><pre name="code" class="html">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)。下面贴出初始化函数与中断函数。

view plain copy to clipboard print ?
  1. void Touch_Init(void)  
  2. {  
  3.     rADCDLY = 50000;  
  4.     rADCCON = PRESCALE_EN | PRSCVL(9);  
  5.     wait_down_int();    /* 进入"等待中断模式",等待触摸屏被按下 */  
  6.   
  7.   
  8.         pISR_ADC = (int)AdcTsIntHandle;    // 设置ADC中断服务程序  
  9.         rINTMSK &= ~BIT_ADC;          // 开启ADC总中断  
  10.         rINTSUBMSK &= ~(BIT_SUB_TC);  // 开启INT_TC中断,即触摸屏被按下或松开时产生中断  
  11. }  
  12. static void  AdcTsIntHandle(void)  
  13. {  
  14.     #if OS_CRITICAL_METHOD == 3       
  15.      OS_CPU_SR  cpu_sr;  
  16.     #endif  
  17.     OS_ENTER_CRITICAL();      
  18.          if(rADCDAT0&0x8000)  
  19.      {  
  20.          rSUBSRCPND|=BIT_SUB_TC;  
  21.         ClearPending(BIT_ADC);//清A/D中断,开启A/D中断屏蔽  
  22.         //Uart_Printf("\nStylus Up!!\n");  
  23.         wait_down_int();    /* 进入"等待中断模式",等待触摸屏被按下 */  
  24.         //rADCTSC&=0xff;    // Set stylus down interrupt bit  
  25.      }  
  26.      else  
  27.      {  
  28.         mode_auto_xy();     /* 进入自动(连续) X/Y轴坐标转换模式 */  
  29.         rADCDLY = 40000;                    //延时  
  30.         /* 设置位[0]为1,启动A/D转换  
  31.          * 注意:ADCDLY为50000,PCLK = 50MHz,  
  32.          *       要经过(1/50MHz)*50000=1ms之后才开始转换X坐标  
  33.          *       再经过1ms之后才开始转换Y坐标  
  34.          */  
  35.         rADCCON |= ADC_START;  
  36.         while(rADCCON & 0x1);                           //检查A/D转换是否开始  
  37.        while(!(rADCCON & 0x8000));                      //等待A/D转换的结束  
  38.        while(!(rSRCPND & (BIT_ADC)));                  //判断A/D中断的悬挂位  
  39.          
  40.     xdata=(rADCDAT0&0x3ff);  
  41.         ydata=(rADCDAT1&0x3ff);  
  42.      // 打印X、Y坐标值          
  43.     wait_up_int();//再次设置等待中断模式,这一次是判断触笔的抬起  
  44.                     //设置触笔抬起中断  
  45.  Uart_Printf("xdata = %d, ydata = %d\n", xdata, ydata);  
  46. rSUBSRCPND|=BIT_SUB_TC;  
  47. ClearPending(BIT_ADC);//清A/D中断,开启A/D中断屏蔽     
  48. OS_EXIT_CRITICAL();  
  49. }  
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,测试,Class,UP,任务)