📄 eeprom.lst
字号:
C51 COMPILER V8.05a EEPROM 10/25/2006 17:36:37 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE EEPROM
OBJECT MODULE PLACED IN eeprom.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE eeprom.c OMF2 BROWSE DEBUG
line level source
1
2 #include <config.h>
3
4
5
6 #define IN_EEPROM
7
8 #if EEPROM_USING
sfr ISP_DATA = 0xE2;
sfr ISP_ADDRH = 0xE3;
sfr ISP_ADDRL = 0xE4;
sfr ISP_CMD = 0xE5;
sfr ISP_TRIG = 0xE6;
sfr ISP_CONTR = 0xE7;//
#define ISP_IAP_BYTE_READ 0x01;//字节读
#define ISP_IAP_BYTE_PROGRAM 0x02;//字节编程, 前提是该字节是空,0FFh
#define ISP_IAP_SECTOR_ERASE 0x03;//扇区擦除, 要某字节为空,要擦一扇区
#define WAIT_TIME 0x01;//设置等待时间,30MHz 以下0,24M 以下1,
#define ENABLE_ISP 0x81;// <24MHz
#define EEPROM_MAX_BUFFER 0x10
#if XDATA_USING
unsigned char xdata eeprom_buffer[EEPROM_MAX_BUFFER];
#else
unsigned char idata eeprom_buffer[EEPROM_MAX_BUFFER];
#endif
// -----------------------------------------------------------------------------
// ------ EEPROM的数据初始化 -------------------------------------------------
void eeprom_initialize(void)
{
}
// ;ENABLE_ISP EQU 80H ;<30MHz
// ;ENABLE_ISP EQU 81H ;<24MHz
// ;ENABLE_ISP EQU 82H ;<20MHz
// ;ENABLE_ISP EQU 83H ;<12MHz
// ;ENABLE_ISP EQU 84H ;<6MHz
// ;ENABLE_ISP EQU 85H ;<3MHz
// ;ENABLE_ISP EQU 86H ;<2MHz
// ;ENABLE_ISP EQU 87H ;<1MHz
//-----------------------------------------------------------------------------
// ----eeprom的读,需要指定地址,每次固定读入一定的字节数
void eeprom_read(unsigned char idata sectors)
{
//MOV ISP_ADDRH, #BYTE_ADDR_HIGH ;送地址高字节
//MOV ISP_ADDRL, #BYTE_ADDR_LOW ;送地址低字节
//MOV ISP_CONTR, #WAIT_TIME ;设置等待时间
//ORL ISP_CONTR, #10000000B ;允许ISP/IAP 操作
//MOV ISP_CMD, #ISP_IAP_BYTE_READ ;送字节读命令,命令不需改变时,不需重新送命令
//MOV ISP_TRIG, #46h ;先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
C51 COMPILER V8.05a EEPROM 10/25/2006 17:36:37 PAGE 2
//MOV ISP_TRIG, #0B9h ;送完B9h 后,ISP/IAP 命令立即被触发起动
unsigned char idata i=0x00;
unsigned char idata eeprom_h_address=0x10;
eeprom_h_address=0x10+sectors; // 由于只使用eeprom的几个字节而已故不要考虑溢出问题
for(i=0x00;i<EEPROM_MAX_BUFFER;i++)
{ ISP_ADDRH = eeprom_h_address;
ISP_ADDRL = i;
ISP_CONTR = WAIT_TIME;
ISP_CONTR |= 0x80;
ISP_CMD = ISP_IAP_BYTE_READ;
EA = 0x00;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
EA = 0x01;
eeprom_buffer[i]=ISP_DATA;
}
// -----------关闭ISP/IAP功能---------------
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
ISP_ADDRH = 0x00;
ISP_ADDRL = 0x00;
}
void eeprom_write(unsigned char idata sectors)
{
//MOV ISP_DATA, #ONE_DATA ;送字节编程数据到ISP_DATA
//MOV ISP_ADDRH, #BYTE_ADDR_HIGH ;送地址高字节
//MOV ISP_ADDRL, #BYTE_ADDR_LOW ;送地址低字节
//MOV ISP_CONTR, #WAIT_TIME ;设置等待时间
//ORL ISP_CONTR, #10000000B ;允许ISP/IAP 操作
//MOV ISP_CMD, #ISP_IAP_BYTE_PROGRAM ;送字节编程命令
//MOV ISP_TRIG, #46h ;先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
//MOV ISP_TRIG, #0B9h ;送完B9h 后,ISP/IAP 命令立即被触发起动
unsigned char idata i=0x00;
unsigned char idata eeprom_h_address=0x10;
eeprom_h_address=0x10+sectors; // 由于只使用eeprom的几个字节而已故不要考虑溢出问题
for(i=0x00;i<EEPROM_MAX_BUFFER;i++)
{ ISP_DATA=eeprom_buffer[i];
ISP_ADDRH = eeprom_h_address;
ISP_ADDRL = i;
ISP_CONTR = WAIT_TIME;
ISP_CONTR |= 0x80;
ISP_CMD = ISP_IAP_BYTE_PROGRAM;
EA = 0x00;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
EA = 0x01;
}
// -----------关闭ISP/IAP功能---------------
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
ISP_ADDRH = 0x00;
ISP_ADDRL = 0x00;
}
C51 COMPILER V8.05a EEPROM 10/25/2006 17:36:37 PAGE 3
void eeprom_earse(unsigned char idata sectors)
{
//MOV ISP_ADDRH, #SECTOR_FIRST_BYTE_ADDR_HIGH ;送扇区起始地址高字节
//MOV ISP_ADDRL, #SECTOR_FIRST_BYTE_ADDR_LOW ;送扇区起始地址低字节
//MOV ISP_CONTR, #WAIT_TIME ;设置等待时间
//ORL ISP_CONTR, #10000000B ;允许ISP/IAP
//MOV ISP_CMD, #ISP_IAP_SECTOR_ERASE ;送扇区擦除命令,命令不需改变时,不需重新送命令
//MOV ISP_TRIG, #46h ;先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
//MOV ISP_TRIG, #0B9h ;送完B9h 后,ISP/IAP 命令立即被触发起动
unsigned char idata i=0x00;
unsigned char idata eeprom_h_address=0x10;
eeprom_h_address=0x10+sectors; // 由于只使用eeprom的几个字节而已故不要考虑溢出问题
ISP_ADDRH = eeprom_h_address;
ISP_ADDRL = 0x80; //指定该扇区的任何一个地址即可
ISP_CONTR = WAIT_TIME;
ISP_CONTR |= 0x80;
ISP_CMD = ISP_IAP_SECTOR_ERASE;
EA = 0x00;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
EA = 0x01;
// -----------关闭ISP/IAP功能---------------
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
ISP_ADDRH = 0x00;
ISP_ADDRL = 0x00;
}
// -----------------------------------------------------------------------------
// ----- EEPROM的数据处理 ----------------------------------------------------
unsigned char idata eeprom_operatemode=0x00; //参数的写入或者读出
void eeprom_process(void)
{unsigned char idata i=0x00;
if(eeprom_operatemode==0x01) //读出
{
eeprom_read(0x00);
if((eeprom_buffer[0]==0x55)&&(eeprom_buffer[1]==0xaa)) //验证正确
{master_volume=eeprom_buffer[2]; //音量的控制
music_mode=eeprom_buffer[3]; //音乐模式的控制
}
else
{master_volume=32; //取得默认值
music_mode=0x00;
}
eeprom_operatemode=0x00;
// rs232_senddata(0x84);
// rs232_senddata(0x01);
}
else if(eeprom_operatemode==0x02) //写入
{eeprom_earse(0x00);
eeprom_buffer[0]=0x55;
eeprom_buffer[1]=0xaa;
eeprom_buffer[2]=master_volume;
eeprom_buffer[3]=music_mode;
eeprom_write(0x00);
eeprom_operatemode=0x00;
C51 COMPILER V8.05a EEPROM 10/25/2006 17:36:37 PAGE 4
// rs232_senddata(0x84);
// rs232_senddata(0x02);
}
}
#endif
189
190
191
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = ---- ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -