UCOS-II+TQ2440+触摸屏

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

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

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

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

1.创建Touch任务

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

  1. #defineTaskStkLengh1024
#define TaskStkLengh 1024

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

  1. #defineNormalTaskPrio5
#define NormalTaskPrio 5
  1. #defineTask0PrioNormalTaskPrio+1
#define Task0Prio NormalTaskPrio+1

(3)、设置好任务堆栈

  1. OS_STKTaskTouchStk[Task2StkLengh];
OS_STK TaskTouchStk[Task2StkLengh];

然后声明

  1. voidTaskLCD(void*pdata);
void TaskLCD(void *pdata);

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

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

  1. </pre></blockquote></blockquote><prename="code"class="html">voidTaskTouch(void*pdata)
  2. {
  3. #ifOS_CRITICAL_METHOD==3/*AllocatestorageforCPUstatusregister*/
  4. OS_CPU_SRcpu_sr;
  5. #endif
  6. OS_ENTER_CRITICAL();
  7. Touch_Init();
  8. OS_EXIT_CRITICAL();
  9. while(1)
  10. {
  11. Uart_Printf("\nEnterTaskTouch\n");
  12. rGPBDAT&=LED3_ON;//LED亮
  13. OSTimeDly(400);//延时20个节拍
  14. rGPBDAT|=LED3_OFF;//LED灭
  15. OSTimeDly(400);//延时20个节拍
  16. }
  17. }
</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,即staticvoid AdcTsIntHandle(void)。下面贴出初始化函数与中断函数。

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

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

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

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

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

1.创建Touch任务

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

  1. #defineTaskStkLengh1024
#define TaskStkLengh 1024

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

  1. #defineNormalTaskPrio5
#define NormalTaskPrio 5
  1. #defineTask0PrioNormalTaskPrio+1
#define Task0Prio NormalTaskPrio+1

(3)、设置好任务堆栈

  1. OS_STKTaskTouchStk[Task2StkLengh];
OS_STK TaskTouchStk[Task2StkLengh];

然后声明

  1. voidTaskLCD(void*pdata);
void TaskLCD(void *pdata);

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

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

  1. </pre></blockquote></blockquote><prename="code"class="html">voidTaskTouch(void*pdata)
  2. {
  3. #ifOS_CRITICAL_METHOD==3/*AllocatestorageforCPUstatusregister*/
  4. OS_CPU_SRcpu_sr;
  5. #endif
  6. OS_ENTER_CRITICAL();
  7. Touch_Init();
  8. OS_EXIT_CRITICAL();
  9. while(1)
  10. {
  11. Uart_Printf("\nEnterTaskTouch\n");
  12. rGPBDAT&=LED3_ON;//LED亮
  13. OSTimeDly(400);//延时20个节拍
  14. rGPBDAT|=LED3_OFF;//LED灭
  15. OSTimeDly(400);//延时20个节拍
  16. }
  17. }
</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,即staticvoid AdcTsIntHandle(void)。下面贴出初始化函数与中断函数。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值