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

📄 example_eeprom.c

📁 C8051F020单片机开发板演示程序
💻 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 + -