单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1333|回复: 0
收起左侧

这段程序的功能是什么啊?是为了实现EEPROM的吗?

[复制链接]
lx843040583 发表于 2017-5-25 16:01 | 显示全部楼层 |阅读模式
void ISP_IAP_enable(void) /* ================ 打开 ISP,IAP 功能 ================= */
{
EA = 0;       /* 关中断   */
ISP_CONTR = ISP_CONTR & 0x18;       /* (0001,1000) **ISP/IAP 控制寄存器复位*/
ISP_CONTR = ISP_CONTR | WaitTime;   /* 写入硬件延时 */
ISP_CONTR = ISP_CONTR | 0x80;       /*(10000000) ISPEN=1 在ISPEN(ISP_CONTR.7) =1时,
                                       (解释当ISPCONTR的最高位=1时有效,)
                                        对ISP_TRIG (命令触发寄存器)先写入46h,再写入B9h,ISP/IAP命令才会生效。*/
}
void ISP_IAP_disable(void) /* =============== 关闭 ISP,IAP 功能 ================== */
{
ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
ISP_TRIG = 0x00;
EA   =   1;   /* 开中断 */
}
void ISPgoon(void) /* ================ 公用的触发代码 ==================== */
{
ISP_IAP_enable();   /* 打开 ISP,IAP 功能 第47行有定义*/
ISP_TRIG = 0x46;  /* 触发ISP_IAP命令字节1,(解释)在ISPEN(ISP_CONTR.7) =1时,
                    (解释当ISPCONTR的最高位=1时有效,)
                     对ISP_TRIG (命令触发寄存器)先写入46h,再写入B9h,ISP/IAP命令才会生效。 */
ISP_TRIG = 0xb9;  /* 触发ISP_IAP命令字节2 */
_nop_();
}
unsigned char byte_read(unsigned int byte_addr) /* ========= 字节读 ============= */
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 读出byte_addr的高八位;
                                                如果byte_addr是16位的,就是把byte_addr的高八位
                                                赋值给一个unsigned char类型的变量:ISP_ADDRH*/
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); /* 读出byte_addr的低八位;*/
ISP_CMD   = ISP_CMD & 0xf8;   /* (11111000)清除低3位  */
ISP_CMD   = ISP_CMD | RdCommand; /* 写入读命令 */
ISPgoon();       /* 触发执行  */
ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
return (ISP_DATA);    /* 返回读到的数据 */
}
void SectorErase(unsigned int sector_addr) /* =========== 扇区擦除 ============ */
{
unsigned int iSectorAddr;
iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位 (注释)清楚后待机模式,无ISP操作 */
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  前面定义过#define EraseCommand 0x03
                                     (00000011)对用户的应用程序flash区及数据flash区扇区擦除*/
ISPgoon();            /* 触发执行  */
ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
}
void byte_write(unsigned int byte_addr, unsigned char original_data) /* ==== 字节写 ==== */
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8);  /* 取出高八位  */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); /*取出低八位*/
ISP_CMD  = ISP_CMD & 0xf8;    /* 清低3位 意思就是将第三位全部清0再在下边的prgcommand(00000010)进行或运算得(*****010)*/
ISP_CMD  = ISP_CMD | PrgCommand;  /* 写命令2 (注释)(*****010)对用户的应用程序flash区及数据flash区字节编程*/
ISP_DATA = original_data;   /* 写入数据准备 注释:DATA为数据寄存器*/
ISPgoon();       /* 触发执行  */
ISP_IAP_disable();     /* 关闭IAP功能 */
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

快速回复 返回顶部 返回列表