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