sfr ISP_DATA = 0xe2; //ISP数据寄存器 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
//初始值=1111,1111 1 1 1 1 1 1 1 1
/////////////////////////////////
sfr ISP_ADDRH = 0xe3; //ISP地址高位寄存器 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
//初始值=0000,0000 0 0 0 0 0 0 0 0
/////////////////////////////////
sfr ISP_ADDRL = 0xe4; //ISP地址低位寄存器 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
//初始值=0000,0000 0 0 0 0 0 0 0 0
/////////////////////////////////
sfr ISP_CMD = 0xe5; //ISP命令寄存器 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
//初始值=xxxx,xx00 x x x x x 0 0 0
#define ISP_IDLE 0x00 //ISP待机命令
#define ISP_READ 0x01 //ISP读字节数据命令
#define ISP_PROGRAM 0x02 //ISP字节编程命令
#define ISP_ERASE 0x03 //ISP扇区擦除命令(每扇区字节))
/////////////////////////////////
sfr ISP_TRIG = 0xe6; //ISP命令触发寄存器 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
//初始值=xxxx,xxxx x x x x x x x x
#define ISP_TRIG0 0x46 //ISP功能触发命令
#define ISP_TRIG1 0xb9 //ISP功能触发命令
/////////////////////////////////
sfr ISP_CONTR = 0xe7; //ISP控制寄存器 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
//位描述 ISPEN SWBS SWRST - - WT2 WT1 WT0
//初始值=000x,x000 0 0 0 x x 0 0 0
#define ISPEN 0x80 //ISP使能开关
#define SWBS 0x40 //软启动选择,0:从用户AP启动1:从ISP启动
#define SWRST 0x20 //触发软件复位
void isp_safe()
{
ISP_ADDRH=0X20;
ISP_ADDRL=0X00;
ISP_CMD=0X00;
ISP_TRIG=0X00;
ISP_CONTR=0X00;
}
void write_i2c(uchar x,uchar z)
{
ISP_DATA=z;//数据送ISP
ISP_ADDRL=x&0x00ff;//送低位ISP地址/
ISP_ADDRH=x>>8;//STC89C51的ISP地址,STC89C51的I2C地址在2000H单元开始的/
ISP_CONTR=0x81;//充许ISP有效////设置响应时间,20M为1,6M以下是4/
ISP_CMD=ISP_PROGRAM;//操作模式为写操作
EA=0;
ISP_TRIG=0x46;//发送命令字//
ISP_TRIG=0xb9;//发送执行命令字,发送完执行,执行完后程序才继续//
EA=1;
isp_safe();
}
uchar read_i2c(uchar x)
{
uchar z;
ISP_ADDRL=x&0x00ff;//送低位ISP地址
ISP_ADDRH=x>>8;//送高位ISP地址,STC89C51的I2C地址在2000H单元开始的!
ISP_CONTR=0X81;//充许ISP有效//设置响应时间,20M为1,6M以下是4
ISP_CMD=ISP_READ;//操作模式为读操作
EA=0;
ISP_TRIG=0x46;//发送命令字
ISP_TRIG=0xb9;//发送执行命令字,发送完执行,执行完后程序才继续
EA=1;
z=ISP_DATA;//数据送ISP
isp_safe();
return(z);
}
void clear_i2c(uchar x)
{
ISP_ADDRL=x&0x00ff;//送低位ISP地址
ISP_ADDRH=x>>8;//送高位ISP地址,STC89C51的I2C地址在2000H单元开始的!
ISP_CONTR=0X81;//充许ISP有效 //设置响应时间,20M为1,6M以下是4
ISP_CMD=ISP_ERASE;//操作模式为擦除操作
EA=0;
ISP_TRIG=0x46;//发送命令字
ISP_TRIG=0xb9;//发送执行命令字,发送完执行,执行完后程序才继续
EA=1;
isp_safe();
}
void main()
{
clear_i2c(0x2000);
clear_i2c(0x2200);
write_i2c(0x2000,50);
write_i2c(0x2200,30);
read_i2c(0x2000);
read_i2c(0x2200);
}
这样读出来为什么是两个30
如果将主程序的write_i2c(0x2200,30)和read_i2c(0x2000)位置对调就能读出50和30 |