⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24c01.asm

📁 完整功放的控制程序
💻 ASM
字号:
;*************************** 24c01器件子程序 **************************
;I2C总线EEPROM
;使用了: ACC,R0,R1,R2,R3

	;************ 公共变量定义 ****************
	PUBLIC	READ_ABYTE, WRITE_ABYTE



       ;************ 变量说明 *****************
        BC_SDA_24C01    BIT     P2.7    ;24c01数据线
        BC_CLK_24C01    BIT     P2.6    ;24c01时钟

       	EXTRN	BIT(B_ACK_24C01)    	;24C01的应答位值寄存
	EXTRN	DATA(ERR_24C01)    	;24C01的错误码寄存,!!!!!! 开机时清0 !!!



	;************** 常数定义 ******************
	WRITE_24C01   EQU  0A0H        ;读HT24C01命令
	READ_24C01    EQU  0A1H        ;写HT24C01命令






;******* 24c01,在约定地址读出一数据 (被C调用) *********
;******************************************************
;参数: PAR	读出数在24c01中的地址 
;返回: PAR	读出数

READ_ABYTE:
      MOV   A,ERR_24C01
      CJNE  A,#01H, LBL_P67
      MOV   PAR, ACC
      RET
LBL_P67:
      MOV R3,#00AH
LBL_P68:
      LCALL START_CONDITION   	;Ready to get data from ht24c01,start condition
      MOV   A,#WRITE_24C01    	;write address command
      LCALL SEND_24C01        	;send command to ht24c01
      LCALL GET_ACK           	;get ack bit from ht24c01,ack bit is save in B_ACK_24C01
      MOV   A,PAR          	;address is save in 01FH
      LCALL SEND_24C01        	;send command to ht24c01
      LCALL GET_ACK           	;get ack bit from ht24c01,ack bit is save in B_ACK_24C01
      LCALL STOP_CONDITION    	;stop condtion
      DJNZ  R3,LBL_P69
      ORL   ERR_24C01,#01H
      MOV   PAR, ACC
      RET 
LBL_P69:
      JB    B_ACK_24C01,LBL_P68   ;transist data with htc2401
      MOV R3,#00AH 
LBL_P7:
      LCALL START_CONDITION   ;Ready to get data from ht24c01,start condition
      MOV   A,#READ_24C01     ;read data command
      LCALL SEND_24C01        ;send command to ht24c01,read command is #0A1h
      LCALL GET_ACK           ;get ack bit from ht24c01,ack bit is save in B_ACK_24C01
      DJNZ  R3,LBL_P70 
      ORL   ERR_24C01,#01H
      MOV   PAR, ACC
      RET 
LBL_P70:
      JB    B_ACK_24C01,LBL_P7  ;if ack zero then continue
      LCALL GET_DATA          	;get data from ht24c01 return val is in ACC
      LCALL STOP_CONDITION    	;stop condtion
      ANL   ERR_24C01,#0FEH     ;clear err_24c01 bit
      MOV   PAR, ACC		;返回数据
      RET                     	;this is random read operations






;******** 24c01,在约定地址写一数据, 占用20ms (被C调用)***********
;****************************************************************
;参数1: PAR 		24c01中的地址 
;参数2: @PAR		写入数
;返回:

WRITE_ABYTE:
     MOV  A,ERR_24C01          ;EEPROM错误代码
     CJNE A, #01H, LBL_P76
     LJMP WE24C_DEL

LBL_P76:
     MOV R1,#00AH
LBL_P71:
     MOV R2,#00AH
LBL_P74:
     MOV R3,#00AH
LBL_P72:
     LCALL START_CONDITION   	;Ready to get data from ht24c01,start condition
     MOV   A,#WRITE_24C01 
     LCALL SEND_24C01        	;send command to ht24c01,write command is 0A0H
     LCALL GET_ACK           	;get ack bit from ht24c01,ack bit is save in 000h
     DJNZ  R3,LBL_P73 
     ORL   ERR_24C01, #01H
     LJMP  WE24C_DEL
     
LBL_P73:
     JB    B_ACK_24C01,LBL_P72
     MOV   A,PAR 
     LCALL SEND_24C01        	;送地址 to ht24c01
     LCALL GET_ACK           	;get ack bit from ht24c01,ack bit is save in 000h
     DJNZ  R2,LBL_P75 
     ORL   ERR_24C01, #01H
     LJMP  WE24C_DEL

LBL_P75:
     JB    B_ACK_24C01,LBL_P74
     
     MOV  R0,PAR
     MOV  A,@R0

     LCALL SEND_24C01        	;送数据 to ht24c01
     LCALL GET_ACK           	;get ack bit from ht24c01,ack bit is save in 000h
     DJNZ  R1,LBL_P77 
     ORL   ERR_24C01, #01H
     LJMP  WE24C_DEL
     
LBL_P77:
     JB    B_ACK_24C01,LBL_P71
     LCALL STOP_CONDITION    	;stop condtion
     ANL   ERR_24C01,#0FEH 	;write OK!!!
                                ;每写完一次24C01则要等待20MS的时间*********
WE24C_DEL:			;********* 延时20ms, 4M晶振 ***********
     MOV  A, #00H
     MOV  R1, #09H
WE24C_L0:
     DJNZ  ACC, WE24C_L0
     DJNZ  R1, WE24C_L0
     RET








;================================= 文件内部子程序 ================================
;*********************************************************************************

;********* 24c01 的起始准备工作 *********
START_CONDITION:
     CLR   B_ACK_24C01   	;clear ack flag
     SETB  BC_SDA_24C01      	;Ready to get data from ht24c01,start condition
     SETB  BC_CLK_24C01      	;HT24C01 CLK
     NOP 
     NOP
     NOP
     CLR   BC_SDA_24C01      	;HT24C01 SDA
     NOP
     NOP
     NOP 
     CLR   BC_CLK_24C01      	;HT24C01 CLK
     NOP 
     RET 





;************ 24c01 的结束工作 **************
STOP_CONDITION:
      NOP			;stop condtion
      CLR   BC_SDA_24C01      	;HT24C01 SDA
      NOP
      NOP
      NOP 
      SETB  BC_CLK_24C01      	;HT24C01 CLK
      NOP
      NOP
      NOP 
      SETB  BC_SDA_24C01      	;HT24C01 SDA
      RET 






;************ 写一字节到24c01 *************
SEND_24C01:
      MOV   R0,#008H          ;send data to ht24c01
LBL_P5:
      CLR   BC_CLK_24C01      ;HT24C01 CLK
      NOP
      NOP
      RLC   A 
      MOV   BC_SDA_24C01,C    ;SDA
      NOP 
      NOP
      NOP
      SETB  BC_CLK_24C01      ;HT24C01 CLK
      NOP
      NOP
      NOP 
      DJNZ  R0,LBL_P5 
      NOP 
      CLR   BC_CLK_24C01      ;HT24C01 CLK
      RET 


;*********** 从24c01读出一字节 ************
GET_DATA:	;读数据
      MOV   R0,#008H          ;get data from ht24c01
LBL_P6:
      CLR   BC_CLK_24C01      ;HT24C01 CLK
      NOP
      NOP
      NOP 
      SETB  BC_SDA_24C01      ;HT24C01 SDA
      NOP 
      MOV   C,BC_SDA_24C01    ;HT24C01 SDA
      RLC   A 
      NOP
      SETB  BC_CLK_24C01      ;HT24C01 CLK
      NOP 
      NOP
      NOP
      DJNZ  R0,LBL_P6 
      NOP 
      CLR   BC_CLK_24C01      ;HT24C01 CLK
      RET     		      ;return val is in ACC


;********* 读24c01的应答位 **********
GET_ACK:
      SETB  BC_SDA_24C01      ;get ack bit from ht24c01,ack bit is save in 000h
      NOP
      NOP 
      MOV   C,BC_SDA_24C01    ;HT24C01 SDA
      MOV   B_ACK_24C01,C 
      NOP
      NOP 
      SETB  BC_CLK_24C01      ;HT24C01 CLK
      NOP
      NOP
      NOP 
      CLR   BC_CLK_24C01      ;HT24C01 CLK
      RET 


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -