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

📄 9300.asm

📁 带遥控 带128*64LCD 带电子开关
💻 ASM
📖 第 1 页 / 共 5 页
字号:
STOP:     
       CLR    SDA
       NOP
       SETB   SCL    
       NOP           	
       NOP            
       NOP
       NOP
       NOP
       SETB    SDA    		;结束总线
       NOP          		;保证一个终止信号和起始信号的空闲时间大于4.7us
       NOP
       NOP
       NOP
       RET
MACK:     
       CLR     SDA      	;将SDA置0 
       NOP
       NOP
       SETB    SCL
       NOP            		;保持数据时间,即SCL为高时间大于4.7us
       NOP
       NOP
       NOP
       NOP
       CLR     SCL
       NOP
       NOP
       RET
MNACK:    
       SETB    SDA          	;将SDA置1 
       NOP
       NOP
       SETB    SCL
       NOP
       NOP               	;保持数据时间,即SCL为高时间大于4.7us
       NOP
       NOP
       NOP
       CLR     SCL
       NOP
       NOP
       RET
CACK:	
      SETB     SDA
      NOP
      NOP
      SETB     SCL
      CLR      ACK
      NOP
      NOP
      MOV  	   C,SDA
      JC       CEND
      SETB     ACK           	;判断应答位
CEND:
      NOP
      CLR  	   SCL
      NOP
      RET
MNACK1:    	
     SETB 	   SDA          
     NOP
     NOP
     SETB 	   SCL
     NOP
     NOP               
     NOP
     NOP
     NOP
     CLR  	   SCL
     NOP
     NOP
     RET
WRBYTE: 
     MOV  	   R2,#08H
WLP: 		
     RLC       A              	;取数据位
     JC        WR1
     SJMP      WRO            	;判断数据位
WLP1:   	
     DJNZ  	   R2,WLP
     NOP
     RET
WR1:    	
     SETB  	   SDA            	;发送1
     NOP
     SETB  	   SCL
     NOP
     NOP
     NOP
     NOP
     NOP
     CLR   	   SCL
     SJMP  	   WLP1
WRO:  	
     CLR       SDA            	;发送0
     NOP
     SETB      SCL
     NOP
     NOP
     NOP
     NOP
     NOP
     CLR  	  SCL
     SJMP 	  WLP1
IWRBYTE:	
     NOP
     NOP
     PUSH     ACC
IWBLOOP: 	
     LCALL    START      
     MOV      A,SLA  
     LCALL    WRBYTE     
     LCALL    CACK
     JNB      ACK,RETWRB     	
     NOP
     NOP
     POP      ACC       
     LCALL    WRBYTE
     LCALL    CACK
     LCALL    STOP
     RET
RETWRB:  
      POP     ACC
      LCALL	  STOP
      NOP
      NOP
      RET
ASKWAT:	LCALL	DELAY
	SETB	SDAAT		
	LCALL	DELAY
	SETB	SCLAT
WAITASKW:	
	MOV	C,SDAAT
	;   JC	WAITASKW
	LCALL       DELAY
	CLR	SCLAT
	SETB	SDAAT
	RET
NOASK:	
	SETB	SDAAT
	NOP
	NOP
	NOP
	SETB	SCLAT
	LCALL	DELAY
	CLR	SCLAT
	LCALL	DELAY	
	RET
STARTAT:	SETB	SCLAT
	SETB	SDAAT
	LCALL	DELAY
	CLR	SDAAT
	LCALL	DELAY
	CLR	SCLAT
	RET
STOPAT:	CLR	SCLAT
	LCALL	DELAY
	CLR	SDAAT
	LCALL	DELAY
	SETB	SCLAT
	LCALL	DELAY
	SETB	SDAAT
	LCALL	DELAY
	RET
CACK2AT:	SETB  	SDAAT
	NOP
	NOP
	SETB  	SCLAT
	CLR   	ACK
	NOP
	NOP
	MOV  	C,SDAAT
	JC    	CEND2AT
	SETB  	ACK          	;判断应答位
CEND2AT:	NOP
	CLR  	SCLAT
	NOP
	RET
RD24: 	PUSH 	ACC 	
	LCALL 	STARTAT
	MOV 	A,#0A0H
	LCALL 	SENDDATE
	LCALL 	ASKWAT
            POP 	ACC
	LCALL 	SENDDATE
	LCALL 	ASKWAT	
	LCALL 	STARTAT
	MOV 	A,#0A1H
	LCALL 	SENDDATE
	LCALL 	ASKWAT
	SETB 	SDAAT
	MOV 	R7,#8
	CLR 	A
	SETB 	SDAAT
RD000: 		
	RL 	A
	SETB 	SCLAT
	NOP
	NOP
	MOV 	C,SDAAT
	MOV 	ACC.0,C
	CLR 	SCLAT
	NOP
	NOP
	DJNZ 	R7,RD000
	LCALL       NOASK
	LCALL       STOPAT
	RET
WT24: 	PUSH 	ACC
	LCALL 	STARTAT
	MOV 	A,#0A0H
	LCALL 	SENDDATE
	LCALL 	ASKWAT
	POP 	ACC
	LCALL 	SENDDATE	
	LCALL 	ASKWAT
	MOV 	A,B
	LCALL 	SENDDATE
	LCALL 	ASKWAT
	LCALL 	STOPAT
	LCALL 	DELAY
	RET
SENDDATE:	
	MOV	R2,#8
LOOPW:	RLC	A
	MOV	SDAAT,C
	LCALL	DELAY
	SETB	SCLAT
	LCALL	DELAY
	CLR	SCLAT
	LCALL	DELAY
	DJNZ	R2,LOOPW
	SETB	SDAAT
	RET
DELAY:	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP	
	RET
WRITE_TIME:
        MOV     37H,#0h
        MOV     38H,#0h
        MOV     39H,#0h
        MOV     3AH,#0h
        MOV     3BH,#0h
        MOV     3CH,#0h
        MOV     3DH,#0h
        MOV     3EH,#0h
        MOV     3FH,#00H      		 ; CLEAR THE RTC'RAM
        
	LCALL   TIMEWRITE_ON
	LCALL	T_IICSTART
        JB      FLAG.1,T_ERR_IICSTOP     ;如SDA线被箝位为低电平则退出
TIME_WRITE_1:
	MOV	TIMETX,#sd2400_W         ;发送写时钟sd2400的数据命令
	LCALL	T_SENDH_L
        JB      FLAG.0,T_ERR_IICSTOP     ;ACK信号不正常则退出.
        MOV     TIMETX,#00H              ;时间内部的起始地址
        LCALL   T_SENDH_L
TIME_WRITE_2:
	MOV	R0,#SECOND
	MOV	R1,#7H
WRTIME1:MOV	A,@R0
	MOV	TIMETX,A
	LCALL	T_SENDH_L
	INC	R0
	DJNZ	R1,WRTIME1
	LCALL	T_IICSTOP
	
        LCALL   T_IICSTART
	MOV	TIMETX,#sd2400_W        ;发送时钟sd2400的器件地址(写)
	LCALL	T_SENDH_L
	MOV	TIMETX,#12H             ;设置时钟数据的内部起始地址为12H
	LCALL	T_SENDH_L		;
        MOV     TIMETX,#0H              ;清12H的为0
        LCALL   T_SENDH_L
        LCALL   T_IICSTOP    
         
	LCALL   TIMEWRITE_OFF
	RET
;==================读实时时钟实时数据寄存器子程序==========================
;功能:从实时时钟读入当前时间数据                                         |
;入口:NONE                                                               |
;出口:接收数据放在年、月、日、星期、时、分、秒各寄存器                   |
;影响资源:A,R0,R3,TIMETX,TIMERX,YEAR,MONTH,DAY,WEEK,HOUR,MINUTE,SECOND  |
;==========================================================================
READ_TIME:
RDTIME_LOOP:
	LCALL	T_IICSTART
	 
        JB      FLAG.1,T_ERR_IICSTOP    ;如SDA线被箝位为低电平则退出
	MOV	TIMETX,#sd2400_W        ;发送写时钟sd2400的数据命令
	LCALL	T_SENDH_L
        JB      FLAG.0,T_ERR_IICSTOP    ;ACK信号不正常则退出.
        MOV     TIMETX,#0H              ;读时间内部的起始地址
        LCALL   T_SENDH_L
        LCALL   T_IICSTART              ;重新开始信号
        MOV     TIMETX,#sd2400_R        ;发送读时钟sd2400的数据命令
        LCALL   T_SENDH_L

	MOV	R0,#SECOND
	MOV	R3,#7H
RDTIME1:
	LCALL	T_RXH_L
	MOV	A,TIMERX
	MOV	@R0,A
	INC	R0
 	DJNZ	R3,RDTIME2              ;读完一个字节数据后确认数据传输
        JMP     RDTIME3                 ;若为最后一个字节数据则为NOACK
RDTIME2:
        CALL    T_ACK
        JMP     RDTIME1
RDTIME3:
        CALL    T_NOACK
        LCALL   T_IICSTOP
RDTIME_RET:
        ANL     HOUR,#7FH             ;屏蔽小时的最高位
        RET

T_ERR_IICSTOP:
        LCALL   T_IICSTOP
        RET



	      
;============================ACK===========================================
;功能:延时         入口:NONE             出口:NONE                     |
;影响资源:                                                               |
;==========================================================================
T_ACK:  CLR      TIMETEMP.1
        LCALL    T_BITOUT
        RET

;============================ACK===========================================
;功能:延时         入口:NONE             出口:NONE                     |
;影响资源:                                                               |
;==========================================================================
T_NOACK:  SETB     TIMETEMP.1
        LCALL    T_BITOUT
        RET
;===============================保存错误代码===============================
;功能:保存MCU与IIC接口通信时的错误状态                                   |
;入口:TIMETEMP.0=ACK位缙?                                                |
;出口:FLAG.0 =错误代码                                                   |
;==========================================================================
T_ACK_ERR:
        JNB     TIMETEMP.0,T_ACK_ERR_RET  ;检查ACK信号是否正常
        SETB    FLAG.0                    ;置ACK出错标志位
T_ACK_ERR_RET:
        RET
;===============================启用IIC总线================================
;功能:开启实时时钟的IIC总线
;入口:NONE       出口:NONE
;影响资源:NONE
;==========================================================================
T_IICSTART:
        CLR     FLAG.1
	SETB	T_SDA
	SETB	T_SCL
	LCALL	DELAY1
        JB      T_SDA,T_IIC_SDAHI
        SETB    FLAG.1
T_IIC_SDAHI:
	CLR	T_SDA
        LCALL   DELAY1
	CLR	T_SCL
        LCALL    DELAY1
        RET
;===============================关闭IIC总线================================
;功能:关闭实时时钟IIC总线
;入口:NONE       出口:NONE
;影响资源:NONE
;==========================================================================
T_IICSTOP:CLR	T_SDA
	SETB	T_SCL
	LCALL	DELAY1
	SETB	T_SDA
	LCALL	DELAY1
	RET

;============================发送一个字节,由高位到低位发送================
;功能:从MCU发送一个字节给实时时钟,由高位到低位发送                        |
;入口:发送数据放在TIMETX          出口:NONE                              |
;影响资源:A,R2,TIMETX                                                   |
;==========================================================================
T_SENDH_L:MOV	A,TIMETX
	MOV	R2,#08H
        CLR     FLAG.0
T_SENDH_L1:
        MOV	C,ACC.7

⌨️ 快捷键说明

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