下面给出FM24C16的页面写和任意字节读汇编子程序。程序经过应用验证,效果良好(为保证稳定性,可以在相应地方加入空语句以延时)。

页面写子程序:






PAGE-WR: ACALL START\_BIT





MOV A,#10100000B





MOV R7,#4





ACALL SHFTO





;SHFTO为送位子程序,以上3行送





1010到FM24C16





MOV A,#20H





MOV R7,#3





ACALL SHFTO





;以上3行确定写FM24C16的00l页





MOV A,#00H





MOV R7,#1





ACALL SHFTO ;以上3行送写控制位0





ACALL SlAVE\_ACK





;SLAVE-ACK为从应答子程序,在此检测





从应答位





MOV A,#00H





MOV R7,#8





ACALL SHFTO





;以上3行确定写入数据首地址为00H





ACALLSLAVE-ACK ;检测从应答位





MOV R0,#00H ;R0中为被写人数据





所在单元首地址





MOV R4,#7FH ;R4中为写入字节数





(现为256B)





NEXT-DATA:MOV A,@R0 ;调入第1个写入数据





INC R0 ;R0指向第2个数据所在单元地址





MOV R7,#8





ACALL SHFTO;写入数据





ACALL SLAVE-ACK ;检测从应答位





DJNZ R4,NEXT-DATA





;循环写入下一个字节数据





ACALL STOP-BIT





;STOP-BIT为停止位,结束写操作(此处没有写延时等待)





RET ;返回,程序结束





读任意地址子程序:





SELECT-RD:ACALL START-BIT





ACALL START-BIT





MOV A,#10100000B





MOV R7,#4





ACALL SHFTO





MOV A,#20H





MOV R7,#3





ACALL SHFTO





MOV A,#0FOH





MOV R7,#1





ACALL SHFTO





ACALL SlAVE-ACK





MOV R5,#00H





MOV R7,#8





ACALL SHFTO





ACALL SlAVE-ACK





;以上为伪写,确定读FM24C16的001





00H单元数据





ACALL START-BIT





MOV A,#10100000B





MOV R7,#4





ACALL SHFTO





MOV A,#20H





MOV R7,#3





ACALL SHFTO





MOV A,#0FOH





MOV R7,#1





ACALL SHFTO ;上面3行送读控制位1





ACALL SlAVE-ACK





MOV R5,#00H ;清R5,以存储读出数据





MOV R7,#8 ;R7作读出位记数器





CLOCK8: SETB SCL





MOV C,SDA





CLR SCL





MOV A,R5





RLC A





MOV R5,A





;以上6行读出FM24C16送来的1位





DJNZ R7,CLOCK8 ;循环读出1B数据





ACALL NO\_ACK





;NO\_ACK为无需应答位子程序





ACLL STOP\_BIT ;停止





RET ;程序结束