//---------------------------------------------------------------
//向器件指定地址按頁寫函數(shù)(這里雖然是說按頁,其實原理是一樣的~~,要是不明白可以看上一篇我整理的)
//入口參數(shù)有4個:器件地址碼、器件單元地址、寫入的數(shù)據串的指針、寫入的字節(jié)個數(shù)
//寫入成功,返回1;不成功,返回0,使用后必須結束總線
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);//有應答,發(fā)送ROM的單元地址
send_byte(rom_add);
IIC_ack_acc();
if(ack==0)
return(0);
for(i=0;i //連續(xù)發(fā)送num個字節(jié)數(shù)據
{
send_byte(*s);
IIC_ack_acc();
if(ack==0)
return(0);
s++;
}
IIC_stop();
return(1);
}
4)從被控器件讀取n個字節(jié)數(shù)據子程序MCU_RDN_BYTE
;--------------------------------------------------------------------------------
;從器件地址讀取N個數(shù)據
;入口參數(shù):器件從地址,器件子地址SUBA,接收字節(jié)數(shù)NUM_BYTE
;出口參數(shù):接收數(shù)據緩沖區(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;準備進行讀操作
LCALLWR_BYTE
LCALLCACK
JNBACK,MCU_RDN_BYTE
MOVR1,#MRD
RDN1:
LCALLRD_BYTE;讀操作開始
MOV@R1,A
DJNZR3,SACK
LCALLMNACK;最后一個字節(jié)發(fā)非應答位
RET_RDN:
LCALLSTOP
RET
SACK:
LCALLMACK;發(fā)送應答位
INCR1
SJMPRDN1
//-------------------------------------------------------------------------------
//從器件指定地址讀多個字節(jié)
//入口參數(shù)有4個:器件地址碼、器件單元地址、讀出的數(shù)據串、讀出的字節(jié)個數(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ā)送開始信號,開始讀取數(shù)據
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); //送應答信號
s++;
}
*s=rec_byte();
IIC_ack_send(1); //送非應答信號
IIC_stop();
return(1);
}
總算是好了~~呵呵,哦了,整理好了~~要是哪里不對~~我就shit了
評論