;該試驗(yàn)功能是單片機(jī)復(fù)位一次,自動(dòng)從24C02中讀取數(shù)據(jù)到數(shù)碼管顯示,然后對(duì)值加1再寫(xiě)入24C02,最終數(shù)碼管中的數(shù)據(jù)就是開(kāi)機(jī)的次數(shù),具有一定的實(shí)用意義 ;本電路所使用24C02為ATMEL的,或不是該廠的,則燒寫(xiě)時(shí)間可能會(huì)有差異 ;必須調(diào)整本程序的DELAY時(shí)間 ;本實(shí)戰(zhàn)的目的是讓大家進(jìn)上步熟悉I2C通信的時(shí)序,熟悉24CXX的讀寫(xiě),會(huì)用軟件模擬I2C通信 ;硬件接法: ;1.24CXX的SDA接877A的RB5口,SCLK接877A的RB4口,WP接地,A0,A1,A2接地 ;2.實(shí)驗(yàn)本實(shí)驗(yàn)須將MCD-DEMO實(shí)驗(yàn)板上的93CXX系列芯片先取下,在實(shí)驗(yàn)過(guò)程中不要按動(dòng)同樣接在RB口的按鍵,以免影響通信時(shí)序. ;3.實(shí)驗(yàn)板上拔碼開(kāi)關(guān)S4,S5要置ON,其它拔碼開(kāi)關(guān)都可以關(guān)閉。 ;PIC單片機(jī)學(xué)習(xí)網(wǎng) 陳學(xué)乾 http://www.pic16.com 討論論壇:http://pic16.com/bbs/ ;版權(quán)所有,轉(zhuǎn)載請(qǐng)注明出處,并不能去掉或改變文件中的說(shuō)明文字。 ;程序文件名“MCD-24C02.ASM" ;程序清單如下: ;************************************ LIST P=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; ;************************************ 定義查表偏移量 #define SDA PORTB,5 #define SCLK PORTB,4 ;********************* COUNT EQU 20H ADDR EQU 21H DAT EQU 23H TEMP EQU 24H ;********************** ORG 000H NOP ;放置一條ICD必需的空操作指令 GOTO MAIN ORG 004H RETURN ORG 0008H ;****************************************************** TABLE ADDWF PCL,1 ;地址偏移量加當(dāng)前PC值 RETLW 0C0H ;0 RETLW 0F9H ;1 RETLW 0A4H ;2 RETLW 0B0H ;3 RETLW 99H ;4 RETLW 92H ;5 RETLW 82H ;6 RETLW 0F8H ;7 RETLW 80H ;8 RETLW 98H ;9 RETLW 00H ;A RETLW 00H ;B RETLW 00H ;C RETLW 00H ;D RETLW 00H ;E RETLW 00H ;F ;******************************************************* MAIN MOVLW 0FFH MOVWF PORTC ;數(shù)碼管先全部熄滅 MOVLW 0FFH MOVWF PORTA MOVLW 0FFH MOVWF PORTB ;SDT,SCLK都為高
BSF STATUS,RP0 ;定義RA口,RC,RB口全部為輸出 MOVLW 07H MOVWF ADCON1 ;設(shè)置RA口全部為普通數(shù)字IO口 CLRW MOVWF TRISB ; MOVWF TRISA MOVWF TRISC MOVWF OPTION_REG ;開(kāi)啟RB口內(nèi)部弱上拉 BCF STATUS,RP0
CLRW ;地址00H CALL RD24 ;讀地址 MOVWF DAT ;讀出的值送F1 SUBLW .9 ;若讀出的值大于9,則F1送為0,從0開(kāi)始(因?yàn)?位數(shù)碼管只能顯示到0-9) BC TT2 ;C=0就轉(zhuǎn)TT2 TT1 CLRF DAT TT2 MOVFW DAT CALL TABLE ;取顯示段碼 MOVWF PORTC ;段碼送C口 BCF PORTA ,1 ;點(diǎn)亮第一位數(shù)碼管 INCF DAT ,1 ;每次上電,存入24CXX的00H地址的值加1 CLRW ;地址00H CALL WT24 ;寫(xiě)24CXX GOTO $ ;**************************** RD24 MOVWF ADDR ;地址暫存于F4中 CALL START24 ;啟動(dòng)I2C MOVLW 0A0H CALL SUBS ;寫(xiě)器件地址1010000+最后一位0寫(xiě)操作 MOVFW ADDR ;載入地址 CALL SUBS ;寫(xiě)地址 CALL START24 ;再發(fā)開(kāi)始信號(hào) MOVLW 0A1H ;寫(xiě)器件地址1010000+最后一位1讀操作 CALL SUBS BSF STATUS ,RP0 BSF TRISB ,5 ;設(shè)SDA腳為輸入,準(zhǔn)備讀 BCF STATUS ,RP0 MOVLW 08H ;共讀8位數(shù)據(jù) MOVWF COUNT RD000 NOP NOP NOP BSF SCLK ;讀數(shù)據(jù) NOP BSF STATUS,C BTFSS SDA BCF STATUS,C RLF TEMP ,1 BCF SCLK DECFSZ COUNT ,1 ;循環(huán)讀完8位 GOTO RD000 BSF STATUS ,RP0 BCF TRISB ,5 ;恢復(fù)SDA腳為輸出 BCF STATUS ,RP0 BSF SDA CALL DELAY2 BSF SCLK CALL DELAY2 BCF SCLK ;應(yīng)答畢,SDA置1 CALL STOP ;送停止信號(hào) MOVFW TEMP ;將讀的數(shù)據(jù)送入W中 RETURN ;******************************寫(xiě)入24C02程序 WT24 MOVWF ADDR ; 先將地址暫存于F4 CALL START24 ;開(kāi)始條件 MOVLW 0A0H CALL SUBS ;寫(xiě)器件地址1010000+最后一位0寫(xiě)操作 MOVFW ADDR ;載入地址 CALL SUBS ;寫(xiě)地址 MOVFW DAT ;載入數(shù)據(jù) CALL SUBS ;寫(xiě)數(shù)據(jù) CALL STOP ;停止信號(hào) RETURN
START24 ;開(kāi)始條件 BSF SDA BSF SCLK CALL DELAY2 BCF SDA CALL DELAY2 BCF SCLK RETURN
STOP BCF SDA ;停止條件 NOP NOP BSF SCLK CALL DELAY2 BSF SDA RETURN
SUBS ;寫(xiě)數(shù)據(jù) MOVWF TEMP ;將要寫(xiě)的數(shù)據(jù)存于F2中 MOVLW 08H MOVWF COUNT ;寫(xiě)8位數(shù)據(jù) SH01 RLF TEMP ,1 BSF SDA BTFSS STATUS ,C BCF SDA NOP BSF SCLK CALL DELAY2 BCF SCLK DECFSZ COUNT ,1 ;循環(huán)寫(xiě)完8位 GOTO SH01 BSF SDA NOP NOP BSF SCLK BSF STATUS,RP0 BSF TRISB ,5 BCF STATUS,RP0 REP BTFSC SDA ;判應(yīng)答到否,未到則等待 GOTO REP BCF SCLK BSF STATUS,RP0 BCF TRISB ,5 BCF STATUS,RP0 RETURN
DELAY2 NOP NOP NOP NOP RETURN ;******************************************** end ;源程序結(jié)束 ;***************************************************** |
|