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

📄 fm24cl04.asm

📁 c8051f020单片机控制铁电存储器FM24CL04的驱动程序
💻 ASM
字号:
      ; FM24CL04铁电存储器的模拟IIC传输测试及其子程序
      ; 新华龙C8051F020芯片
      ; 外部时钟,11.0592Mhz
      ; 模拟IIC

      $INCLUDE (C8051F020.INC)

      ORG 0000H
      LJMP MAIN



MAIN:
     MOV SP, #60H
     LCALL OTER_INIT
     LCALL SYSCLK_INIT
     LCALL SWITCH_INIT
     LCALL WRDATA

LOOP:
     LCALL FRAM
SJMP LOOP

;;--------------------------------
;;其它初始化操作
;;--------------------------------
OTER_INIT:
;;看门狗
          CLR EA
          MOV WDTCN,#0DEH  ;DISABLE WATCHDOG
          MOV WDTCN,#0ADH
          SETB EA
	  ORL EMI0CF,#00100011B  ;XRAM IN HIGH PORTS
          RET

;;--------------------------------
;;时钟
;;--------------------------------
SYSCLK_INIT:
            MOV OSCXCN,#67H
            CLR A 
            DJNZ ACC,$
            DJNZ ACC,$
	    DJNZ ACC,$
OSC_WAIT:   NOP
            MOV A,OSCXCN
            JNB ACC.7,OSC_WAIT
            MOV OSCICN,#88H  ;SELECTED EX_CLK
            RET


;;--------------------------------
;;交叉开关及I/O口的输入输出方式
;;--------------------------------
SWITCH_INIT:
            MOV XBR0,#00000101B  ;UART0, SMBUS
            MOV XBR1,#00010100B  ;INT1, INT0
            MOV XBR2,#01000100B  ;ENABLED, UART1
            MOV P0MDOUT,#00H
            MOV P1MDIN,#0FFH
            MOV P1MDOUT,#00H
            MOV P2MDOUT,#00H
            MOV P3MDOUT,#00H
            MOV P3IF,#00H
            MOV P74OUT,#00H
            RET


;;-----------------------
;;测试数据写程序
;;-----------------------
WRDATA:MOV R1,#0AH
       MOV R0,#WR_BUF
WR_L:  MOV @R0,#0AAH
       INC R0
       DJNZ R1,WR_L
       RET

;;-----------------------
;;测试
;;-----------------------
FRAM:
     CLR WP

     MOV N,#10
     MOV POINTER,#10H
     LCALL WR_NB  ;在小于256B空间内写入10B

     MOV N,#10
     MOV POINTER,#10H
     LCALL RD_NB  ;在小于256B空间内读出10B

     MOV N,#10
     MOV POINTERH,#01H
     MOV POINTERL,#0F0H
     LCALL WR_NBHL  ;在大于256B空间内写入10B

     MOV N,#10
     MOV POINTERH,#01H
     MOV POINTERL,#0F0H
     LCALL RD_NBHL  ;在大于256B空间内读出10B

     RET



;***************************************************************************


SDA2 BIT P1.3
SCL2 BIT P1.4
WP BIT P1.5
POINTERH EQU  1FH  ;高位地址,空间大于256B时用
POINTERL EQU  1EH  ;低位地址,空间大于256B时用
POINTER EQU  20H  ;一般地址,空间在256B以下时用
WR_BUF EQU 23H  ;欲写的数据缓冲区首址
RD_BUF EQU 33H  ;欲读的数据缓冲区首址
N EQU 22H  ;字节个数
DEVICE EQU 21H  ;器件地址

;;-----启动-----;;
START:LCALL DEL5US
      SETB SDA2
			LCALL DEL5US
			SETB SCL2
			LCALL DEL5US
      CLR SDA2
			LCALL DEL5US
      CLR SCL2
			LCALL DEL5US
      RET

;;-----结束-----;;
STOP:LCALL DEL5US
     SETB SCL2
		 LCALL DEL5US
		 SETB SDA2
		 LCALL DEL5US
		 RET

;;-----应答检查-----;;
CACK:SETB SDA2
     LCALL DEL5US
		 SETB SCL2
		 LCALL DEL5US
		 MOV C,SDA2
		 JC CACK
		 CLR SCL2
		 CLR SDA2
		 LCALL DEL1MS
		 RET

;;-----应答-----;;
MACK:CLR SDA2
     LCALL DEL5US
		 SETB SCL2
		 LCALL DEL5US
		 CLR SCL2
		 LCALL DEL5US
		 SETB SDA2
		 RET


;;-----按顺序写字节数据-----;;
;;入口:ACC
;;资源占用:A、R0、CY、F0、R2
IWRB:LCALL START
     MOV A,#0A0H
		 LCALL WR8BIT
		 LCALL CACK
		 MOV A,WR_BUF
		 LCALL WR8BIT
		 LCALL CACK
IWEXIT:
     LCALL STOP
		 LCALL DEL10MS
		 RET

;;-----按顺序读字节数据-----;;
;;入口:从器件地址DEVICE
;;出口:数据读入ACC
;;资源占用:A、R0、CY、F0
IRDB:LCALL START
     MOV A,#0A1H
		 LCALL WR8BIT
		 LCALL CACK
		 LCALL RD8BIT
IREXIT:
		 LCALL STOP
		 RET

;;-----向从器件指定单元写N个字节数据-----;;
;;入口:传递的地址在POINTER,数据在WR_BUF中,发送字节数在N中
;;资源占用:ACC、R0、R1、R3、C
WR_NB:SETB SDA2
      SETB SCL2
			LCALL START
			MOV A,#0A0H
			LCALL WR8BIT
			LCALL CACK
			MOV A,POINTER
			LCALL WR8BIT
			LCALL CACK
			MOV R3,N
			MOV R1,#WR_BUF
WRNB1:MOV A,@R1
      LCALL WR8BIT
			LCALL CACK
			INC R1
			DJNZ R3,WRNB1
			LCALL STOP
			LCALL DEL10MS
			RET


;;-----从从器件指定单元读N个字节数据-----;;
;;入口:传递的地址在POINTER,接收数据缓冲区RD_BUF,接收字节数在N中
;;资源占用:ACC、R0、R1、R3、C
RD_NB:MOV R3,N
RDNB1:LCALL START
      MOV A,#0A0H
			LCALL WR8BIT
			LCALL CACK
			MOV A,POINTER
			LCALL WR8BIT
			LCALL CACK
			LCALL START
			MOV A,#0A1H
			LCALL WR8BIT
			LCALL CACK
			MOV R1,#RD_BUF
RDB:  LCALL RD8BIT
      MOV @R1,A
			DJNZ R3,SACK
			LCALL STOP
			RET
SACK: INC R1
      LCALL MACK
			SJMP RDB

;;-----字节发送-----;;
;;入口:要发送的数据在ACC中
;;每发送完一个字节,要调用一次CACK,以判断是否有应答
WR8BIT:PUSH ACC
       MOV R0,#08H
WR_BIT:RLC A
       MOV SDA2,C
			 LCALL DEL5US
			 SETB SCL2
			 LCALL DEL5US
			 CLR SCL2
			 DJNZ R0,WR_BIT
			 POP ACC
			 RET


;;-----字节接收-----;;
;;出口:接收到的数据在ACC中
;;每接收完一个字节,要调用一MCACK/MNACK
RD8BIT:MOV R0,#08H
RD_BIT:SETB SDA2
       LCALL DEL5US
			 SETB SCL2
			 LCALL DEL5US
			 MOV C,SDA2
			 RLC A
			 LCALL DEL5US
			 CLR SCL2
			 DJNZ R0,RD_BIT
			 CLR SDA2
			 RET
			 
			 
;;-----5US-----;;			 			 			 
DEL5US:NOP
       NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 RET
			 
			 

;;-----1MS-----;;
DEL1MS:MOV R4,#200
       NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 NOP
			 DJNZ R4,$-3
			 RET



;;-----10MS-----;;
DEL10MS:MOV R5,#10
        NOP
				LCALL DEL1MS
				NOP
				NOP
				DJNZ R5,$-3
				RET
							 			 			     
			      						
;;-----向从器件指定单元写N个字节数据(>256B的EEPROM)-----;;
;;入口:传递的地址在POINTER,数据在WR_BUF中,发送字节数在N中
;;资源占用:ACC、R0、R1、R3、C
WR_NBHL:SETB SDA2
      SETB SCL2
			LCALL START
			MOV A,#0A0H
			LCALL WR8BIT
			LCALL CACK
			MOV A,POINTERH
			LCALL WR8BIT
			LCALL CACK
			MOV A,POINTERL
			LCALL WR8BIT
			LCALL CACK
			MOV R3,N
			MOV R1,#WR_BUF
WRNB1HL:MOV A,@R1
      LCALL WR8BIT
			LCALL CACK
			INC R1
			DJNZ R3,WRNB1HL
			LCALL STOP
			LCALL DEL10MS
			RET


;;-----从从器件指定单元读N个字节数据(>256B的EEPROM)-----;;
;;入口:传递的地址在POINTER,接收数据缓冲区RD_BUF,接收字节数在N中
;;资源占用:ACC、R0、R1、R3、C
RD_NBHL:MOV R3,N
RDNB1HL:LCALL START
      MOV A,#0A0H
			LCALL WR8BIT
			LCALL CACK
			MOV A,POINTERH
			LCALL WR8BIT
			LCALL CACK
			MOV A,POINTERL
			LCALL WR8BIT
			LCALL CACK
			LCALL START
			MOV A,#0A1H
			LCALL WR8BIT
			LCALL CACK
			MOV R1,#RD_BUF
RDBHL:  LCALL RD8BIT
      MOV @R1,A
			DJNZ R3,SACKHL
			LCALL STOP
			RET
SACKHL: INC R1
      LCALL MACK
			SJMP RDBHL


;***************************

     END

⌨️ 快捷键说明

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