📄 testled.asm
字号:
LED_STR EQU P1.0 ;1
LED_CLK EQU P1.1 ;2
LED_DATA EQU P1.2 ;3
LED_OE EQU P1.3 ;4
TIME_STR EQU P1.4 ;
TIME_CLK EQU P1.5 ;
TIME_DATA EQU P1.6 ;
TIME_OE EQU P1.7 ;
T_CLK Bit P3.5 ;实时时钟时钟线引脚
T_IO Bit P3.4 ;实时时钟数据线引脚
T_RST Bit P3.3 ;实时时钟复位线引脚
YKIN BIT P3.2
DATA_BUFF EQU 2EH
DATA_INDEX EQU 2FH ;修改模式中当前正在编辑位的编号,第7位编辑标志位,为1表示正在编辑状态,第6位为编辑种类位,值是0为编辑利率,值是1为修改时间
NUM_START_L EQU 30H
NUM_START_H EQU 31H
NUM_COUNT EQU 32H ;汇率LED的位数
TIME_COUNT EQU 33H ;时间LED的位数
TIME_START_L EQU 34H
TIME_START_H EQU 35H
TIME_SECOND EQU 36H
TIME_MINUTE EQU 37H
TIME_HOUR EQU 38H
TIME_DAY EQU 39H
TIME_MONTH EQU 3AH
TIME_WEEK EQU 3BH
TIME_YEAR EQU 3CH
HWTH EQU 80H
;****************************************
ORG 0000H
JMP START
ORG 0003H ;INT0中断处理
AJMP INT_0
ORG 0100H
;****************************************
;TEST_TIME:
; MOV TIME_SECOND,#20H
; MOV TIME_MINUTE,#30H
; MOV TIME_HOUR,#14H
; MOV TIME_DAY,#18H
; MOV TIME_MONTH,#04H
; MOV TIME_WEEK,#02H
; MOV TIME_YEAR,#06H
; LCALL WRITE_TIME_TO_1302
; MOV TIME_SECOND,#0FFH
; MOV TIME_MINUTE,#0FFH
; MOV TIME_HOUR,#0FFH
; MOV TIME_DAY,#0FFH
; MOV TIME_MONTH,#0FFH
; MOV TIME_WEEK,#0FFH
; MOV TIME_YEAR,#0FFH
; RET
;****************************************
;初始化汇率屏幕数据基础信息
;使用资源:无
INIT: SETB IT0
SETB EX0
SETB EA
MOV NUM_START_L,#00H
MOV NUM_START_H,#20H
MOV NUM_COUNT,#40H
MOV TIME_START_L,#80H
MOV TIME_START_H,#20H
MOV TIME_COUNT,#0DH
MOV A,#10000000B
ADD A,NUM_COUNT
DEC A
MOV DATA_INDEX,A
SETB LED_OE
SETB LED_STR
SETB TIME_OE
SETB TIME_STR
LCALL Set1302
; LCALL TEST_EXT_MEM
RET
;****************************************
;汇率显示清空
;使用资源:无
CLR_LED:
XCH A,R0
PUSH ACC
XCH A,R0
XCH A,R1
PUSH ACC
XCH A,R1
MOV R0,NUM_COUNT
; CLR LED_OE
CLR LED_STR
LOOP1: MOV R1,#08H
LOOP2: SETB LED_DATA
CLR LED_CLK
SETB LED_CLK
DJNZ R1,LOOP2
DJNZ R0,LOOP1
SETB LED_STR
; SETB LED_OE
XCH A,R1
POP ACC
XCH A,R1
XCH A,R0
POP ACC
XCH A,R0
RET
;****************************************
CLR_TIME:
XCH A,R0
PUSH ACC
XCH A,R0
XCH A,R1
PUSH ACC
XCH A,R1
MOV R0,TIME_COUNT
; CLR TIME_OE
CLR TIME_STR
LOOP5: MOV R1,#08H
LOOP6: SETB TIME_DATA
CLR TIME_CLK
SETB TIME_CLK
DJNZ R1,LOOP6
DJNZ R0,LOOP5
SETB TIME_STR
; SETB TIME_OE
XCH A,R1
POP ACC
XCH A,R1
XCH A,R0
POP ACC
XCH A,R0
RET
;****************************************
;汇率显示全亮
;使用资源:无
FULL_LED:
XCH A,R0
PUSH ACC
XCH A,R0
XCH A,R1
PUSH ACC
XCH A,R1
MOV R0,NUM_COUNT
; CLR LED_OE
CLR LED_STR
LOOP3: MOV R1,#08H
LOOP4: CLR LED_DATA
CLR LED_CLK
SETB LED_CLK
DJNZ R1,LOOP4
DJNZ R0,LOOP3
SETB LED_STR
; SETB LED_OE
XCH A,R1
POP ACC
XCH A,R1
XCH A,R0
POP ACC
XCH A,R0
RET
;****************************************
FULL_TIME:
XCH A,R0
PUSH ACC
XCH A,R0
XCH A,R1
PUSH ACC
XCH A,R1
MOV R0,TIME_COUNT
; CLR TIME_OE
CLR TIME_STR
LOOP7: MOV R1,#08H
MOV A,#00H
ORL A,#10000000B
LOOP8: RRC A
MOV TIME_DATA,C
CLR TIME_CLK
SETB TIME_CLK
DJNZ R1,LOOP8
DJNZ R0,LOOP7
SETB TIME_STR
; SETB TIME_OE
XCH A,R1
POP ACC
XCH A,R1
XCH A,R0
POP ACC
XCH A,R0
RET
;****************************************
;显示全部的数字
DISPLAY_LED:
SETB RS1
PUSH DPH
PUSH DPL
PUSH ACC
MOV R0,NUM_COUNT
MOV DPL,NUM_START_L
MOV DPH,NUM_START_H
; CLR LED_OE
CLR LED_STR
DISPLAY_LED_LOOP1:
MOV R1,#08H
MOVX A,@DPTR
DISPLAY_LED_LOOP2:
RRC A
MOV LED_DATA,C
CLR LED_CLK
SETB LED_CLK
DJNZ R1,DISPLAY_LED_LOOP2
INC DPTR
DJNZ R0,DISPLAY_LED_LOOP1
SETB LED_STR
; SETB LED_OE
POP ACC
POP DPL
POP DPH
CLR RS1
RET
;****************************************
;显示时间
DISPLAY_TIME:
SETB RS1
PUSH DPH
PUSH DPL
PUSH ACC
LCALL FIX_TIME
MOV R0,TIME_COUNT
MOV DPL,TIME_START_L
MOV DPH,TIME_START_H
; CLR TIME_OE
CLR TIME_STR
DISPLAY_TIME_LOOP1:
MOV R1,#08H
MOVX A,@DPTR
; ORL A,#00000000B
DISPLAY_TIME_LOOP2:
RRC A
MOV TIME_DATA,C
CLR TIME_CLK
SETB TIME_CLK
DJNZ R1,DISPLAY_TIME_LOOP2
INC DPTR
DJNZ R0,DISPLAY_TIME_LOOP1
SETB TIME_STR
; SETB TIME_OE
POP ACC
POP DPL
POP DPH
CLR RS1
RET
;****************************************
;修正时间误差,每10分钟加1秒,相当于每天加144秒。
FIX_TIME:
MOV A,TIME_MINUTE
ANL A,#00001111B
CJNE A,#05H,FIX_TIME_EXIT ;分钟数不是5退出
MOV A,TIME_SECOND
CJNE A,#59H,FIX_TIME_EXIT ;秒数不是59退出
MOV A,TIME_MINUTE
INC A
MOV TIME_MINUTE,A
MOV TIME_SECOND,#00H
LCALL WRITE_TIME_TO_1302
FIX_TIME_EXIT:
RET
;****************************************
;在指定位置显示指定数
DISPLAY_NUM:
JB DATA_INDEX.7,DISPLAY_NUM_EXIT ;不是编辑状态的话退出
PUSH DPH
PUSH DPL
XCH A,B
PUSH ACC
XCH A,B
PUSH ACC ;A进栈
MOV A,DATA_BUFF
MOV C,ACC.7
MOV A,#0FFH
MOV ACC.7,C
MOV B,A ;有点B是7FH,没有点B是FFH
LCALL SET_DATA_DPTR_AUTO_SELECT ;设置DPTR
POP ACC ;GET_NUM_DATA需要将参数放在A中
LCALL GET_NUM_DATA ;读显示数的数据
JB DATA_INDEX.6,SKIP_DISPLAY_DOT;显示时间不需要点
CJNE A,#0FFH,DISPLAY_DOT1 ;A不是#0FFH就保持/不显示显示点
SJMP SKIP_DISPLAY_DOT ;否则要跳过点的显示
DISPLAY_DOT1:
ANL A,B
SKIP_DISPLAY_DOT:
MOV DATA_BUFF,A
MOVX @DPTR,A ;写数据
LCALL REFRESH_AUTO_SELECT ;显示
XCH A,B
POP ACC
XCH A,B
POP DPL
POP DPH
DISPLAY_NUM_EXIT:
RET
;****************************************
;在指定位置显示小数点
DISPLAY_DOT:
JB DATA_INDEX.7,DISPLAY_DOT_EXIT ;不是编辑状态的话退出
PUSH DPH
PUSH DPL
LCALL SET_DATA_DPTR_AUTO_SELECT ;设置DPTR
ANL DPL,#11111100B
MOVX A,@DPTR
ORL A,#10000000B
MOVX @DPTR,A
INC DPTR
MOVX A,@DPTR
ORL A,#10000000B
MOVX @DPTR,A
INC DPTR
MOVX A,@DPTR
ORL A,#10000000B
MOVX @DPTR,A
INC DPTR
MOVX A,@DPTR
ORL A,#10000000B
MOVX @DPTR,A
LCALL SET_DATA_DPTR_AUTO_SELECT ;设置DPTR
MOV A,DATA_BUFF
CPL ACC.7
MOV DATA_BUFF,A
MOVX @DPTR,A ;写数据
LCALL REFRESH_AUTO_SELECT ;显示
POP DPL
POP DPH
DISPLAY_DOT_EXIT:
RET
;****************************************
;延时
;使用资源:R6,R7
DELAY: MOV R6,#0FFH
DLPX4: MOV R7,#0FFH
DLPX5: NOP
NOP
NOP
NOP
DJNZ R7,DLPX5
DJNZ R6,DLPX4
RET
;****************************************
;超长延时
;使用资源:无
DELAY_500MS:
XCH A,R5
PUSH ACC
XCH A,R5
XCH A,R6
PUSH ACC
XCH A,R6
XCH A,R7
PUSH ACC
XCH A,R7
MOV R5,#080H
DLPX1: MOV R6,#080H
DLPX2: MOV R7,#010H
DLPX3: NOP
DJNZ R7,DLPX3
DJNZ R6,DLPX2
DJNZ R5,DLPX1
XCH A,R7
POP ACC
XCH A,R7
XCH A,R6
POP ACC
XCH A,R6
XCH A,R5
POP ACC
XCH A,R5
RET
;****************************************
;中断处理,识别红外遥控码,并进行相应处理
INT_0:
CLR EA ;关中断
PUSH PSW
PUSH DPH
PUSH DPL
PUSH ACC
PUSH 0
PUSH 1
PUSH 2
PUSH 3
PUSH 4
PUSH 5
PUSH 6 ;保存现场
MOV 8,#0 ;08H填0
MOV 9,#0 ;08H填0
MOV R1,#20H
ILOOPS:
LCALL TESTH ;调用程序读出红外编码
LCALL TESTL
JC OVER
SJMP ILOOPS
OVER: MOV DPTR,#YKDATA
MOV R0,#30 ;
OVERL: LCALL FINDS ;判断键码
JC OV1 ;找到后跳到OV1,R0为其键码在表中的编号
DJNZ R0,OVERL ;循环扫描22个键,找到编码后C置1
SJMP OV2 ;22个都不是,不进行处理
OV1: LCALL KEY_DOWN ;处理相应按键
LCALL DELAY
OV2: POP 6 ;恢复现场,退出
POP 5
POP 4
POP 3
POP 2
POP 1
POP 0
POP ACC
POP DPL
POP DPH
POP PSW
SETB EA
RETI
;*******************************************************
;检测红外数据
TESTH: MOV R3,#0 ;初始化R3
TESTL1:INC R3 ;遥控编码的宽度记数+1
CALL DLYT ;延时
MOV C,YKIN ;继续读取红外数据
JC TBR1 ;红外信号端高电平,转到TBR1
SJMP TESTL1 ;红外信号端低电平,R3继续记数
TBR1: CLR C ;
CALL M89 ;红外信号端高电平,二区R0,R1左移一位
MOV A,R3 ;R3数据是红外信号端低电平的宽度,R3 X DLYT
CLR C
MOV B,#HWTH
SUBB A,B
JC TBR11 ;R3大于HWTH跳转到TBR11
CLR C
CALL M89 ;R3小于或等于HWTH则要
TBR11: MOV A,R3
MOV @R1,A
CJNE R1,#2DH,T001
RET
T001: INC R1
RET
;*******************************************************
;检测红外数据
TESTL: MOV R3,#0
L2: INC R3
CALL DLYT
MOV C,YKIN
JC TBR2
SETB C
CALL M89
MOV A,R3
CLR C
MOV B,#HWTH
SUBB A,B
JC TBR21
SETB C
CALL M89
TBR21: MOV A,R3
MOV @R1,A
CJNE R1,#2DH,T002
CLR C
RET
T002: INC R1
CLR C
RET
TBR2: CJNE R3,#0FFH,L2
SETB C
RET
;*******************************************************
;08H 09H C左移
M89: MOV A,9
RLC A
MOV 9,A
MOV A,8
RLC A
MOV 8,A
RET
;*******************************************************
DLYT: MOV R4,#03H ;22.1184用03H
DLTL: DJNZ R4,DLTL
RET
;****************************************
;查表找键,DPTR已经预置为YKDATA
FINDS: CLR C
MOV A,#0
MOVC A,@A+DPTR ;读DPTR数据
CJNE A,8,FBR1 ;2区R0不一样就继续下个
MOV A,#1
MOVC A,@A+DPTR ;继续读DPTR数据
CJNE A,9,FBR1 ;与2区R1不一样就继续下个
SETB C ;两字节全符合,C置后1返回
RET
FBR1: INC DPTR
INC DPTR
CLR C ;不符合,C置0后返回
RET
;*******************************************************
KEY_DOWN:
MOV A,#1EH
CLR C
SUBB A,R0
RLC A
MOV DPTR,#KEYMAP
JMP @A+DPTR
KEYMAP: AJMP K_AAD2 ;01 开关
AJMP K_55A6 ;02 静音
AJMP K_ACAA ;03 节目+
AJMP K_5956 ;04 节目-
AJMP K_599A ;05 微调+
AJMP K_ACD2 ;06 微调-
AJMP K_AB2A ;07 音量+
AJMP K_5656 ;08 音量-
AJMP K_AAAA ;09 0
AJMP K_5556 ;10 1
AJMP K_AAAC ;11 2
AJMP K_555A ;12 3
AJMP K_AAB2 ;13 4
AJMP K_5566 ;14 5
AJMP K_AAB4 ;15 6
AJMP K_556A ;16 7
AJMP K_AACA ;17 8
AJMP K_5596 ;18 9
AJMP K_AB54 ;19 调谐 空数字
AJMP K_AACC ;20 单/双 小数点
AJMP K_55AA ;21 招回
AJMP K_5996 ;22 存储
AJMP K_AB52 ;23 对比+
AJMP K_56A6 ;24 对比-
AJMP K_AB32 ;25 色彩+
AJMP K_5666 ;26 色彩-
AJMP K_AB2C ;27 亮度+
AJMP K_565A ;28 亮度-
AJMP K_AD4A ;29 录象
AJMP K_5AAA ;30 电视
K_AAD2: LCALL SET_EDIT_NUM_MODE ;开关 进入/退出利率修改模式
RET
K_55A6: LCALL SET_EDIT_TIME_MODE ;静音 进入/退出时间修改模式
RET
K_ACAA: LCALL CURSOR_INC ;节目+ 向左移动一位,如果是首位则移动到上个利率牌的末位,到头则无反映
RET
K_5956: LCALL CURSOR_DEC ;节目- 向右移动一位,如果是末尾则移动到下个利率牌的首位,到尾则无反映
RET
K_599A: LCALL CURSOR_NUM_INC ;微调+ 光标所在的位数值+1,到9后再按则返回到0
RET
K_ACD2: LCALL CURSOR_NUM_DEC ;微调- 光标所在的位数值-1,到0后再按则返回到9
RET
K_AB2A: LCALL CURSOR_INC_EX ;音量+ 移动到上一个利率块
RET
K_5656: LCALL CURSOR_DEC_EX ;音量- 移动到下一个利率块
RET
K_AAAA: MOV A,#00H ;0
LCALL DISPLAY_NUM
RET
K_5556: MOV A,#01H ;1
LCALL DISPLAY_NUM
RET
K_AAAC: MOV A,#02H ;2
LCALL DISPLAY_NUM
RET
K_555A: MOV A,#03H ;3
LCALL DISPLAY_NUM
RET
K_AAB2: MOV A,#04H ;4
LCALL DISPLAY_NUM
RET
K_5566: MOV A,#05H ;5
LCALL DISPLAY_NUM
RET
K_AAB4: MOV A,#06H ;6
LCALL DISPLAY_NUM
RET
K_556A: MOV A,#07H ;7
LCALL DISPLAY_NUM
RET
K_AACA: MOV A,#08H ;8
LCALL DISPLAY_NUM
RET
K_5596: MOV A,#09H ;9
LCALL DISPLAY_NUM
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -