📄 testled.asm
字号:
K_AB54: MOV A,#0AH ;调谐 空数字,按了光标所在位都不亮
LCALL DISPLAY_NUM
RET
K_AACC: LCALL DISPLAY_DOT ;单/双 小数点
RET
K_55AA: LCALL RESTORE_LED_DATA;招回
RET
K_5996: LCALL SAVE_DATA_AUTO_SELECT ;存储,备份数据待用
RET
K_AB52: LCALL FULL_LED ;对比+
RET
K_56A6: LCALL FULL_TIME ;对比-
RET
K_AB32: LCALL CLR_LED ;色彩+
RET
K_5666: LCALL CLR_TIME ;色彩-
RET
K_AB2C: LCALL DISPLAY_LED ;亮度+
RET
K_565A: LCALL DISPLAY_TIME ;亮度-
RET
K_AD4A: LCALL FULL_LED ;录象
LCALL FULL_TIME
RET
K_5AAA: LCALL DISPLAY_TIME ;电视
LCALL DISPLAY_LED
RET
;*******************************************************
;根据A的值返回其LED显示数据
GET_NUM_DATA:
PUSH DPH
PUSH DPL
MOV DPTR,#NUMDATA
MOVC A,@A+DPTR
POP DPL
POP DPH
RET
;****************************************
SET_EDIT_NUM_MODE:
;根据DATA_INDEX.7判断是否在编辑状态(约定0为编辑状态),
;当前不是编辑状态则进入,是编辑状态则保存数据退出
JB DATA_INDEX.7,ENTER_EDIT_NUM_MODE;DATA_INDEX.7为1,先前状态不是编辑中
EXIT_EDIT_NUM_MODE:
JNB DATA_INDEX.6,REFRESH_NUM;判断当前状态,如果不是编辑利率状态则保存好时间信息,进入编辑利率的状态,否则就退出编辑利率状态
LCALL SAVE_TIME_DATA ;保存时间数据到1302
LCALL READ_TIME ;读取时间数据
LCALL DISPLAY_TIME ;刷新时间
CLR DATA_INDEX.6 ;修改利率/时间标志位为1,表示从编辑时间状态转换为编辑利率状态
AJMP ENTER_EDIT_NUM_MODE
REFRESH_NUM:
LCALL REFRESH_AUTO_SELECT ;刷新利率屏
SETB DATA_INDEX.7 ;修改编辑状态标志位为1,表示退出编辑状态
RET
ENTER_EDIT_NUM_MODE: ;进入利率编辑模式
MOV DATA_INDEX,NUM_COUNT
DEC DATA_INDEX
CLR DATA_INDEX.7 ;设置当前为编辑模式
CLR DATA_INDEX.6 ;设置利率/时间标志位为利率
PUSH DPH
PUSH DPL
LCALL SET_DATA_DPTR_AUTO_SELECT
LCALL GET_INDEX_DATA_TO_BUFF ;从存储器中取出当前位置的数据,放到DATA_BUFF中
MOV A,#0FFH
MOVX @DPTR,A
POP DPH
POP DPL
LCALL REFRESH_AUTO_SELECT
RET
;****************************************
SET_EDIT_TIME_MODE:
;根据DATA_INDEX.7判断是否在编辑状态(约定0为编辑状态),
;当前不是编辑状态则进入,是编辑状态则保存数据退出
JB DATA_INDEX.7,ENTER_EDIT_TIME_MODE
EXIT_EDIT_TIME_MODE:
JB DATA_INDEX.6,REFRESH_TIME;判断当前编辑状态,利率/时间标志位为利率,
;转到刷新利率屏,否则保存时间数据到1302,
;刷新时间显示后退出
LCALL SAVE_NUM_DATA
LCALL REFRESH_AUTO_SELECT ;刷新利率屏
AJMP ENTER_EDIT_TIME_MODE
REFRESH_TIME:
LCALL SAVE_TIME_DATA ;保存时间数据到1302
LCALL READ_TIME ;读取时间数据
LCALL REFRESH_AUTO_SELECT ;刷新时间
SETB DATA_INDEX.7 ;修改编辑状态标志位为1,表示退出编辑状态
RET
ENTER_EDIT_TIME_MODE: ;进入编辑模式
MOV DATA_INDEX,TIME_COUNT
DEC DATA_INDEX
CLR DATA_INDEX.7 ;设置当前为编辑模式
SETB DATA_INDEX.6 ;设置利率/时间标志位为时间
LCALL GET_INDEX_DATA_TO_BUFF ;从存储器中取出当前位置的数据,放到DATA_BUFF中
PUSH DPH
PUSH DPL
LCALL SET_DATA_DPTR_AUTO_SELECT
MOV A,#0FFH
MOVX @DPTR,A
POP DPH
POP DPL
LCALL READ_TIME
LCALL DISPLAY_TIME
RET
;****************************************
;根据DATA_INDEX的标志刷新相应的显示屏
REFRESH_AUTO_SELECT:
JNB DATA_INDEX.6,REF_LED
REF_TIME:
LCALL DISPLAY_TIME
RET
REF_LED:
LCALL DISPLAY_LED
RET
;****************************************
;光标右移一位
CURSOR_DEC:
JB DATA_INDEX.7,CURSOR_DEC_EXIT1 ;不是编辑状态的话退出
PUSH DPH
PUSH DPL
LCALL SET_DATA_DPTR_AUTO_SELECT
MOV A,DATA_BUFF
MOVX @DPTR,A ;将DATA_BUFF中的数据写回DATA_INDEX指示的位置
POP DPL
POP DPH
MOV A,DATA_INDEX
CLR ACC.6
JZ CURSOR_DEC_EXIT ;是0退出,不是0可以减1
MOV A,DATA_INDEX
DEC A
MOV DATA_INDEX,A
LCALL RESET_DATA_BUFF ;重新设置DATA_BUFF的数据
CURSOR_DEC_EXIT:
LCALL SET_EMPTY
CURSOR_DEC_EXIT1:
LCALL REFRESH_AUTO_SELECT
RET
;****************************************
;光标左移一位
CURSOR_INC:
JB DATA_INDEX.7,CURSOR_INC_EXIT1 ;不是编辑状态的话退出
PUSH B
PUSH DPH
PUSH DPL
LCALL SET_DATA_DPTR_AUTO_SELECT ;设置DPTR
MOV A,DATA_BUFF
MOVX @DPTR,A ;将DATA_BUFF中的数据写回DATA_INDEX指示的位置
POP DPL
POP DPH
JB DATA_INDEX.6,IS_EDIT_TIME
IS_EDIT_NUM:
MOV B,NUM_COUNT
JMP CURSOR_INC_1
IS_EDIT_TIME:
MOV B,TIME_COUNT
CURSOR_INC_1:
DEC B
MOV A,DATA_INDEX
CLR ACC.6
CJNE A,B,INC_ADD1 ;不是末尾的数,可以+1
SJMP CURSOR_INC_EXIT
INC_ADD1:
MOV A,DATA_INDEX
INC A
MOV DATA_INDEX,A
LCALL RESET_DATA_BUFF ;重新设置DATA_BUFF的数据
CURSOR_INC_EXIT:
POP B
LCALL SET_EMPTY
CURSOR_INC_EXIT1:
LCALL REFRESH_AUTO_SELECT
RET
;****************************************
;光标右移B指定的位数
CURSOR_DEC_LOOP:
LCALL CURSOR_DEC
DJNZ B,CURSOR_DEC_LOOP
RET
;****************************************
;光标左移B指定的位数
CURSOR_INC_LOOP:
LCALL CURSOR_INC
DJNZ B,CURSOR_INC_LOOP
RET
;****************************************
;光标右移四位
CURSOR_DEC_EX:
JB DATA_INDEX.7,CURSOR_DEC_EX_EXIT ;不是编辑状态的话退出
JB DATA_INDEX.6,DEC4_TIME
DEC4_NUM: ;利率
MOV B,#04H
LCALL CURSOR_DEC_LOOP
CURSOR_DEC_EX_EXIT:
RET
DEC4_TIME: ;时间
MOV A,DATA_INDEX
CLR ACC.6
CJNE A,#0CH,DEC_SKIP_B ;千年
MOV B,#04H
LCALL CURSOR_DEC_LOOP
RET
DEC_SKIP_B:
CJNE A,#0BH,DEC_SKIP_A ;百年
MOV B,#03H
LCALL CURSOR_DEC_LOOP
RET
DEC_SKIP_A:
CJNE A,#0AH,DEC_SKIP_9 ;十年
MOV B,#02H
LCALL CURSOR_DEC_LOOP
RET
DEC_SKIP_9:
CJNE A,#09H,DEC_SKIP_8 ;年
LCALL CURSOR_DEC
RET
DEC_SKIP_8:
CJNE A,#08H,DEC_SKIP_7 ;十月
MOV B,#02H
LCALL CURSOR_DEC_LOOP
RET
DEC_SKIP_7:
CJNE A,#07H,DEC_SKIP_6 ;月
MOV B,#02H
LCALL CURSOR_DEC_LOOP
RET
DEC_SKIP_6:
CJNE A,#06H,DEC_SKIP_5 ;十日
MOV B,#02H
LCALL CURSOR_DEC_LOOP
RET
DEC_SKIP_5:
CJNE A,#05H,DEC_SKIP_4 ;日
LCALL CURSOR_DEC
RET
DEC_SKIP_4:
CJNE A,#04H,DEC_SKIP_3 ;周
LCALL CURSOR_DEC
RET
DEC_SKIP_3:
CJNE A,#03H,DEC_SKIP_2 ;十时
MOV B,#03H
LCALL CURSOR_DEC_LOOP
RET
DEC_SKIP_2:
CJNE A,#02H,DEC_SKIP_1 ;时
MOV B,#02H
LCALL CURSOR_DEC_LOOP
RET
DEC_SKIP_1:
CJNE A,#01H,DEC_SKIP_0 ;十分
LCALL CURSOR_DEC
RET
DEC_SKIP_0:
RET
;****************************************
;光标左移四位
CURSOR_INC_EX:
JB DATA_INDEX.7,CURSOR_INC_EX_EXIT ;不是编辑状态的话退出
JB DATA_INDEX.6,INC4_TIME
INC4_NUM: ;编辑利率
MOV B,#04H
LCALL CURSOR_INC_LOOP
CURSOR_INC_EX_EXIT:
RET
INC4_TIME: ;编辑时间
MOV A,DATA_INDEX
CLR ACC.6
CJNE A,#0CH,INC_SKIP_B ;千年
RET
INC_SKIP_B:
CJNE A,#0BH,INC_SKIP_A ;百年
LCALL CURSOR_INC_LOOP
RET
INC_SKIP_A:
CJNE A,#0AH,INC_SKIP_9 ;十年
MOV B,#02H
LCALL CURSOR_INC_LOOP
RET
INC_SKIP_9:
CJNE A,#09H,INC_SKIP_8 ;年
MOV B,#03H
LCALL CURSOR_INC
RET
INC_SKIP_8:
CJNE A,#08H,INC_SKIP_7 ;十月
MOV B,#04H
LCALL CURSOR_INC_LOOP
RET
INC_SKIP_7:
CJNE A,#07H,INC_SKIP_6 ;月
MOV B,#02H
LCALL CURSOR_INC_LOOP
RET
INC_SKIP_6:
CJNE A,#06H,INC_SKIP_5 ;十日
MOV B,#02H
LCALL CURSOR_INC_LOOP
RET
INC_SKIP_5:
CJNE A,#05H,INC_SKIP_4 ;日
MOV B,#02H
LCALL CURSOR_INC_LOOP
RET
INC_SKIP_4:
CJNE A,#04H,INC_SKIP_3 ;周
MOV B,#02H
LCALL CURSOR_INC_LOOP
RET
INC_SKIP_3:
CJNE A,#03H,INC_SKIP_2 ;十时
LCALL CURSOR_INC
RET
INC_SKIP_2:
CJNE A,#02H,INC_SKIP_1 ;时
MOV B,#02H
LCALL CURSOR_INC_LOOP
RET
INC_SKIP_1:
CJNE A,#03H,INC_SKIP_0 ;十分
MOV B,#03H
LCALL CURSOR_INC_LOOP
RET
INC_SKIP_0:
MOV B,#04H
LCALL CURSOR_INC_LOOP
RET
;****************************************
;清空DATA_INDEX指示的目标的显示数据(全不显示)
SET_EMPTY:
PUSH DPH
PUSH DPL
LCALL SET_DATA_DPTR_AUTO_SELECT
MOV A,#0FFH
MOVX @DPTR,A ;将DATA_BUFF中的数据写回DATA_INDEX指示的位置
POP DPL
POP DPH
RET
;****************************************
;光标所在的数+1,循环顺序为0-9,点保留
CURSOR_NUM_INC:
JB DATA_INDEX.7,CURSOR_NUM_INC_EXIT ;不是编辑状态的话退出
PUSH DPH
PUSH DPL
XCH A,B
PUSH ACC
XCH A,B
MOV A,DATA_BUFF
MOV C,ACC.7
MOV A,#0FFH
MOV ACC.7,C
MOV B,A ;有点B是7FH,没有点B是FFH
MOV DPTR,#NUMDATA ;DPTR指向LED显示数据
MOV A,DATA_BUFF ;从缓存中取出LED显示数据
LCALL GET_NUM_ID ;换算成数字
INC A
CJNE A,#0AH,SKIP_SET_Z1 ;INC后不是点(空数字后的数据),跳过清0
MOV A,#00H ;清0
SKIP_SET_Z1:
CJNE A,#0BH,SKIP_SET_Z ;INC后不是点(空数字后的数据),跳过清0
MOV A,#00H ;清0
SKIP_SET_Z:
MOV DPTR,#NUMDATA ;DPTR指向LED显示数据
MOVC A,@A+DPTR ;查表获取LED数据
ANL A,B
MOV DATA_BUFF,A ;获取的LED数据打入DATA_BUFF
LCALL SET_DATA_DPTR_AUTO_SELECT
MOVX @DPTR,A
XCH A,B
POP ACC
XCH A,B
POP DPL
POP DPH
LCALL REFRESH_AUTO_SELECT
CURSOR_NUM_INC_EXIT:
RET
;****************************************
;光标所在的数+1,循环顺序为0-9,点保留
CURSOR_NUM_DEC:
JB DATA_INDEX.7,CURSOR_NUM_DEC_EXIT ;不是编辑状态的话退出
PUSH DPH
PUSH DPL
XCH A,B
PUSH ACC
XCH A,B
MOV A,DATA_BUFF
MOV C,ACC.7
MOV A,#0FFH
MOV ACC.7,C
MOV B,A ;有点B是7FH,没有点B是FFH
MOV DPTR,#NUMDATA ;DPTR指向LED显示数据
MOV A,DATA_BUFF ;从缓存中取出LED显示数据
LCALL GET_NUM_ID ;换算成数字
DEC A
CJNE A,#0FFH,SKIP_SET_EMPTY ;DEC后不是-1(0前的数据),跳过填9
MOV A,#09H ;
SKIP_SET_EMPTY:
MOV DPTR,#NUMDATA ;DPTR指向LED显示数据
MOVC A,@A+DPTR ;查表获取LED数据
ANL A,B
MOV DATA_BUFF,A ;获取的LED数据打入DATA_BUFF
LCALL SET_DATA_DPTR_AUTO_SELECT
MOVX @DPTR,A
XCH A,B
POP ACC
XCH A,B
POP DPL
POP DPH
LCALL REFRESH_AUTO_SELECT
CURSOR_NUM_DEC_EXIT:
RET
;****************************************
;查表获取LED数字,返回值保存在A
GET_NUM_ID:
PUSH B
XCH A,R0
PUSH ACC
XCH A,R0
PUSH DPH
PUSH DPL
MOV B,A
MOV R0,#00H
MOV DPTR,#NUMDATA
GET_NUM_ID_LOOP:
CLR C
MOV A,#0BH
SUBB A,R0
JC GET_NUM_ID_NO_FIND ;查询12次,没有找到就放弃
MOV A,#00H
MOVC A,@A+DPTR
INC DPTR
INC R0
XCH A,B
MOV C,ACC.7
XCH A,B
MOV ACC.7,C
CJNE A,B,GET_NUM_ID_LOOP ;与查表数据不相符,继续查
DEC R0
SJMP GET_NUM_ID_EXIT
GET_NUM_ID_NO_FIND:
MOV R0,#00H ;没找到就填0
GET_NUM_ID_EXIT:
POP DPL
POP DPH
POP ACC
XCH A,R0 ;将查找结果送入A,同时R0也恢复进栈的数
POP B
RET
;****************************************
;根据DATA_INDEX重新设置DATA_BUFF的数据
RESET_DATA_BUFF:
PUSH DPH
PUSH DPL
PUSH ACC
LCALL SET_DATA_DPTR_AUTO_SELECT ;调用程序,设置数据的DPTR
MOVX A,@DPTR ;取出数据
MOV DATA_BUFF,A
POP ACC
POP DPL
POP DPH
RET
;****************************************
;编辑利率模式,使当前光标位置闪烁
EDIT_NUM_MODE:
CLR EA
LCALL SET_DATA_DPTR_AUTO_SELECT;调用程序,设置数据的DPTR
MOVX A,@DPTR ;取出数据
CJNE A,#0FFH,DISPLAY_FILL_Z;数据不是空(0FFH)则跳到DISPLAY_FILL_Z
DISPLAY_FILL_NUM:
MOV A,DATA_BUFF
SJMP DISPLAY_DATA
DISPLAY_FILL_Z: ;数据不是空(0FFH)则把当前数据保存到DATA_BUFF,然后显示空(0FFH)
MOV DATA_BUFF,A ;数据保存到DATA_BUFF
MOV A,#0FFH ;显示数据的地址添FF
DISPLAY_DATA:
MOVX @DPTR,A
LCALL DISPLAY_LED
LCALL READ_TIME
LCALL DISPLAY_TIME
SETB EA
LCALL DELAY_500MS
CLR EA
JB DATA_INDEX.6,EXIT_NUM_MODE ;DATA_INDEX.6为1则退出编辑利率状态
JNB DATA_INDEX.7,EDIT_NUM_MODE ; ;DATA_INDEX.7为0则循环显示,否则便向下执行,退出编辑状态
EXIT_NUM_MODE:
CLR EA
MOV A,DATA_BUFF
LCALL SET_DATA_DPTR_AUTO_SELECT
MOVX @DPTR,A
LCALL REFRESH_AUTO_SELECT
SETB EA
RET
;****************************************
;编辑时间模式,使当前光标位置闪烁
EDIT_TIME_MODE:
CLR EA
LCALL SET_DATA_DPTR_AUTO_SELECT
MOVX A,@DPTR ;取出数据
CJNE A,#0FFH,DISPLAY_FILL_Z1 ;数据不是空(0FFH)则跳到DISPLAY_FILL_Z1
DISPLAY_FILL_TIME:
MOV A,DATA_BUFF
SJMP DISPLAY_DATA1
DISPLAY_FILL_Z1: ;数据不是空(0FFH)则把当前数据保存到DATA_BUFF,然后显示空(0FFH)
MOV DATA_BUFF,A ;数据保存到DATA_BUFF
MOV A,#0FFH ;显示数据的地址添FF
DISPLAY_DATA1:
MOVX @DPTR,A
LCALL DISPLAY_TIME
SETB EA
LCALL DELAY_500MS
CLR EA
JNB DATA_INDEX.6,EXIT_TIME_MODE ;DATA_INDEX.6为0则退出编辑时间状态
JNB DATA_INDEX.7,EDIT_TIME_MODE ;DATA_INDEX.7为0则循环显示,否则便向下执行,退出编辑状态
EXIT_TIME_MODE:
CLR EA
MOV A,DATA_BUFF
LCALL SET_DATA_DPTR_AUTO_SELECT
MOVX @DPTR,A
LCALL SAVE_TIME_DATA
LCALL READ_TIME
LCALL DISPLAY_TIME
SETB EA
RET
;****************************************
;测试2K内存块,地址为2000H-3FFFH
TEST_EXT_MEM:
MOV DPTR,#2000H
MOV R0,01FH
TEST_MEM_LOOP1:
MOV R1,0FFH
TEST_MEM_LOOP2:
MOVX A,@DPTR
PUSH ACC
MOV A,#00H
MOVX @DPTR,A
MOV A,#0FFH
MOVX A,@DPTR
CJNE A,#00H,MEMTEST_ERR
MOV A,#0FFH
MOVX @DPTR,A
MOV A,#00H
MOVX A,@DPTR
CJNE A,#0FFH,MEMTEST_ERR
POP ACC
MOVX @DPTR,A
INC DPTR
DJNZ R1,TEST_MEM_LOOP2
DJNZ R0,TEST_MEM_LOOP1
CLR C
RET
MEMTEST_ERR:
SETB C
RET
;****************************************
;取出DATA_INDEX指示的数据,放到DATA_BUFF中
GET_INDEX_DATA_TO_BUFF:
PUSH DPH
PUSH DPL
PUSH ACC
MOV A,DATA_INDEX
LCALL SET_DATA_DPTR_AUTO_SELECT
CLR ACC.7
CLR ACC.6 ;标志位全清0,仅保留序数
MOVX A,@DPTR ;读出A中数字的显示编码
MOV DATA_BUFF,A ;保存到DATA_BUFF
POP ACC
POP DPL
POP DPH
RET
;****************************************
;根据DATA_INDEX设置DPTR
SET_DATA_DPTR_AUTO_SELECT:
PUSH ACC
JB DATA_INDEX.6,IS_SET_TIME_DPTR
IS_SET_NUM_DPTR:
MOV DPL,NUM_START_L
MOV DPH,NUM_START_H
LJMP SET_DATA_DPTR_1
IS_SET_TIME_DPTR:
MOV DPL,TIME_START_L
MOV DPH,TIME_START_H
SET_DATA_DPTR_1:
CLR C
MOV A,DATA_INDEX
CLR ACC.7
CLR ACC.6
ADD A,DPL
MOV DPL,A
MOV A,DPH
ADDC A,#00H
MOV DPH,A
POP ACC
RET
;****************************************
;根据当前编辑类型保存数据
SAVE_DATA_AUTO_SELECT:
JB DATA_INDEX.7,SAVE_DATA_AUTO_SELECT_EXIT ;不是编辑状态的话退出
JNB DATA_INDEX.6,SAVE_NUM
LCALL SAVE_TIME_DATA
RET
SAVE_NUM:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -