📄 isp.c
字号:
//IspCity 0--9 为城市数据
// 10为储存多小城市
// 11为保存现在城市
#include "reg51.h"
#include <mylib.h>
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_Byte_Read 1
#define Isp_Byte_Write 2
#define Isp_Byte_Erase 3
#define Enable_Isp 0x8a
#define WAIT_TIME 0x2
#define IspCitySize 0x9400
code uint IspCity[]={0x8000,0x8200,0x8400,0x8600,0x8800,0x8a00,0x8c00,0x8e00,0x9000,0x9200,0x9400,0x9600};
uchar Get_IspData;
void ISP_IAP_enable(void)
{
EA = 0; /* 关中断 */
ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
ISP_CONTR = ISP_CONTR | WAIT_TIME;
ISP_CONTR = ISP_CONTR | 0x80; /* 1000,0000 */
}
/* 关闭 ISP,IAP 功能 */
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f; /* 0111,1111 */
ISP_TRIG = 0x00;
EA = 1; /* 开中断 */
}
uchar Read_Isp(uint Address)
{
/*ISP_CONTR=Enable_Isp;
ISP_CMD=Isp_Byte_Read;
ISP_ADDRH=0x4;
ISP_ADDRL=0;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
Get_IspData=0;
Get_IspData=ISP_DATA;
ISP_CONTR=0;
return(Get_IspData);*/
ISP_ADDRH = Address>>8;
ISP_ADDRL = Address;
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | Isp_Byte_Read; /* 0000,0001 */
ISP_IAP_enable();
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
ISP_IAP_disable();
return (ISP_DATA);
}
void Write_Isp(uint Address,uchar a)
{
/*ISP_CONTR=Enable_Isp;
ISP_CMD=Isp_Byte_Write;
ISP_ADDRH=0x4;
ISP_ADDRL=0;
ISP_DATA=0xaa;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
ISP_CONTR=0;*/
ISP_ADDRH = Address>>8;
ISP_ADDRL = Address;
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | Isp_Byte_Write; /* 0000,0010 */
ISP_DATA = a;
ISP_IAP_enable();
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
ISP_IAP_disable();
}
void Erase_Isp(uint Address)
{
/*ISP_CONTR=Enable_Isp;
ISP_CMD=Isp_Byte_Erase;
ISP_ADDRH=0x4;
ISP_ADDRL=0;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
while(1);
ISP_TRIG=0;
ISP_CMD=0;
ISP_CONTR=0;*/
ISP_ADDRH = Address>>8;
ISP_ADDRL = Address;
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | Isp_Byte_Erase; /* 0000,0011 */
ISP_IAP_enable();
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
ISP_IAP_disable();
}
void Write_Isp_String(uchar AddressIndex,uchar *Read_Buf)
{
uint a,b;
b=AddressIndex*0x100;
Erase_Isp(b);
for(a=0;a<256;a++)
{
Write_Isp(b+a,Read_Buf[a]);
}
}
void from_ISP_Memory_switch_to_AP_Memory(void)
{
ISP_CONTR = 0x20; // 0010,000
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -