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

📄 main.c

📁 C51单片机端
💻 C
字号:

#include <string.h>
#include <stdio.h>

#include "config.h"
#include "isp.h"
#include "lcd.h"
#include "system.h"
#include "hex.h"

void vInitSystem(void);
void uart_tx(Uchar tx_data);

extern unsigned char Msg;
extern unsigned char m_BankSector;
extern unsigned char mBuffer[256];
extern unsigned int  offset;
extern unsigned char SreialStr;

unsigned int  mSectorSize;
unsigned char m_Bank;
unsigned int  moffset;

float mPer;
float mPercent;

void main(void)
{
	unsigned char mPTick=0;
	unsigned char mFlashTimes;
	unsigned int  mFlashMax;
	unsigned int  mFlashID;
	unsigned long mErrsum;

	mFlashID = vFlashId();
	vInitSystem();
	SreialStr = 0;

	//界面显示	
	vDrawLogo(4, 36, 256, 72, 1);
	lprintf(7,166,0,"FirmWare V1.0 12/15/06");
    lprintf(7,184,0,"Serial No  xxxx-xxxx");
    lprintf(7,202,0,"Device ID  =  %4X",mFlashID);
	lprintf(3,220,0,"Cheng Ji Ltd.");
	
	Msg = HEX_DEC_OK;
	while(1)
	{
		switch (Msg) 
		{
			case HEX_DEC_SECTOR_IRQ :
				mFlashID = vFlashId();
				Msg = HEX_DEC_OK;
				vCOmSend(2, 0x1D, mFlashID);  //返回FLASH ID号				
				break;
			
			case HEX_DEC_SECTOR_BANK :
				mSectorSize = offset;
				Msg = HEX_DEC_OK;
				vCOmSend(2, 0x1E, mSectorSize);  //返回FLASH扇区大小
				break;			
                                                       
			case HEX_DEC_START      :  //开始
				mFlashMax = 0;         //每帧允许编程次数
				mPer = 0;
				mPTick = 0;
				mErrsum = 0;                                
				vFlashErase();            //擦除Flash
				Msg = HEX_DEC_OK;
				lprintf(7,126,0,"Programing ......                ");		
				vCOmSend(0, 0x05, 0);		//就绪
				break;						

			case HEX_DEC_SEG_ERR    :      //段错误
				Msg = HEX_DEC_OK;
				vCOmSend(0, 0x09, 0);	
				break;

			case HEX_DEC_SEG_DATA   :     //段数据
				m_Bank = m_BankSector;
				Msg = HEX_DEC_OK;
				vCOmSend(0, 0x08, 0);	  //段正确
				break;

			case HEX_DEC_FRAME_ERR  :      //帧错误
				Msg = HEX_DEC_OK;
				vCOmSend(0, 0x07, 0);      //帧错误 
				break;

			case HEX_DEC_FRAME_DATA :      //帧数据
				moffset = offset;
				mFlashMax = 0;
				vWriteSector(mBuffer,mSectorSize,offset,m_Bank);
				if((mFlashMax = vVerify(mBuffer,mSectorSize,moffset,m_Bank)) !=0)
				{
					mFlashTimes = 1;
					vWriteSector(mBuffer,mSectorSize,offset,m_Bank);
					if((mFlashMax = vVerify(mBuffer,mSectorSize,moffset,m_Bank)) !=0)
					{
						mFlashTimes = 2;
						vWriteSector(mBuffer,mSectorSize,offset,m_Bank);
						if((mFlashMax = vVerify(mBuffer,mSectorSize,moffset,m_Bank)) !=0)
						{
							vWriteSector(mBuffer,mSectorSize,offset,m_Bank);
							mFlashMax = vVerify(mBuffer,mSectorSize,moffset,m_Bank);
						}
					}
				}
				if(mFlashMax != 0)
				{
					mErrsum += (unsigned long )mFlashMax;
					lprintf(7,148,0,"Error Number is  %ld",mErrsum);	
					Msg = HEX_DEC_OK;
					vCOmSend(0, 0x1A, 0);  //烧写错误
					break;
				}
				
				mPer += (float)mSectorSize;
		       	mPTick++;
				if(7<mPTick)
				{
					mPTick = 0;
					mPercent   = (float)(mPer/(4*65536.0));
					mPercent = mPercent*100+0.5;
					lprintf(24,126,0,"%3d%c",(unsigned int)mPercent,'%');	
				}
				Msg = HEX_DEC_OK;
				vCOmSend(0, 0x06, 0);	     //帧正确 
				break;						
			
			case HEX_DEC_FRAME_IRQ  :     //帧请求
				Msg = HEX_DEC_OK;
				if(((moffset == 0xFF80)&&(mSectorSize==128))||((moffset == 0xFF00)&&(mSectorSize==256)))
				{
					vCOmSend(0, 0x0F, 0);  //帧结束
				}
				else vCOmSend(0, 0x0E, 0); //下一帧
				break;					

			case HEX_DEC_SEG_IRQ    :     //段请求
				Msg = HEX_DEC_OK;
				if(m_Bank<3)vCOmSend(0, 0x0B, 0); //下一段	
				else vCOmSend(0, 0x0C, 0);        //段结束
				break;					

			case HEX_DEC_END :     //结束
				Msg = HEX_DEC_OK;
				mFlashMax = 0;            //每帧允许编程次数
				mPer = 0;
				mPTick = 0;
				mErrsum = 0;                                
				lprintf(7,148,0,"256K Btye Program Sucess");	
				break;

			case HEX_DEC_PROGRAM_ERR :
				Msg = HEX_DEC_OK;
				mFlashMax = 0;            //每帧允许编程次数
				mPer = 0;
				mPTick = 0;
				mErrsum = 0;                                
				lprintf(7,126,0,"Programing Error ......          ");		
				break;
			
			//////////////////////////////////////////////////////////////////
		
			case HEX_DEC_VERIFY_START :    //开始比较命令
				mPer = 0;
				mPTick = 0;
				moffset = 0;
				lprintf(7,126,0,"Veriy Processing ...            ");
				lprintf(7,148,0,"                                 ");
				Msg = HEX_DEC_OK;
				vCOmSend(0, 0x11, 0);  //比较就绪
				break;

			case HEX_DEC_SEG_VERIFY_ERR : //比较段数据错误
				Msg = HEX_DEC_OK;
				vCOmSend(0, 0x14, 0);     //比较段数据错误
				break;
			
			case HEX_DEC_SEG_VERIFY_DATA : //比较段地址正确
				m_Bank = m_BankSector;
				Msg = HEX_DEC_OK;
				vCOmSend(0, 0x13, 0);      //比较段地址正确
				break;
				
			case HEX_DEC_FRAME_VERIFY_DATA :  //比较帧地址
				moffset = offset;
				mPer += (float)mSectorSize;
		       	mPTick++;
				if(7<mPTick)
				{
					mPTick = 0;
					mPercent = (float)(mPer/(4*65536.0));
					mPercent = mPercent*100+0.5;
					lprintf(28,126,0,"%3d%c",(unsigned int)mPercent,'%');	
				}
				Msg = HEX_DEC_OK;
				vSendBuff(offset,mSectorSize,m_Bank);
				break;
			
			case HEX_DEC_VERIFY_FRAME_IRQ :	  //帧比较请求
				Msg = HEX_DEC_OK;
				if(((moffset == 0xFF80)&&(mSectorSize==128))||((moffset == 0xFF00)&&(mSectorSize==256)))
				{
					vCOmSend(0, 0x18, 0); //比较帧结束
				}
				else
				{
					vCOmSend(0, 0x17, 0); //比较帧继续
				}
				break;
			
			case HEX_DEC_VERIFY_FRAME_END :
				Msg = HEX_DEC_OK;
				lprintf(7,126,0,"%s%c","Success for Verify...100",'%');	
				break;

			case HEX_DEC_OK :
				break;

			default : break;

		}
	}  
}

void vInitSystem(void)
{
#if Sp756P==1
	vInitUart();
	vInitLcd();
    vClearLcd();
#else
	vInitUart();
	vInitLcd();
    vClearLcd();
	UsbWriteCom(0xF3);
	UsbWriteData(0x0E);
	UsbWriteData(0x0B);
#endif
	vEnterInterrupt();
}



⌨️ 快捷键说明

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