📄 timer and ring.asm
字号:
JNB AC,STOS
SUBB A,#6
STOS: MOV 40H,A
SETOK2: LCALL LEDDIS
NOTDOWN2:LJMP SECSET
;-------------------------- 出口
SETENT: MOV 30H,40H
MOV 31H,41H
MOV 32H,42H
SETCAN: POP CONDES
POP CONSOS
LCALL LEDDIS
POP DPLYLOC
POP PSW
POP ACC
LJMP MAIN
;------------------------------------方便掉用
DAASP: ADD A,#01
DA A
RET
;******************************************打铃设置
BELLBRO:PUSH CONSOS
PUSH CONDES
PUSH DPLYLOC
MOV TCDOWN,#20
MOV BELLM,#0EEH ;初始化打铃点分单元为"-"
MOV BELLH,#0EEH ;初始化打铃点时单元为"-"
MOV BELNUM,#00H
MOV A,BCBIN
JZ BEL_OK
MOV BNBIN,#01H
XRL A,#01H
JZ BELLLP
LCALL PAIXU
BELLLP: LCALL SEARCH
BEL_OK: MOV DPLYLOC,#54H ;显示程序入口指针指向54H
MOV CONSOS,#50H
MOV CONDES,#59H ;初始化转换程序
BLOOP: MOV A,TCDOWN
JNZ BLPGO
LJMP BELCAN
BLPGO: LCALL LEDDIS ;将50H-52H单元的内容拆解为六个BCD字节送往显示单元
LCALL DISPLAY
LCALL GETKEY
MOV A,KEYFLAG
JZ BLOOP
MOV A,KEYCODE
MOV TCDOWN,#20
MOV KEYFLAG,#00H
MOV B,A
CJNE A,#RIGHT,NOTBRIGHT
LJMP BELCAN
NOTBRIGHT:CJNE A,#CANCEL,NOTCAN ;取消
LJMP BELCAN
NOTCAN: CJNE A,#ENTER,NOTBENT ;确定
LJMP BELENT
NOTBENT:CJNE A,#NEW,NOTBNEW ;新增
LJMP BELNEW
NOTBNEW:MOV A,BCBIN
JZ BLOOP
MOV A,B
CJNE A,#SETUP,NOTSET ;设置
LJMP BELSET
NOTSET: CJNE A,#DEL,NOTDEL ;删除
LJMP BELDEL
NOTDEL: MOV A,BCBIN
JNZ GOBELSET
LJMP BLOOP ;打铃点为0时,只作功能判断
GOBELSET:MOV A,B
CJNE A,#UP,NOTUP5 ;向上
MOV A,BNBIN
CJNE A,BCBIN,NOTTOP2
MOV A,#01H
MOV BNBIN,A
AJMP NOTTOP3
NOTTOP2:ADD A,#1
MOV BNBIN,A
NOTTOP3:LCALL SEARCH
LJMP BLOOP
NOTUP5: MOV A,B ;向下
CJNE A,#DOWN,NOTDOWN5
MOV A,BNBIN
CLR C
SUBB A,#1
MOV BNBIN,A
JNZ NOTOVER
MOV BNBIN,BCBIN
NOTOVER:LCALL SEARCH
NOTDOWN5:LJMP BLOOP
;------------------------------------------;新增
BELNEW: MOV TCDOWN,#20
MOV NEWFLAG,#0FFH
MOV A,BCBIN
CJNE A,#40,BNEXT
MOV BNBIN,A
LJMP BELSER
BNEXT: ADD A,#1
MOV BCBIN,A
MOV BNBIN,A
BELSER: LCALL SEARCH
;------------------------------------------;B设置
BELSET: MOV TCDOWN,#20
MOV A,51H
CJNE A,#23H,B24NEXT1
AJMP B24NEXT
B24NEXT1:JC B24NEXT
MOV 51H,#12H
MOV 50H,#30H
LCALL LEDDIS
AJMP BELHSET
B24NEXT: MOV A,50H
CJNE A,#59H,B59NEXT ;判断时钟是否有效,无效,则置为12:30
AJMP BELHSET
B59NEXT: JC BELHSET
MOV 50H,#30H
LCALL LEDDIS
BELHSET: MOV A,TCDOWN ;倒计时20S
JNZ BELSGO
LJMP BELCAN
BELSGO: MOV C,01H
JNC BHIDE
LCALL LEDDIS
LCALL DISPLAY
AJMP BELHSP
BHIDE: PUSH 51H
MOV 51H,#0FFH
LCALL LEDDIS
LCALL DISPLAY
POP 51H
BELHSP: LCALL GETKEY
MOV A,KEYFLAG
JZ BELHSET
MOV A,KEYCODE
MOV TCDOWN,#20
MOV KEYFLAG,#00H
MOV B,A
CJNE A,#CANCEL,B_NOTCN
LJMP NEWCAN ;CANCEL,则转向取消设置程序
B_NOTCN: CJNE A,#ENTER,B_NOTENT
LJMP BELSENT ;ENTER,则转向确定设置程序
B_NOTENT:CJNE A,#RIGHT,B_NOTRIT
LJMP BELMSET ;按下RIGHT键,转入分钟设置
B_NOTRIT:MOV A,KEYCODE
CJNE A,#UP,B_NOTUP
MOV A,51H
CJNE A,#23H,B_ADDH
MOV 51H,#00H
AJMP B_SETOK
B_ADDH: LCALL DAASP
MOV 51H,A
LJMP B_SETOK
B_NOTUP: MOV A,B
CJNE A,#DOWN,B_NOTDOWN
MOV A,51H
CJNE A,#00H,B_SUBH
MOV 51H,#23H
AJMP B_SETOK
B_SUBH: SUBB A,#1
JNB AC,B_STOH
SUBB A,#6
B_STOH: MOV 51H,A
B_SETOK: LCALL LEDDIS
B_NOTDOWN:LJMP BELHSET
;-------------------------------------------B分设置
BELMSET: MOV A,TCDOWN
JNZ BELMGO
LJMP BELCAN
BELMGO: MOV C,01H
JNC B_HIDE1
LCALL LEDDIS
LCALL DISPLAY
AJMP B_MINSP
B_HIDE1:PUSH 50H
MOV 50H,#0FFH
LCALL LEDDIS
LCALL DISPLAY
POP 50H
B_MINSP:LCALL GETKEY
MOV A,KEYFLAG
JZ BELMSET
MOV A,KEYCODE
MOV TCDOWN,#20
MOV KEYFLAG,#00H
MOV B,A
CJNE A,#CANCEL,B_NOTCN1
LJMP NEWCAN ;CANCEL,则转向取消设置程序
B_NOTCN1:CJNE A,#ENTER,B_NOTENT1
LJMP BELSENT ;ENTER,则转向确定设置程序
B_NOTENT1:CJNE A,#RIGHT,B_NOTRIT1
LJMP BELHSET ;按下RIGHT键,转入秒钟设置
B_NOTRIT1:MOV A,KEYCODE
CJNE A,#UP,B_NOTUP1
MOV A,50H
CJNE A,#59H,B_ADDM
MOV 50H,#00H
AJMP B_SETOK1
B_ADDM: LCALL DAASP
MOV 50H,A
AJMP B_SETOK1
B_NOTUP1: MOV A,B
CJNE A,#DOWN,B_NOTDOWN1
MOV A,50H
CJNE A,#00H,B_SUBM
MOV 50H,#59H
AJMP B_SETOK1
B_SUBM: SUBB A,#1
JNB AC,B_STOM
SUBB A,#6
B_STOM: MOV 50H,A
B_SETOK1:LCALL LEDDIS
B_NOTDOWN1:LJMP BELMSET
NEWCAN: MOV A,NEWFLAG
JZ BSETCAN
MOV A,BCBIN
CLR C
SUBB A,#1
MOV BCBIN,A
MOV BNBIN,A
LCALL SEARCH
MOV A,BCBIN
JZ NCOUT2
LJMP BELLLP
NCOUT2: MOV BELLM,#0EEH
MOV BELLH,#0EEH
LJMP BEL_OK
BSETCAN: LJMP BELLLP
;------------------------------------------;删除
BELDEL: MOV A,BCBIN
JZ BZOUT
MOV B,#2
MUL AB
ADD A,#7EH
MOV R0,A
MOV @R0,#0EEH
INC R0
MOV @R0,#0EEH
MOV R0,BCBIN
CJNE R0,#1,BELPAIXU
AJMP NOPAIXU
BELPAIXU:LCALL PAIXU
MOV A,BCBIN
CLR C
SUBB A,#1
MOV BCBIN,A
MOV A,BNBIN
CJNE A,#01,BCONV
MOV BNBIN,#01
AJMP B_DELN3
BCONV: CLR C
SUBB A,#1
MOV BNBIN,A
B_DELN3: LJMP BELLLP
NOPAIXU: MOV BELNUM,#00H
MOV BCBIN,#00H
MOV BNBIN,#00H
BZOUT: MOV BELLM,#0EEH
MOV BELLH,#0EEH
LJMP BEL_OK
BELSENT:MOV A,BNBIN ;确定
MOV B,#2
MUL AB
ADD A,#7EH
MOV R0,A
MOV @R0,51H
INC R0
MOV @R0,50H
BELSCAN:LJMP BELLLP
BELENT: MOV R0,#7FH
MOV @R0,BCBIN
MOV R0,#7FH
MOV R4,#00H
MOV A,#BCBIN
MOV B,#2
MUL AB
ADD A,#1
MOV R3,A
LCALL WR24
POP DPLYLOC
POP CONDES
POP CONSOS
LJMP MAIN ;退出程序
BELCAN: POP DPLYLOC
POP CONDES
POP CONSOS
LJMP MAINRD
;------------------------
SEARCH: PUSH ACC ;将当前打铃点的信息从RAM中传送到缓存中
PUSH 00H
PUSH B
MOV A,BNBIN
MOV B,#10
DIV AB
SWAP A
ORL A,B ;将二进制转换为BCD码
MOV BELNUM,A
MOV B,#2
MOV A,BNBIN
MUL AB
ADD A,#7EH
MOV R0,A
MOV BELLH,@R0
INC R0
MOV BELLM,@R0
POP B
POP 00H
POP ACC
RET
;*****************************写24C02 EEPROM数据子程序*****************************
;R0:RAM地址指针,R2:8位移位计数器 ;R3:数据字节计数器;R4:24C02 存储地址
WR24: NOP
W_LOOP: LCALL START24
MOV A,#0A0H
LCALL WBYTE
MOV A,R4
LCALL WBYTE
MOV A,@R0
LCALL WBYTE
LCALL STOP24
MOV R6,#4
DLP: LCALL DISPLAY
DJNZ R6,DLP
INC R0
INC R4
WAIT: MOV A,TH0
CPL A
JZ WAIT
DJNZ R3,W_LOOP
RET
;*****************************读24C02 EEPROM数据子程序*****************************
;R0:RAM地址指针,R2:8位移位计数器;R3:数据字节计数器 ;R4:24C02 存储地址
RD24: NOP
R_LOOP1: LCALL START24
MOV A,#0A0H
LCALL WBYTE
MOV A,R4
LCALL WBYTE
LCALL START24
MOV A,#0A1H
LCALL WBYTE
LCALL RBYTE
MOV @R0,A
INC R0
INC R4
DJNZ R3,R_LOOP1
LCALL STOP24
RET
;-----------------------------------
RBYTE: NOP
CLR SCL
MOV R2,#08H
SETB SDA
RBY0: CLR SCL
NOP
SETB SCL
NOP
MOV C,SDA
RLC A
DJNZ R2,RBY0
CLR SCL
NOP
CLR SCL
SETB SDA
NOP
SETB SCL
RET
;-------------------------------------
WBYTE: NOP
MOV R2,#08H
WBY0: CLR SCL
RLC A
MOV SDA,C
NOP
SETB SCL
DJNZ R2,WBY0
CLR SCL
NOP
SETB SCL
NOP
JB SDA,$
CLR SCL
NOP
RET
;---------------------------------
START24: CLR SCL
NOP
SETB SDA
NOP
SETB SCL
NOP
CLR SDA
NOP
CLR SCL
RET
;---------------------------------
STOP24: CLR SCL
NOP
CLR SDA
NOP
SETB SCL
NOP
SETB SDA
NOP
CLR SCL
RET
;*****************************双字节排序程序*****************************
;入口参数:COUNT单元存放打铃点个数,BEGIN为排序的入口指针
PAIXU: PUSH ACC
PUSH PSW
PUSH B
PUSH 00H
PUSH 01H
PUSH 02H
PUSH 03H
PUSH 04H
PUSH 05H
PUSH 06H
MOV R2,BCBIN
DEC R2 ;送外循环数
GOTO1: MOV A,R2
MOV R3,A ;送内循环数
MOV R6,#01 ;送换位标志为1
MOV R0,#80H ;R0为时指针
GOTO2: MOV A,R0
INC A
MOV R1,A ;R1为分指针
MOV A,@R0
MOV R4,A ;第一个时值送R4
INC R0
INC R0 ;时指针加2
MOV A,@R1
MOV R5,A ;第一个分值送R5
INC R1
INC R1 ;分指针加2
CLR C ;进位清0
MOV A,R4
SUBB A,@R0 ;第一个时值减第二个时值
JZ LESS1 ;相等
JC LESS ;小于
JNC BIG ;大于
LESS1: CLR C ;进位清0
MOV A,R5
SUBB A,@R1 ;第一个分值减第二个分值
JC LESS ;小于
BIG: MOV A,R4 ;大于或等于时
XCH A,@R0 ;时对换
DEC R0
DEC R0
MOV @R0,A
INC R0
INC R0
MOV A,R5
XCH A,@R1 ;分对换
DEC R1
DEC R1
MOV @R1,A
INC R1
INC R1
MOV R6,#02 ;对换标志置2
LESS: DJNZ R3,GOTO2
DJNZ R2,GOTO3
SJMP GOTO4
GOTO3: DJNZ R6,GOTO1
GOTO4: POP 06H
POP 05H
POP 04H
POP 03H
POP 02H
POP 01H
POP 00H
POP B
POP PSW
POP ACC
RET
;**********************************
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,00H,00H,00H,40H,00H ;," ", " ","-"," "
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -