原创 ucos+ucgui+触摸屏控制demo

2010-7-6 10:16 2094 4 4 分类: MCU/ 嵌入式
ucos+ucgui+触摸屏控制demo


用的是周立功的试验箱,现在移植了UCOS+UCGUI,移植过程可以参考我前面的一片文章,下面我给出工程实例。
   在本工程中我建立了四个任务:
   任务一:从外界采集模拟信号并保存到缓存中,将其试试显示在屏幕上。
    任务二:桌面控件的显示以及控件的处理。
    任务三:ARM处理器的外部资源,包括数码管,直流电机、交流电机等等。
   任务四:更新屏幕,UCGUI推荐用最低任务级用于屏幕更新。
   任务二和任务三通过邮箱机制传递触摸屏的控制信息。

   
首先简单说一下进程间的通信,进程间可以通过信号量,互斥信号量、邮箱、队列等等通信机制进行相互通信,在此我们用的是MBox通信,传递一个结构体指针。
   就三条语句,都记住啦!
        OS_EVENT    *ConMsg;           //声明邮箱
   (1)ConMsg = OSMboxCreate(NULL); //创建邮箱
    (2)OSMboxPost(ConMsg,&conmsg);   
// 发conmsg邮件给接收进程
   (3)OSMboxPend(ConMsg,0,&err);     //接受邮箱,返回消息指针conmsg
*****************************************************************
下面是主程序框架

/****************************************Copyright (c)****************
** File Name:          main.c
** Last modified Date: 2006-01-11
** Last Version:       v1.0
** Deions:       主函数
************************************************************************/

#i nclude "config.h"
#i nclude "string.h"

#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条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条