;该试验功能是单片机复位一次,自动从24C02中读取数据到数码管显示,然后对值加1再写入24C02,最终数码管中的数据就是开机的次数,具有一定的实用意义 ;本电路所使用24C02为ATMEL的,或不是该厂的,则烧写时间可能会有差异 ;必须调整本程序的DELAY时间 ;本实战的目的是让大家进上步熟悉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 ;再发开始信号 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 ;循环读完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 ;循环写完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 ;源程序结束 ;***************************************************** |
|