📄 worldclock.txt
字号:
世界时钟源代码详解
本综合实验程序中实验者自已编写的代码都在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 + -