//---------------------------------------------------------------
//向器件指定地址按頁寫函數(shù)(這里雖然是說按頁,其實(shí)原理是一樣的~~,要是不明白可以看上一篇我整理的)
//入口參數(shù)有4個(gè):器件地址碼、器件單元地址、寫入的數(shù)據(jù)串的指針、寫入的字節(jié)個(gè)數(shù)
//寫入成功,返回1;不成功,返回0,使用后必須結(jié)束總線
bit mcu_send_string(uchar add,uchar rom_add,uchar *s,uchar num)
{
uchar i;
IIC_start();
send_byte(add);//發(fā)送器件地址碼
IIC_ack_acc();
if(ack==0)
return(0);//有應(yīng)答,發(fā)送ROM的單元地址
send_byte(rom_add);
IIC_ack_acc();
if(ack==0)
return(0);
for(i=0;i //連續(xù)發(fā)送num個(gè)字節(jié)數(shù)據(jù)
{
send_byte(*s);
IIC_ack_acc();
if(ack==0)
return(0);
s++;
}
IIC_stop();
return(1);
}
4)從被控器件讀取n個(gè)字節(jié)數(shù)據(jù)子程序MCU_RDN_BYTE
;--------------------------------------------------------------------------------
;從器件地址讀取N個(gè)數(shù)據(jù)
;入口參數(shù):器件從地址,器件子地址SUBA,接收字節(jié)數(shù)NUM_BYTE
;出口參數(shù):接收數(shù)據(jù)緩沖區(qū)
;占用:A,R0,R1,R2,R3,CY
MCU_RDN_BYTE:
MOVR3,NUM_BYTE
LCALLSTART
MOVA,SLA
LCALLWR_BYTE;發(fā)送器件地址
LCALLCACK
JNBACK,RET_RDN
MOVA,SUBA;指定子地址
LCALLWR_BYTE
LCALLCACK
LCALLSTART
MOVA,SLA
INCA;準(zhǔn)備進(jìn)行讀操作
LCALLWR_BYTE
LCALLCACK
JNBACK,MCU_RDN_BYTE
MOVR1,#MRD
RDN1:
LCALLRD_BYTE;讀操作開始
MOV@R1,A
DJNZR3,SACK
LCALLMNACK;最后一個(gè)字節(jié)發(fā)非應(yīng)答位
RET_RDN:
LCALLSTOP
RET
SACK:
LCALLMACK;發(fā)送應(yīng)答位
INCR1
SJMPRDN1
//-------------------------------------------------------------------------------
//從器件指定地址讀多個(gè)字節(jié)
//入口參數(shù)有4個(gè):器件地址碼、器件單元地址、讀出的數(shù)據(jù)串、讀出的字節(jié)個(gè)數(shù),寫入成功返回1,不成功返回0
bit mcu_rec_string(uchar add,uchar rom_add,uchar *s,uchar num)
{
uchar i;
IIC_start();
send_byte(add); //發(fā)送器件的地址碼,這里最低位為0,寫
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add);//發(fā)送器件的單元地址
IIC_ack_acc();
if(ack==0)
return(0);
IIC_start(); //重新發(fā)送開始信號(hào),開始讀取數(shù)據(jù)
send_byte(add+1);//發(fā)送器件的地址碼,這里最后一位為1,讀
IIC_ack_acc();
if(ack==0)
return(0);
for(i=0;i{
*s=rec_byte();
IIC_ack_send(0); //送應(yīng)答信號(hào)
s++;
}
*s=rec_byte();
IIC_ack_send(1); //送非應(yīng)答信號(hào)
IIC_stop();
return(1);
}
總算是好了~~呵呵,哦了,整理好了~~要是哪里不對(duì)~~我就shit了
評(píng)論