//---------------------------------------------------------------
//向器件指定地址按页写函数(这里虽然是说按页,其实原理是一样的~~,要是不明白可以看上一篇我整理的)
//入口参数有4个:器件地址码、器件单元地址、写入的数据串的指针、写入的字节个数
//写入成功,返回1;不成功,返回0,使用后必须结束总线
bit mcu_send_string(uchar add,uchar rom_add,uchar *s,uchar num)
{
uchar i;
IIC_start();
send_byte(add);//发送器件地址码
IIC_ack_acc();
if(ack==0)
return(0);//有应答,发送ROM的单元地址
send_byte(rom_add);
IIC_ack_acc();
if(ack==0)
return(0);
for(i=0;i //连续发送num个字节数据
{
send_byte(*s);
IIC_ack_acc();
if(ack==0)
return(0);
s++;
}
IIC_stop();
return(1);
}
4)从被控器件读取n个字节数据子程序MCU_RDN_BYTE
;--------------------------------------------------------------------------------
;从器件地址读取N个数据
;入口参数:器件从地址,器件子地址SUBA,接收字节数NUM_BYTE
;出口参数:接收数据缓冲区
;占用:A,R0,R1,R2,R3,CY
MCU_RDN_BYTE:
MOVR3,NUM_BYTE
LCALLSTART
MOVA,SLA
LCALLWR_BYTE;发送器件地址
LCALLCACK
JNBACK,RET_RDN
MOVA,SUBA;指定子地址
LCALLWR_BYTE
LCALLCACK
LCALLSTART
MOVA,SLA
INCA;准备进行读操作
LCALLWR_BYTE
LCALLCACK
JNBACK,MCU_RDN_BYTE
MOVR1,#MRD
RDN1:
LCALLRD_BYTE;读操作开始
MOV@R1,A
DJNZR3,SACK
LCALLMNACK;最后一个字节发非应答位
RET_RDN:
LCALLSTOP
RET
SACK:
LCALLMACK;发送应答位
INCR1
SJMPRDN1
//-------------------------------------------------------------------------------
//从器件指定地址读多个字节
//入口参数有4个:器件地址码、器件单元地址、读出的数据串、读出的字节个数,写入成功返回1,不成功返回0
bit mcu_rec_string(uchar add,uchar rom_add,uchar *s,uchar num)
{
uchar i;
IIC_start();
send_byte(add); //发送器件的地址码,这里最低位为0,写
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add);//发送器件的单元地址
IIC_ack_acc();
if(ack==0)
return(0);
IIC_start(); //重新发送开始信号,开始读取数据
send_byte(add+1);//发送器件的地址码,这里最后一位为1,读
IIC_ack_acc();
if(ack==0)
return(0);
for(i=0;i{
*s=rec_byte();
IIC_ack_send(0); //送应答信号
s++;
}
*s=rec_byte();
IIC_ack_send(1); //送非应答信号
IIC_stop();
return(1);
}
总算是好了~~呵呵,哦了,整理好了~~要是哪里不对~~我就shit了
评论