📄 example_eeprom.c
字号:
/************************************************************************************
* Copyright (c), 2004-2007,西安铭朗电子科技有限责任公司
* All rights reserved.
*
* Http: www.mlarm.com
* Email: mlarm@mlarm.com
*
* File name: Example_EEPROM.c
*
* Project : ML-F020ICB
* Processor: C8051F020
* Compiler : Keil C51 Compiler
*
* Author: EagleC
* Version: 1.00
* Date: 2007.07.05
* Email:
*
* Description: EEPROM参数设置测试程序
*
* Others: none;
*
* Function List:
*
* History:
* 1. Author: Eagle Cao
* Version: 1.00
* Date: 2007.07.05
* Modification: 建立文件
*
*************************************************************************************/
/************************************************************************************/
// 引用外部头文件
#include "driver.h"
#include "def.h"
#include "api.h"
#include "ShowLCD.h"
/************************************************************************************/
/************************************************************************************/
// 常量及全局变量定义
/************************************************************************************/
/*************************************************************************************/
//
// EEPROM测试程序函数定义
//
/*************************************************************************************/
/***********************************************************************************
* Function: EEPROM_Proc;
*
* Description: EEPROM参数设置测试程序
*
* Input: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void EEPROM_Proc()
{
unsigned char i,cmd,m;
unsigned int j,k;
unsigned char ucRet,bDecode,ucRecTimes;
unsigned char ucRec;
unsigned int len;
unsigned char buf[255];
unsigned char bCheck;
unsigned char nChenkLen;
union ProParam pparam;
unsigned long addres = 0x42000;//300*1024 : Flash 容量需大于301K才能存储参数
unsigned char nX;
unsigned char *pItem;
unsigned char bShowHelp;
LCDB_ClearScreen();
Show_Title();
LCDB_DispFWord(32,8*(20-6),"参 数 调 整");
Show_Param();
EEPROM_Read(8, pparam.Data, 128);
Show_ParamD(&pparam);
bShowHelp = 0;
while(1)
{
EWachdog_Clear();
cmd = Key_Read();
if(cmd != CH452_KEY_INVAL)
{
ALARM_Ctrl(1);
Delay_ms(20);
ALARM_Ctrl(0);
switch (cmd)
{
case 0x0A:// 进入接收参数状态
if(bShowHelp)
{
Show_ClareX64();
Show_Param();
bShowHelp = 0;
}
else
CLear_ParamD();
LCDB_DispFWord(240-16, 16*2,"等待PC机下传参数.....");
len = 0;
bDecode = 0;
for(i=0;i<255;i++)
{
EWachdog_Clear();
Delay_ms(25);
bCheck = 0;
nChenkLen = 0;
ucRec = Uart0_GetCharsRxBuf();//串口已接收到参数的字节数
if(ucRec>=134)//PC软件下发参数时的通讯字节数为134个
{
m = 0;
if(ucRec>UART0_RXBUF_SIZE) ucRec = UART0_RXBUF_SIZE;
ucRecTimes = 0;
//循环接收134字节
while(m<ucRec)
{
ucRet = Uart0_RecvChar(&buf[m]);
if(ucRet == UART_ERR_OK) {
m++;
ucRecTimes = 0;
}
else {
Delay_ms(5);
if(ucRecTimes++>5) break;
}
}
len = m;
//已接收到多于、等于134字节后,解析
if(len>=134)
{
for(j=0; j<len; j++)
{
if(buf[j]==0xED && buf[j+1]==0xCB)//find head
{
bCheck = 0;
// 获取长度
nChenkLen = buf[j+2];
// 接收数据溢出,放弃buffer中的所有数据
if(j+3+nChenkLen >=255) {len = 0; continue;}
// 数据长度接收不够,退出继续接收
if(j+3+nChenkLen+1 < 134) continue;
for(k=0; k<nChenkLen; k++) bCheck ^= buf[j+3+k];
// 校验通不过,继续查找下一组数据
if(bCheck != buf[j+3+nChenkLen]) continue;
// 校验通过后,判断是否是“设置功能”==2
if(buf[j+4] != 2) continue;
// 获取数据
for(k=0; k<128; k++) pparam.Data[k] = buf[j+5+k];
bDecode = 1;
len = 0;
break;
}
}
}
}
if(bDecode) break;
}
if(bDecode)
{
// 保存参数到EEPROM中
EEPROM_Write(8, pparam.Data, 128);
LCDB_DispFWord(240-16, 16*2,"EEPROM 参数设置成功!");
// 回复PC软件参数设置成功
buf[0] = 0xED;
buf[1] = 0xCB;
buf[2] = 0x02;
buf[3] = 0x01;
buf[4] = 0x02;
buf[5] = 0x03;
Uart0_SendBlock(buf,6,&i);
// 显示新的参数
EEPROM_Read(8, pparam.Data, 128);
Show_ParamD(&pparam);
}
else
{
LCDB_DispFWord(240-16, 16*2,"EEPROM 参数设置失败!");
}
break;
case 0x0B:// 进入发送参数状态
if(bShowHelp)
{
Show_ClareX64();
Show_Param();
bShowHelp = 0;
}
else
CLear_ParamD();
LCDB_DispFWord(240-16, 16*2,"等待PC机读取参数.....");
len = 0;
bDecode = 0;
for(i=0;i<255;i++)
{
EWachdog_Clear();
Delay_ms(10);
bCheck = 0;
nChenkLen = 0;
ucRec = Uart0_GetCharsRxBuf();
if(ucRec>=6)//PC软件读取参数时的通讯字节数为6个
{
m = 0;
if(ucRec>255) ucRec = 255;
ucRecTimes = 0;
//循环接收6字节
while(m<ucRec)
{
ucRet = Uart0_RecvChar(&buf[m]);
if(ucRet == UART_ERR_OK)
{
m++;
ucRecTimes = 0;
}
else
{
Delay_ms(5);
if(ucRecTimes++>5) break;
}
}
len = m;
//已接收到多于、等于6字节后,解析
if(len>=6)
{
for(j=0; j<len; j++)
{
if(buf[j]==0xED && buf[j+1]==0xCB)//find head
{
bCheck = 0;
// 获取长度
nChenkLen = buf[j+2];
// 接收数据溢出,放弃buffer中的所有数据
if(j+3+nChenkLen >=255) {len = 0; continue;}
// 数据长度接收不够,退出继续接收
if(j+3+nChenkLen+1 < 6) continue;
for(k=0; k<nChenkLen; k++) bCheck ^= buf[j+3+k];
// 校验通不过,继续查找下一组数据
if(bCheck != buf[j+3+nChenkLen]) continue;
// 校验通过后,判断是否是“读取参数功能”==1
if(buf[j+4] != 1) break;
bDecode = 1;
len = 0;
break;
}
}
}
}
if(bDecode) break;
}
if(bDecode)
{
LCDB_DispFWord(240-16, 16*2,"EEPROM 参数上传成功!");
bCheck = 0;
//读取EEPROM中的参数并上传给PC软件
buf[0] = 0xED;
buf[1] = 0xCB;
buf[2] = 130;
buf[3] = 0x01;
buf[4] = 0x01;
EEPROM_Read(8, pparam.Data, 128);
for(k=0; k<128; k++) buf[5+k] = pparam.Data[k];
for(k=0; k<130; k++) bCheck ^= buf[3+k];
buf[133] = bCheck;
Uart0_SendBlock(buf,134,&i);
// 显示参数
Show_ParamD(&pparam);
}
else
{
LCDB_DispFWord(240-16, 16*2,"EEPROM 参数上传失败!");
}
break;
case 0x0D:
if(bShowHelp)
{
Show_ClareX64();
Show_Param();
bShowHelp = 0;
}
else
CLear_ParamD();
//读取并显示参数
EEPROM_Read(8, pparam.Data, 128);
Show_ParamD(&pparam);
LCDB_DispFWord(240-16, 16*2,"EEPROM 参数读取成功!");
break;
case 0x0E://帮助说明
Show_ClareX64();
bShowHelp=1;
nX = 64;
pItem = "本测试程序主要是配合PC机参数下载软件对参数进行调整,所有参数保存在EEPROM中。";
LCDB_DispFWord(nX, 32,pItem);
pItem = "A:设置参数。若在6.4秒内没有接收到下传的参数则退出等待。";
LCDB_DispFWord(nX+16*2, 56,pItem);
pItem = "B:上传参数。若在6.4秒内没有接收到获取参数命令则退出等待。";
LCDB_DispFWord(nX+16*4, 56,pItem);
pItem = "D:读取参数";
LCDB_DispFWord(nX+16*6, 56,pItem);
pItem = "E:帮助";
LCDB_DispFWord(nX+16*7, 56,pItem);
pItem = "F:返回";
LCDB_DispFWord(nX+16*8, 56,pItem);
break;
case 0x0F:
return;
}
}
}
}
/***********************************************************************************/
// 文件结束
/***********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -