📄 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) //按键选择时更新消息的内容
{
LCD_WritePixel(0,0,320-1,240-16,BmpPt);
//在LCD上面显画面 刷新
Where=pt[3]; //获取菜单项目有关信息
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) //消息移动时候恢复
{
Where=pt[3]; //获取菜单项目有关信息
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); //恢复非叠加显示
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);
//恢复原来部分
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); //恢复原来部分
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;
}
}
}
/**********************************************************************************
文件操作函数,理应放在另一个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为刷新文件数目;1为枚举文件;返回为文件数目-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; // 根据字符串长度将结束符替换为搜索的序号,从0到255
i = CH375FileOpen(); // 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开
if ( i == ERR_MISS_FILE ) {return(j-1);break;} // 再也搜索不到匹配的文件,已经没有匹配的文件名
if ( i == ERR_FOUND_NAME ) // 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中
{
if(type)
Uart_Printf( "%03d:%s", (unsigned int)j, mCmdParam.Open.mPathName );// 显示序号和搜索到的匹配文件名或者子目录名
continue; //继续搜索下一个匹配的文件名,下次搜索时序号会加1
}
else // 出错
{
mStopIfError( i );
break;
}
}
}
/////////////////////////////////////////////////
/* 检查操作状态*/
INT8U Msg[2];
INT8U Error=0x01;
void mStopIfError( U8 iError )
{
if ( iError == ERR_SUCCESS ) return; /* 操作成功 */
Error=0x01;
OSQPost(ReMsgQeue,(void*)&Error); //发送出错提示
OSTimeDly(800);
Error=0x02;
OSQPost(ReMsgQeue,(void*)&Error); //发送出错提示
CH375Reset(); //复位CH375芯片
OSTimeDly(100);
CH375LibInit(); //初始化CH375程序库和CH375芯片,操作成功返回0
Msg[0]=0;
}
/**********************************************************************************
数据保存到U盘的任务。
***********************************************************************************/
void TaskDataSave (void *pdata)
{
INT8U i,*pt,err;
while(1)
{
while ( CH375DiskStatus != DISK_CONNECT ) /* 查询CH375中断并更新中断状态,等待U盘插入 */
OSTimeDly(50);
for ( i = 0; i < 5; i ++ )
{ /* 有的U盘总是返回未准备好,不过可以被忽略 */
if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */
}
pt=(INT8U *)OSMboxPend(MyMbox,0,&err);
strcpy( mCmdParam.Open.mPathName, "\\MSG.TXT"); /* 文件名,该文件在根目录下 */
i = CH375FileOpen(); /* 打开文件 */
if ( i == ERR_SUCCESS )
{ /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */
mCmdParam.ByteLocate.mByteOffset = 0xffffffff; /* 移到文件的尾部 */
i = CH375ByteLocate( );
}
else if ( i == ERR_MISS_FILE )
{ /* 没有找到文件,必须新建文件 */
// mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/MY_ADC.TXT" ); /* 文件名,该文件在根目录下,刚才已经提供给CH375FileOpen */
i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
}
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; /* 指定本次写入的字节数,单次读写的长度不能超过MAX_BYTE_IO */
i = CH375ByteWrite( ); /* 以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO */
mStopIfError( i );
mCmdParam.Modify.mFileAttr = 0xff; /* 输入参数: 新的文件属性,为0FFH则不修改 */
mCmdParam.Modify.mFileTime = MAKE_FILE_TIME( SysTime->hour,SysTime->min, SysTime->sec ); /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 */
mCmdParam.Modify.mFileDate = MAKE_FILE_DATE(SysTime->year,SysTime->month,SysTime->day); /* 输入参数: 新的文件日期: 2004.05.18 */
mCmdParam.Modify.mFileSize =0xffffffff; //输入参数: 新的文件长度,以字节为单位写文件应该由程序库关闭文件时自动更新长度,所以此处不修改
i = CH375FileModify( ); /* 修改当前文件的信息,修改日期和长度 */
mCmdParam.Close.mUpdateLen =1; //自动计算文件长度
i = CH375FileClose( );
mStopIfError( i );
}
}
/**********************************************************************************
设置任务,现在改为显示时间动态刷新任务。
***********************************************************************************/
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字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 */
NewSize = FILE_DATA_BUF_LEN; /* 由于RAM有限所以限制长度 */
}
else
{ /* 如果原文件较小,那么使用原长度 */
SecCount = ( CH375vFileSize + 511 ) >> 9; /* (CH375vFileSize+511)/512, 计算文件的扇区数,因为读写是以扇区为单位的,先加511是为了读出文件尾部不足1个扇区的部分 */
NewSize = (UINT16)CH375vFileSize; /* 原文件的长度 */
}
mCmdParam.Read.mSectorCount = SecCount; /* 读取全部数据,如果超过60个扇区则只读取60个扇区 */
/* current_buffer = & FILE_DATA_BUF[0]; 如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址 */
CH375vFileSize += 511; /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 */
i = CH375FileRead( ); /* 从文件读取数据 */
CH375vFileSize -= 511; /* 恢复原文件长度 */
}
OSQPost(ReMsgQeue,(void*)Msg);
OSTaskDel(OS_PRIO_SELF);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -