1)發送一字節數據WR_BYTE
該子程序是向虛擬的IIC總顯得數據線SDA上發送一字節數據的操作。調用該子程序前,將要發送的數據送入A中。
還是先匯編,然后c代碼:
;-----------------------------------------------------------------
;發送字節子程序
;字節數據放入ACC
;每發送一個字節筪掉用一次CACK(檢測應答子程序),取應答位
WR_BYTE:
MOVR0,#08H;8位數據長度送R0
W_LP:
RLCA;發送數據左移,使發送位入c
JCW_R1;判讀發送1,還是發送0,發送1,轉入W_R1
SJMPW_R0;發送0轉入W_R0
W_LP1:
DJNZR0,W_LP
NOP
RET
W_R1: ;發送1
SETBSDA
NOP
SETBSCL
NOP
NOP
NOP
NOP
NOP
CLRSCL
SJMPW_LP1
W_R0: ;發送0
CLRSDA
NOP
SETBSCL
NOP
NOP
NOP
NOP
NOP
CLRSCL
SJMPW_LP1
//----------------------------------------------------------------------
//寫一個字節函數
void send_byte(uchar c)
{
uchar bit_cnt;
for(bit_cnt=0;bit_cnt<8;bit_cnt++)//循環傳送8位
{
if((c< //取當前發送位
sda=1;
else
sda=0;
_nop_();
scl=1;//發送到數據線上
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
}
}
2)接收一字節數據RD_BYTE(這個的匯編感覺并不肯定,有可能有錯~~
,當然c語言還是沒問題的,呵呵)
;----------------------------------------------------------------------
;讀取字節子程序
;讀出的值再ACC中
;每取一個字節要發送一個應達或者非應答信號(要知道你讀取就成了從機,就要發送一個信號告訴主機)
RD_BYTE:
MOVR0,#08H;8位數據長度
R_LP:
SETBSDA;置SDA為輸入方式
NOP
CLRSCL;置時鐘線為低電平,準備接收數據
NOP
NOP
NOP
NOP
NOP
SETBSCL
NOP
MOVC,SDA;讀取數據位
RLCA;進行數據位的處理
NOP
DJNZR0,R_LP;沒有到8位,再來一次
RET
//------------------------------------------------------------------------
//接收一個字節函數
//返回接收的8位數據
uchar rec_byte()
{
uchar temp;
uchar bit_cnt;
temp=0;
sda=1; //置數據線為輸入方式
for(bit_cnt=0;bit_cnt<8;bit_cnt++)
{
_nop_();
scl=0; //置時鐘線為低電平,準備接收數據
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
temp<<=1;
if(sda==1)//接收當前數據位,接收內容放入temp中
temp+=1;
_nop_();
_nop_();
}
scl=0;
_nop_();
_nop_();
return(temp);
}
3)向被控器件發送n個字節數據子程序MCU_WRN_BYTE
;-----------------------------------------------------------------------
;向器件指定地址寫入N個數據
;入口參數:器件從地質SLA,器件子地址SUBA、發送數據緩沖區MTD、發送字節數NUMBYTE
;占用:A,R0,R1,R3,CY
MCU_WRN_BYTE:
MOVA,NUM_BYTE
MOVR3,A
LCALLSTART;啟動總線
MOVA,SLA
LCALLWR_BYTE;發送器件地址
LCALLCACK
JNBACK,RET_WRN
MOVA,SUBA;指定子地址,并發送
LCALLWR_BYTE
LCALLCACK
MOVR1,#MTD
WRN_DA:
MOVA,@R1
LCALLWR_BYTE;開始寫入數據
LCALLCACK
JNBACK,MCU_WRN_BYTE
INCR1
DJNZR3,WRN_DA;判斷寫完沒有
RET_WRN:
LCALLSTOP
RET
評論