📄 e2prom.c
字号:
#include "reg51.h"
#include "DEF.H"
#include "system.h"
#define ISP_READ 1 ///字节读命令
#define ISP_RAM 2 ///字节编程命令 前提是该字节是空(0FFH)
#define ISP_ERASE 3 ///扇区擦除命令 要某字节为空,要擦移扇区
#define ISP_TIME 0 ///等待时间 30MHZ以下为0,24MHZ以下为1,20MHZ以下为2,12MHZ以下为3,6MHZ以下为4,3MHZ以下为5,2MHZ以下为6,1MHZ以下为7
extern uchar bright ;
extern uchar comp ;
extern uchar color ;
extern uchar Pauto ;
extern uchar row_num ;
/************************************************
内部E2PROM的操作
************************************************/
void Delay(uWORD wLoops)
{
uWORD wTemp ;
while (wLoops--)
{
wTemp = 1000/6 ; // one loop below takes about 11 us
while (wTemp--) ;
}
}
/************************************************
打开 ISP,IAP 功能
************************************************/
void ISP_IAP_enable(void)
{
EA = 0 ; // 关中断
ISP_CONTR = ISP_CONTR & 0x18 ; // 0001,1000
ISP_CONTR = ISP_CONTR | ISP_TIME ; // 写入硬件延时
ISP_CONTR = ISP_CONTR | 0x80 ; // ISPEN=1
}
/************************************************
关闭 ISP,IAP 功能
************************************************/
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f ; // ISPEN = 0
ISP_TRIG = 0x00 ;
EA = 1 ; // 开中断
}
/************************************************
公用的触发代码
************************************************/
void ISPgoon(void)
{
ISP_IAP_enable() ; // 打开 ISP,IAP 功能
ISP_TRIG = 0x46 ; // 触发ISP_IAP命令字节1
ISP_TRIG = 0xb9 ; // 触发ISP_IAP命令字节2
}
/************************************************
字节读
************************************************/
uchar byte_read(uint byte_addr)
{
ISP_ADDRH = (uchar)(byte_addr >> 8) ; // 地址赋值
ISP_ADDRL = (uchar)(byte_addr & 0x00ff) ;
ISP_CMD = ISP_CMD & 0xf8 ; // 清除低3位
ISP_CMD = ISP_CMD | ISP_READ ; // 写入读命令
ISPgoon() ; // 触发执行
ISP_IAP_disable() ; // 关闭ISP,IAP功能
return (ISP_DATA) ; // 返回读到的数据
}
/************************************************
扇区擦除
************************************************/
void SectorErase(uint sector_addr)
{
uint iSectorAddr ;
iSectorAddr = (sector_addr & 0xfe00) ; // 取扇区地址
ISP_ADDRH = (uchar)(iSectorAddr >> 8) ;
ISP_ADDRL = 0x00 ;
ISP_CMD = ISP_CMD & 0xf8 ; // 清空低3位
ISP_CMD = ISP_CMD | ISP_ERASE ; // 擦除命令3
ISPgoon() ; // 触发执行
ISP_IAP_disable() ; // 关闭ISP,IAP功能
}
/************************************************
字节写
************************************************/
void byte_write(uint byte_addr, uchar w_data)
{
ISP_ADDRH =(uchar)(byte_addr >> 8) ; // 取地址
ISP_ADDRL =(uchar)(byte_addr & 0x00ff) ;
ISP_CMD = ISP_CMD & 0xf8 ; // 清低3位
ISP_CMD = ISP_CMD | ISP_RAM ; // 写命令2
ISP_DATA = w_data ; // 写入数据准备
ISPgoon() ; // 触发执行
ISP_IAP_disable() ; // 关闭IAP功能
}
/**************************************************
把要记忆的参数写入E2PROM
**************************************************/
void write_set(void)
{
SectorErase(0x8000) ;
byte_write(0x8000,color) ;
byte_write(0x8001,bright) ;
byte_write(0x8002,comp) ;
byte_write(0x8003,Pauto) ;
byte_write(0x8004,row_num) ;
Delay(10) ;
ISP_IAP_disable() ; // 关闭IAP功能
}
/**************************************************
把所设定的参数读出E2PROM28
**************************************************/
void read_set(void)
{
byte_read(0x8000) ;
color = ISP_DATA ;
byte_read(0x8001) ;
bright = ISP_DATA ;
byte_read(0x8002) ;
comp = ISP_DATA ;
byte_read(0x8003) ;
Pauto = ISP_DATA ;
byte_read(0x8004) ;
row_num = ISP_DATA ;
Delay(10) ;
ISP_IAP_disable() ; // 关闭IAP功能
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -