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

📄 common.c

📁 AT91fr40162的FLASH读写程序
💻 C
📖 第 1 页 / 共 3 页
字号:
}

//=================================================================
// 打开或关闭红灯
//=================================================================
void LEDGreen(_BYTE cStatus,_BYTE cTime)
{
	if (cStatus==OFF){
		gcpCPLDReg[2] |= CPLD_LED_G;
		pCPLD[4]=gcpCPLDReg[2];
		gcOpenLEDGreen = OFF;
	}
	else{
		gcpCPLDReg[2] &= ~CPLD_LED_G;
		pCPLD[4]=gcpCPLDReg[2];
		if (cTime!=0) {
			gcOpenLEDGreen = ON;
			gcLEDGreenLightTime = cTime;
		}	
	}
}


//=================================================================
// 打开或关闭绿灯
//=================================================================
void LEDRed(_BYTE cStatus,_BYTE cTime)
{
	if (cStatus==OFF){
		gcpCPLDReg[2] |= CPLD_LED_R;
		pCPLD[4]=gcpCPLDReg[2];
		gcOpenLEDRed = OFF;
	}
	else{
		gcpCPLDReg[2] &= ~CPLD_LED_R;	
		pCPLD[4] = gcpCPLDReg[2];
		if (cTime!=0) {
			gcOpenLEDRed = ON;
			gcLEDRedLightTime = cTime;
		}	
	}
}

//=================================================================
// 打开或关闭蜂鸣器
//=================================================================
void SoundOnOff(_BYTE cStatus)
{
   	if (cStatus==ON) {
     	gcpCPLDReg[3] |= CPLD_BEEP;
     	pCPLD[6] = gcpCPLDReg[3];
   	}
   	else {
     	gcpCPLDReg[3] &=~CPLD_BEEP;
     	pCPLD[6]=gcpCPLDReg[3];
     	gcOpenBeep = 0;
   	}
}	

void Delayms(_DWORD dwTime)
{
 	_DWORD  i;
 	while(dwTime--) {
      	for (i=0;i<MCK/5000;i++);
 	}
}

void Delays(_DWORD dwTime)
{
   	_DWORD i,j;
    for(i=0; i<dwTime; i++)  
    	for (j=0;j<MCK/5;j++);
}

void DelayMCK4(_DWORD dwTime)
{
   	_DWORD i ;
    for(i=0; i<dwTime; i++) ;
}

void Delay10us(_DWORD dwTime){
    unsigned int dummy;
	gcTimer0Flag = 0xff;
	gdwTimer0Counter = dwTime;
    dummy = MY_TC0_SR;			//* Clear status bit 
    dummy = dummy;					//* Suppress warning variable "dummy" was set but never used
    //* Enable the clock
	MY_TC0_CCR = AT91C_TC_CLKEN;
	MY_TC0_CCR = AT91C_TC_SWTRG ;
	loop:
	if (gcTimer0Flag==0xff) goto loop;
	return;
}

//=================================================================
// 开机时进行断电前信息的恢复
//=================================================================
void PowerOnRecovery(void)
{
   	_BYTE  cRetCode;
   	_BYTE  i,j,cWidth,cMode;
	cWidth = 0;
   	for (i=0;i<LENOFDCBT/8;i++) {
      	cMode = 0x80;
      	for (j=0;j<8;j++) {
         	if ((DAT[i] & cMode)!=0) cWidth++;
         	cMode = cMode >> 1;
        }
   	}

   	if ((CSI.cStatus==S_WAIT_TRAIN)||(CSI.cStatus==S_TRAINING)||(cWidth!=0)) {
      	DispLCDClearScreen();       // 清显示
      	DispOutText(0,0,12,(_BYTE *)"   *系统恢复*   ");
      	DispOutText(3,0,10 ,(_BYTE *)" 恢复中, 请等待 ");
      	DispRefresh(0,0,6,VIDEOCOL,1);
      	cRetCode = RebuildDCBT();           // 根据Flash中的DCBT重构DCBT表
      	// 重构全局变量
      	if (cRetCode!=C_OK){
         	DispOutText(6,0,12,(_BYTE *)"    恢复失败    ");
         	DispRefresh(6,0,2,VIDEOCOL,1);
         	Delays(1);
         	SetStatus(S_INIT);
         	return;
      	}
      	// 恢复CDTI信息,将Flash中的CDTI信息恢复到内存的CDTI中
      	if (CSI.cStatus==S_TRAINING) {
         	cRetCode = FlashReadWriteCDTI(&CDTI,ICREAD);
         	if (cRetCode!=C_OK) {
         		cRetCode = C_NOTOK;
 				for (cWidth=1;cWidth<LENOFDCBT;cWidth++)
      				if (DCBT[cWidth].cFlag==0) {
      					GetCDTI(cWidth);
      					CSI.cCurDCB=cWidth;
      					cRetCode =C_OK;
      				}
      			if (cRetCode!=C_OK) {	         		
         			DispOutText(6,0,12,(_BYTE *)"    恢复失败    ");
         			DispRefresh(6,0,2,VIDEOCOL,1);
         			Delays(1);
               		SetStatus(S_INIT);
               		return;
            	}
         	}
      	}
   	}
   	else
      	return;
   	DispOutText(6,0,12,(_BYTE *)"    恢复成功    ");
   	DispRefresh(6,0,2,VIDEOCOL,1);
   	Delays(1);
   	
   // 恢复成功转此处
   	gCurDriverCount=0;
   	for (cWidth=1;cWidth<LENOFDCBT;cWidth++)
      	if (DCBT[cWidth].cFlag) gCurDriverCount++;
   	switch (CSI.cStatus){
      	case S_WAIT_TRAIN:                     // 恢复到等待训练状态
         	gcDispChanged = 1;
         	gcClockFreshFlag = 1;
         	break;

      	case S_TRAINING:                       // 恢复训练状态
      		if (gCurDriverCount==0) {
				SetStatus(S_WAIT_TRAIN);
	         	gcDispChanged = 1;
    	     	gcClockFreshFlag = 1;
      		}
      		else {
         		CSI.cCurDCB = CDTI.cSeq;
         		gcValidSeconds = CDTI.cCycleSecond;
         		gcDispChanged=1;
         		gcClockFreshFlag = 1;
         		gcTrainFreshFlag = 1;
         	}	
         	break;
   	}
}


//=================================================================
// 显示卡内容
// 显示的内容包括持卡人的姓名
//=================================================================
void DisplayCardInfo(SBIEF_1 *sBIEFBaseInfo,SBIEF_2 *sBIEFTrainInfo,SBIEF_3 *sBIEFTimeInfo,_BYTE cWait,_BYTE cDetail)
{
   	_BYTE  cpBuf[12],cPage;
   	_DWORD dwTimeOrMile,dwTmp;
   	_DWORD dwTotalTime,dwTotalMile;
   	_DWORD dwFieldTime,dwFieldMile;
   	_DWORD dwRoadTime,dwRoadMile;
	cPage = 1;

   	switch (sBIEFBaseInfo->cCardType) {
      	case 0x01:
         	break;

      	case 0x02:
      	case 0x03:
         	if (cWait==0) DispLCDClearScreen();
         	if (sBIEFBaseInfo->cCardType==0x02)
            	DispOutText(0,0,4,(_BYTE *)" 教练:");
         	else
            	DispOutText(0,0,4,(_BYTE *)" 学员:");
         	DispOutImage(0,6*8,2,8*8,(_BYTE *)&sBIEFBaseInfo->cpName[0]);   	// 显示姓名

         	DispOutText(2,0,4,(_BYTE *)" 时间:");
         	dwTimeOrMile = sBIEFTrainInfo->dwDayFieldTotalTime;
         	dwTimeOrMile += sBIEFTrainInfo->dwDayRoadTotalTime;
         	dwTimeOrMile += sBIEFTrainInfo->dwNightFieldTotalTime;
         	dwTimeOrMile += sBIEFTrainInfo->dwNightRoadTotalTime;
         	TimeMileToString(dwTimeOrMile,0,cpBuf,TIMESUM);
         	DispOutText(2,6*8,9,cpBuf);

         	DispOutText(4,0,4,(_BYTE *)" 里程:");
         	dwTimeOrMile = sBIEFTrainInfo->dwDayFieldTotalMile;
         	dwTimeOrMile += sBIEFTrainInfo->dwDayRoadTotalMile;
         	dwTimeOrMile += sBIEFTrainInfo->dwNightFieldTotalMile;
         	dwTimeOrMile += sBIEFTrainInfo->dwNightRoadTotalMile;
         	TimeMileToString(dwTimeOrMile,0,cpBuf,MILESUM);
         	DispOutText(4,6*8,9,cpBuf);

         	DispOutText(6,0,4,(_BYTE *)" 容量:");
         	dwTimeOrMile = sBIEFTrainInfo->wCurrentItem;
         	LongToString(dwTimeOrMile,cpBuf,4);
         	cpBuf[4]='/';
         	dwTimeOrMile = sBIEFBaseInfo->wMaxItem;
         	LongToString(dwTimeOrMile,cpBuf+5,4);
         	DispOutText(6,6*8,9,cpBuf);
         	break;

      	case 0x04:
         	break;

      	default:
         	DisplayMessage(C_ICINVALID,6,1,WAITDISP,RECOVERYDISP);
         	break;
   	}
   	DispRefresh(0,0,8,VIDEOCOL,1);
   	// 等待按键
   	if ((cDetail==0)&&(cWait)) {
      	KeyReadKey();         	                   // 扫描键盘
      	dwTimeOrMile = 10000;
      	while(dwTimeOrMile>0) {
         	if (gcKeyUp) {
            	gcKeyUp = FALSE;
            	break;
         	}
         	dwTimeOrMile--;
         	KeyReadKey();         	                   // 扫描键盘
         	Delayms(1);
      	}
   	}
   	
   	if (cDetail==0) return;
   	dwFieldTime = sBIEFTrainInfo->dwDayFieldTotalTime + sBIEFTrainInfo->dwNightFieldTotalTime;
   	dwFieldMile = sBIEFTrainInfo->dwDayFieldTotalMile + sBIEFTrainInfo->dwNightFieldTotalMile;
   	dwRoadTime = sBIEFTrainInfo->dwDayRoadTotalTime + sBIEFTrainInfo->dwNightRoadTotalTime;
   	dwRoadMile = sBIEFTrainInfo->dwDayRoadTotalMile + sBIEFTrainInfo->dwNightRoadTotalMile;
   	dwTotalTime = dwFieldTime + dwRoadTime;
   	dwTotalMile = dwFieldMile + dwRoadMile;

	while (1) {
      	KeyReadKey();
      	if (gcKeyUp) {
         	gcKeyUp = FALSE;
         	if (gdwKeyNum==CANCEL_CHANGE_KEY) {
            	gcDispChanged=1;
            	return;
     		}
       		DispLCDClearScreen();
           	DispOutText(0,0,4,(_BYTE*)" 场训:");
    	    dwTimeOrMile = dwFieldTime;
        	dwTmp = dwTimeOrMile/60;
            LongToString(dwTmp,cpBuf,3);
            Trim(cpBuf,3);
            DispOutText(0,6*8,3,cpBuf);
	        DispOutText(0,9*8,1,(_BYTE*)"时");
    	    dwTmp = dwTimeOrMile%60;
        	LongToString(dwTmp,cpBuf,2);
            DispOutText(0,11*8,2,cpBuf);
            DispOutText(0,13*8,1,(_BYTE*)"分");
          	DispOutText(2,0,4,(_BYTE*)" 路训:");
    	    dwTimeOrMile = dwRoadTime;
        	dwTmp = dwTimeOrMile/60;
            LongToString(dwTmp,cpBuf,3);
            Trim(cpBuf,3);
            DispOutText(2,6*8,3,cpBuf);
	        DispOutText(2,9*8,1,(_BYTE*)"时");
    	    dwTmp = dwTimeOrMile%60;
        	LongToString(dwTmp,cpBuf,2);
            DispOutText(2,11*8,2,cpBuf);
            DispOutText(2,13*8,1,(_BYTE*)"分");
          	DispOutText(4,0,4,(_BYTE*)" 总量:");
    	    dwTimeOrMile = dwTotalTime;
        	dwTmp = dwTimeOrMile/60;
            LongToString(dwTmp,cpBuf,3);
            Trim(cpBuf,3);
            DispOutText(4,6*8,3,cpBuf);
	        DispOutText(4,9*8,1,(_BYTE*)"时");
    	    dwTmp = dwTimeOrMile%60;
        	LongToString(dwTmp,cpBuf,2);
            DispOutText(4,11*8,2,cpBuf);
            DispOutText(4,13*8,1,(_BYTE*)"分");
       		DispRefresh(0,0,VIDEOPAGE,VIDEOCOL,1);
      	} // end of if key
   	} // end of while
}


//=================================================================
// 根据BIEF信息生成DCB信息
// sBIEFBaseInfo,sBIEFTrainInfo,sBIEFTimeInfo:存放BEIF信息
// sDCB:存放DCB信息

⌨️ 快捷键说明

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