?? at45main.#2
字號(hào):
//
//.................................................
void Uart0() interrupt 4
{
BYTE cRecvData;
if(RI0) // 如果收到數(shù)據(jù)
{
RI0=0; // 清除收到數(shù)據(jù)標(biāo)志
cRecvData = SBUF0; // 讀取數(shù)據(jù)
SBUF0 = cRecvData; // 回顯
if(cRecvData=='\r')
{// 回車符作為結(jié)束標(biāo)志
g_cRecvBuffer[g_cRecvPointer]=0; // 接收結(jié)束
g_cRecvPointer = 0;
g_cMainSignal|=UART0RECV_SIGNAL; // 接收完成信號(hào)
}
else if(cRecvData==0x08)
{// CTRL+H控制鍵,退格
if(g_cRecvPointer>0) g_cRecvPointer--;
}
else
{
if(g_cRecvPointer<RECVBUF_LEN)
{
/*
// 檢查是否有數(shù)據(jù)需要轉(zhuǎn)換為小寫
if(isupper(cRecvData))
{// 大寫字符轉(zhuǎn)換為小寫
cRecvData = _tolower(cRecvData);
}
*/
g_cRecvBuffer[g_cRecvPointer++]=cRecvData;
}
else
{// 數(shù)據(jù)長(zhǎng)度錯(cuò)誤
g_cRecvPointer = 0;
}
}
}
if(TI0) // 如果數(shù)據(jù)發(fā)送結(jié)束
{
TI0=0;
}
}
//------------------------------------------------------------------
// 主函數(shù)開(kāi)始
//-------------------------------------------------------------------
void main()
{
BYTE nDeviceID;
Init_Device(); // 初始化系統(tǒng)
InitVariable(); // 初始化變量
EA=0; // 禁止看門狗
WDTCN = 0xDE; // 實(shí)驗(yàn)中不使用看門狗
WDTCN = 0xAD;
EA = 1; // 打開(kāi)中斷控制位
TR0 = 1; // 啟動(dòng)定時(shí)器0
SendString("C8051F02x core Module EC1,v1.0\r\n");
SendString("Serial Flash Test\r\n");
//////////////////////////////////////////////////
// 檢查Flash
/////////////////////////////////////////////////
SendString("Flash ID:");
SendString(GetFlashType());
SendString("\r\n");
////////////////////////////////////////////////
while(1)
{
if(g_cMainSignal&SECD_SIGNAL)
{// 秒信號(hào)
g_cMainSignal&=~SECD_SIGNAL;
P_LED2 = !P_LED2;
}
if(g_cMainSignal&MINU_SIGNAL)
{// 分信號(hào)
g_cMainSignal&=~MINU_SIGNAL;
}
if(g_cMainSignal&UART0RECV_SIGNAL)
{// UART0接收完成信號(hào)
g_cMainSignal&=~UART0RECV_SIGNAL;
// 確保接收緩沖區(qū)內(nèi)的字符串有結(jié)尾
g_cRecvBuffer[RECVBUF_LEN-1] = 0;
// 分析接收的命令
CommandProc(g_cRecvBuffer);
}
}
}
//------------------------------------------------------------------
// 功能:分析接收的串口命令
// 輸入?yún)?shù):pRecvString,char *:輸入字符串
// 輸出參數(shù):無(wú)
//..................................................................
void CommandProc(char *pRecvString)
{
BYTE cRet=0;
int iPos,iPage,i;
// 使用strncmps進(jìn)行不區(qū)分大小寫的比較
if(strncmps("setled=",pRecvString,7)==0)
{// 設(shè)置LED狀態(tài)命令
pRecvString+=7;
iPos=strpos(pRecvString,',');
if(iPos==-1)
{// 無(wú)效命令
cRet = 0;
}
else
{
if(strncmps(pRecvString,"2",1)==0)
{// 控制LED2
pRecvString+=2;
if(strncmps(pRecvString,"on",2)==0)
{// 打開(kāi)LED
P_LED2 = 1;
cRet = 1;
}
else if(strncmps(pRecvString,"off",3)==0)
{// 關(guān)閉LED
P_LED2 = 0;
cRet = 1;
}
else
{
cRet = 0;
}
}
}
}
else if(strncmps(pRecvString,"erasepage=",10)==0)
{// 擦除指定扇區(qū)
pRecvString+=10;
iPage = atoi(pRecvString);
cRet=FlashPageErase(iPage);
}
else if(strncmps(pRecvString,"eraseblock=",11)==0)
{// 擦除指定塊
pRecvString+=11;
iPage = atoi(pRecvString);
cRet=FlashBlockErase(iPage);
}
else if(strncmps(pRecvString,"writepage=",10)==0)
{// 寫入Flash
pRecvString+=10;
iPos=strpos(pRecvString,',');
if(iPos==-1) cRet=0;
else
{// 查找扇區(qū)
pRecvString[iPos]=0;
iPage = atoi(pRecvString);
if(pRecvString[iPos+1]!=0)
{
pRecvString+=iPos+1;
// 通過(guò)Buffer1直接將數(shù)據(jù)寫入到頁(yè)面中,因此,除用戶本次傳送過(guò)來(lái)的數(shù)據(jù)外
// 其它寫入PAGE中的內(nèi)容由BUFFER1中原來(lái)的內(nèi)容決定
cRet=FlashProgViaBuffer1(0,strlen(pRecvString),pRecvString,iPage);
// 注釋的部分通過(guò)先將數(shù)據(jù)寫入Buffer,然后用命令將數(shù)據(jù)寫入到主存的方法
//FlashBuffer1Write(0,strlen(pRecvString),pRecvString);
//FlashBuffer1ProgAutoErase(iPage);
}
else
{
cRet = 0;
}
}
}
else if(strncmps(pRecvString,"readpage=",9)==0)
{// 讀出一個(gè)扇區(qū)的指定內(nèi)容
pRecvString+=9;
iPage = atoi(pRecvString);
// 數(shù)據(jù)首先讀取到buffer1,然后從buffer1中讀出
if(PageToBuffer1(iPage)==1)
{
// AT45DB041,081的頁(yè)面為256+8B
// AT45DB161的頁(yè)面為512+16B
cRet=FlashBuffer1Read(0,264,g_cFlashReadBuffer);
g_cFlashReadBuffer[264]=0;
}
else cRet = 0;
if(cRet==1)
{
// 扇區(qū)內(nèi)容傳送到計(jì)算機(jī)
SendString("\r\nHex Value:\r\n");
for(i=0;i<254;i++)
{
SendHex(g_cFlashReadBuffer[i]);
SendString("(");
SendBuffer(&g_cFlashReadBuffer[i],1);
SendString(")");
SendString(" ");
}
}
}
else
{// 無(wú)效命令
cRet = 0;
}
// 向主機(jī)發(fā)送應(yīng)答
if(cRet)
{
SendString("\r\nOK\r\n");
}
else
{
SendString("\r\nError\r\n");
}
}
//-----------------------------------------------------
// 函數(shù)功能:循環(huán)方式發(fā)送字符串
// 輸出參數(shù):pSendString,char*:欲發(fā)送的字符串的緩沖區(qū)
// 輸出:無(wú)
//-----------------------------------------------------
void SendString(char *pSendString)
{
// 循環(huán)發(fā)送,首先關(guān)閉中斷
ES0 =0;
while(*pSendString!=0)
{
SBUF0 = *pSendString++;
while(TI0==0);
TI0=0;
}
ES0 = 1;
}
void SendBuffer(BYTE *pSend,WORD len)
{
// 循環(huán)發(fā)送,首先關(guān)閉中斷
ES0 =0;
while(len)
{
SBUF0 = *pSend++;
while(TI0==0);
TI0=0;
len--;
}
ES0 = 1;
}
void SendHex(BYTE buf)
{
ES0 = 0;
SBUF0 = ASCII_CODE[(buf>>4)&0x0F];
while(TI0==0){}
TI0 = 0;
SBUF0 = ASCII_CODE[(buf&0x0F)];
while(TI0==0){}
TI0 = 0;
ES0 = 1;
}
//---------------------------------------------------------
// 軟件延時(shí)函數(shù)
//---------------------------------------------------------
// ;時(shí)鐘周期數(shù)
// lcall ;4
void dly(BYTE cnt){while(cnt){cnt--;}} // delay: mov a,r7 ;1
// jz quit ;2
// dec r7 ;1
// sjmp delay ;2
// quit: ret ;1
// 6n+5 sysclk @c8051f022(0.5425)
// 延時(shí)(6n+5)*0.0904us @11.0592MHZ
//....................................................................................
// 延時(shí)ms毫秒
//....................................................................................
void Dlyms(WORD ms) // 延時(shí)cnt(ms)@11.0592MHZ
{
while(ms)
{
dly(250);
dly(210);
dly(250);
dly(210);
dly(250);
dly(210);
dly(250);
dly(210);
dly(250);
dly(210);
dly(250);
dly(210);
dly(250);
dly(210);
dly(250);
dly(210);
ms--;
}
}
//----------------------------------------------------------
// 功能:不區(qū)分大小寫的字符串比較函數(shù)
// 參數(shù):pString1,char*:字符串1
// pString2,char*:字符串2
// iLen,int:長(zhǎng)度
// 返回值:-1:字符串相同;0:字符串不同
//-----------------------------------------------------------
char strncmps(char *pString1,char *pString2,int iLen)
{
char cTemp;
int i;
if(strlen(pString1)<iLen) return -1;
if(strlen(pString2)<iLen) return -1;
for(i=0;i<iLen;i++)
{
cTemp = pString1[i];
if(cTemp!=pString2[i])
{
if((cTemp>='A')&&(cTemp<='Z'))
{
cTemp = cTemp-'A'+'a';
if(cTemp!=pString2[i]) return -1;
}
else if((cTemp>='a')&&(cTemp<='z'))
{
cTemp = cTemp-'a'+'A';
if(cTemp!=pString2[i]) return -1;
}
else return -1;
}
}
return 0;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -