pic16f877A軟件模擬I2C通信讀寫24C02
;該試驗(yàn)功能是單片機(jī)復(fù)位一次,自動(dòng)從24C02中讀取數(shù)據(jù)到數(shù)碼管顯示,然后對(duì)值加1再寫入24C02,最終數(shù)碼管中的數(shù)據(jù)就是開機(jī)的次數(shù),具有一定的實(shí)用意義
;本電路所使用24C02為ATMEL的,或不是該廠的,則燒寫時(shí)間可能會(huì)有差異
;必須調(diào)整本程序的DELAY時(shí)間
;本實(shí)戰(zhàn)的目的是讓大家進(jìn)上步熟悉I2C通信的時(shí)序,熟悉24CXX的讀寫,會(huì)用軟件模擬I2C通信
;硬件接法:
;1.24CXX的SDA接877A的RB5口,SCLK接877A的RB4口,WP接地,A0,A1,A2接地
LISTP=16F877A,R=DEC
include"P16F877A.inc"
;***********************************
__CONFIG_DEBUG_OFF&_CP_OFF&_WRT_HALF&_CPD_OFF&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC;
;************************************定義查表偏移量
#defineSDAPORTB,5
#defineSCLKPORTB,4
;*********************
COUNTEQU20H
ADDREQU21H
DATEQU23H
TEMPEQU24H
;**********************
ORG000H
NOP;放置一條ICD必需的空操作指令
GOTOMAIN
ORG004H
RETURN
ORG0008H
;******************************************************
TABLE
ADDWFPCL,1;地址偏移量加當(dāng)前PC值
RETLW0C0H;0
RETLW0F9H;1
RETLW0A4H;2
RETLW0B0H;3
RETLW99H;4
RETLW92H;5
RETLW82H;6
RETLW0F8H;7
RETLW80H;8
RETLW98H;9
RETLW00H;A
RETLW00H;B
RETLW00H;C
RETLW00H;D
RETLW00H;E
RETLW00H;F
;*******************************************************
MAIN
MOV LW0FFH
MOV WFPORTC;數(shù)碼管先全部熄滅
MOV LW0FFH
MOV WFPORTA
MOV LW0FFH
MOV WFPORTB;SDT,SCLK都為高
BSFSTATUS,RP0;定義RA口,RC,RB口全部為輸出
MOV LW07H
MOV WFADCON1;設(shè)置RA口全部為普通數(shù)字IO口
CLRW
MOV WFTRISB;
MOV WFTRISA
MOV WFTRISC
MOV WFOPTION_REG;開啟RB口內(nèi)部弱上拉
BCFSTATUS,RP0
CLRW;地址00H
CALLRD24;讀地址
MOV WFDAT;讀出的值送F1
SUBLW.9;若讀出的值大于9,則F1送為0,從0開始(因?yàn)?位數(shù)碼管只能顯示到0-9)
BCTT2;C=0就轉(zhuǎn)TT2
TT1
CLRFDAT
TT2
MOV FWDAT
CALLTABLE;取顯示段碼
MOV WFPORTC;段碼送C口
BCFPORTA,1;點(diǎn)亮第一位數(shù)碼管
INCFDAT,1;每次上電,存入24CXX的00H地址的值加1
CLRW;地址00H
CALLWT24;寫24CXX
GOTO$
;****************************
RD24
MOV WFADDR;地址暫存于F4中
CALLSTART24;啟動(dòng)I2C
MOV LW0A0H
CALLSUBS;寫器件地址1010000+最后一位0寫操作
MOV FWADDR;載入地址
CALLSUBS;寫地址
CALLSTART24;再發(fā)開始信號(hào)
MOV LW0A1H;寫器件地址1010000+最后一位1讀操作
CALLSUBS
BSFSTATUS,RP0
BSFTRISB,5;設(shè)SDA腳為輸入,準(zhǔn)備讀
BCFSTATUS,RP0
MOV LW08H;共讀8位數(shù)據(jù)
MOV WFCOUNT
RD000
NOP
NOP
NOP
BSFSCLK;讀數(shù)據(jù)
NOP
BSFSTATUS,C
BTFSSSDA
BCFSTATUS,C
RLFTEMP,1
BCFSCLK
DECFSZCOUNT,1;循環(huán)讀完8位
GOTORD000
BSFSTATUS,RP0
BCFTRISB,5;恢復(fù)SDA腳為輸出
BCFSTATUS,RP0
BSFSDA
CALLDELAY2
BSFSCLK
CALLDELAY2
BCFSCLK;應(yīng)答畢,SDA置1
CALLSTOP;送停止信號(hào)
MOV FWTEMP;將讀的數(shù)據(jù)送入W中
RETURN
;******************************寫入24C02程序
WT24 MOV WFADDR;先將地址暫存于F4
CALLSTART24;開始條件
MOV LW0A0H
CALLSUBS;寫器件地址1010000+最后一位0寫操作
MOV FWADDR;載入地址
CALLSUBS;寫地址
MOV FWDAT;載入數(shù)據(jù)
CALLSUBS;寫數(shù)據(jù)
CALLSTOP;停止信號(hào)
RETURN
START24
;開始條件
BSFSDA
BSFSCLK
CALLDELAY2
BCFSDA
CALLDELAY2
BCFSCLK
RETURN
STOP
BCFSDA;停止條件
NOP
NOP
BSFSCLK
CALLDELAY2
BSFSDA
RETURN
SUBS;寫數(shù)據(jù)
MOV WFTEMP;將要寫的數(shù)據(jù)存于F2中
MOV LW08H
MOV WFCOUNT;寫8位數(shù)據(jù)
SH01
RLFTEMP,1
BSFSDA
BTFSSSTATUS,C
BCFSDA
NOP
BSFSCLK
CALLDELAY2
BCFSCLK
DECFSZCOUNT,1;循環(huán)寫完8位
GOTOSH01
BSFSDA
NOP
NOP
BSFSCLK
BSFSTATUS,RP0
BSFTRISB,5
BCFSTATUS,RP0
REP
BTFSCSDA;判應(yīng)答到否,未到則等待
GOTOREP
BCFSCLK
BSFSTATUS,RP0
BCFTRISB,5
BCFSTATUS,RP0
RETURN
DELAY2
NOP
NOP
NOP
NOP
RETURN
;********************************************
end;源程序結(jié)束