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

📄 sky1.asm

📁 基于2051的数据记录仪汇编源码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	      MOV   SUBADR, #03H
		MOV   BYTCNT, #06
		ACALL RCVDATA
      	MOV   A, 60H		;读取分钟
	      ANL   A, #7FH		;屏蔽无效位
	      MOV   MIN_MD, A		
	      MOV   A, 61H		;读取小时
	      ANL   A, #3FH		;屏蔽无效位
	      MOV   HOU_MD, A
	      MOV   A, 62H 		;读取日子
	      ANL   A, #3FH 		;屏蔽无效位
	      MOV   DAY_MD, A
	      MOV   A, 64H		;读取月份
      	ANL   A, #1FH 		;屏蔽无效位
	      MOV   MON_MD, A
	      MOV   A, 65H		;读取年份
	      ANL   A, #0FFH		;屏蔽无效位
	      MOV   YEA_MD, A
		RET
;**************************************************************
; 设置当前时间及日期数据	       
;**************************************************************
SET_TIME:
		ACALL INIT8563 
		MOV   SLVADR, #PCF8563      
		MOV   SUBADR, #00H 
		MOV   BYTCNT, #9 
		ACALL SENDDATA
		RET
;**************************************************************
; 初始化P8653	       
;**************************************************************
INIT8563:
		MOV   70H, #00H		;启动时钟
		MOV   71H, #15H		;设置报警及定时器中断
		MOV   72H, #00H		;设置秒BCD
		MOV   73H, MIN_MD		;设置分钟BCD
		MOV   74H, HOU_MD		;设置小时BCD
		MOV   75H, DAY_MD		;设置日期BCD
		MOV   76H, #00H		;设置星期BCD
		MOV   77H, MON_MD		;设置月份BCD
		MOV   78H, YEA_MD		;设置年份BCD
		RET
;**************************************************************
; 写数据到E2PROM	       
;
; 输入 -- R7:写数据起始地址
;	    AT2408:E2PROM器件地址  (0A8H,0AAH,0ABH,0ACH有效) 	
;**************************************************************
WRITE_ROM:
		ACALL SETBUFF 
		MOV   SLVADR, AT2408      
		MOV   SUBADR, R7 
		MOV   BYTCNT, #07H 
		ACALL SENDDATA
		RET
;**************************************************************
; 设置I2C总线发送数据缓冲区
;
; 输入 -- R6	:当前记录序号
;**************************************************************
SETBUFF:
		MOV   70H, R6		;记录序号
		MOV   71H, YEA_MD		;当前年数据
		MOV   72H, MON_MD		;当前月数据
		MOV   73H, DAY_MD		;当前日数据
		MOV   74H, HOU_MD		;当前小时数据
		MOV   75H, MIN_MD		;当前分钟数据
		MOV   76H, AD_VAL		;AD采样值
		MOV   77H, #0FFH		;记录结束标志
		RET
;**************************************************************
; 读取E2PROM数据	       
;
; 输入 -- R7:读数据起始地址
;	    AT2408:E2PROM器件地址  (0A8H,0AAH,0ABH,0ACH有效) 	
; 返回 -- R6:当前记录数
;**************************************************************
READ_ROM:
		MOV   SLVADR, AT2408
	      MOV   SUBADR, R7
		MOV   BYTCNT, #07H
		ACALL RCVDATA
      	MOV   R6, 60H		;读取记录数
	      MOV   YEA_MD, 61H		;读取年份数据
	      MOV   MON_MD, 62H 	;读取月份数据
	      MOV   DAY_MD, 63H		;读取日期数据
	      MOV   HOU_MD, 64H		;读取小时数据
	      MOV   MIN_MD, 65H		;读取分钟数据
	      MOV   AD_VAL, 66H		;读取AD采年份
		RET
;**************************************************************
; 读取E2PROM中保存的记录总数	       
;**************************************************************
READ_REC:
		MOV   SLVADR, #0AEH	;E2PROM中第四页
	      MOV   SUBADR, #0F8H	;最后8位字节
		MOV   BYTCNT, #01H
		ACALL RCVDATA
      	MOV   REC_NU, 60H		;读取记录数
		RET
;**************************************************************
; I2C总线发送数据	       
;**************************************************************
SENDDATA:
		ACALL I2C_START
		MOV   A, SLVADR
		ACALL SENTBYTE
		JB    F0, SRET
		MOV   A, SUBADR
		ACALL SENTBYTE
		JB    F0, SRET
		MOV   R0, #XMTDAT 
SNEXT:
		MOV   A, @R0
		ACALL SENTBYTE
		JB    F0, SRET
		INC   R0 
		DJNZ  BYTCNT, SNEXT
		ACALL I2C_STOP 
DELAY10:
		MOV   R7, #30H 
D1:	
		MOV   R6, #34H
D2:   
		DJNZ  R6, D2
	      DJNZ  R7, D1
SRET:
		RET
;**************************************************************
; I2C总线接收数据	       
;**************************************************************
RCVDATA:
		ACALL I2C_START
		MOV   A, SLVADR
		ACALL SENTBYTE
		JB    F0, RRET
		MOV   A, SUBADR
		ACALL SENTBYTE
		JB    F0, RRET
		ACALL I2C_START
		MOV   A, SLVADR
		SETB  ACC.0 
		ACALL SENTBYTE
		JB    F0, RRET
		CLR   ACK
		MOV   R0, #RCVDAT
		DJNZ  BYTCNT,RNEXT
		SJMP  RLAST
RNEXT:
		ACALL RCVBYTE
		MOV   @R0, A 
		INC   R0
		DJNZ  BYTCNT,RNEXT
RLAST:
		SETB  ACK
		ACALL RCVBYTE
		MOV   @R0, A 
		ACALL I2C_STOP
RRET:	
		RET
;**************************************************************
; 启动I2C总线	       
;**************************************************************
I2C_START:
		SETB  I2C_DIO
		NOP
		SETB  I2C_CLK
		NOP				;NOP=1.085us
		NOP
		NOP
		NOP
		NOP
		CLR   I2C_DIO
		NOP
		NOP 
		NOP 
		NOP
		CLR   I2C_CLK
		RET
;**************************************************************
; 停止I2C总线	       
;**************************************************************
I2C_STOP:
		CLR   I2C_DIO
		NOP
		NOP
		SETB  I2C_CLK
		NOP
		NOP
		NOP
		NOP
		NOP 
		SETB  I2C_DIO
		NOP
		NOP 
		NOP 
		NOP 
;		CLR   I2C_DIO
;		CLR   I2C_CLK
		RET
;**************************************************************
; I2C总线发送字节	       
;**************************************************************
SENTBYTE:
		MOV	BITCNT, #08H
SENTB:
   		RLC	A
		JC	SENT1
		CLR	I2C_DIO
		SJMP	SENT
SENT1:
		SETB	I2C_DIO
		NOP
SENT: 
		NOP
		SETB	I2C_CLK
		NOP
		NOP 
		NOP 
		NOP
		NOP 
		CLR	I2C_CLK
		DJNZ	BITCNT, SENTB
		NOP
		NOP
		SETB	I2C_DIO
		NOP
		NOP
		SETB	I2C_CLK
		NOP
		NOP
		CLR	F0
		JNB	I2C_DIO, ACKEND
		SETB	F0 
ACKEND:
		NOP
		NOP
		CLR	I2C_CLK
		RET
;**************************************************************
; I2C总线接收字节	       
;**************************************************************
RCVBYTE:
		SETB 	I2C_DIO
		MOV   BITCNT, #08H 
RCV:  
		NOP 
		CLR 	I2C_CLK
		NOP
		NOP 
		NOP 
		NOP
		NOP
		SETB 	I2C_CLK
		NOP 
		NOP
		NOP
		NOP
		CLR 	C
		JNB 	I2C_DIO, RCV0
		SETB 	C 
RCV0: 
		RLC 	A 
		NOP
		NOP
		DJNZ 	BITCNT, RCV
		CLR 	I2C_CLK
		NOP
		NOP
		CLR 	I2C_DIO
		JNB 	ACK, SentAckB
		SETB 	I2C_DIO
SENTACKB:
		NOP
		SETB 	I2C_CLK
		NOP 
		NOP
		NOP
		NOP
		NOP
		CLR	I2C_CLK
		CLR	ACK
		RET
;**************************************************************
; 设置产生秒中断       
;**************************************************************
SETSINT:
		MOV	SLVADR, #PCF8563
		MOV   SUBADR, #01H
		MOV   BYTCNT, #01H
		ACALL RCVDATA
		MOV   A, #60H
		ORL   A, #01H
		MOV   70H, A
		MOV   SUBADR, #01H
		MOV	BYTCNT, #01H
		ACALL SENDDATA
		MOV	70H, #81H
		MOV	71H, #64
		MOV	SUBADR, #0EH
		MOV 	BYTCNT, #02H
		ACALL SENDDATA 
		RET
;**************************************************************
; 功能键处理	       
;**************************************************************
KEY_FUN:
		MOV   A, LED_D6
		RR   	A
		MOV	LED_D6, A  
		CJNE  A, #20H, PD0	;切换到日期
		ACALL CLR_SCR
		MOV   A, LED_D6
		SJMP  PD4
PD0:  
		CJNE  A, #10H, PD1	;切换到时间
		ACALL CLR_SCR
		MOV   A, LED_D6
	      SJMP  PD4
PD1:	
		CJNE  A, #04H, PD3	;切换到常态
PD3:  
		MOV   LED_D6, #40H
		MOV	A, FNDREG
		CJNE	A, #01H, PD5	;是否处于查寻状态
		ACALL CLR_SCR
		ACALL DISP_ADS
PD5:
		MOV	A, REC_NU
		ACALL DISP_REC
		MOV 	A, #40H 	
PD4:  
		MOV	R7, #07H
		ACALL SET_LED
		RET
;**************************************************************
; 编辑键处理	       
;**************************************************************
KEY_MOD:
		MOV	A, LED_D6
		ANL   A, #7FH
		CJNE  A, #40H, PJ4
		MOV	A, FNDREG
		CJNE	A, #01H, PJ6
		ANL	FNDREG, #0F0H		;清除查寻状态标志
		SJMP	PJ7
PJ6:
		ORL	FNDREG, #01H		;设置查寻状态标志
		ACALL CLR_SCR
PJ7:
		MOV	CU_REC, REC_NU
		MOV	A, REC_NU
		ACALL DISP_REC
		SJMP	PJ1
PJ4:
		CJNE  A, #20H, PJ0		;编辑日期
		MOV	TMPVAL, #80H
		SJMP  PJ2
PJ0:
		CJNE  A, #10H, PJ1		;编辑时间
		MOV	TMPVAL, #0C0H
PJ2:
		ANL	MODREG, #0F0H		;清除查看记录状态
		MOV	A, MODREG
		ANL  	A, #0F0H
		CJNE	A, #0H, PJ3
		MOV   MODREG, #90H
		SJMP	PJ1		
PJ3:		
		RL	A
		ORL   A, #80H
		ANL	A, #0F0H
		CJNE  A, TMPVAL, PJ5
		MOV   MODREG, #00H
		SJMP  PJ1
PJ5:
		MOV	MODREG, A
PJ1:
		RET
;**************************************************************
; 增加键模式处理	       
;**************************************************************
KEY_UP:
		ANL	FUNREG, #0F0H
		ORL	FUNREG, #01H
		ACALL	PRESS_KEY
		RET
;**************************************************************
; 减少键模式处理	       
;**************************************************************
KEY_DOWN:
		ANL	FUNREG, #0F0H
		ORL	FUNREG, #02H
		ACALL PRESS_KEY
		RET
;**************************************************************
; 增加键处理例程	A:         B: 
;**************************************************************
UP_ROUTINE:
		CJNE	A, MAX_VL, XP0
		MOV   A, MIN_VL
		SJMP	XP2
XP0:		
		INC	A
XP2:
		RET
;**************************************************************
; 减少键处理例程	A:         B: 
;**************************************************************
DOWN_ROUTINE:
		CJNE	A, MIN_VL, XP1
		MOV   A, MAX_VL
		SJMP	XP3
XP1:		
		DEC	A
XP3:
		RET
;**************************************************************
; 编辑模式按键处理	       
;**************************************************************
PRESS_KEY:
		MOV	A, FNDREG
		CJNE	A, #01H, PG0		;是否处于查寻状态
		MOV   A, LED_D6
	      ANL   A, #7FH
		CJNE  A, #40H, XD12		;记录数增加
;		MOV	A, FNDREG
;		CJNE	A, #01, XD12
	      MOV   MAX_VL, REC_NU
		MOV   MIN_VL, #00H
	      MOV	A, FUNREG
		ANL	A, #0FH
		CJNE 	A, #01H, XD0
		MOV   A, CU_REC
		ACALL	DOWN_ROUTINE
		SJMP	XD1
XD0:		
		MOV   A, CU_REC
		ACALL UP_ROUTINE
XD1:
		MOV   CU_REC, A
		ACALL	GET_ADDR
		ACALL	READ_ROM
;		ACALL CLR_SCR
		ACALL DISP_ADS
XD12:
	      JMP	PG9
PG0:  
		MOV   A, LED_D6
	      ANL   A, #7FH
		CJNE	A, #40H, XD13
		JMP	PG9
XD13:
		CJNE  A, #20H, PG4		;日期编辑
	      MOV   A, MODREG
		ANL 	A, #0F0H
		CJNE	A, #90H, PG2		;编辑天数
		MOV   MAX_VL, #31
		MOV   MIN_VL, #1
		MOV   A, FUNREG
		ANL   A, #0FH
		CJNE	A, #01H, XD2
		MOV   A, DAY_MD
		ACALL BCD_HEX
		ACALL DOWN_ROUTINE
		SJMP	XD3
XD2:
		MOV	A, DAY_MD
		ACALL BCD_HEX
		ACALL UP_ROUTINE
XD3:
		ACALL HEX_BCD
		MOV	DAY_MD, A
		MOV   LED_D0, R3
		MOV   LED_D1, R4
      	MOV   A, R3
		MOV	R7, #01H
		ACALL WRITE_LED
	      MOV   A, LED_D1

⌨️ 快捷键说明

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