⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 worldclock.txt

📁 学习设计一个复杂嵌入式应用程序的方法
💻 TXT
📖 第 1 页 / 共 2 页
字号:
世界时钟源代码详解
    本综合实验程序中实验者自已编写的代码都在main.c文件中。以下给出main.c的详细
解释。
main.C
    #include "..\ucos-ii\includes.h"    //*μc/os-ii interface
    #include"..\ucos-ii\add\osaddition.h"
    #include"..\inc\drv.h"    //设备驱动
    #include"..\inc\OSFile.h"
    #include"..\inc\drvkUstring.h"
    #include<string.h>
    #include<math.h>
    #include"..\inc\exio.h"    //系统输入输出
    //定义数码管段码
    unsigned char
    led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,
    0x5e,0x79,0x71);
    int inifisnished;    //该变量记录初始化是否完毕
    ///***********任务定义*******///
    OS_STK Main_Stack[STACKSIZE*8]={0,};    //Main_Test_Task堆栈
    void Main_Task(void*Id);    //Main_Test_Task
    #define Main_Task_Prio  12
    OS_STK Led_Flash_Stack[STACKSIZE]={0,};    //LED闪烁任务堆栈
void Led_Flash_Task(void*Id);    //LED闪烁任务
#define Led_Flash_Prio    60
OS_STK Rtc_Disp_Stack[STACKSIZE]={0,};
void Rtc_Disp_Task(void*Id);    //LED闪烁任务
#define Rtc_Disp_Prio    57
#define pi 3.14159265357
//******已经定义的OS任务*******
#define Touch_Screen_Task Prio 9
#define Main_Task_Prio    12
#define Key_Scan_Task_Prio    58
#defime Lcd_Fresh_prio    59
#define Led_Flash_Prio    60
#define Rtc_Disp_Prio    57
//**********************************************
//********事件定义***********
OS_EVENT*Rtc_Updata_Sem;
OS_EVENT*Nand_Rw_Sem;    //Nand_Flash读写控制权旗语
//and you can use it as folloeing:
//    Nand_Rw_Sem=OSSemCreate(1);
    //创建Nand-Flash读写控制权旗语,初值为l满足互斥条件
//  OSSemPend(Nand_Rw_Sem,0,&err);
//    OSSemPost(Nand_Rw_Sem);
OS_EVENT*Uart_Rw_Sem;    //Uart读写控制权旗语
//and you can use it as f01loeing:
//    Uart_Rw_Sem=OSSemCreate(1);
    //创建Uart读写控制权旗语,初值为1满足互斥条件
//    OSSemPend(Uart_Rw_Sem,0,&err);
//    OSSemPost(Uart_Rw_Sem);
//////////////////////////////////////////////////////////
void Led_Flash_Task(void*Id)    //指示RTOS处于正常工作中
  unsigned char 1ed_state;
  for(;;)
  {
  Led_Display(led_state);
  1ed_state=~led_state;
  OSTimeDly(250);
  }
}//Led_Flash_Task
void initOSGUI()    //初始化操作系统的图形界面
{
    init0SMessage();
    init0SList();
    init0SDC();
    init0SCtrl();
    init0SFile();
}
/////////////////////////////////////////////////////
//    Main function    //
////////////////////////////////////////////////////
int Main(int argc,char**argv)
{
    ARMTargetInit();  //do target(uHAL based ARM system)initialisation
    OSInit();    //needed by uC/OS-II
    uHALr_ResetMMU();
    LCD_Init();    //初始化LCD模块
    LCD_printf("LCD initialization is OK\n");
    LCD_printf("320 x 240 Text Mode\n");
    LoadFont();
    LoadConfigSys();
    //treate the tasks in uC/OS and assign increasing
    //priorities to them so that Task3 at the end of
    //the pipel ine has the highest priority
    LCD printf("Create task on uCOS-II...\n");
    osTaskcreate(Main_Task,(void*)0,(OS_STK*)&Main_Stack[STACKSIZE*8-1],
    Main_Task_rio);
    OSTaskcreate(Led_Flash_Task,(void*)0,(OS_STK*)&Led_Flash_Stack[STACKSIZE-1],
    Led_Flash_Prio);  //10
  OSTaskCreate(Rtc_Disp_Task,(void*)0,(OS_STK*)&Rtc_Disp_Stack[STACKSIZE-1],
    Rtc_Disp_Prio);    //5
  EXIO_8255A_CTRL=Ox80;    //初始化LED
  EXIO 8255A_PORTC=0xff;
  OSAddTask_Init();
  LCD_printf("Starting uCOS-II...\n");
  LCD_printf("Entering graph mode...\n");
  LCD_ChangeMode(DspGraMode);
  initOSGUI();
  InitRtc();
  Nand_Rw_Sem=OSSemCreate(1);
    //创建Nand-Flash读写控制权旗语,初值为l满足互斥条件
  ARMTargetStart();  //Start the(uHAL based ARM system)system running
  OSStart();    //start the game
  //never reached
  return 0;
}//main
////////////////////////////////////////////////////////////////////
PListCtrl pMainListctrl;    //列表框控件指针
char FileExName[]=('B','M',' P',0);    //文件扩展名
char BmpFile[100][12];    //文件名数组
int listnumber=0;
#define ID_MainListBox 100    //列表框控件ID
PTextCtrl pTextCtrl;    //文本框结构
#define ID_MainTextCtrl 101    //文本框ID
void CreateFileList()
{
  structRECT rect;    //定义矩形结构
  static char filename[9][10]=("BeiJing","Newyork","Tehela","Paris",
    "Tokyo");
    U32 filepos=0;
    U16 Ufilename[9];
    int i=0;
    SetRect(&rect,0,5,120,200);    //创建列表框控件
    pMainListCtrl=CreateListCtrl(ID_MainListBox,&rect,i00,FONTSIZE_MIDDLE,
    CTRL_STYLE_DBFRAME,NULL);    //创建列表框
    SetWndCtrlFocus(NULL,ID_MainListBox);//焦点移到列表框控件
    for(i=0;i<=4;){
    strChar2Unicode(Ufilename,filename[i]);    //将文件名转换为Unieede
    AddStringListCtrl(pMainListCtrl,Ufilename);//向列表框中添加表项
    strcpy(BmpFile[i],filename[i]);   //将文件名存入文件名数组
    strncat(BmpFile[i++],FileExName,3);
    }
    ReDrawOSCtrl();    //重画控件
}
U8 SetSysTime()
{
    u16*ptext=pTextCtrl->text;    //得到文本框文本指针
    U32 tmp[3],i;
    structClock clock;
    for(i=0;i<3;i++){    //从文本中分离出时间,BCD码
    tmp[i]=0;
    while(*ptext&&*ptext!=':'){
    tmp[i]<<=4;
    tmp[i]|=(*ptext)-'0';
    ptext++;
    }
    ptext++;
    }
    clock.hour=tmp[0];
    clock.minute=tmp[1];
    clock.second=tmp[2];
    if((Clock.hour<=0x24&&clock.hour>=0)&&(clock.minute>=0
    &&clock.minute<=0x60)&&(clock.second>=0&&clock.second<=0x60))
    //小时在0-24,分和秒在0~60
    {
    Set_Rtc_Clock(&clock);    //设置时间
    return TRUE;
    }
    else
    {
    return FALSE;
    }
}
void CreateText()
{
    Static char
    TimeKeyTable[]={'1','2','3',0,'4','5','6',0,'7','8','9',0,':','0',
    '\b',0);    //键值映射表
  structRECT rect;    //定义矩形结构
  int i=0;
  U16 str[20];
  SetRect(&rect,1 65,120,23 0,140);    //设置文本框
  pTextCtrl=CreateTextCtrl(ID_MainTextCtrl,&rect,FONTSIZE_MIDDLE,
    CTRL_STYLE_FRAME,TimeKeyTable,NULL);//创建文本框
    SetWndCtrlFocus(NULL,ID_MainTextCtrl);    //焦点移到文本框中
    DrawTextCtrl(pTextCtrl);    //重绘文本框
}
U8 onKey(int nkey,int fnkey);
void Main_Task(void*Id)    //Main_Test Task
{
  POSMSG pMsg=0;    //定义消息结构
  char bmpnamelogo[12]={'1','4','5','_','5','9',' ',' ','B','M','P',0);
PDC pdc;
    pdc=CreateDC();
    ClearScreen();    //清屏
    ShowBmp(pdc,bmpnamelogo,l,1);    //显示登录图片
    inifisnished=0;
    OSTimeDly(2000);
    C1earScreen();    //清屏
    CreateFileList();    //创建文件列表框
    CreateText();
    Rtc_Updata_Sem=OSSemCreate(1);
    inifisnished=l;
    //消息循环
    for(;;){
    POS_Ctrl pCtrl;    //定义控件结构指针
    pMsg=waitMessage(0);    //等待消息
    if(pMsg>pOSCtrl){    //发送给控件的消息
    if(pMsg->pOSCtrl->CtrlMsgCaliBk)
    (*pMsg->pOSCtrl->ctrlMsgcallBk)(pMsg);
    }
    else{
    switch(pMsg->Message){
    case OSM_KEY:   //键盘消息
    pCtrl=GetCtrlfromID(NULL,GetWndCtrlFocus(NULL));
    //得到焦点控件的指针
    if(pCtrl->CtrIType==CTRLTYPE_WINDOW){
    if((((PWnd)pCtrl)->style&WND_STYLE_MODE)==WND_
    STYLE_MODE){  //焦点是有模式窗口,消息直接传递过去
    OSOnSysMessage(pMsg);
    break;
    }
    }
    if(onKey(pMsg->WParam,pMsg->LParam))
    break;
    default:
    OSOnSysMessage(pMsg);
    break;
    }
    DeleteMessage(pMsg);    //删除消息
  OSTimeDly(200);
}
U8 onKey(int nkey,int fnkey)
    PDC pdc;
    U16 str[20];
    static u8 input=FALSE;    //编辑状态标志
    INT8U err;
    char errinformation[]="data flow!";    //数据溢出信息
    u8 i=0;
    switch(nkey){
    Case 11://1
    if(!input){    //没处于编辑状态
    OSSemPend(Rtc_Updata_Sem,0,&err);    //等待信号量
    pTextCtrl->text[0]=0;    //清空文本框
    SetTextCtrlEdit(pTextCtrl,TRUE);    //焦点移到文本框控件
    DrawTextCtrl(pTextCtrl);    //重绘文本框控件
    input=TRUE;    //置编辑状态标志为真
    else{
    if(SetSysTime())    //输入的数据有效
    SetTextCtrlEdit(pTextCtrl,FALSE);//退出编辑状态
    DrawTextCtrl(pTextCtrl);    //重绘文本框控件
    input=FALSE;    //置编辑状态标志为假
    OSSemPost(Rtc_Updata_Sem);    //发送信号量
    else
    {
    strChar2Unicode(pTextCtrl->text,errinformation);
    //数据溢出信息转换成unicode
    DrawTextCtrl(pTextCtrl);    //重绘文本框控件
    pTextCtrl->text[0]=0;    //清空文本框
    }
    }
    retUrn TRUE;
  Case 15://Cancel
    if(input){
    SetTextCtrlEdit(pTextCtrl,FALSE);    //退出编辑状态
    input=FALSE ;    //编辑状态标志为假
    OSSemPost(Rtc_Updata_Sem);    //发送信号量
    }
    return TRUE;
    Case 14://0K
    ClearScreen();
    pdc=createDC();    //创建绘图设备上下文
    ReDrawOSCtrl();    //重画控件
    DestoryDC(pdc);
    }
    return FALSE;
}
///////实时操作//////
void Rtc_Disp_Task(void *ID)
{double i=O;
    int second,minute,hour,clock;
    int
    J=0,k=0,second_1=0,second_2=0,minute_1=0,minute_2=0,hour_1=0,hour_2=0,
    carry_number=0;
    int xl=0,yl=0;    //画线的终点
    //各城市图片
    char BeiJing[12]={'1','2','8','-','5','0','','','B','M','P',0};
    char Newyork[12]={'1','2','8','-','5','l','','','B','M','P',0};
    char Tehela[12]={'1','2','8','-','5','2','','','B','M','P',0};
    char Paris[12]={'1','2','8','-','5','3','','','B','M','P',0};
    char Tokyo[12]={'1','2','8','-','5','4','','','B','M','P',0};
    char Nju[12]={'1','2','8','-','5','5','','','B','M','P',0};
   //定义一些时间转换的中间变量
    U16 strtime[10];
    U16 strtime2[10],Temp second l[1],Temp_second_2[1],Temp_minute_l[
    Temp minute_2[1];
    U16 Temp_hour_l[1],Temp hour 2[1],Temp_hour_unicodel[1],
    Temp_hour_unicode2[1];
  U16 Temp_minute unicodel[1],Temp_second_unicode[1],
    Temp_minute_unicode2[1];
    INTSU err;
    int nowclock;
    structTime*PstructTime;
    PDC pdc;
    pdc=CreateDC();
    if(inifisnished==0){OSTimeDly(2000);}
    for(;;){
    J=pMainListctrl->CurrentSel+l;//判断列表中选择的是第几项
    listnumber=pMainListCtrl->CurrentSel+1;
    Circle(pdc,200,6 0,55);    //画圆
    MoveTo(pdc,200,6);    //当前位置
SetPenColor(pdc,0);  //笔的颜色
SetPenWidth(pdc,3);  //笔的宽度
LineTo(pdc,200,8);    //画线
MoveTo(pdc,254,60);
SetPenColor(pdc,0);
SetPenWidth(pdc,3);
 LineTo(pdc,252,60);
MoveTo(pdc,2 00,114);
SetPenColor(pdc,0);
SetPenWidth(pdc,3);
LineTo(pdc,200,113);
MoveTo(pdc,146,60);
SetPenColor(pdc,0);
SetPenWidth(pdc,3);
LineTo(pdc,148,60);
//上面4个是画12、3、6、9点的小黑线
if(Rtc_IsTimechange(RTC_SECOND_CHANGE)){    //不需要更新显示
  OSSemPend(Rtc_Updata_Sem,0,&err);    //等待信号量
  Rtc_Format("%H:%I:%s",strtime);    //格式化时间

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -