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

📄 menu.c

📁 AT91fr40162的FLASH读写程序
💻 C
字号:
#include "dtm_v3.h"
#include "dtm.h"
#include "externdef.h"
#include <stdio.h>

_BYTE DeviceInit(void);
_BYTE ChangeDriver(_BYTE *cDCBSeq);
void MenuDisplayWin(_BYTE cWinMin,_BYTE cWinMax,_BYTE cBarPos,_BYTE *cpBuf);
_BYTE Estimantation(void);

//=================================================================
// 名称:DeviceInit
// 函数:设备初始化,首次使用设备时初始化FLASH
// 返回:成功返回C_OK,否则返回错误码
//=================================================================
_BYTE DeviceInit(void)
{
	struct StruCSI sCSI;
	struct StruSPB sSPB;
	_BYTE cpDATBuf[LENOFDAT];
	int i;
	_BYTE cRetCode;
	
   	DispLCDClearScreen();
   	DispOutText(0,0,11,(_BYTE *)"   初始化确认   ");
   	DispOutText(2,0,11,(_BYTE *)"  确认初始化吗? ");
   	DispOutText(4,0,9,(_BYTE *)"按[确认]键初始化");
   	DispOutText(6,0,10,(_BYTE *)"  按其它键取消  ");
   	DispRefresh(0,0,8,VIDEOCOL,1);
   	i=0;
   	while(i<0x2200) {
      	KeyReadKey();
      	if (gcKeyUp) {
         	gcKeyUp = FALSE;
         	if (gdwKeyNum!=ENTER_MENU_KEY) 
         		return(C_OK);
         	else
         		break;	
      	}
      	Delayms(1);
      	i++;
   	}
	
	// 初始化CSI 
	sCSI.cStatus = S_WAIT;								// 手持机的当前状态
	sCSI.cCurDCB = 0xff;                     			// 当前DCB序号,仅在训练状态下有效
	cRetCode = FlashReadWriteCSI(&sCSI,ICWRITE);
	if (cRetCode!=C_OK) return(cRetCode);

	// 初始化DAT
	for (i=0;i<LENOFDAT;i++) cpDATBuf[i]=0x00;
	cRetCode = FlashReadWriteDAT(cpDATBuf,ICWRITE);
	if (cRetCode!=C_OK) return(cRetCode);

	// 初始化SPB
	sSPB.wKParm = 970;								// K系数
	sSPB.cVerifyCycle = 120;						// 验证指纹的时间周期
	sSPB.cSpeedLimit = 60;							// 速度上限
	sSPB.cSpeedLine = 10;							// 区分场地和道路训练的临界值
	sSPB.cTimeCycle = 4;							// 区分训练类型的时间周期
	for (i=0;i<12;i++)
		sSPB.cpDayNightLine[i] = 18<<3;				// 区分日训和夜训的时间临界值
	cRetCode = FlashReadWriteSPB(&sSPB,ICWRITE);
	if (cRetCode!=C_OK) return(cRetCode);
	
	// 初始化队列指针
	for (i=0;i<LENOFQUEUEPOINT/2;i++) cpDATBuf[i]=0x00;
	cRetCode = FlashReadWriteQueuePoint(cpDATBuf,ICWRITE,INQUEUE,0);
	if (cRetCode!=C_OK) return(cRetCode);
	cRetCode = FlashReadWriteQueuePoint(cpDATBuf,ICWRITE,OUTQUEUE,0);
	if (cRetCode!=C_OK) return(cRetCode);
	cRetCode = FlashReadWriteQueuePoint(cpDATBuf,ICWRITE,INQUEUE,1);
	if (cRetCode!=C_OK) return(cRetCode);
	cRetCode = FlashReadWriteQueuePoint(cpDATBuf,ICWRITE,OUTQUEUE,1);
	if (cRetCode!=C_OK) return(cRetCode);
	ReBoot();
	return(C_OK);
}

//=================================================================
// 变更驾驶员
// 返回选择的驾驶员的编号
//=================================================================
_BYTE ChangeDriver(_BYTE *cDCBSeq)
{
   _BYTE i,cCurPos,cBarPos,cMaxPos,cWinMin,cWinMax;
   _BYTE cpBuf[LENOFDCBT];
   // 初始化变量
   for (i=0;i<LENOFDCBT;i++) cpBuf[i]=0xff;
   cBarPos=0;
   cCurPos=0;
   for (i=1;i<LENOFDCBT;i++) {
      if (CSI.cCurDCB==i) cCurPos=cBarPos;
      if (DCBT[i].cFlag==1) cpBuf[cBarPos++]=i;
   }
   cMaxPos = cBarPos-1;
   cBarPos = cCurPos;

   // 设置初始窗口的位置
   if ((cBarPos+3)<=cMaxPos) {
      cWinMin = cBarPos;
      cWinMax = (cBarPos+3>cMaxPos?cMaxPos:cBarPos+3);
   }
   else {
      cWinMin = (cMaxPos>3?cMaxPos-3:0);
      cWinMax = cMaxPos;
   }
   if ((cBarPos<cWinMin)||(cBarPos>cWinMax)) cBarPos=cWinMin;
   // 显示
   MenuDisplayWin(cWinMin,cWinMax,cBarPos,cpBuf);

   while(1) {
      KeyReadKey();
      if (gcKeyUp) {
         gcKeyUp = FALSE;
         switch(gdwKeyNum) {
            case CANCEL_CHANGE_KEY:
               return(C_CANCELED);

            case ENTER_MENU_KEY:
               *cDCBSeq = cpBuf[cBarPos];
               if (*cDCBSeq<LENOFDCBT)
                  return(C_OK);
               else
                  return(C_NOTOK);

            case LOGOUT_PGDN_KEY:
               if (cBarPos<cWinMax) {
                  DispRefresh((cBarPos-cWinMin)*2,0,2,VIDEOCOL,1);
                  cBarPos++;
                  DispRefresh((cBarPos-cWinMin)*2,0,2,VIDEOCOL,0);
               }
               else {
                  if (cWinMax<cMaxPos) {
                     cCurPos = (cWinMax+4>cMaxPos?cMaxPos:cWinMax+4);
                     cCurPos = cCurPos - cWinMax;
                     cWinMax = (cWinMax+4>cMaxPos?cMaxPos:cWinMax+4);
                     cWinMin += cCurPos;
                     if (cBarPos<cWinMax) cBarPos++;
                     // 整屏刷新
                     MenuDisplayWin(cWinMin,cWinMax,cBarPos,cpBuf);
                  }
               }
               break;

            case LOGIN_PGUP_KEY:
               if (cBarPos>cWinMin) {
                  DispRefresh((cBarPos-cWinMin)*2,0,2,VIDEOCOL,1);
                  cBarPos--;
                  DispRefresh((cBarPos-cWinMin)*2,0,2,VIDEOCOL,0);
               }
               else {
                  if (cWinMin>0) {
                     cCurPos = (cWinMin>4?cWinMin-4:0);
                     cCurPos = cWinMin - cCurPos;               // 计算移动步长
                     cWinMin = (cWinMin>4?cWinMin-4:0);
                     cWinMax -= cCurPos;
                     if (cBarPos>cWinMin) cBarPos--;
                     // 整屏刷新
                     MenuDisplayWin(cWinMin,cWinMax,cBarPos,cpBuf);

                  }
               }
               break;
         }
      }
   }

   return(C_OK);
}

//=================================================================
// 刷新显示屏
// cWinMin:显示屏起始行在cpBuf的位置
// cWinMax:显示屏中止行在cpBuf的位置
// cBarPos:光标条在cpBuf的位置
// cpBuf:DCBT序号的列表,反映当前所有学员
//=================================================================
void MenuDisplayWin(_BYTE cWinMin,_BYTE cWinMax,_BYTE cBarPos,_BYTE *cpBuf)
{
   _BYTE cPage,i;
   _BYTE cpSeq[2];
   DispLCDClearScreen();
   for (i=cWinMin;i<=cWinMax;i++) {
      cPage = i-cWinMin;
      DispOutText(cPage*2,0,2,(_BYTE *)"  ");
      cpSeq[0]=((i+1)/10)+0x30;
      cpSeq[1]=((i+1)%10)+0x30;
      DispOutText(cPage*2,16,2,cpSeq);
      DispOutText(cPage*2,32,1,(_BYTE *)" ");
      DispOutImage(cPage*2,5*8,2,8*8,&DCBT[cpBuf[i]].cpName[0]);     // 显示姓名
      if (i==cBarPos)
         DispRefresh(cPage*2,0,2,VIDEOCOL,0);
      else
         DispRefresh(cPage*2,0,2,VIDEOCOL,1);
      cPage++;
   }
   while(cPage<4) {
      DispOutText(cPage*2,0,14,(_BYTE *)"              ");
      DispRefresh(2*cPage,0,2,VIDEOCOL,1);
      cPage++;
   }
}

//=================================================================
// 显示菜单,选择对教练员的评价
// 评价分:满意,一般,不满意 三个级别,进入评价窗口时缺省显示一般
// 函数的返回值为:3表示满意,2表示一般,1表示不满意
//=================================================================
_BYTE Estimantation(void)
{
   _BYTE cRow;
   DispLCDClearScreen();                                      // 请屏
   DispOutText(0,0,10,(_BYTE *)" *对教练满意度* ");                 // 显示初始信息
   DispOutText(2,0,14,(_BYTE *)"    1. 满  意   ");                //
   DispOutText(4,0,14,(_BYTE *)"    2. 中  等   ");                //
   DispOutText(6,0,13,(_BYTE *)"    3. 不满意   ");                //
   DispRefresh(0,0,VIDEOPAGE,VIDEOCOL,1);
   cRow=2;
   DispRefresh(2*cRow,0,2,VIDEOCOL,0);                       //
   while(1) {
      KeyReadKey();
      if (gcKeyUp) {
         gcKeyUp = FALSE;
         switch(gdwKeyNum) {
            case CANCEL_CHANGE_KEY:
               break;

            case ENTER_MENU_KEY:
               DispRefresh(2*cRow,0,2,VIDEOCOL,1);    //
               return(4-cRow);

            case LOGIN_PGUP_KEY:
               DispRefresh(2*cRow,0,2,VIDEOCOL,1);    //
               cRow = (cRow==1?3:cRow-1);
               DispRefresh(2*cRow,0,2,VIDEOCOL,0);    //
               break;

            case LOGOUT_PGDN_KEY:
               DispRefresh(2*cRow,0,2,VIDEOCOL,1);    //
               cRow = (cRow==3?1:cRow+1);
               DispRefresh(2*cRow,0,2,VIDEOCOL,0);    //
               break;
         }
      }
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -