📄 testled.asm
字号:
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 + -