?? main.c
字號:
/*********************************************************************************
內(nèi)容:基于嵌入式USB主機的智能點菜系統(tǒng)的設計
作者:潘卓賢
日期:2007年6月8日
**********************************************************************************/
#include <string.h>
#include "includes.h" /* uC/OS interface */
#include "lcd.h"
#include "lcdlib.h"
#include "glib.h"
#include "Bmp_Color256_320_240.h"
#include "\CH375\CH375CFG.H"
#include "\CH375\CH375HF9.H"
#include "RTC\RTC TIME.H"
extern int Image$$RO$$Limit;
extern int Image$$RW$$Base;
/*********************************************************************************
該部分用于定義或者聲明任務有關變量或者信號
*********************************************************************************/
#define STACKSIZE 300
unsigned int StackKey[STACKSIZE];
unsigned int StackDisp[STACKSIZE];
unsigned int StackView[STACKSIZE];
unsigned int StackSysSet[STACKSIZE];
unsigned int StackDataSave[STACKSIZE];
//void TaskMsgAccept(void *pdata) //客人請求信息接收任務,優(yōu)先級4
void TaskDataSave (void *pdata); //數(shù)據(jù)保存到U盤的任務,優(yōu)先級6
void TaskSysSet(void *pdata); //系統(tǒng)設置任務,優(yōu)先級8
void TaskDataView (void *pdata); //客人請求記錄查看任務,優(yōu)先級10
void TaskKey (void *pdata); //鍵盤任務,優(yōu)先級12
void TaskDisp (void *pdata); //顯示任務,優(yōu)先級14
INT8U DispLay=0; //顯示處在某一界面層的選擇
OS_EVENT *Sem; //定義互斥信號
OS_EVENT *MyMbox; //定義信號郵箱
OS_EVENT *ReMsgQeue; //定義消息隊列
void *MsgQeueTb[20]; //定義消息隊列指針數(shù)組
/**********************************************************************************
串口中斷接收函數(shù),接收客人發(fā)送的信息。
***********************************************************************************/
U8 MsgBuf[50][25],GetCnt=0,MsgCnt=0;
OS_EVENT *LCDFlsh;
OS_EVENT *KeyScrlFlh;
INT8U Temp=0xf0;
void __irq Uart0Int(void)
{
OSIntEnter();
rI_ISPC|=BIT_URXD0;
if(rUTRSTAT0 & 0x1)
{
MsgBuf[MsgCnt][GetCnt]=RdURXH0();
if(MsgBuf[MsgCnt][GetCnt]==10||GetCnt>23)
{
MsgBuf[MsgCnt][GetCnt]='\0';
GetCnt=0;
OSMboxPost(MyMbox,(void*)MsgBuf[MsgCnt]); //用于數(shù)據(jù)保存
MsgCnt++;
if(MsgCnt==50)
MsgCnt=0;
OSQPost(ReMsgQeue,&Temp); //用于刷新顯示
}
else
GetCnt++;
}
OSIntExit();
}
/**********************************************************************************
主函數(shù),端口或外設的初始化放在系統(tǒng)啟動的第一個任務(即鍵盤任務)而不放在該部分。
***********************************************************************************/
void Main(void)
{
rSYSCFG = CACHECFG; //8K字節(jié)cache,寫緩沖使能,data abort使能
rNCACHBE0 = ((Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12);
//在上面的數(shù)據(jù)區(qū)域不使用高速緩存
ChangePllValue( 24, 3, 1 ); //晶振10MHz,修改系統(tǒng)主頻為3.2倍頻(32MHz)
OSInit();
OSTaskCreate(TaskKey, (void *)0, (void *)&StackKey[STACKSIZE - 1], 12);
OSStart(); //開始啟動任務
}
/**********************************************************************************
鍵盤任務,端口或外設的初始化放在系統(tǒng)啟動的第一個任務(即鍵盤任務)而不放在該部分。
***********************************************************************************/
void TaskKey(void *pdata)
{
INT8U err;
INT8U KeyNum,Cnt;
INT8U MsgTemp[4]; //發(fā)送消息暫存
INT8U Keyarr[4],clrs=0; //按鍵發(fā)送的短信息,清屏標志
INT8U Where=0,NowMenu=0,ItemBackup=0;
InitInterrupts(); //初始化系統(tǒng)核心節(jié)拍
Port_Init(); //初始化各端口
Uart_Init(0,9600); //初始化串口
Delay(500); //延時
Uart_Select(0); //選擇串口0
Lcd_DispON(); //開啟LCD顯示,包含初時化LCD
RtcInit(SysTime); //初始化系統(tǒng)時間日期
InstallSystemTimer(); //安裝并開啟UCOS的時鐘節(jié)拍
CH375Reset(); //復位CH375芯片
mDelaymS(100 ); /* 延時50ms */
err=CH375LibInit(); //初始化CH375程序庫和CH375芯片,操作成功返回0
mStopIfError(err);
CH375_PORT_INIT( ); //打開USB硬件的中斷函數(shù)
OSStatInit(); //初始化系統(tǒng)統(tǒng)計任務,在打開系統(tǒng)節(jié)拍之前
rINTMSK&=(~(BIT_URXD0)); //以下兩句用于打開串口中斷函數(shù)
pISR_URXD0=(unsigned)Uart0Int;
//以下用于創(chuàng)建信號量
Sem=OSMutexCreate(4,&err); //創(chuàng)建互斥信號,優(yōu)先級繼承值為4
MyMbox=OSMboxCreate((void*)0); //創(chuàng)建消息郵箱
ReMsgQeue=OSQCreate(&MsgQeueTb[0],20); //最大可以存放20條消息
OSTaskCreate(TaskDisp, (void *)0, (void *)&StackDisp[STACKSIZE - 1], 14);
OSTaskCreate(TaskDataSave, (void *)0, (void *)&StackDataSave[STACKSIZE - 1],6);
while(1)
{
OSTimeDly(50);
MsgTemp[0]=0xe1;
OSQPost(ReMsgQeue,(void*)MsgTemp);//定期刷新狀態(tài)欄目
KeyNum=0;
if(Key1)
{
while(Key1) OSTimeDly(40);
KeyNum=1;
}
if(Key2)
{
while(Key2) OSTimeDly(40);
KeyNum=2;
}
if(Key3)
{
while(Key3) OSTimeDly(40);
KeyNum=3;
}
if(Key4)
{
while(Key4) OSTimeDly(40);
KeyNum=4;
}
if(!KeyNum)
continue;
if(KeyNum==1)
{
DispLay++;
if(DispLay==3)
DispLay=0;
if(DispLay==2)
{ OSTaskDel(8); //刪除時間顯示設置任務。
}
MsgTemp[0]=0xe2;MsgTemp[1]=DispLay;
OSQPost(ReMsgQeue,(void*)MsgTemp); //定期刷新狀態(tài)欄目
}
switch(DispLay)
{
case 0:
switch(KeyNum)
{
case 1:
Keyarr[0]=0xf1;
//Where=0;
//ItemBackup=0;
//NowMenu=0;
break;
case 2: //向上鍵
if(Where)
{
ItemBackup=NowMenu;
Where--;
NowMenu--;
Keyarr[0]=0xf2; //局部更新
}
else
{
if(NowMenu)
{
NowMenu--;
Keyarr[0]=0xf1; //全部更新
}
else
{
Keyarr[0]=0; //不操作
}
}
break;
case 3:
if(Where<14)
{
ItemBackup=NowMenu;
if(NowMenu==MsgCnt-1||MsgCnt==0)
break;
Where++;
NowMenu++;
Keyarr[0]=0xf2; //局部更新
}
else
{
if(NowMenu<MsgCnt-1)
{
NowMenu++;
Keyarr[0]=0xf1; //全部更新
}
else
{
Keyarr[0]=0; //不操作
}
}
break;
case 4:
Keyarr[0]=0xf1;
Where=0;
ItemBackup=0;
NowMenu=0;
break;
}
Keyarr[1]=NowMenu;
Keyarr[2]=ItemBackup;
Keyarr[3]=Where;
break;
case 1:
switch(KeyNum)
{
case 1:
Keyarr[0]=0xA0;
Cnt=0;
OSTaskCreate(TaskSysSet, (void *)0, (void *)&StackSysSet[STACKSIZE - 1], 8);
break;
case 2:
Cnt--;
if(Cnt==255)
Cnt=2;
Keyarr[0]=0xA1;
break;
case 3:
Cnt++;
if(Cnt==3)
Cnt=0;
Keyarr[0]=0xA1;
break;
case 4:
Keyarr[0]=0xA2;
break;
}
Keyarr[2]=Cnt;
break;
case 2:
switch(KeyNum)
{
case 1:
OSTaskCreate(TaskDataView, (void *)0, (void *)&StackView[STACKSIZE - 1],10);
break;
case 2:
break;
case 3:
break;
case 4:
break;
}
Keyarr[0]=0;
break;
}
OSQPost(ReMsgQeue,(void*)Keyarr);
}
}
/**********************************************************************************
顯示任務,根據(jù)發(fā)送的消息隊列獲取命令,并解析命令,相應的顯示其他內(nèi)容
***********************************************************************************/
#define Blue 0xfc
#define Black 0x00
#define Red 0x1f
#define White 0xff
#define Green 57
#define Yellow 63
#define Purple 135
#define Orange 41
#define MaxBar 15 //顯示條項的最大數(shù)目
void TaskDisp (void *pdata)
{
INT8U err,*pt,i,Cnt,*ErrPt,*BmpPt;
INT8U NowMenu,Where,ItemBackup; //當前菜單;以及其位置,之前菜單位置。
LCD_BGColor =Blue;
LCD_PenColor =Purple;
Lcd256_Clear(Yellow);
BmpPt =acFROG; //背景圖片選取
LCD_WritePixel(0,0,320-1,240-16,BmpPt); //在LCD上面顯畫面
LCD_TextOut("消息",8,226);LCD_PenColor =Black;
LCD_TextOut("設置",40,226);
LCD_TextOut("資料",72,226);
while(1)
{
RtcGetTime(SysTime);
LCD_PrinSet(178,226);LCD_BGColor =Green;
LCD_Printf("CPU使用%2d%%",(U16)OSCPUUsage);
LCD_BGColor =Yellow;
if(CH375DiskStatus==DISK_CONNECT)
LCD_TextOut("(U)",154,226);
else
LCD_TextOut(" ",154,226);
LCD_PrinSet(253,226);LCD_BGColor =Blue; //藍色
LCD_Printf("%02d:%02d:%02d",SysTime->hour,SysTime->min,SysTime->sec);
pt=(INT8U *)OSQPend(ReMsgQeue,0,&err);
if(pt[0]==0xe1) //清屏
continue; //刷新狀態(tài)欄
if(pt[0]==0xe0) //清屏
{
LCD_WritePixel(0,0,320-1,240-16,BmpPt);
//在LCD上面顯畫面 刷新
}
if(pt[0]==0xe2) //更新任務欄
{
switch(pt[1])
{
case 0:
LCD_PenColor=Purple;
LCD_TextOut("消息",8,226);LCD_PenColor=Black;
LCD_TextOut("資料",72,226);
break;
case 1:
LCD_TextOut("消息",8,226);LCD_PenColor=Purple;
LCD_TextOut("設置",40,226);LCD_PenColor=Black;
break;
case 2:
LCD_WritePixel(0,0,320-1,240-16,BmpPt);
LCD_TextOut("設置",40,226);LCD_PenColor=Purple;
LCD_TextOut("資料",72,226);LCD_PenColor=Black;
break;
}
continue;
}
if(pt[0]==0xf0) //串口接收更新消息的內(nèi)容
{
if(MsgCnt<=15)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -