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

📄 testled.asm

📁 红外遥控利率屏汇编源码。 MCU:普通51即可 时间芯片:DS1302 遥控器:用38K晶振的任意型号彩电遥控器
💻 ASM
📖 第 1 页 / 共 3 页
字号:
 	LCALL	SAVE_NUM_DATA
 SAVE_DATA_AUTO_SELECT_EXIT:
 	RET
;****************************************
;保存数据
SAVE_NUM_DATA:
	JB	DATA_INDEX.7,SAVE_NUM_DATA_EXIT	;不是编辑状态的话退出
	PUSH	DPH
	PUSH	DPL
	XCH	A,R0
	PUSH	ACC
	XCH	A,R0

	LCALL	SET_DATA_DPTR_AUTO_SELECT	;设置当前DATA_INDEX的DPTR
	MOV	A,DATA_BUFF		;从闪烁字符的缓冲中读出数据
	MOVX	@DPTR,A			;写到缓冲区中
	LCALL	REFRESH_AUTO_SELECT
	
	MOV	R0,NUM_COUNT		;循环次数
	DEC	R0
 SAVE_NUM_DATA_LOOP:
 	LCALL	SET_DPTR_00H		;设置读取数据的DPTR
 	MOVX	A,@DPTR			;从缓冲区中读出数据
	LCALL	SET_DPTR_40H		;设置备份数据的DPTR
	MOVX	@DPTR,A			;写到备份中
	DJNZ	R0,SAVE_NUM_DATA_LOOP
 	LCALL	SET_DPTR_00H		;设置读取数据的DPTR
 	MOVX	A,@DPTR			;从缓冲区中读出数据
	LCALL	SET_DPTR_40H		;设置备份数据的DPTR
	MOVX	@DPTR,A			;写到备份中

	XCH	A,R0
	POP	ACC
	XCH	A,R0
	POP	DPL
	POP	DPH
 SAVE_NUM_DATA_EXIT:
	RET
;****************************************
TIME_ENCODE:
	PUSH	DPH
	PUSH	DPL
	XCH	A,R0
	PUSH	ACC
	XCH	A,R0

	MOV	DPH,TIME_START_H
	MOV	DPL,TIME_START_L
	
	MOV	TIME_SECOND,#00H

	MOVX	A,@DPTR
	LCALL	GET_NUM_ID
	SWAP	A
	MOV	R0,A			;分钟个位保存在R0高4位中
	INC	DPTR
	MOVX	A,@DPTR
	LCALL	GET_NUM_ID
	ADD	A,R0
	SWAP	A			;转换回正常位序
	MOV	TIME_MINUTE,A		;分钟数据

	INC	DPTR
	MOVX	A,@DPTR
	LCALL	GET_NUM_ID
	SWAP	A
	MOV	R0,A			;小时个位保存在R0高4位中
	INC	DPTR
	MOVX	A,@DPTR
	LCALL	GET_NUM_ID
 	ADD	A,R0
 	SWAP	A
	MOV	TIME_HOUR,A		;小时的数据
	
	INC	DPTR
	MOVX	A,@DPTR
	CJNE	A,#08FH,SKIP_SET_WEEK_7
	MOV	A,#70H
 SKIP_SET_WEEK_7:
	LCALL	GET_NUM_ID
	MOV	TIME_WEEK,A		;周数据

	INC	DPTR
	MOVX	A,@DPTR
	LCALL	GET_NUM_ID
	SWAP	A
	MOV	R0,A			;日期个位保存在R0高4位中
	INC	DPTR
	MOVX	A,@DPTR
	CJNE	A,#0FFH,SKIP_SET_0_DAY
	MOV	A,#81H
 SKIP_SET_0_DAY:
	LCALL	GET_NUM_ID
	ADD	A,R0
	SWAP	A			;转换回正常位序
	MOV	TIME_DAY,A		;日期数据

	INC	DPTR
	MOVX	A,@DPTR
	LCALL	GET_NUM_ID
	SWAP	A
	MOV	R0,A			;月份个位保存在R0高4位中
	INC	DPTR
	MOVX	A,@DPTR
	CJNE	A,#0FFH,SKIP_SET_0_MONTH
	MOV	A,#81H
 SKIP_SET_0_MONTH:
	LCALL	GET_NUM_ID
	ADD	A,R0
	SWAP	A			;转换回正常位序
	MOV	TIME_MONTH,A		;月份数据

	INC	DPTR
	MOVX	A,@DPTR
	LCALL	GET_NUM_ID
	SWAP	A
	MOV	R0,A			;年份个位保存在R0高4位中
	INC	DPTR
	MOVX	A,@DPTR
	LCALL	GET_NUM_ID
	ADD	A,R0
	SWAP	A			;转换回正常位序
	MOV	TIME_YEAR,A		;年份数据

	XCH	A,R0
	POP	ACC
	XCH	A,R0
	POP	DPL
	POP	DPH
	RET
;****************************************
;保存时间数据
SAVE_TIME_DATA:
	JB	DATA_INDEX.7,SAVE_TIME_DATA_EXIT	;不是编辑状态的话退出
	JNB	DATA_INDEX.6,SAVE_TIME_DATA_EXIT	;不是编辑时间状态的话也要退出
	PUSH	DPH
	PUSH	DPL
	XCH	A,R0
	PUSH	ACC
	XCH	A,R0

	XCH	A,R1
	PUSH	ACC
	XCH	A,R1

	LCALL	SET_DATA_DPTR_AUTO_SELECT;设置当前DATA_INDEX的DPTR
	MOV	A,DATA_BUFF		;从闪烁字符的缓冲中读出数据
	MOVX	@DPTR,A			;写到缓冲区中
	LCALL	TIME_ENCODE		;将缓冲区的数据转换成1302所需的格式
	LCALL	WRITE_TIME_TO_1302
	XCH	A,R1
	POP	ACC
	XCH	A,R1

	XCH	A,R0
	POP	ACC
	XCH	A,R0

	POP	DPL
	POP	DPH
 SAVE_TIME_DATA_EXIT:
	RET
;****************************************
WRITE_TIME_TO_1302:
	;写数据到1302
	LCALL	ULOCK_1302		;解除1302写锁定
	MOV	R0,#TIME_SECOND
	MOV	R7,#7	;秒 分 时 日 月 星期 年 
	MOV	R1,#80H	;秒写地址
S13022:	CLR	T_RST
	CLR	T_CLK
	SETB	T_RST 
	MOV	A,R1	;写秒 分 时 日 月 星期 年 地址
	LCALL	RTInputByte  
	MOV	A,@R0	;写秒数据
	LCALL	RTInputByte  
	INC	R0
	INC	R1
	INC	R1
	SETB	T_CLK 
	CLR	T_RST
	DJNZ	R7,S13022

	LCALL	LOCK_1302		;恢复1302写锁定
	RET
;****************************************
LOCK_1302:
	CLR	T_RST
	CLR	T_CLK
	SETB	T_RST 
	MOV	B,#8EH	;控制寄存器
	LCALL	RTInputByte  
	MOV	B,#80H	;控制,WP=1,写保护
	LCALL	RTInputByte  
;	SETB	T_CLK 
	CLR	T_RST
	RET
;****************************************
ULOCK_1302:
	CLR	T_RST
	CLR	T_CLK
	SETB	T_RST 
	MOV	B,#8EH	;控制寄存器
	LCALL	RTInputByte  
	MOV	B,#00H	;写操作前WP=0
	LCALL	RTInputByte  
	SETB	T_CLK 
	CLR	T_RST
	RET
;****************************************
;恢复LED修改
RESTORE_LED_DATA:
	JB	DATA_INDEX.7,RESTORE_LED_EXIT	;不是编辑状态的话退出
	JB	DATA_INDEX.6,SAVE_TIME_DATA_EXIT	;不是编辑时间状态的话也要退出
 RESTORE_LED_DATA_0:
	PUSH	DPH
	PUSH	DPL
	XCH	A,R0
	PUSH	ACC
	XCH	A,R0

	MOV	R0,NUM_COUNT		;循环次数
	DEC	R0
 RESTORE_LED_LOOP:
 	LCALL	SET_DPTR_40H		;设读置取数据的DPTR
 	MOVX	A,@DPTR			;从备份中读数据
	LCALL	SET_DPTR_00H		;设备置份数据的DPTR
	MOVX	@DPTR,A			;写回缓冲区
	DJNZ	R0,RESTORE_LED_LOOP
 	LCALL	SET_DPTR_40H		;设读置取数据的DPTR
 	MOVX	A,@DPTR			;从备份中读数据
	LCALL	SET_DPTR_00H		;设备置份数据的DPTR
	MOVX	@DPTR,A			;写回缓冲区
	
	LCALL	RESET_DATA_BUFF
	LCALL	DISPLAY_LED
	XCH	A,R0
	POP	ACC
	XCH	A,R0
	POP	DPL
	POP	DPH
 RESTORE_LED_EXIT:
	RET
;****************************************
RESTORE_LED_DATA_1:
	JMP	RESTORE_LED_DATA_0
;****************************************
SET_DPTR_00H:
	PUSH	ACC

	CLR	C
	MOV	A,NUM_START_L
	ADD	A,R0
	MOV	DPL,A		;低位

	MOV	A,NUM_START_H
	ADDC	A,#00H
	MOV	DPH,A		;高位

	POP	ACC
	RET
;****************************************
SET_DPTR_40H:
	PUSH	ACC

	CLR	C
	MOV	A,NUM_START_L
	ADD	A,R0
	MOV	DPL,A		;低位
	
	MOV	DPH,NUM_START_H	;高位

	CLR	C
	ADD	A,#40H
	MOV	DPL,A		;低位
	
	MOV	A,NUM_START_H
	ADDC	A,#00H
	MOV	DPH,A		;高位

	POP	ACC
	RET
;**********************************************************
;子程序名:Set1302
;功    能:设置DS1302 初始时间,并启动计时。
;说    明:
;调    用:RTInputByte
;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.Year(地址连续)
;出口参数:无
;影响资源:A B R0 R1 R4 R7 
;设    计:zhaojunjie           日    期:2002-03-19
;修    改:                     日    期: 
;**********************************************************
Set1302:
	CLR    T_RST
	CLR    T_CLK
	SETB   T_RST 
	MOV    A,     #8EH	;控制寄存器
	LCALL  RTInputByte  
	MOV    A,     #00H	;写操作前WP=0
	LCALL  RTInputByte  
	SETB   T_CLK 
	CLR    T_RST

	CLR	T_RST
	CLR	T_CLK
	SETB	T_RST
	MOV	A,#80H
	LCALL	RTInputByte
	MOV	A,#00H
	LCALL	RTInputByte
	SETB	T_CLK
	CLR	T_RST
	
;	MOV    R0,    #TIME_SECOND;
;	MOV    R7,    #7	;秒 分 时 日 月 星期 年 
;	MOV    R1,    #80H	;秒写地址
;S13021:	CLR    T_RST
;	CLR    T_CLK
;	SETB   T_RST 
;	MOV    B,     R1	;写秒 分 时 日 月 星期 年 地址
;	LCALL  RTInputByte  
;	MOV	A,#00H
;	MOV    A,     @R0	;写秒数据
;	MOV    B,     A
;;	LCALL  RTInputByte  
;	INC    R0
;	INC    R1
;	INC    R1
;	SETB   T_CLK 
;	CLR    T_RST
;	DJNZ   R7,S13021

	CLR    T_RST
	CLR    T_CLK
	SETB   T_RST 
	MOV    B,     #8EH	;控制寄存器
	LCALL  RTInputByte  
	MOV    B,     #80H	;控制,WP=1,写保护
	LCALL  RTInputByte  
	SETB   T_CLK 
	CLR    T_RST
	RET
;**********************************************************
;子程序名:Get1302
;功    能:从DS1302 读时间
;说    明:
;调    用:RTInputByte,RTOutputByte
;入口参数:时间保存在:Second,Minute,Hour,Day,Month,Week.YearL
;出口参数:无
;影响资源:A B R0 R1 R4 R7
;**********************************************************
Get1302:      
          MOV    R0,#TIME_SECOND
          MOV    R7,#7
          MOV    R1,#81H	;秒地址
G13021:   CLR    T_RST
          CLR    T_CLK
          SETB   T_RST 
          MOV    A,     R1	;秒 分 时 日 月 星期 年 地址
          LCALL  RTInputByte  
          LCALL  RTOutputByte
          MOV    @R0,A		;秒
          INC    R0
          INC    R1
          INC    R1
          SETB   T_CLK 
          CLR    T_RST
          DJNZ   R7,    G13021
          RET
;**********************************************************
;功    能:写1302一字节  (内部子程序)
;**********************************************************
RTInputByte:  
	MOV    R2,    #8
Inbit1:	RRC    A

	CLR	T_IO
	NOP
	NOP
	NOP

	MOV    T_IO,C
	NOP
	NOP
	NOP

	SETB   T_CLK
	NOP
	NOP
	NOP

	CLR    T_CLK
	DJNZ   R2,Inbit1
	RET
;**********************************************************
;功    能:读1302一字节  (内部子程序)
;**********************************************************
RTOutputByte:
	MOV	R2,    #8
Outbit1:MOV	C,T_IO
	RRC	A
	SETB	T_CLK
	NOP
	CLR	T_CLK
	DJNZ	R2,Outbit1
	RET
;****************************************
;从1302中读出时间,保存到时间数据的缓冲区
READ_TIME:
	LCALL	Get1302		;从1302中读出未处理的时间数据,保存到寄存器

	PUSH	DPH
	PUSH	DPL
	MOV	DPH,TIME_START_H
	MOV	DPL,TIME_START_L
	
	MOV	A,TIME_SECOND
	CLR	C
	RRC	A
	MOV	P3.0,C
;	ANL	A,#00001111B
;	LCALL	GET_NUM_DATA
;	MOVX	@DPTR,A			;秒

;	INC	DPTR
;	MOV	A,TIME_SECOND
;	SWAP	A
;	ANL	A,#00000111B
;	LCALL	GET_NUM_DATA
;	MOVX	@DPTR,A			;十秒

;	INC	DPTR

	MOVX	A,@DPTR
	MOV	A,TIME_MINUTE
	ANL	A,#00001111B
	LCALL	GET_NUM_DATA
	MOVX	@DPTR,A			;分
	
	INC	DPTR
	MOV	A,TIME_MINUTE
	SWAP	A
	ANL	A,#00001111B
	LCALL	GET_NUM_DATA
	MOVX	@DPTR,A			;十分

	INC	DPTR
	MOV	A,TIME_HOUR
	ANL	A,#00001111B
	LCALL	GET_NUM_DATA
	MOVX	@DPTR,A			;小时

	INC	DPTR
	MOV	A,TIME_HOUR
	SWAP	A
	ANL	A,#00000011B
	LCALL	GET_NUM_DATA
	MOVX	@DPTR,A			;十小时

	INC	DPTR
	MOV	A,TIME_WEEK
	ANL	A,#00000111B
	CJNE	A,#07H,SKIP_SET_WEEK7
	INC	A
 SKIP_SET_WEEK7:
	LCALL	GET_NUM_DATA
	MOVX	@DPTR,A			;周

	INC	DPTR
	MOV	A,TIME_DAY
	ANL	A,#00001111B
	LCALL	GET_NUM_DATA
	MOVX	@DPTR,A			;日

	INC	DPTR
	MOV	A,TIME_DAY
	SWAP	A
	ANL	A,#00000011B
	LCALL	GET_NUM_DATA
	CJNE	A,#81H,SKIP_SET_EMPTY_DAY
	MOV	A,#0FFH
 SKIP_SET_EMPTY_DAY:
	MOVX	@DPTR,A			;十日

	INC	DPTR
	MOV	A,TIME_MONTH
	ANL	A,#00001111B
	LCALL	GET_NUM_DATA
	MOVX	@DPTR,A			;月

	INC	DPTR
	MOV	A,TIME_MONTH
	SWAP	A
	ANL	A,#00000001B
	LCALL	GET_NUM_DATA
	CJNE	A,#81H,SKIP_SET_EMPTY_MONTH
	MOV	A,#0FFH
 SKIP_SET_EMPTY_MONTH:
	MOVX	@DPTR,A			;十月

	INC	DPTR
	MOV	A,TIME_YEAR
	ANL	A,#00001111B
	LCALL	GET_NUM_DATA
	MOVX	@DPTR,A			;年

	INC	DPTR
	MOV	A,TIME_YEAR
	SWAP	A
	ANL	A,#00001111B
	LCALL	GET_NUM_DATA
	MOVX	@DPTR,A			;十年

	INC	DPTR
	MOV	A,#00H
	LCALL	GET_NUM_DATA
	MOVX	@DPTR,A			;百年(固定为0)

	INC	DPTR
	MOV	A,#02H
	LCALL	GET_NUM_DATA
	MOVX	@DPTR,A			;千年(固定为2)

	POP	DPL
	POP	DPH

	RET
;****************************************
START:	MOV	PSW,#00H
	MOV	SP,#050H
	LCALL	INIT
	LCALL	FULL_LED
	LCALL	FULL_TIME
	LCALL	DELAY
	LCALL	CLR_LED
	LCALL	CLR_TIME
	LCALL	DELAY
	LCALL	RESTORE_LED_DATA_1
;	MOV	DATA_INDEX,#01000000B
;	LCALL	READ_TIME
;	LCALL	DISPLAY_TIME
;	LCALL	TEST_TIME
;	LCALL	SAVE_TIME_DATA
;	MOV	DATA_INDEX,#10000000B
	LCALL	READ_TIME
	LCALL	DISPLAY_TIME
WAIT:  	JB	DATA_INDEX.7,READ_1302TIME	;非编辑时间模式跳到读1302时钟
	JB	DATA_INDEX.6,SKIP_READ_TIME	;编辑时间模式则不读1302
 READ_1302TIME:
	LCALL	READ_TIME
 SKIP_READ_TIME:
 	CLR	EA
	LCALL	DISPLAY_TIME
	LCALL	DISPLAY_LED
	SETB	EA
	LCALL	DELAY
	LCALL	DELAY
	LCALL	DELAY
	JB	DATA_INDEX.7,WAIT		;不是编辑模式则跳过
	JNB	DATA_INDEX.6,EDIT_NUM		;DATA_INDEX.6是1进编辑时间状态,是0进编辑利率状态
 EDIT_TIME:
 	LCALL	EDIT_TIME_MODE
	JMP	WAIT
 EDIT_NUM:
 	LCALL	EDIT_NUM_MODE
	JMP	WAIT
;****************************************
ORG	0F00H
NUMDATA:	;LED码表,共12字节数字数据(0-9,点,空)
	DB	081H,0AFH,0C2H,086H,0ACH,094H,090H,08FH,080H,084H,0FFH,07FH
;	DB	07EH,050H,03DH,079H,053H,06BH,06FH,070H,07FH,07BH,080H,000H
;LED_DATA:	;0310H-034FH,64字节汇率LED数据,4字节一个共计16个单元
;	DB	081H,0AFH,0C2H,086H,0ACH,094H,090H,08FH
;	DB	080H,084H,07FH,0FFH,081H,0AFH,0C2H,086H
;	DB	0ACH,094H,090H,08FH,080H,084H,07FH,0FFH
;	DB	081H,0AFH,0C2H,086H,0ACH,094H,090H,08FH
;	DB	080H,084H,07FH,0FFH,081H,0AFH,0C2H,086H
;	DB	0ACH,094H,090H,08FH,080H,084H,07FH,0FFH
;	DB	081H,0AFH,0C2H,086H,0ACH,094H,090H,08FH
;	DB	080H,084H,07FH,0FFH,081H,0AFH,0C2H,086H
;ORG	0450H
;TIME_DATA:	;14字节时间数据
;	DB	00H,00H,00H,00H,00H,00H,00H,00H
;	DB	00H,00H,00H,00H,00H,00H
;ORG	0C10H
;遥控接收编码
YKDATA:	DB	0AAH,0D2H	;开关	进入/退出利率修改模式
	DB	055H,0A6H	;静音	进入/退出时间修改模式
	DB	0ACH,0AAH	;节目+	移动到下一个利率块
	DB	059H,056H	;节目-	移动到上一个利率块
	DB	059H,09AH	;微调+	向左移动一位,如果是首位则移动到上个利率牌的末位,到头则无反映
	DB	0ACH,0D2H	;微调-	向右移动一位,如果是末尾则移动到下个利率牌的首位,到尾则无反映
	DB	0ABH,02AH	;音量+	光标所在的位数值+1,到9后显示空,再按则返回到0
	DB	056H,056H	;音量-	光标所在的位数值-1,到0后显示空,再按则返回到9
	DB	0AAH,0AAH	;0
	DB	055H,056H	;1
	DB	0AAH,0ACH	;2
	DB	055H,05AH	;3
	DB	0AAH,0B2H	;4
	DB	055H,066H	;5
	DB	0AAH,0B4H	;6
	DB	055H,06AH	;7
	DB	0AAH,0CAH	;8
	DB	055H,096H	;9
	DB	0ABH,054H	;调谐	空数字,按了光标所在位都不亮
	DB	0AAH,0CCH	;单/双	小数点
	DB	055H,0AAH	;招回
	DB	059H,096H	;存储
	DB	0ABH,052H	;对比+
	DB	056H,0A6H	;对比-
	DB	0ABH,032H	;色彩+
	DB	056H,066H	;色彩-
	DB	0ABH,02CH	;亮度+
	DB	056H,05AH	;亮度-
	DB	0ADH,04AH	;录象
	DB	05AH,0AAH	;电视
END

⌨️ 快捷键说明

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