📄 xram.#1
字号:
{
TI0=0;
}
}
//------------------------------------------------------------------
// 主函数开始
//-------------------------------------------------------------------
void main()
{
Init_Device(); // 初始化系统
InitVariable(); // 初始化变量
EA=0; // 禁止看门狗
WDTCN = 0xDE; // 实验中不使用看门狗
WDTCN = 0xAD;
EA = 1; // 打开中断
TR0 = 1; // 启动定时器0
SendString("C8051F02x core Module EC1,v1.0\r\n");
SendString("XRAM with 62WV2568 Test\r\n");
while(1)
{
if(g_cMainSignal&SECD_SIGNAL)
{// 秒信号
g_cMainSignal&=~SECD_SIGNAL;
P_LED2=!P_LED2;
}
if(g_cMainSignal&MINU_SIGNAL)
{// 分信号
g_cMainSignal&=~MINU_SIGNAL;
}
if(g_cMainSignal&UART0RECV_SIGNAL)
{// UART0接收完成信号
g_cMainSignal&=~UART0RECV_SIGNAL;
// 确保接收缓冲区内的字符串有结尾
g_cRecvBuffer[RECVBUF_LEN-1] = 0;
// 分析接收的命令
CommandProc(g_cRecvBuffer);
}
}
}
//......................................
// 功能:分析接收的命令
// 输入参数:
// pRecvString,char *:输入字符串
// 输出参数:无
// 命令格式说明:
// setled=灯序号,开关状态 \r
// 灯序号: 1,LED1;2,LED2
// 开关状态:ON,打开灯;OFF,关闭灯
// 命令字符不区分大小写
//.......................................
void CommandProc(char *pRecvString)
{
BYTE cRet=0;
int iPos,i,readlen;
BYTE cPage;
BYTE xdata *pRam;
if(strncmps("setled=",pRecvString,7)==0)
{// 设置LED状态命令
pRecvString+=7;
iPos=strpos(pRecvString,',');
if(iPos==-1)
{// 无效命令
cRet = 0;
}
else
{
if(strncmps(pRecvString,"2",1)==0)
{// 控制LED2
pRecvString+=2;
if(strncmps(pRecvString,"on",2)==0)
{// 打开LED
P_LED2 = 1;
cRet = 1;
}
else if(strncmps(pRecvString,"off",3)==0)
{// 关闭LED
P_LED2 = 0;
cRet = 1;
}
else
{
cRet = 0;
}
}
}
}
else if(strncmps(pRecvString,"testsram",8)==0)
{
// 测试62LV256
if(1==TestSRAM())
{
SendString("62LV256 Test OK!\r\n");
cRet = 1;
}
else cRet = 0;
}
else if(strncmps(pRecvString,"testtram",8)==0)
{// 测试62LV2567,测试的过程中TRAM中的数据会被修改
if(1==TestTRAM())
{
SendString("62LV2568 Tesk OK!\r\n");
cRet = 1;
}
else cRet = 0;
}
else if(strncmps(pRecvString,"writetram=",10)==0)
{// 向指定的TRAM存储区域写数据
pRecvString+=10;
iPos=strpos(pRecvString,',');
if(iPos==-1) cRet=0;
else
{// 查找扇区
pRecvString[iPos]=0;
cPage = atoi(pRecvString);
if(cPage>=RAM_PAGE)
{
cRet = 0;
}
else
{
if(pRecvString[iPos+1]!=0)
{
pRecvString+=iPos+1;
pRam = 0xC000; // TRAM页内地址
P4&=0xF0;
P4|=cPage; // 设置页
while((*pRecvString)!=0)
{// 写入TRAM中
*pRam++=*pRecvString++;
}
cRet = 1;
}
else
{
cRet = 0;
}
}
}
}
else if(strncmps(pRecvString,"readtram=",9)==0)
{// 读取指定的页
pRecvString+=9;
iPos=strpos(pRecvString,',');
if(iPos==-1) cRet=0;
else
{// 查找页面
pRecvString[iPos]=0;
cPage = atoi(pRecvString);
if(cPage>=RAM_PAGE)
{
cRet = 0;
}
else
{
pRecvString+=iPos+1;
readlen = atoi(pRecvString);
pRam = 0xC000; // TRAM页内地址
P4&=0xF0;
P4|=cPage; // 设置页
SendString("\r\nHex Value:\r\n");
for(i=0;i<readlen;i++)
{
SendHex(*pRam);
SendBuf('(');
SendBuf(*pRam++);
SendBuf(')');
}
cRet = 1;
}
}
}
else
{// 无效命令
cRet = 0;
}
// 向主机发送应答
if(cRet)
{
SendString("\r\nOK\r\n");
}
else
{
SendString("\r\nError\r\n");
}
}
//-----------------------------------------------------
// 函数功能:循环方式发送字符串
// 输出参数:pSendString,char*:欲发送的字符串的缓冲区
// 输出:无
//-----------------------------------------------------
void SendString(char *pSendString)
{
// 循环发送,首先关闭中断
ES0 =0;
while(*pSendString!=0)
{
SBUF0 = *pSendString++;
while(TI0==0);
TI0=0;
}
ES0 = 1;
}
void SendBuf(BYTE buf)
{
ES0 = 0;
SBUF0 = buf;
while(TI0==0){}
TI0 = 0;
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;
}
//-----------------------------------------
// 功能:以16进制方式发送16位无符号数
// 参数:wData,WORD:要发送的数据
//
//-----------------------------------------
void SendWordHex(WORD wData)
{
SendHex(wData>>8);
SendHex(wData&0xff);
}
//-----------------------------------------------------
// 功能:测试62LV256,地址范围为0x0000-0x7FFF,共32K
// 输入参数:无
// 输出:
//----------------------------------------------------
BYTE TestSRAM()
{
int i;
BYTE iRet=1;
BYTE xdata *pSRAM; // 定义指向外部RAM的指针
SendString("\r\nTest 62LV256:\r\n");
// 向RAM的0x0001,0x0003,0x0007等地址写入数据,然后分别读出
pSRAM = 0x0000; // 指向外部RAM地址0
for(i=0;i<16;i++)
{
*pSRAM = TESTDATA[i];
pSRAM=((WORD)pSRAM<<1)|0x00001;
}
pSRAM = 0x0000;
for(i=0;i<16;i++)
{
SendWordHex(pSRAM);
SendString(":");
if(*pSRAM!=TESTDATA[i])
{
SendString("Error,Write=");
SendHex(TESTDATA[i]);
SendString(",Read=");
SendHex(*pSRAM);
iRet = 0; // 发现错误
}
else
{
SendString("OK\r\n");
}
pSRAM=((WORD)pSRAM<<1)|0x00001;
}
return iRet;
}
//-----------------------------------------------------
// 功能:测试62LV2568/1024,地址范围为0xC000-0xFFFF,共16K
// 并分别使用外部4条地址线来选择最多16个页面
// 输入参数:无
// 输出:
//----------------------------------------------------
BYTE TestTRAM()
{
BYTE i,j;
BYTE iRet=1;
BYTE testdata;
BYTE xdata *pSRAM; // 定义指向外部RAM的指针
SendString("\r\nTest 62LV2568:\r\n");
testdata = 0;
for(j=0;j<RAM_PAGE;j++)
{
P4&=0xF0;
P4|=j; // 选择页面
pSRAM = 0xC000; // 指向外部RAM地址0
for(i=0;i<15;i++)
{
*pSRAM = testdata;
pSRAM=(((WORD)pSRAM<<1)|0xC001);
testdata++;
}
}
// 读,校验
testdata = 0;
for(j=0;j<RAM_PAGE;j++)
{
P4&=0xF0;
P4|=j; // 选择页面
SendString("PAGE=");
SendHex(j);
SendString(":\r\n");
pSRAM = 0xC000;
for(i=0;i<15;i++)
{
SendWordHex(pSRAM);
SendString(":");
if(*pSRAM!=testdata)
{
SendString("Error,Write=");
SendHex(testdata);
SendString(",Read=");
SendHex(*pSRAM);
SendString("\r\n");
iRet = 0; // 发现错误
}
else
{
SendString("OK\r\n");
}
pSRAM=(((WORD)pSRAM<<1)|0xC001);
testdata++;
}
SendString("\r\n");
}
return iRet;
}
//----------------------------------------------------------
// 功能:不区分大小写的字符串比较函数
// 参数:pString1,char*:字符串1
// pString2,char*:字符串2
// iLen,int:长度
// 返回值:-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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -