?? i2c_wr.asm
字號(hào):
;===========================================================
;名 稱:模擬I2C總線通訊
;說 明:以普通I/O口模擬I2C通訊,本例以主控方式驅(qū)動(dòng)24C02
;入口參數(shù):WR_ADR、RD_ADR、WR_DATA
;出口參數(shù):RD_DATA
;程序入口:BYTE_WRITE、BYTE_READ
;占用資源:5CH~50H,B、C、WA、HL、IX
;涉及模塊:-
;===========================================================
;===========================================================
$include"TMP86P808.H";包含頭文件
;-------------------------------
;中斷及復(fù)位向量
;-------------------------------
CODE_INVEC SECTION CODE ABS=0XFFE0
INTVEC:
DW TO_RETI;/INT5 0XFFE0
DW TO_RETI;INTTXD1 0XFFE2
DW TO_RETI;INTRXD1 OXFFE4
DW TO_RETI;INT 0XFFE6
DW TO_RETI;INTTIC0 0XFFEa
DW TO_RETI;INTET0 0XFFEc
DW TO_RETI;INTTXD0 0XFFEe
DW TO_RETI;INTRXD0 0XFFF0
DW TO_RETI;INTT1 0XFFF2
DW INTTBT;INTTBT 0XFFF4
DW TO_RETI;INT1 0XFFF6
DW TO_RETI;/INTT0 0XFFF8
DW TO_RETN;INTWDT 0XFFFA
DW TO_RETN;INTATRAP 0XFFFC
DW TO_RETN;INTUNDEF 0XFFFE
DW START;RESET 0XFFEF
;------------------------------------
;=========================================內(nèi)存分配
;---------------------------------------TBT
HOUR EQU 0X4E
MIN EQU 0X4F
SEC EQU 0X50
MS EQU 0X51
TEN_MS EQU 0X52
BP_FLAG EQU 0X6F;蜂鳴器標(biāo)志
BP_TIM EQU 0X70;蜂鳴器鳴響時(shí)間
;----------------------------------------I2C
BIT_CNT EQU 0X5C;位計(jì)數(shù)器
WR_ADR EQU 0X5D;寫入地址
RD_ADR EQU 0X5E;讀出地址
WR_DATA EQU 0X5F;寫入數(shù)據(jù)
RD_DATA EQU 0X60;讀出數(shù)據(jù)
FLAG EQU 0X61;讀寫標(biāo)志
;------------------------------------------------
;--------------------------------------------
SDA_IN EQU 0Y10000011;SDA輸入狀態(tài)時(shí)端口控制器數(shù)值
SDA_OUT EQU 0Y11000011;SDA輸出狀態(tài)時(shí)端口控制器數(shù)值
;=======================================LCD_DISP位定義
TBTEN EQU 3;TBT允許
;-----------------------------------------I2C位定義
SDA EQU 6;P36
SCL EQU 7;P37
;----------------------------------------
READ_FLAG EQU 0;讀寫操作標(biāo)志,1表示讀操作
;---------------------------------------------
BP_ON EQU 0;打開蜂鳴器標(biāo)志,1有效
;=============================================主程序開始
MAIN_CODE SECTION CODE ABS=0XE000
START:
LD SP,0X13F;堆棧指針
LD (SYSCR2),0X80;單時(shí)鐘模式
LD (WDTCR1),0X00
LD (WDTCR2),0XB1;禁用WDT
LD (P1),0X0
LD (P2),0X0
LD (P3),0X0
LD (P0OUTCR),SDA_OUT;
LD (P1CR),0XFF;P1全部輸出
; LD (P2PRD),0X01;
LD (P3CR),SDA_OUT
;------------------------------------------內(nèi)存清0
RAM_CLR:
LD HL,0X40
LD WA,0X13F-0X40
RCLR1:
LD (HL),0X0
INC HL
DEC WA
J F,RCLR1
;---------------------------------------------------主循環(huán)
LOOP:
LD (TBTCR),0X05;每次中斷約1MS-4MHZ晶振
DI
SET (TBTCR).TBTEN;啟動(dòng)TBT
SET (EIRL).6;允許TBT中斷
EI;打開中斷
;------------------------------------------開始24CXX操作
SET (BP_FLAG).BP_ON
LD (WR_ADR),0X01;載入寫數(shù)據(jù)地址
LD (WR_DATA),0X44;載入寫數(shù)據(jù)
CALL BYTE_WRITE;寫入24Cxx
CALL DELY10MS;延時(shí)10ms,24Cxx一次操作后必須延時(shí)10ms再進(jìn)行下一次操作
CALL DELY10MS
;CALL DELY10MS
;CALL DELY10MS
LD (RD_ADR),0X01;讀出數(shù)據(jù)地址
CALL BYTE_READ;讀數(shù)據(jù)
LD A,(RD_DATA);將讀出數(shù)據(jù)載入A
CALL DELY10MS;延時(shí)10ms
J $;循環(huán)等待中斷
;===========================================================
;===========================================================
;NO_USEINT SECTION CODE MEDIUM;未使用中斷向量處理
TO_RETI:
RETI
TO_RETN:
RETN
;===========================================================
;===========================================================
DELY10MS:
LD IX,50000
DE_IX:
DEC IX
J NZ,DE_IX
RET
;===========================================================
;==========================================TBT構(gòu)成的實(shí)時(shí)時(shí)鐘
INTTBT:
PUSH A
PUSH B
PUSH C
PUSH H
PUSH L;壓棧
MSF:
INC (MS);每次中斷約等于1ms
CMP (MS),0X0A
J CS,CLOCK_EXIT;是否大于等于10ms
;----------------------------------------------蜂鳴器
LD CF,(BP_FLAG).BP_ON
J CC,TEN_MSF;是否要打開蜂鳴器
SET (P1).2
INC (BP_TIM)
CMP (BP_TIM),30
J CS,TEN_MSF;蜂鳴器是否鳴想了30ms
CLR (BP_FLAG).BP_ON
LD (BP_TIM),0
CLR (P1).2
;---------------------------------------------------
TEN_MSF:
LD (MS),0X0
INC (TEN_MS)
CMP (TEN_MS),0X64
J CS,CLOCK_EXIT
SECF:
LD (TEN_MS),0X0
INC (SEC)
CMP (SEC),0X3C
J CS,CLOCK_EXIT
MINF:
LD (SEC),0X0
INC (MIN)
CMP (MIN),0X3C
J CS,CLOCK_EXIT
HOURF:
LD (MIN),0X0
INC (HOUR)
CMP (HOUR),0X3C
J CS,CLOCK_EXIT
LD (HOUR),0X0
CLOCK_EXIT:
POP L
POP H
POP C
POP B
POP A
RETI
;===========================================================
;===========================================================
;I2C_START:
; LD SP,0X130
; LD (SYSCR2),0X80
; LD (WDTCR1),0X00
; LD (WDTCR2),0XB1;禁用WDT
MAKE_S:
SET (P3).SDA
NOP
NOP
LD (P3CR),SDA_OUT
NOP
NOP
NOP
NOP
ACK_CHECK:
;SET (P3).SDA
;NOP
;NOP
LD (P3CR),SDA_IN;SDA輸入狀態(tài)
NOP
NOP
NOP
NOP
M_START:
SET (P3).SCL;時(shí)鐘拉高
NOP
NOP
NOP
LD CF,(P3).SDA
J CC,MAKE_S;總線不空則強(qiáng)制拉高
M_START0:
NOP
NOP
SET (P3).SCL
NOP
NOP
NOP
NOP
CLR (P3).SDA;起始信號(hào)
NOP
NOP
LD (P3CR),SDA_OUT;SDA輸出
LD B,0y10100001;讀命令字
LD CF,(FLAG).READ_FLAG
J CS,W_BYTE;讀標(biāo)志是否=1
LD B,0y10100000;寫命令字
W_BYTE:
LD (P3CR),SDA_OUT
LD (BIT_CNT),0X08
BIT_LOOP:
NOP
NOP
NOP
CLR (P3).SCL
ROLC B
J CC,BIT_0
SET (P3).SDA
J SEND_DATA
BIT_0:
CLR (P3).SDA
SEND_DATA:
NOP
NOP
NOP
NOP
SET (P3).SCL
DEC (BIT_CNT)
J NZ,BIT_LOOP
NOP
NOP
NOP
NOP
CLR (P3).SCL
NOP
NOP
SET (P3).SDA;輸出鎖存器置1
LD (P3CR),SDA_IN
NOP
NOP
NOP
SET (P3).SCL
NOP
NOP
NOP
LD CF,(P3).SDA
J CS,M_START0
CLR (P3).SCL
RET
W_STOP:
M_STOP:
CLR (P3).SDA
LD (P3CR),SDA_OUT
NOP
NOP
NOP
NOP
SET (P3).SCL
NOP
NOP
NOP
NOP
SET (P3).SDA
NOP
NOP
NOP
NOP
CLR (P3).SCL
RET
RD_BYTE:
RNXTB:
CLR (P3).SCL
NOP
NOP
NOP
LD (P3CR),SDA_IN
LD (BIT_CNT),0X08
RNX:
CLR (P3).SCL
NOP
NOP
NOP
CLR CF
TEST (P3).SDA
J F,BITIS_0
SET CF
BITIS_0:
ROLC B
SET (P3).SCL
NOP
NOP
NOP
DEC (BIT_CNT)
J NZ,RNX
LD (RD_DATA),B
CLR (P3).SCL
LD (P3CR),SDA_OUT
R_STOP:
J M_STOP
;===========================================================
BYTE_WRITE:
CALL ACK_CHECK
LD B,(WR_ADR)
CALL W_BYTE
LD B,(WR_DATA)
CALL W_BYTE
CALL W_STOP
RET
;===========================================================
BYTE_READ:
CALL ACK_CHECK
LD B,(RD_ADR)
CALL W_BYTE
CALL DELY10MS
;CALL DELY10MS
;CALL DELY10MS
SET (FLAG).READ_FLAG
CALL ACK_CHECK
CLR (FLAG).READ_FLAG
CALL RD_BYTE
RET
;===========================================================
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -