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

📄 main.c.bak

📁 CH375移植到S3C44B0
💻 BAK
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************************
内容:基于嵌入式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 + -