扔段程序
define BUS_SPEED 4300000 // Hz
#define CONST (BUS_SPEED / 1000 /32 ) // 1000 ms 8 循环
void Wait1ms(void)
{
asm {
PSHX
PSHH
LDHX #CONST
loop:
AIX #-1 ;2 cycles
CPHX #0 ;3 cycles
BNE loop ;3 cycles
PULH
PULX
}
}
//等待n毫秒
void WaitNms(int n)
{
int i;
for(i=1;i<=n;i++) Wait1ms();
}
//EEPROM 24C256 NEW
typedef union
{
word EE_Address;
struct
{
byte addr_H;
byte addr_L;
}Addr_bytes;
}tAddr;
tAddr sAddr;
#define Address sAddr.EE_Address
#define Addr_H sAddr.Addr_bytes.addr_H
#define Addr_L sAddr.Addr_bytes.addr_L
//word Address;
uchar length;
uchar i;
uchar IIC_Res_flg;
uchar flag;
#define MAX_LENGTH 64
#define MAX_PAGE 64
#define IIC_OK 1
#define IIC_SLAVE 0xa0
extern uchar WR_Data[64];
extern uchar RD_Data[64];
extern uchar dummy;
void Init_IIC(void)
{
IICF=89; // frequency divider register: BUS=8Mhz => 400Khz
IICC1=0XC0; // enable IIC module with interrupt;
IICA=0; //salve address of this module
IICS=0X12; // clear the IBAL and IICIF flags
}
void IIC_read_block(word addr,byte len)
{
Address= addr;
length=len;
i=0; // for interrupt only;
IIC_Res_flg=0;// for interrupt only;
flag=10; // defines receive function in the interrupt service routine
if(length>MAX_LENGTH)length=MAX_LENGTH;
IICC1_TXAK=0; //RX/TX=1;MS/SL=1,TXAK=0;
IICC1 |=0X30; // And generate START condition;
IICD=IIC_SLAVE; // Address the slave and set up for master transmit;
}
void IIC_write_block(word addr,byte len)
{
Address=addr; //load address;
length=len; // load length of data pack to be written;
i=0; // for interrupt only;
IIC_Res_flg=0; // for interrupt only;
flag=2; // define transmit function in the interrupt service routine;
if(length>MAX_PAGE) length=MAX_PAGE; // set limit;
IICC1_TXAK=0; // RX/TX=1;MS/SL=1;TXAK=0;
IICC1 |=0X30; // And generate START condition;
IICD=IIC_SLAVE; // Address the slave and set up for master transmit;
}