第3节 EEPROM的仿真演示
理解了flash编程和擦除命令是如何工作的,然后就可以将这些概念应用到EEPROM的仿真中。本实 例使用了DEMO9S08LC60开发板和Softec的SCI及LCD显示软件。该EEPROM仿真软件提供了两个可选菜单:密码的存储和验证。你可以设置一个新密码,而且通过DEMO9S08LC60开发板上的按钮PTC7和PTC5还可以验证存放在仿真EEPROM内的当前密码。
该演示软件用到的显示屏是整个软件的用户接口。首先,程序通过显示屏来显示那些选项,然后等待输入:
void menu(){
// Prints a welcome string
SlideString("PTC7 - New psswd",250);
Delay(3000);
SlideString("PTC5 - Verify psswd",250);
Delay(3000);
SlideString("Make your choice", 250);
}
当你按下PTC7或PTC5时,中断产生并检查哪一个按钮被按过。任一种功能都需要输入8位字母数字密码,敲回车。必须使用这种格式;否则软件不识别输入的数据。

图5 DEMO9S08LC60开发板
3.1 显示
由于DEMO9S08LC60支持板上使用的这种显示屏,所以它提供了显示屏的驱动和所有的源代码。
本应用笔记主要用了9位字母数字显示。这些字符可以显示从SCI读取的数据和系统消息“MEMORY FULL”。
3.2 SCI接口
这种微控制器硬件上有一个SCI接口,只要简单地配置一下8个8位的寄存器就可以使用该接口,这些寄存器是用于控制波特率,选择SCI选项,报告SCI状态以及收/发数据。 软件对SCI接口的配置如下:
3.3 数据存储
0x1870~0x286F的地址区域被分成8个512字节的块(可擦除的最小块),用来存放数据。根据从SCI收到的字符数又将每块分成8字节的小块。
使用的机制如下:
假设微控制器第一次上电时,EEPROM的受保护区域是空的,接收到的第一个8字节数据被存放到EEPROM的第一个8字节的地址内(0x1870~0x1877)。
为了存放从SCI接收到的下一个8字节数据,软件需要找到EEPROM内的下一个开放的地址(包括0xFF),并将该位置作为接下来的8字节数据存放的第一个地址。
若EEPROM已存放满了,地址就到了0x286F。然后程序就擦除该块并又从0x1870开始写入。
按SW305可随时清空存储区。8页全被清空。
执行EEPROM.c中的void NVM_Write_Byte (unsigned char *dest, char data)就可以存储数据,该函数是按图3建议的编程流程来实现的。
下面代码用于检查和验证被写入的地址:
NVMStartAddress = &EEPAdrs; // pointer to start address
do
{
*NVMStartAddress++;
data = *NVMStartAddress;
}
while(data != 0xFF); //looks for empty space in EEPROM
//Checks if reached end of EEProm
if (NVMStartAddress == &EEPAdrsEnd+1)
{
DisableInterrupts;
// Erases EEPROM sector : Memory Full NVM_Erase_Page(&(*NVMStartAddress));
//EEPROM.c erasing routine EnableInterrupts;
// reset pointer to EEPROM sector NVMStartAddress = &EEPAdrs;
}
if (FSTAT_FCBEF == 1) //Check if the command buffer is empty
{
DisableInterrupts;
//EEPROM.c writing routine NVM_Write_Byte (&(*NVMStartAddress), *p);
*NVMStartAddress++; EnableInterrupts;
}
3.4 数据验证
如果按下PTC5按钮,主程序等待输入密码,键入8位字母数字字符后回车。然后读程序开始恢复上次存放的密码。如果与输入的密码匹配,LCD显示屏就会显示操作成功信息。
NVMStartAddress = &EEPAdrs;
do
{
*NVMStartAddress++;
data = *NVMStartAddress;
}
while(data != 0xFF); //looks for empty space in EEPROM
NVMReadAddress = NVMStartAddress - 8; //sets address for last valid passwd typed
if (NVMReadAddress <= &EEPAdrs)
{
NVMReadAddress = &EEPAdrs + 1;
}
t = &messageTX;
for(i = 0; i != NVMRowSize; i++)
{
NVM_Read_Byte(&(*NVMReadAddress), t);
// stores in messageTX the read data t++;
NVMReadAddress++;
if ( messageTX[i]== 0xFF )
{
messageTX[i] = 0;
}
该演示软件用到的显示屏是整个软件的用户接口。首先,程序通过显示屏来显示那些选项,然后等待输入:
void menu(){
// Prints a welcome string
SlideString("PTC7 - New psswd",250);
Delay(3000);
SlideString("PTC5 - Verify psswd",250);
Delay(3000);
SlideString("Make your choice", 250);
}
当你按下PTC7或PTC5时,中断产生并检查哪一个按钮被按过。任一种功能都需要输入8位字母数字密码,敲回车。必须使用这种格式;否则软件不识别输入的数据。

图5 DEMO9S08LC60开发板
3.1 显示
由于DEMO9S08LC60支持板上使用的这种显示屏,所以它提供了显示屏的驱动和所有的源代码。
本应用笔记主要用了9位字母数字显示。这些字符可以显示从SCI读取的数据和系统消息“MEMORY FULL”。
3.2 SCI接口
这种微控制器硬件上有一个SCI接口,只要简单地配置一下8个8位的寄存器就可以使用该接口,这些寄存器是用于控制波特率,选择SCI选项,报告SCI状态以及收/发数据。 软件对SCI接口的配置如下:
- ● 波特率——9600
- ● 数据位——8
- ● 奇偶校验——无
- ● 停止位——1
3.3 数据存储
0x1870~0x286F的地址区域被分成8个512字节的块(可擦除的最小块),用来存放数据。根据从SCI收到的字符数又将每块分成8字节的小块。
使用的机制如下:
假设微控制器第一次上电时,EEPROM的受保护区域是空的,接收到的第一个8字节数据被存放到EEPROM的第一个8字节的地址内(0x1870~0x1877)。
为了存放从SCI接收到的下一个8字节数据,软件需要找到EEPROM内的下一个开放的地址(包括0xFF),并将该位置作为接下来的8字节数据存放的第一个地址。
若EEPROM已存放满了,地址就到了0x286F。然后程序就擦除该块并又从0x1870开始写入。
按SW305可随时清空存储区。8页全被清空。
执行EEPROM.c中的void NVM_Write_Byte (unsigned char *dest, char data)就可以存储数据,该函数是按图3建议的编程流程来实现的。
下面代码用于检查和验证被写入的地址:
NVMStartAddress = &EEPAdrs; // pointer to start address
do
{
*NVMStartAddress++;
data = *NVMStartAddress;
}
while(data != 0xFF); //looks for empty space in EEPROM
//Checks if reached end of EEProm
if (NVMStartAddress == &EEPAdrsEnd+1)
{
DisableInterrupts;
// Erases EEPROM sector : Memory Full NVM_Erase_Page(&(*NVMStartAddress));
//EEPROM.c erasing routine EnableInterrupts;
// reset pointer to EEPROM sector NVMStartAddress = &EEPAdrs;
}
if (FSTAT_FCBEF == 1) //Check if the command buffer is empty
{
DisableInterrupts;
//EEPROM.c writing routine NVM_Write_Byte (&(*NVMStartAddress), *p);
*NVMStartAddress++; EnableInterrupts;
}
3.4 数据验证
如果按下PTC5按钮,主程序等待输入密码,键入8位字母数字字符后回车。然后读程序开始恢复上次存放的密码。如果与输入的密码匹配,LCD显示屏就会显示操作成功信息。
NVMStartAddress = &EEPAdrs;
do
{
*NVMStartAddress++;
data = *NVMStartAddress;
}
while(data != 0xFF); //looks for empty space in EEPROM
NVMReadAddress = NVMStartAddress - 8; //sets address for last valid passwd typed
if (NVMReadAddress <= &EEPAdrs)
{
NVMReadAddress = &EEPAdrs + 1;
}
t = &messageTX;
for(i = 0; i != NVMRowSize; i++)
{
NVM_Read_Byte(&(*NVMReadAddress), t);
// stores in messageTX the read data t++;
NVMReadAddress++;
if ( messageTX[i]== 0xFF )
{
messageTX[i] = 0;
}


