新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機—再論IIC—軟件通用包(匯編、c語言)—03

51單片機—再論IIC—軟件通用包(匯編、c語言)—03

作者: 時間:2016-11-25 來源:網(wǎng)絡 收藏

1)發(fā)送一字節(jié)數(shù)據(jù)WR_BYTE

該子程序是向虛擬的IIC總顯得數(shù)據(jù)線SDA上發(fā)送一字節(jié)數(shù)據(jù)的操作。調(diào)用該子程序前,將要發(fā)送的數(shù)據(jù)送入A中。

還是先匯編,然后c代碼:

;-----------------------------------------------------------------
;發(fā)送字節(jié)子程序
;字節(jié)數(shù)據(jù)放入ACC
;每發(fā)送一個字節(jié)筪掉用一次CACK(檢測應答子程序),取應答位
WR_BYTE:
MOVR0,#08H;8位數(shù)據(jù)長度送R0
W_LP:
RLCA;發(fā)送數(shù)據(jù)左移,使發(fā)送位入c
JCW_R1;判讀發(fā)送1,還是發(fā)送0,發(fā)送1,轉入W_R1
SJMPW_R0;發(fā)送0轉入W_R0
W_LP1:
DJNZR0,W_LP
NOP
RET
W_R1: ;發(fā)送1
SETBSDA
NOP
SETBSCL
NOP
NOP
NOP
NOP
NOP
CLRSCL
SJMPW_LP1
W_R0: ;發(fā)送0
CLRSDA
NOP
SETBSCL
NOP
NOP
NOP
NOP
NOP
CLRSCL
SJMPW_LP1

//----------------------------------------------------------------------
//寫一個字節(jié)函數(shù)
void send_byte(uchar c)
{
uchar bit_cnt;
for(bit_cnt=0;bit_cnt<8;bit_cnt++)//循環(huán)傳送8位
{
if((c< //取當前發(fā)送位
sda=1;
else
sda=0;
_nop_();
scl=1;//發(fā)送到數(shù)據(jù)線上
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
}
}

2)接收一字節(jié)數(shù)據(jù)RD_BYTE(這個的匯編感覺并不肯定,有可能有錯~~,當然c語言還是沒問題的,呵呵)

;----------------------------------------------------------------------
;讀取字節(jié)子程序
;讀出的值再ACC中
;每取一個字節(jié)要發(fā)送一個應達或者非應答信號(要知道你讀取就成了從機,就要發(fā)送一個信號告訴主機)
RD_BYTE:
MOVR0,#08H;8位數(shù)據(jù)長度
R_LP:
SETBSDA;置SDA為輸入方式
NOP
CLRSCL;置時鐘線為低電平,準備接收數(shù)據(jù)
NOP
NOP
NOP
NOP
NOP
SETBSCL
NOP
MOVC,SDA;讀取數(shù)據(jù)位
RLCA;進行數(shù)據(jù)位的處理
NOP
DJNZR0,R_LP;沒有到8位,再來一次
RET

//------------------------------------------------------------------------
//接收一個字節(jié)函數(shù)
//返回接收的8位數(shù)據(jù)
uchar rec_byte()
{
uchar temp;
uchar bit_cnt;
temp=0;
sda=1; //置數(shù)據(jù)線為輸入方式
for(bit_cnt=0;bit_cnt<8;bit_cnt++)
{
_nop_();
scl=0; //置時鐘線為低電平,準備接收數(shù)據(jù)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
temp<<=1;
if(sda==1)//接收當前數(shù)據(jù)位,接收內(nèi)容放入temp中
temp+=1;
_nop_();
_nop_();
}
scl=0;
_nop_();
_nop_();
return(temp);
}

3)向被控器件發(fā)送n個字節(jié)數(shù)據(jù)子程序MCU_WRN_BYTE

;-----------------------------------------------------------------------
;向器件指定地址寫入N個數(shù)據(jù)
;入口參數(shù):器件從地質SLA,器件子地址SUBA、發(fā)送數(shù)據(jù)緩沖區(qū)MTD、發(fā)送字節(jié)數(shù)NUMBYTE
;占用:A,R0,R1,R3,CY
MCU_WRN_BYTE:
MOVA,NUM_BYTE
MOVR3,A
LCALLSTART;啟動總線
MOVA,SLA
LCALLWR_BYTE;發(fā)送器件地址
LCALLCACK
JNBACK,RET_WRN
MOVA,SUBA;指定子地址,并發(fā)送
LCALLWR_BYTE
LCALLCACK
MOVR1,#MTD
WRN_DA:
MOVA,@R1
LCALLWR_BYTE;開始寫入數(shù)據(jù)
LCALLCACK
JNBACK,MCU_WRN_BYTE
INCR1
DJNZR3,WRN_DA;判斷寫完沒有
RET_WRN:
LCALLSTOP
RET



評論


技術專區(qū)

關閉