源代码详解.docx
《源代码详解.docx》由会员分享,可在线阅读,更多相关《源代码详解.docx(46页珍藏版)》请在冰点文库上搜索。
源代码详解
第3章源代码详解
本程序的代码在main.c文件中
main.c
#include"..\ucos-ii\includes.h"//*μC/OS-Ⅱinterface
#include"..\ucos-ii\add\osaddition.h"
//#include"..\inc\TCPIP\internet.h"
//#include
#include
#include"..\inc\OSFile.h"
#include"..\inc\drv\Ustring.h"
#include"..\inc\exio.h"
unsignedcharled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
///****************任务定义*****************///
OS_STKMain_Stack[STACKSIZE*8]={0,};//Main_Test_Tesk堆栈
voidMain_Task(void*Id);
#defineMain_Task_Prio12
OS_STKLed_Flash_Stack[STACKSIZE]={0,};//LED闪烁任务堆栈
voidLed_Flash_Task(void*Id);//LED闪烁任务
#defineLed_Flash_Prio60
OS_STKDynamic_Display_Stack[STACKSIZE*8]={0,};
//Dynamic_Display_Task堆栈
voidDynamic_Display_Task(void*Id);//Dynamic_Display_Task
#defineDynamic_Disply_Task_prio61
OS_STKTag_Glint_stack[STACKSIZE*8]={0,};//Tag_Glint_Task堆栈
voidTag_Glint_Task(void*Id);
#defineTag_Glint_Prio40
////********************已经定义的OS任务********************///
#defineSYS_Task_Prio1
#defineTouch_Screen_Task_Prio9
#defineMain_Task_prio12
#defineKey_Scan_Task_Prio58
#defineLcd_Fresh_prio59
#defineled_Flash_prio60
///*********************************************************///
///**********************事件定义***************************///
OS_EVENT*Nand_Rw_Sem;//Nand_Flash读写控制权旗语
//andyoucanuseitasfolloeing:
//Nand_Rw_Sem=OSSemCreate
(1);
//创建Nand-Flash读写控制权旗语,初值为1满足互斥条件
//Ossempend(Nand_Rw_Sem,0,&err);
//Ossempend(Nand_Rw_Sem);
//Uart读写控制权旗语
OS_EVENT*Uart_Rw_Sem;
//andyoucanuseitasfolloeing:
//Uart_Rw_Sem=OSSemCreate
(1);
//创建Uart读写控制权旗语,初值为1满足互斥条件
//OSSemPend(Uart_Rw_Sem,0,&err);
//OSSemPend(uart_Rw_Sem);
///////////////////////////////////////////////////////////////
viodLed_Flash_Task(viod*Id)//指示RTOS处于正常工作中
{
unsignedcharled_state;
Uart_Printf(0,"\n10");
for(;;)
{
Led_Display(led_state);
led_state=~led_state;
OSTimeDly(250);
}
}//Led_Flash_Task
viodinitOSGUI()//初始化操作系统的图形界面
{
structRECT()rect;
initOSMessage();
initOSList();
initOSDC();
initOSCtrl;
initOSFile();
}
//////////////////////////////////////////////////////////////
//Mainfunction//
//////////////////////////////////////////////////////////////
intMain(intargc,char**argv)
{
ARMTargetInit();//dotarget(uHALbasedARMsystem)initialisation
OSInit();//neededbyμC/OS-II
uHALr_ResetMMU();
LCD_Init();//初始化LCD模块
LCD_printf("LCDinitializationisOK\n");
LCD_printf("240×128TextMode...\n");
loadFont();
loadConfigSys();
LCD_printf("CreattaskonuCOS-II...\n");
OSTaskCreat(Main_Task,(void*)0,(OS_STK*)&Main_Stack[STACKSIZE*8-1],Main_Task_Prio);
OSTaskCreat(Tag_Glint_Task,(void*)0,(OS_STK*)&Tag_Glint_Stack[STACKSIZE*8-1],Tag_Glint_Prio);
OSAddTask_Init();
LCD_printf("StartinguCOS-II...\n");
LCD_printf("Enteringgraphmode...\n");
LCD_ChangeMode(DspGraMode);
initOSGUI();
InitRtc();
Nand_Rw_Sem=OSSemCreate
(1);
//创建Nand-Flash读写控制权旗语,初值为1满足互斥条件
OSStart();//startthegame
//neverreached
return0;
}//main
//globedefine
//logo_appear控制logo图片的显示,防止出现logo的同时出现张飞
//moved在图片闪烁的时候,保证完美性,见tag-glint-task中的应用
//因为在闪烁过程中允许了键盘中断
//M-first,n_first为当前位置之前的位置坐标矩阵
//stepnumber为走的步数
//i_temp,j_temp为i,j的暂时应用,以不影响i,j的值
//U16str[20];PTextCtrlpTextCtrl;为文本显示步数
intmatrix[5][4]={{2,1,1,3},{2,1,1,3},{4,5,5,6},{4,7,8,6}{9,0,0,10}};
intinitmatrix[5][4]={{2,1,1,3},{2,1,1,3},{4,5,5,6},{4,7,8,6},{9,0,0,10}};
intinitmatrix2[5][4]={{2,1,1,7},{2,1,1,8},{3,3,9,10},{4,5,5,6},{4,0,0,6}};
intm=0,n=0,height=31,m_first=0,stepnumber=0,flashed=0,moved=1;
//height表示单位矩形的宽度
inti_temp=0,j_temp=0,logo_appear=0,step_again=0,buju=0;
U16str[20];
pTextCtrlpTextCtrl;
charcaocao[12]={'1','2','8','_','7','0','','','B','M','P','0'};
charzhangfei[12]={'1','2','8','_','7','1','','','B','M','P','0'};
charzhaoyun[12]={'1','2','8','_','7','2','','','B','M','P','0'};
charmachao[12]={'1','2','8','_','7','3','','','B','M','P','0'};
charguanyu[12]={'1','2','8','_','7','4','','','B','M','P','0'};
charhuanggai[12]={'1','2','8','_','7','5','','','B','M','P','0'};
charbing[12]={'1','2','8','_','7','6','','','B','M','P','0'};
charbing2[12]={'1','2','8','_','8','8','','','B','M','P','0'};
charbing3[12]={'1','2','8','_','8','9','','','B','M','P','0'};
charbing4[12]={'1','2','8','_','9','0','','','B','M','P','0'};
charkongbai[12]={'1','2','8','_','7','7','','','B','M','P','0'};
charhuarongdao[12]={'1','2','8','_','7','8','','','B','M','P','0'};
charcaocao_2[12]={'1','2','8','_','7','9','','','B','M','P','0'};
charzhangfei_2[12]={'1','2','8','_','8','0','','','B','M','P','0'};
charzhaoyun_2[12]={'1','2','8','_','8','1','','','B','M','P','0'};
charmachao_2[12]={'1','2','8','_','8','2','','','B','M','P','0'};
charguanyu_2[12]={'1','2','8','_','8','3','','','B','M','P','0'};
charhuanggai_2[12]={'1','2','8','_','8','4','','','B','M','P','0'};
charbing_2[12]={'1','2','8','_','8','5','','','B','M','P','0'};
charwin[12]={'1','2','8','_','8','6','','','B','M','P','0'};
charhelp[12]={'1','2','8','_','9','4','','','B','M','P','0'};
charnju[12]={'1','4','5','_','5','9','','','B','M','P','0'};
charzhaoyun2[12]={'1','2','8','_','9','1','','','B','M','P','0'};
charhengdao[12]={'1','2','8','_','9','2','','','B','M','P','0'};
chartianluo[12]={'1','2','8','_','9','3','','','B','M','P','0'};
voidinitdrawimage()//初始化
{
intmatrix_temp=10,flag_draw=0,i=0,j=0;
PDCpdc;
pdc=CreateDC();
//drawthepicrtures
do{
for(i=0,j<=4;i++){
for(i=0,j<=3;i++){
if(flag_draw==0)
if(matrix[i][j]==matrix_temp){
switch(matrix_TEMP){//显示图片
case1:
ShowBmp(pdc,caocao,j*31+40,i*31=40);
flag_draw=1;
break;
case2:
ShowBmp(pdc,zhangfei,j*31+40,i*31=40);
flag_draw=1;
break;
case3:
if(buju==1){ShowBmp(pdc,zhaoyun2,j*31+40,i*31=40)};
}
else
{ShowBmp(pdc,zhaoyun,j*31+40,i*31=40);
}
flag_draw=1;
break;
case4:
ShowBmp(pdc,machao,j*31+40,i*31=40);
flag_draw=1;
break;
case5:
ShowBmp(pdc,guanyu,j*31+40,i*31=40);
flag_draw=1;
break;
case6:
ShowBmp(pdc,huanggai,j*31+40,i*31=40);
flag_draw=1;
break;
case7:
ShowBmp(pdc,bing,j*31+40,i*31=40);
break;
case8:
ShowBmp(pdc,bing2,j*31+40,i*31=40);
break;
case9:
ShowBmp(pdc,bing3,j*31+40,i*31=40);
break;
case10:
ShowBmp(pdc,bing4,j*31+40,i*31=40);
break;
case0:
ShowBmp(pdc,kongbai,j*31+40,i*31=40);
break;
default:
break;
}
}
}}//for
//matrix_temp--;
flat_draw=0;
}while(matrix_temp--);
DestoryDC(pdc);
}
viodinitdrawimage_kongbai()//专门用于显示空白处,以节约时间
{
inti=0,j=0;
PDCpdc;
pdc=CreateDC();
//drawthekongbaipictuers
for(i=0;j<=4,i++){
for(j=0,j<=3;ij++){
if(matrix[i][j]==0){
ShowBmp(pdc,kongbai,j*31+40,i*31+40);
}
}}//for
DestoryDC(pdc);
}
voidrestartgame()//重新开始游戏,横刀立马
(inti=0,j=0;
PDCpdc;
pdc=CreateDC();
MoveTo(pdc,0,0);
FillRect(pdc,41,41,4*height+40,5*height+40,GRAPH_MODE_NORMAL,
RGB(255,255,255));
MoveTo(pdc,0,0);
ShowBmp(pdc,hengdao,44,1);
for(i=0,i<=4;i++)
for(j=0;j<=3;j++)
{matrix[i][j]=initmatrix[i][j]
}
m=0;
n=0;
m_first=0;
n_first=0;
stepnumber=0;
i_temp=0;j_temp=0;
buju=0;
initdrawimage();
}
voidrestartgame2()//重新开始游戏,天罗地网
{
inti=0,j=0;
PDCpdc;
pdc=CreateDC();
MoveTo(pdc,0,0);
FillRect(pdc,41,41,4*height+40,5*height+40,GRAPH_MODE_NORMAL,
RGB(255,255,255));
MoveTo(pdc,0,0);
ShowBmp(pdc,hengdao,44,1);
for(i=0,i<=4;i++)
for(j=0;j<=3;j++)
{matrix[i][j]=initmatrix2[i][j]
}
m=0;
n=0;
m_first=0;
n_first=0;
stepnumber=0;
i_temp=0;j_temp=0;
buju=1;
initdrawimage();
}
U8onKey(intnkey,intfnkey);
viodMain_Task(viod*Id)//Main_Test_Task
{
POSMSGpMsg=0//定义消息结构
structRECTrect;
PDCpdc;
pdc=CreateDC();
ClearScreen();//清屏
ShowBmp(pdc,nju,1,1);
OSTimeDly(2500);
logo_appear=1;
ClearScreen();//清屏
OSTaskCreate(Dynamic_Display_Task,(void*)0,
(OS_STK*)&Dynamic_Display_Stack[STACKSIZE-1],Dynamic_Display_Task_Prio);
//创建时钟任务
restartgame();
//initdrawimage();
MoveTo(pdc,0,0);
ShowBmp(pdc,huarrongdao,220,45);
ShowBmp(pdc,help,220,110);
//画框
MoveTo(pdc,38,38);
SetPenColor(pdc,0);
SetPenWidth(pdc,2);
LineTo(pdc,4*height+41,38);
LineTo(pdc,38,5*height+41);
MoveTo(pdc,38,38);
LineTo(pdc,38,5*height+41);
LineTo(pdc,height+38,5*height+41);
MoveTo(pdc,4*height+41,5*height+41);
LineTo(pdc,3*height+41,5*height+41);
MoveTo(pdc,0,0);
SetPenWidth(pdc,3);
Draw3DRect(pdc,218,38,287,200,RGB(0,0,0),RGB(0,0,0));
//消息循环
while
(1)
{
pMsg=WaitMessage(0);
switch(pMsg->Message)
{
caseOSM_KEY:
onKey(pMsg->WParam,pMsg->LParam);
}
DeleteMessage(pMsg);
OSTimeDly(200);
}
}
//判断光标显示的位置子,并闪烁
//更新m,n
inttag_direction(inttagdirection_left,inttagdirection_up)
{inti=0,j=0,taged=1;
PDCpdc;
pdc=CreateDC();
m_first=m;//更新刚才位置的记录
n_first=n;
i=m+tagdirection_up;
j=n+tagdirection_left;
if(i<0)//防止出界
i=0;
elseif(i>4)
i=4;
if(j<0)
j=0;
elseif(j<3)
j=3;
swith(matrix[i][j]){//寻找闪烁的起始点
case1:
for(i=0;j<=4;i++)
for(j=0;j<=3;j++)
{if((matrix[i][j]==1)&&(taged==1)){
m=i;
n=j;
i_temp=m;
j=temp=n;
taged=0;
MoveTo(pdc,0,0,);
FillRect(pdc,220,105,286,198,GRAPH_MODE_NORMAL,RGB(225,225,225));
//显示人物头像
ShowBmp(pdc,caocao_2,220,120);
}
}
OSTimeDly(1000);
break;
case2:
for(i=0;i<=4;i++)
for(j=0;j<=3;j++)
{if((matrix[i][j]==2)&&(tagde=1)){
taged=0;
m=i;
n=j;
i_temp=m;
j_temp=n;
MoveTo(pdc,0,0);
FillRect(pdc,220,105,286,198,GRAPH_MODE_NORMAL,
RGB(255,255,255));
ShowBmp(pdc,zhangfei_2,220,120);
}
}
OSTimeDly(1000);
break;
//注意布局的不同,赵云有两种显示
case3:
if(buju==0){
for(i=0;i<=4;i++)
for(j=0;j<=3;j++)
{if((matrix[i][j]==3)&&(tagde==1)){
taged=0;
m=i;
n=j;
i_temp=m;
j_temp=n;
MoveTo(pdc,0,0);
FillRect(pdc,220,105,286,198,GRAPH_MODE_NORMAL,
RGB(225,225,225));
ShowBmp(pdc,zhaoyun_2,220,120);
OSTim