?? main.c
字號:
{ for(i=0;i<MsgCnt;i++)
{
LCD_PrinSet(0,i*14);
LCD_Printf("消息%d:%s\n",(U16)(i+1),MsgBuf[i]);
}
}
else
{ LCD_WritePixel(0,0,320-1,240-16,BmpPt);
//在LCD上面顯畫面 刷新
Cnt=MsgCnt-15;
for(i=0;i<15;i++)
{
LCD_PrinSet(0,i*14);
LCD_Printf("消息%d:%s\n",(U16)(i+Cnt+1),MsgBuf[i+Cnt]);
}
}
}
if(pt[0]==0xf1) //按鍵選擇時更新消息的內(nèi)容
{
LCD_WritePixel(0,0,320-1,240-16,BmpPt);
//在LCD上面顯畫面 刷新
Where=pt[3]; //獲取菜單項目有關(guān)信息
NowMenu=pt[1];
if(MsgCnt>0)
{
LCD_PrinSet(0,Where*14);
LCD_BGColor =Red;
LCD_Printf("消息%d:%s\n",(U16)(NowMenu+1),MsgBuf[NowMenu]);
LCD_BGColor =Blue;
}
if(MsgCnt>=2)
{
for(i=Where;i>0;i--) //顯示上半部分菜單選項
{
LCD_PrinSet(0,(i-1)*14);
LCD_Printf("消息%d:%s\n",(U16)(NowMenu+1-(Where-i+1)),MsgBuf[NowMenu-(Where-i+1)]);
if((NowMenu-Where+i-1)==0)
break;
}
for(i=Where+1;i<MaxBar;i++) //顯示下半部分菜單選項
{
if(NowMenu==MsgCnt-1)
break;
LCD_PrinSet(0,i*14);
LCD_Printf("消息%d:%s\n",(U16)(NowMenu+1+(i-Where)),MsgBuf[NowMenu+(i-Where)]);
if((NowMenu+1+(i-Where))==MsgCnt)
break;
}
}
}
if(pt[0]==0xf2) //消息移動時候恢復(fù)
{
Where=pt[3]; //獲取菜單項目有關(guān)信息
ItemBackup=pt[2];
NowMenu=pt[1];
LCD_PrinSet(0,Where*14);
LCD_BGColor =Red;
LCD_Printf("消息%d:%s\n",(U16)(NowMenu+1),MsgBuf[NowMenu]);
LCD_BGColor =Blue;
if(ItemBackup>NowMenu)
{
LCD_PrinSet(0,(Where+1)*14);
LCD_Printf("消息%d:%s\n",(U16)(ItemBackup+1),MsgBuf[ItemBackup]);
}
else if(ItemBackup<NowMenu)
{
LCD_PrinSet(0,(Where-1)*14);
LCD_Printf("消息%d:%s\n",(U16)(ItemBackup+1),MsgBuf[ItemBackup]);
}
}
if(pt[0]==0xA0)
{
LCD_WritePixel(0,0,320-1,240-16,BmpPt);
//在LCD上面顯畫面 刷新
Glib_FilledRectangle(113,91,209,147,High_Low(Green));
Glib_Rectangle(113,91,209,147,High_Low(Red));
Glib_Line(113,105,209,105,High_Low(Red));
Glib_Line(114,148,209,148,Black);
Glib_Line(115,149,209,149,Black);
Glib_Line(210,91,210,149,Black);
FontOver(1); //疊加顯示
LCD_TextOut("請選擇背景圖片:",115,93);
LCD_TextOut(" 2 荷花.BMP ",115,121);
LCD_TextOut(" 3 動漫.BMP ",115,134);
FontOver(0); //恢復(fù)非疊加顯示
LCD_BGColor=Purple;
LCD_PenColor=Yellow;
LCD_TextOut(" 1 青蛙.BMP ",115,108);
LCD_PenColor=Black;
}
if(pt[0]==0xA1)
{
switch(pt[2])
{
case 0:
LCD_BGColor=Green;
LCD_TextOut(" 2 荷花.BMP ",115,121);
LCD_TextOut(" 3 動漫.BMP ",115,134);
LCD_BGColor=Purple;
LCD_PenColor=Yellow;
LCD_TextOut(" 1 青蛙.BMP ",115,108);
LCD_PenColor=Black;
break;
case 1:
LCD_BGColor=Green;
LCD_TextOut(" 1 青蛙.BMP ",115,108);
LCD_TextOut(" 3 動漫.BMP ",115,134);
LCD_BGColor=Purple;
LCD_PenColor=Yellow;
LCD_TextOut(" 2 荷花.BMP ",115,121);
LCD_PenColor=Black;
break;
case 2:
LCD_BGColor=Green;
LCD_TextOut(" 1 青蛙.BMP ",115,108);
LCD_TextOut(" 2 荷花.BMP ",115,121);
LCD_BGColor=Purple;
LCD_PenColor=Yellow;
LCD_TextOut(" 3 動漫.BMP ",115,134);
LCD_PenColor=Black;
break;
}
}
if(pt[0]==0xa2)
{
switch(pt[2])
{
case 0:
BmpPt=acFROG;
break;
case 1:
BmpPt=acLOTUS;
break;
case 2:
BmpPt=acShrek;
break;
}
pt=(INT8U *)malloc(6000);
LCD_ReadPixel(113,91,210,149,pt);
LCD_WritePixel(0,0,320-1,240-16,BmpPt);
//在LCD上面顯示新的畫面
LCD_WritePixel(113,91,210,149,pt);
//恢復(fù)原來部分
free(pt); //釋放空間
}
if(pt[0]==0xa3)
{
RtcGetTime(SysTime);
LCD_PenColor =Black;
LCD_BGColor =White;
LCD_PrinSet(68,163);
LCD_Printf("%04d年%2d月%2d日%02d時%02d分%02d秒",SysTime->year,SysTime->month,SysTime->day,SysTime->hour,SysTime->min,SysTime->sec);
}
if(pt[0]==0x01)
{
ErrPt=(INT8U *)malloc(1950);
LCD_ReadPixel(113,105,220,122,ErrPt);
Glib_FilledRectangle(113,105,220,122,High_Low(Red));
LCD_BGColor=Red;
LCD_TextOut("提示:U盤讀寫出錯",115,108);
}
if(pt[0]==0x02)
{
LCD_WritePixel(113,105,220,122,ErrPt); //恢復(fù)原來部分
free(ErrPt); //釋放空間
}
if(pt[0]==0x03)
{
Glib_FilledRectangle(113,105,220,122,High_Low(Red));
LCD_BGColor=Red;
LCD_TextOut("提示:U盤沒有連接",115,108);
}
if(pt[0]==0x04)
{
LCD_BGColor=Black;
Glib_FilledRectangle(0,0,320-1,240-16,Black);
LCD_PenColor=Green;
LCD_TextOut("文件<\\Msg.TXT>中記錄的信息如下:",0,0);
LCD_PrinSet(0,14);
LCD_PenColor=White;
LCD_Printf("%s",FILE_DATA_BUF);
LCD_PenColor=Black;
}
}
}
/**********************************************************************************
文件操作函數(shù),理應(yīng)放在另一個C文件,此處為了方便。
**********************************************************************************/
UINT8 mCopyCodeStringToIRAM( UINT8 *iDestination, UINT8 *iSource )
{
UINT8 i = 0;
while ( *iDestination = *iSource )
{
iDestination ++;
iSource ++;
i ++;
}
return( i );
}
//////////////////////////
UINT8 File_Enumer(UINT8 *path,char type) //0為刷新文件數(shù)目;1為枚舉文件;返回為文件數(shù)目-1(含0開始)
{
UINT8 i;
UINT16 j;
if(type)
Uart_Printf("Enumer files:");
for ( j = 0; j < 255; j ++ ) //最多搜索前255個文件
{
i = mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, path); //搜索文件名,*為通配符,適用于所有文件或者子目錄
mCmdParam.Open.mPathName[ i ] = j; // 根據(jù)字符串長度將結(jié)束符替換為搜索的序號,從0到255
i = CH375FileOpen(); // 打開文件,如果文件名中含有通配符*,則為搜索文件而不打開
if ( i == ERR_MISS_FILE ) {return(j-1);break;} // 再也搜索不到匹配的文件,已經(jīng)沒有匹配的文件名
if ( i == ERR_FOUND_NAME ) // 搜索到與通配符相匹配的文件名,文件名及其完整路徑在命令緩沖區(qū)中
{
if(type)
Uart_Printf( "%03d:%s", (unsigned int)j, mCmdParam.Open.mPathName );// 顯示序號和搜索到的匹配文件名或者子目錄名
continue; //繼續(xù)搜索下一個匹配的文件名,下次搜索時序號會加1
}
else // 出錯
{
mStopIfError( i );
break;
}
}
}
/////////////////////////////////////////////////
/* 檢查操作狀態(tài)*/
INT8U Msg[2];
INT8U Error=0x01;
void mStopIfError( U8 iError )
{
if ( iError == ERR_SUCCESS ) return; /* 操作成功 */
Error=0x01;
OSQPost(ReMsgQeue,(void*)&Error); //發(fā)送出錯提示
OSTimeDly(800);
Error=0x02;
OSQPost(ReMsgQeue,(void*)&Error); //發(fā)送出錯提示
CH375Reset(); //復(fù)位CH375芯片
OSTimeDly(100);
CH375LibInit(); //初始化CH375程序庫和CH375芯片,操作成功返回0
Msg[0]=0;
}
/**********************************************************************************
數(shù)據(jù)保存到U盤的任務(wù)。
***********************************************************************************/
void TaskDataSave (void *pdata)
{
INT8U i,*pt,err;
while(1)
{
while ( CH375DiskStatus != DISK_CONNECT ) /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */
OSTimeDly(50);
for ( i = 0; i < 5; i ++ )
{ /* 有的U盤總是返回未準(zhǔn)備好,不過可以被忽略 */
if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準(zhǔn)備好 */
}
pt=(INT8U *)OSMboxPend(MyMbox,0,&err);
strcpy( mCmdParam.Open.mPathName, "\\MSG.TXT"); /* 文件名,該文件在根目錄下 */
i = CH375FileOpen(); /* 打開文件 */
if ( i == ERR_SUCCESS )
{ /* 文件存在并且已經(jīng)被打開,移動文件指針到尾部以便添加數(shù)據(jù) */
mCmdParam.ByteLocate.mByteOffset = 0xffffffff; /* 移到文件的尾部 */
i = CH375ByteLocate( );
}
else if ( i == ERR_MISS_FILE )
{ /* 沒有找到文件,必須新建文件 */
// mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/MY_ADC.TXT" ); /* 文件名,該文件在根目錄下,剛才已經(jīng)提供給CH375FileOpen */
i = CH375FileCreate( ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */
}
else
mStopIfError( i ); /* 打開文件時出錯 */
i = sprintf( mCmdParam.ByteWrite.mByteBuffer, "%04d年%2d月%2d日%02d時%02d分%02d秒\xd\xa %s \xd\xa",SysTime->year,SysTime->month,SysTime->day,SysTime->hour,SysTime->min,SysTime->sec,pt);
mCmdParam.ByteWrite.mByteCount = i; /* 指定本次寫入的字節(jié)數(shù),單次讀寫的長度不能超過MAX_BYTE_IO */
i = CH375ByteWrite( ); /* 以字節(jié)為單位向文件寫入數(shù)據(jù),單次讀寫的長度不能超過MAX_BYTE_IO */
mStopIfError( i );
mCmdParam.Modify.mFileAttr = 0xff; /* 輸入?yún)?shù): 新的文件屬性,為0FFH則不修改 */
mCmdParam.Modify.mFileTime = MAKE_FILE_TIME( SysTime->hour,SysTime->min, SysTime->sec ); /* 輸入?yún)?shù): 新的文件時間,為0FFFFH則不修改,使用新建文件產(chǎn)生的默認(rèn)時間 */
mCmdParam.Modify.mFileDate = MAKE_FILE_DATE(SysTime->year,SysTime->month,SysTime->day); /* 輸入?yún)?shù): 新的文件日期: 2004.05.18 */
mCmdParam.Modify.mFileSize =0xffffffff; //輸入?yún)?shù): 新的文件長度,以字節(jié)為單位寫文件應(yīng)該由程序庫關(guān)閉文件時自動更新長度,所以此處不修改
i = CH375FileModify( ); /* 修改當(dāng)前文件的信息,修改日期和長度 */
mCmdParam.Close.mUpdateLen =1; //自動計算文件長度
i = CH375FileClose( );
mStopIfError( i );
}
}
/**********************************************************************************
設(shè)置任務(wù),現(xiàn)在改為顯示時間動態(tài)刷新任務(wù)。
***********************************************************************************/
void TaskSysSet (void *pdata) //用于時間的刷新
{ INT8U Temp=0xa3;
while(1)
{
OSTimeDly(200);
OSQPost(ReMsgQeue,(void*)&Temp);
}
}
/***********************************************************************************
FILE_DATA_BUF[];
************************************************************************************/
void TaskDataView (void *pdata)
{
INT8U i;
UINT16 SecCount;
UINT32 NewSize;
while(1)
{
if(CH375DiskStatus != DISK_CONNECT)
Msg[0]=0x03;
else
{ Msg[0]=0x04;
strcpy( mCmdParam.Open.mPathName, "\\MSG.TXT"); /* 文件名,該文件在根目錄下 */
i = CH375FileOpen( );
mStopIfError( i );
if ( CH375vFileSize > FILE_DATA_BUF_LEN )
{
SecCount = FILE_DATA_BUF_LEN / 512; /* 由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以只讀取不超過63個扇區(qū),也就是不超過32256字節(jié) */
NewSize = FILE_DATA_BUF_LEN; /* 由于RAM有限所以限制長度 */
}
else
{ /* 如果原文件較小,那么使用原長度 */
SecCount = ( CH375vFileSize + 511 ) >> 9; /* (CH375vFileSize+511)/512, 計算文件的扇區(qū)數(shù),因為讀寫是以扇區(qū)為單位的,先加511是為了讀出文件尾部不足1個扇區(qū)的部分 */
NewSize = (UINT16)CH375vFileSize; /* 原文件的長度 */
}
mCmdParam.Read.mSectorCount = SecCount; /* 讀取全部數(shù)據(jù),如果超過60個扇區(qū)則只讀取60個扇區(qū) */
/* current_buffer = & FILE_DATA_BUF[0]; 如果文件讀寫的數(shù)據(jù)的復(fù)制方式為"外部子程序",那么需要設(shè)置存放數(shù)據(jù)的緩沖區(qū)的起始地址 */
CH375vFileSize += 511; /* 默認(rèn)情況下,以扇區(qū)方式讀取數(shù)據(jù)時,無法讀出文件尾部不足1個扇區(qū)的部分,所以必須臨時加大文件長度以讀取尾部零頭 */
i = CH375FileRead( ); /* 從文件讀取數(shù)據(jù) */
CH375vFileSize -= 511; /* 恢復(fù)原文件長度 */
}
OSQPost(ReMsgQeue,(void*)Msg);
OSTaskDel(OS_PRIO_SELF);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -