📄 main.c.bak
字号:
/*********************************************************************************
内容:基于嵌入式USB主机的智能点菜系统的设计
作者:潘卓贤
日期: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) //客人请求信息接收任务,优先级4
void TaskDataSave (void *pdata); //数据保存到U盘的任务,优先级6
void TaskSysSet(void *pdata); //系统设置任务,优先级8
void TaskDataView (void *pdata); //客人请求记录查看任务,优先级10
void TaskKey (void *pdata); //键盘任务,优先级12
void TaskDisp (void *pdata); //显示任务,优先级14
INT8U DispLay=0; //显示处在某一界面层的选择
OS_EVENT *Sem; //定义互斥信号
OS_EVENT *MyMbox; //定义信号邮箱
OS_EVENT *ReMsgQeue; //定义消息队列
void *MsgQeueTb[20]; //定义消息队列指针数组
/**********************************************************************************
串口中断接收函数,接收客人发送的信息。
***********************************************************************************/
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]); //用于数据保存
MsgCnt++;
if(MsgCnt==50)
MsgCnt=0;
OSQPost(ReMsgQeue,&Temp); //用于刷新显示
}
else
GetCnt++;
}
OSIntExit();
}
/**********************************************************************************
主函数,端口或外设的初始化放在系统启动的第一个任务(即键盘任务)而不放在该部分。
***********************************************************************************/
void Main(void)
{
rSYSCFG = CACHECFG; //8K字节cache,写缓冲使能,data abort使能
rNCACHBE0 = ((Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12);
//在上面的数据区域不使用高速缓存
ChangePllValue( 24, 3, 1 ); //晶振10MHz,修改系统主频为3.2倍频(32MHz)
OSInit();
OSTaskCreate(TaskKey, (void *)0, (void *)&StackKey[STACKSIZE - 1], 12);
OSStart(); //开始启动任务
}
/**********************************************************************************
键盘任务,端口或外设的初始化放在系统启动的第一个任务(即键盘任务)而不放在该部分。
***********************************************************************************/
void TaskKey(void *pdata)
{
INT8U err;
INT8U KeyNum,Cnt;
INT8U MsgTemp[4]; //发送消息暂存
INT8U Keyarr[4],clrs=0; //按键发送的短信息,清屏标志
INT8U Where=0,NowMenu=0,ItemBackup=0;
InitInterrupts(); //初始化系统核心节拍
Port_Init(); //初始化各端口
Uart_Init(0,9600); //初始化串口
Delay(500); //延时
Uart_Select(0); //选择串口0
Lcd_DispON(); //开启LCD显示,包含初时化LCD
RtcInit(SysTime); //初始化系统时间日期
InstallSystemTimer(); //安装并开启UCOS的时钟节拍
CH375Reset(); //复位CH375芯片
mDelaymS(100 ); /* 延时50ms */
err=CH375LibInit(); //初始化CH375程序库和CH375芯片,操作成功返回0
mStopIfError(err);
CH375_PORT_INIT( ); //打开USB硬件的中断函数
OSStatInit(); //初始化系统统计任务,在打开系统节拍之前
rINTMSK&=(~(BIT_URXD0)); //以下两句用于打开串口中断函数
pISR_URXD0=(unsigned)Uart0Int;
//以下用于创建信号量
Sem=OSMutexCreate(4,&err); //创建互斥信号,优先级继承值为4
MyMbox=OSMboxCreate((void*)0); //创建消息邮箱
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);//定期刷新状态栏目
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); //定期刷新状态栏目
}
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);
}
}
/**********************************************************************************
显示任务,根据发送的消息队列获取命令,并解析命令,相应的显示其他内容
***********************************************************************************/
#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 //显示条项的最大数目
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; //刷新状态栏
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) //串口接收更新消息的内容
{
if(MsgCnt<=15)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -