;作者:eleclike
;功能:基于51单片机的AT24C0x串行EEPROM 驱动
;子程序1:SB_WRT 写EEPROM
; 入口参数:R0,写入数据的RAM的地址,
; R3,写入数据的个数,
; RG_ICCADR,IIC EEPROM写入的开始地址
; 出口参数:
;子程序2:SB_REA 读EEPROM
; 入口参数:R0,读出数据保存到的RAM的地址,
; R3,读出数据的个数,
; RG_ICCADR,IIC EEPROM读出的开始地址
; 出口参数: 读出数据,
;子程序3:被子程序1,2调用
;子程序4:被子程序1,2调用
;其他说明:P3.4--SDA;P3.5--SCL;
;
;=====================;延时使用的寄存器
RG_DLY EQU 2H
BT_SDA EQU P3.4
BT_SCL EQU P3.5
;--------------------------------------------------------
;-----子程序使用的RAM----等价符号---开始---------------
RG_PWD1 EQU 51H
RG_PWD2 EQU 52H
RG_PWD3 EQU 53H
RG_IICADR EQU 54H
;-----子程序使用的RAM----等价符号---结束---------------
;------------------------------------------------------
;=====================动态显示部分
PT_DSP_DAT EQU P0;PT_DSP_DT:DiSPlay DATa output PorT
PT_DSP_BT EQU P2;PT_DSP_BT:display port bit select
RG_ADD EQU 40H;保存显示数据的地址;是SB_DSP的入口参数
RG_DAT1 EQU 31H
RG_DAT2 EQU 32H
RG_DAT3 EQU 33H
;=================
ORG 0000H ;中断矢量表
LJMP MAI
ORG 0030H
;==========主程序=====
MAI: MOV SP,#60H
MOV RG_PWD1,#72H
MOV RG_PWD2,#34H
MOV RG_PWD3,#89H
MOV P0,#0
MOV RG_DAT1,#0
MOV RG_DAT2,#0
MOV RG_DAT3,#0
MOV RG_IICADR,#00H;写入IIC的页内地址
LP1_MAI:NOP
CPL P0.0
;--------------------主程序调用段---------------------------
MOV R3,#3 ;写数据的个数
MOV RG_IICADR,#00H ;从EEPROM的00H开始写数据
MOV R0,#RG_PWD1;最先写入的数据为的地址为#RG_PWD1
LCALL SB_WRT
MOV R3,#3
MOV RG_IICADR,#00H ;从EEPROM的00H开始读数据
MOV R0,#RG_DAT1
LCALL SB_REA
;------------------------------------------------------------
MOV A,RG_DAT1
JZ RT_MAI
CPL P0.1
MAI_DSP:MOV RG_ADD,#RG_DAT1;先送低位RAM的数据
LCALL SB_DSP
SETB P1.1
JB P1.1,MAI_DSP
MOV R2,#10
LCALL SB_DLY
JB P1.1,MAI_DSP
JNB P1.1,$
MOV A,RG_PWD1
ADD A,#1
DA A
MOV RG_PWD1,A
CJNE A,#99H,RT_MAI
MOV RG_PWD1,#0
RT_MAI :
CPL P0.2
CPL P0.3
LJMP LP1_MAI
;-------------------------------------------------------------------
;-----------以下IIC 串行EEPROM 驱动子程序-----------------------------
;===写EEPROM子程序========
SB_WRT: MOV A,#10100000B
SETB BT_SCL ; 开始总线
NOP
CLR BT_SDA
NOP
CLR BT_SCL
NOP
LCALL SB_WEE ; WRITE CODE
MOV A,RG_IICADR
LCALL SB_WEE ; 写入地址
MOV A,@R0
LCALL SB_WEE ; 写入数据
CLR BT_SDA
NOP
SETB BT_SCL
NOP
SETB BT_SDA ; 停止总线
NOP
MOV R2,#0CH ;
LCALL SB_DLY ; DELAY
INC RG_IICADR
INC R0
DJNZ R3,SB_WRT
RET
;==读EEPROM子程序========
SB_REA: MOV A,#10100000B
CLR BT_SDA ; START 1
NOP
CLR BT_SCL
NOP
LCALL SB_WEE ; WRITE CODE
MOV A,RG_IICADR
LCALL SB_WEE ; 写入地址
NOP
SETB BT_SCL ; START 2
NOP
CLR BT_SDA
NOP
CLR BT_SCL
NOP
MOV A,#10100001B
LCALL SB_WEE ; READ CODE
LCALL SB_RNK ; READ DATA
MOV @R0,A ; WITHOUT ACK
CLR BT_SDA ; 停止总线
NOP
SETB BT_SCL
NOP
SETB BT_SDA
NOP
MOV R2,#0CH ;
LCALL SB_DLY ; DELAY
INC R0
INC RG_IICADR
DJNZ R3,SB_REA
RET
;======================
SB_WEE: MOV R5,#08H ; SUB SHIFT WRITE
WEW: RLC A ; WITH ACK
MOV BT_SDA, C
SETB BT_SCL
NOP
CLR BT_SCL
DJNZ R5,WEW
SETB BT_SDA
WAT: JB BT_SDA,WAT
SETB BT_SCL
NOP
CLR BT_SCL
RET
;========================================================
SB_RNK: MOV R5, #08H ; SUB SHIFT WRITE
RNR: MOV C, BT_SDA ; WITHOUT ACK
RLC A
SETB BT_SCL
NOP
CLR BT_SCL
DJNZ R5, RNR
SETB BT_SCL
NOP
CLR BT_SCL
RET
;-------------IIC 串行EEPROM 驱动子程序结束---------------------
;---------------------------------------------------------------
;显示子程序
SB_DSP: PUSH ACC
MOV R6,#01H ;R6寄存器选择位
MOV R7,#3 ;R7寄存位移的次数,即需要显示的RAM的内容的个数
MOV R1,RG_ADD ;把最先要显示的内容的寄存器地址送到R1,最先显示低位,即数码管的最后面的位
LP_DSP: MOV A,R6 ;选择显示的位,使用PT_DSP_BT口
MOV PT_DSP_BT,A
RL A
MOV R6,A
MOV A,@R1
;送要显示的数到PT_DSP_DAT口
MOV PT_DSP_DAT,A
MOV RG_DLY, #8 ;调延时子程序
LCALL SB_DLY
MOV A,R6 ;选择显示的位,使用PT_DSP_BT口
MOV PT_DSP_BT,A
RL A
MOV R6,A
MOV A,@R1
ANL A,#0F0H
SWAP A ;送要显示的数到PT_DSP_DAT口
MOV PT_DSP_DAT,A
MOV RG_DLY, #8 ;调延时子程序
LCALL SB_DLY
INC R1
DEC R7 ;位选择控制次数减一
MOV A,R7
JZ RT_DSP
AJMP LP_DSP
RT_DSP: POP ACC
RET
;==========延时子程序==========
SB_DLY: PUSH RG_DLY
LP_DL1: PUSH RG_DLY
LP_DL2: PUSH RG_DLY
DJNZ R2,$
POP RG_DLY
DJNZ R2,LP_DL2
POP RG_DLY
DJNZ R2,LP_DL1
POP RG_DLY
DJNZ R2,SB_DLY
RET
END
文章评论(0条评论)
登录后参与讨论