📄 clock.asm
字号:
LJMP INC_RET
INC_012:JNB CURSOR_7,INC_014
MOV A,DATE_H ;光标在第“07”位
CJNE A,#09H,INC_013
LJMP INC_RET
INC_013:INC A
MOV DATE_H,A
LJMP INC_RET
INC_014:JNB CURSOR_8,INC_016
MOV A,DATE_L ;光标在第“08”位
CJNE A,#09H,INC_015
LJMP INC_RET
INC_015:INC A
MOV DATE_L,A
LJMP INC_RET
INC_016:JNB CURSOR_9,INC_018
MOV A,HOUR_H ;光标在第“09”位
CJNE A,#09H,INC_017
LJMP INC_RET
INC_017:INC A
MOV HOUR_H,A
LJMP INC_RET
INC_018:JNB CURSOR_10,INC_020
MOV A,HOUR_L ;光标在第“10”位
CJNE A,#09H,INC_019
LJMP INC_RET
INC_019:INC A
MOV HOUR_L,A
LJMP INC_RET
INC_020:JNB CURSOR_11,INC_022
MOV A,MINUTE_H ;光标在第“11”位
CJNE A,#09H,INC_021
LJMP INC_RET
INC_021:INC A
MOV MINUTE_H,A
LJMP INC_RET
INC_022:JNB CURSOR_12,INC_RET
MOV A,MINUTE_L ;光标在第“12”位
CJNE A,#09H,INC_023
LJMP INC_RET
INC_023:INC A
MOV MINUTE_L,A
LJMP INC_RET
INC_RET:LCALL WRITE_LED
RET
;-------数字减少处理程序----------
KEY_DECPROG:
JNB CURSOR_1,DEC_002
MOV A,YEAR_A ;光标在第“01”位
CJNE A,#00H,DEC_001
LJMP DEC_RET
DEC_001:DEC A
MOV YEAR_A,A
LJMP DEC_RET
DEC_002:JNB CURSOR_2,DEC_004
MOV A,YEAR_A ;光标在第“02”位
CJNE A,#00H,DEC_003
LJMP DEC_RET
DEC_003:DEC A
MOV YEAR_B,A
LJMP DEC_RET
DEC_004:JNB CURSOR_3,DEC_006
MOV A,YEAR_H ;光标在第“03”位
CJNE A,#00H,DEC_005
LJMP DEC_RET
DEC_005:DEC A
MOV YEAR_H,A
LJMP DEC_RET
DEC_006:JNB CURSOR_4,DEC_008
MOV A,YEAR_L ;光标在第“04”位
CJNE A,#00H,DEC_007
LJMP DEC_RET
DEC_007:DEC A
MOV YEAR_L,A
LJMP DEC_RET
DEC_008:JNB CURSOR_5,DEC_010
MOV A,MOTH_H ;光标在第“05”位
CJNE A,#00H,DEC_009
LJMP DEC_RET
DEC_009:DEC A
MOV MOTH_H,A
LJMP DEC_RET
DEC_010:JNB CURSOR_6,DEC_012
MOV A,MOTH_L ;光标在第“06”位
CJNE A,#00H,DEC_011
LJMP DEC_RET
DEC_011:DEC A
MOV MOTH_L,A
LJMP DEC_RET
DEC_012:JNB CURSOR_7,DEC_014
MOV A,DATE_H ;光标在第“07”位
CJNE A,#00H,DEC_013
LJMP DEC_RET
DEC_013:DEC A
MOV DATE_H,A
LJMP DEC_RET
DEC_014:JNB CURSOR_8,DEC_016
MOV A,DATE_L ;光标在第“08”位
CJNE A,#00H,DEC_015
LJMP DEC_RET
DEC_015:DEC A
MOV DATE_L,A
LJMP DEC_RET
DEC_016:JNB CURSOR_9,DEC_018
MOV A,HOUR_H ;光标在第“09”位
CJNE A,#00H,DEC_017
LJMP DEC_RET
DEC_017:DEC A
MOV HOUR_H,A
LJMP DEC_RET
DEC_018:JNB CURSOR_10,DEC_020
MOV A,HOUR_L ;光标在第“10”位
CJNE A,#00H,DEC_019
LJMP DEC_RET
DEC_019:DEC A
MOV HOUR_L,A
LJMP DEC_RET
DEC_020:JNB CURSOR_11,DEC_022
MOV A,MINUTE_H ;光标在第“11”位
CJNE A,#00H,DEC_021
LJMP DEC_RET
DEC_021:DEC A
MOV MINUTE_H,A
LJMP DEC_RET
DEC_022:JNB CURSOR_12,DEC_RET
MOV A,MINUTE_L ;光标在第“12”位
CJNE A,#00H,DEC_023
LJMP DEC_RET
DEC_023:DEC A
MOV MINUTE_L,A
DEC_RET:LCALL WRITE_LED
RET
;-----------------------------
LED_INT:NOP
MOV DAT_OUT,#12H
LCALL SEND_A
MOV DAT_OUT,#82H
LCALL SEND_A ;复位数码管
MOV DAT_OUT,#11H
LCALL SEND_A
MOV DAT_OUT,#090H
LCALL SEND_A
LCALL WRITE_LED
RET
;-----------------------------
WRITE_LED:
MOV R2,#00H
MOV R0,#30H
LED_INA:LCALL WR_LED
INC R0
INC R2
CJNE R2,#10H,LED_INA
RET
;-------数码管显示程序--------
WR_LED: MOV DAT_OUT,#14H
LCALL SEND_A
MOV DAT_OUT,@R0 ;数码管显示内容及位置
MOV A,R2
SWAP A
ORL DAT_OUT,A
LCALL SEND_A
RET
;---------------------------
LDELAY: MOV R6,#60
DJNZ R6,$
RET
;---------------------------
SDELAY: MOV R6,#10
DJNZ R6,$
RET
;---------------------------
DELAYA: MOV R6,#0FFH
DJNZ R6,$
RET
;---向计时BC7281发指令/数据程序----
SEND_A: CLR MCU_CLK
SETB MCU_CLK
JB MCU_DAT,SEND_A
CLR MCU_CLK
SETB MCU_CLK
JNB MCU_DAT,$
MOV A,DAT_OUT
MOV R4,#08H
SEND_B: RLC A
MOV MCU_DAT,C
LCALL SDELAY
CLR MCU_CLK
SETB MCU_CLK
LCALL SDELAY
DJNZ R4,SEND_B
LCALL SDELAY
SETB MCU_DAT
RET
;------BC7281读数据程序------
RECEIVE:CLR MCU_CLK
SETB MCU_CLK
JB MCU_DAT,$
CLR MCU_CLK
SETB MCU_CLK
MOV R4,#08H
SETB MCU_DAT
LCALL LDELAY
RECEA: SETB MCU_CLK
CALL SDELAY
MOV A,DAT_IN
RL A
MOV DAT_IN,A
MOV C,MCU_DAT
MOV DAT_IN.0,C
CLR MCU_CLK
LCALL SDELAY
DJNZ R4,RECEA
LCALL SDELAY
SETB MCU_DAT
RET
;--读DS1302的年、月、日、秒、分、小时数据-----
READ_TIMER:
MOV WRITE_DATA,#81H
LCALL LOAD_SDAT
MOV SECOND_DAT,A
MOV WRITE_DATA,#83H
LCALL LOAD_SDAT
MOV MINUTE_DAT,A
LCALL BCD_HMINUTE
MOV WRITE_DATA,#85H
LCALL LOAD_SDAT
MOV HOUR_DAT,A
LCALL BCD_HOUR
MOV WRITE_DATA,#87H
LCALL LOAD_SDAT
MOV DATE_DAT,A
LCALL BCD_HDATE
MOV WRITE_DATA,#89H
LCALL LOAD_SDAT
MOV MOTH_DAT,A
LCALL BCD_HMOTH
MOV WRITE_DATA,#8DH
LCALL LOAD_SDAT
MOV YEAR_DAT,A
LCALL BCD_HYEAR
RET
;--写DS1302的年、月、日、秒、分、小时数据-----
WRITE_TIMER:
LCALL DATA_WIRTE
MOV WRITE_DATA,#8EH
MOV WRITE_DATB,#00H ;允许写数据
LCALL SAVE_SDAT
MOV WRITE_DATA,#8CH
MOV WRITE_DATB,YEAR_DAT
LCALL SAVE_SDAT
MOV WRITE_DATA,#8AH
MOV WRITE_DATB,WEEK_DAT
LCALL SAVE_SDAT
MOV WRITE_DATA,#88H
MOV WRITE_DATB,MOTH_DAT
LCALL SAVE_SDAT
MOV WRITE_DATA,#86H
MOV WRITE_DATB,DATE_DAT
LCALL SAVE_SDAT
MOV WRITE_DATA,#84H
MOV WRITE_DATB,HOUR_DAT
LCALL SAVE_SDAT
MOV WRITE_DATA,#82H
MOV WRITE_DATB,MINUTE_DAT
LCALL SAVE_SDAT
MOV WRITE_DATA,#80H
MOV WRITE_DATB,SECOND_DAT
LCALL SAVE_SDAT
RET
;------------------------------------
DATA_WIRTE:
MOV YEAR_DAT,#04H
MOV MOTH_DAT,#07H
MOV DATE_DAT,#12H
MOV WEEK_DAT,#01H
MOV HOUR_DAT,#11H
MOV MINUTE_DAT,#05H
MOV SECOND_DAT,#00H
RET
;-------分BCD码转换为16进制数----
BCD_HMINUTE:
MOV MINUTE_L,MINUTE_DAT
ANL MINUTE_L,#0FH
MOV A,MINUTE_DAT
SWAP A
ANL A,#07H
MOV MINUTE_H,A
RET
;-------时BCD码转换为16进制数----
BCD_HOUR:
MOV HOUR_L,HOUR_DAT
ANL HOUR_L,#0FH
MOV A,HOUR_DAT
SWAP A
ANL A,#03H
MOV HOUR_H,A
RET
;-------日BCD码转换为16进制数----
BCD_HDATE:
MOV DATE_L,DATE_DAT
ANL DATE_L,#0FH
MOV A,DATE_DAT
SWAP A
ANL A,#03H
MOV DATE_H,A
RET
;-------月BCD码转换为16进制数----
BCD_HMOTH:
MOV MOTH_L,MOTH_DAT
ANL MOTH_L,#0FH
MOV A,MOTH_DAT
SWAP A
ANL A,#03H
MOV MOTH_H,A
RET
;------年BCD码转换为16进制数----
BCD_HYEAR:
MOV YEAR_L,YEAR_DAT
ANL YEAR_L,#0FH
MOV A,YEAR_DAT
SWAP A
ANL A,#03H
MOV YEAR_H,A
RET
;-----向DS1302芯片写时钟数据------
SAVE_SDAT:
CLR SER_CLK
NOP
SETB RESET
MOV R5,#08H
MOV A,WRITE_DATA
SAVE_PA:CLR SER_CLK
RRC A
MOV SER_DAT,C ;发送命令字
SETB SER_CLK
NOP
DJNZ R5,SAVE_PA
MOV R5,#08H
MOV A,WRITE_DATB
SAVE_PB:CLR SER_CLK
RRC A
MOV SER_DAT,C ;发送写数据
SETB SER_CLK
DJNZ R5,SAVE_PB
CLR RESET
RET
;----读DS1302芯片时钟数据------
LOAD_SDAT:
CLR SER_CLK ; DS1302串行时钟信号清位(用SER_CLK的高低作为时钟信号控制1302的动作)
NOP
SETB RESET ; DS1302复位信号置位,即启动1302发送数据
MOV R5,#08H
MOV A,WRITE_DATA ; 读入1302的命令数据
LOAD_PA:CLR SER_CLK
RRC A
MOV SER_DAT,C ;发送命令字——送串行数据信号
SETB SER_CLK
NOP
DJNZ R5,LOAD_PA ; 共8次
MOV R5,#08H
CLR SER_CLK
NOP
SETB SER_DAT
MOV R5,#08H
LOAD_PB:CLR SER_CLK
MOV C,SER_DAT ;将读到的数据送“C”标志位
RRC A
SETB SER_CLK
NOP
DJNZ R5,LOAD_PB
CLR RESET
RET
;---------------------------
DS1302_INIT:
MOV WRITE_DATA,#90H
MOV WRITE_DATB,#0A0H ;禁止向备用电池充电
LCALL SAVE_SDAT
MOV WRITE_DATA,#80H
MOV WRITE_DATB,#00H ;秒开始计数
LCALL SAVE_SDAT
MOV WRITE_DATA,#8EH
MOV WRITE_DATB,#80H
LCALL SAVE_SDAT ;禁止向DS1302写数据
RET
;-----RS232初始化程序--------
RS_SET: MOV TMOD,#21H
MOV TH1,#0F4H
MOV TL1,#0F4H
MOV SCON,#01010000B
MOV PCON,#80H ;4800bps
MOV TH0,#0CH
MOV TL0,#58H
SETB ET0 ;允许"T0"中断
SETB TR0 ;启动定时器"0"
SETB TR1
SETB ES
SETB EA
RET
;--------初始化各参数-----------
RAM_INT:MOV A,#00H
MOV R0,#20H
RAM_INA:MOV @R0,A
INC R0
CJNE R0,#60H,RAM_INA
MOV RS_BUFFER,#0AAH
MOV RS_BUFFER+9,#0BBH
MOV RS_DATA,#50H
MOV YEAR_A,#02H
MOV YEAR_B,#00H
MOV A,#0FFH
MOV P1,A
MOV P3,A
CLR CTRL_SEC
CLR RESET
LCALL WRITE_TIMER
LCALL READ_TIMER
RET
;-----------------------------
RS_RECEIVE:
PUSH ACC
PUSH PSW
JNB TI,RS_RECA
POP PSW
POP ACC
RETI
RS_RECA:JNB RI,RS_RET
CLR RI
MOV A,SBUF
CJNE A,#0AAH,RS_RECD
SETB RS_REVFA
RS_RECB:MOV R1,RS_DATA
MOV @R1,A
INC R1
MOV RS_DATA,R1
LJMP RS_RET
RS_RECD:JNB RS_REVFA,RS_RET
CJNE A,#0BBH,RS_RECB
MOV R1,RS_DATA
MOV @R1,A
MOV RS_DATA,#50H
CLR RS_REVFA
SETB RS_REVFB
RS_RET: POP PSW
POP ACC
RETI
;-------------------------
DTIME: MOV R3,#080H
DJNZ R3,$
RET
;--------------------------
CLR_BUFFER:
MOV R0,#51H
MOV A,#00H
CLR_BUA:MOV @R0,A
INC R0
CJNE R0,#59H,CLR_BUA
RET
;*******数码管显示程序********
WRITE_BLINK:
MOV DAT_OUT,#10H
LCALL SEND_A
MOV DAT_OUT,BCD_A ;数码管显示位置
LCALL SEND_A
MOV DAT_OUT,#19H
LCALL SEND_A
MOV DAT_OUT,BCD_B ;数码管显示内容
LCALL SEND_A
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -