📄 clock.asm
字号:
; 时钟程序
;-------------------20H------------------------
ENTER BIT 00H ;确认键按下标志位
SET_BIT BIT 01H ;设置键按下标志位
KEY_MOVE BIT 02H ;移动键按下标志位
INC_A BIT 03H ;数字增加键按下标志位
DEC_A BIT 04H ;数字减少键按下标志位
T0_OVER BIT 05H ;T0中断溢出标志位
KEY_DW BIT 06H ;键盘有键按下标志位
K_DOWN BIT 07H ;已取完键值标志位
;------------------21H------------------------
CURSOR_1 BIT 08H ;光标在第"1"个数码管标志位
CURSOR_2 BIT 09H ;光标在第"2"个数码管标志位
CURSOR_3 BIT 0AH ;光标在第"3"个数码管标志位
CURSOR_4 BIT 0BH ;光标在第"4"个数码管标志位
CURSOR_5 BIT 0CH ;光标在第"5"个数码管标志位
CURSOR_6 BIT 0DH ;光标在第"6"个数码管标志位
CURSOR_7 BIT 0EH ;光标在第"7"个数码管标志位
CURSOR_8 BIT 0FH ;光标在第"8"个数码管标志位
;------------------22H--------------------------------
CURSOR_9 BIT 10H ;光标在第"9"个数码管标志位
CURSOR_10 BIT 11H ;光标在第"10"个数码管标志位
CURSOR_11 BIT 12H ;光标在第"11"个数码管标志位
CURSOR_12 BIT 13H ;光标在第"12"个数码管标志位
CURSOR_13 BIT 14H ;光标在第"13"个数码管标志位
CURSOR_14 BIT 15H ;光标在第"14"个数码管标志位
CURSOR_15 BIT 16H ;光标在第"15"个数码管标志位
CURSOR_16 BIT 17H ;光标在第"16"个数码管标志位
;------------------23H--------------------------------
SEC_FRT BIT 18H ;秒二极管亮、灭标志位
RS_REVFA BIT 19H ;接收到通信起始位标志
RS_REVFB BIT 1AH ;接收完数据标志
SECOND_ON BIT 1BH ;秒LED发光管亮标志位
; BIT 1CH
; BIT 1DH
; BIT 1EH
; BIT 1FH
;------------------24H------------------------
BLINK1 BIT 20H ;数码管1闪烁控制位
BLINK2 BIT 21H ;数码管2闪烁控制位
BLINK3 BIT 22H ;数码管3闪烁控制位
BLINK4 BIT 23H ;数码管4闪烁控制位
BLINK5 BIT 24H ;数码管5闪烁控制位
BLINK6 BIT 25H ;数码管6闪烁控制位
BLINK7 BIT 26H ;数码管7闪烁控制位
BLINK8 BIT 27H ;数码管8闪烁控制位
;------------------25H------------------------
BLINK9 BIT 28H ;数码管9闪烁控制位
BLINK10 BIT 29H ;数码管10闪烁控制位
BLINK11 BIT 2AH ;数码管11闪烁控制位
BLINK12 BIT 2BH ;数码管12闪烁控制位
BLINK13 BIT 2CH ;数码管13闪烁控制位
BLINK14 BIT 2DH ;数码管14闪烁控制位
BLINK15 BIT 2EH ;数码管15闪烁控制位
BLINK16 BIT 2FH ;数码管16闪烁控制位
;----------------------------------------------
WP BIT P1.0 ;X5045/WP信号
DATA_OUT BIT P1.1 ;X5045数据输出信号
CS BIT P1.2 ;X5045片选信号
SCLK BIT P1.3 ;X5045时钟信号
DATA_IN BIT P1.4 ;X5045数据输入信号
SER_CLK BIT P1.5 ;DS1302的串行时钟信号
SER_DAT BIT P1.6 ;DS1302的串行数据信号
RESET BIT P1.7 ;DS1302的RESET信号
;------------------------------------------------
LED_DAT BIT P3.2 ;
MCU_KEY BIT P3.3 ;BC7281芯片KEY信号
CTRL_SEC BIT P3.4 ;秒闪烁控制信号
MCU_CLK BIT P3.5 ;BC7281芯片时钟信号
MCU_DAT BIT P3.7 ;BC7281芯片数据信号
;------------------内存地址定义------------------
BLINK_A DATA 24H
BLINK_B DATA 25H
DAT_OUT DATA 28H
DAT_IN DATA 29H
WRITE_DATA DATA 2AH ;DS1302命令数据
WRITE_DATB DATA 2BH ;DS1302时钟数据
MKEYN DATA 2CH
BCD_A DATA 2DH
BCD_B DATA 2EH
; DATA 2FH
;---------------------------
HOUR_H DATA 30H ;
HOUR_L DATA 31H ;
MINUTE_H DATA 32H ;
MINUTE_L DATA 33H ;
DATE_L DATA 34H ;
DATE_H DATA 35H ;
MOTH_H DATA 36H ;
MOTH_L DATA 37H ;
YEAR_A DATA 38H ;
YEAR_B DATA 39H ;
YEAR_H DATA 3AH ;
YEAR_L DATA 3BH ;
; DATA 3CH ;
; DATA 3DH ;
; DATA 3EH ;
; DATA 3FH ;
;------------------------------
YEAR_DAT DATA 40H
MOTH_DAT DATA 41H
DATE_DAT DATA 42H
WEEK_DAT DATA 43H
HOUR_DAT DATA 44H
MINUTE_DAT DATA 45H
SECOND_DAT DATA 46H
SEC_OLD DATA 47H
TACOM DATA 48H
RXDAT DATA 49H
RS_DATA DATA 4AH
; DATA 4BH
; DATA 4CH
; DATA 4DH
; DATA 4EH
; DATA 4FH
;---------RS232数据缓冲区--------
RS_BUFFER DATA 50H
; DATA 51H
; DATA 52H
; DATA 53H
; DATA 54H
; DATA 55H
; DATA 56H
; DATA 57H
; DATA 58H
; DATA 59H
;┌─────────DS1302寄存器及控制字───────────┐
;│ 寄存器名 命令 取值范围 各位内容 │
;│ 写 读 7 6 5 4 3 2 1 0 │
;│秒寄存器 |80H 81H | 00-59 | CH | 10SEC | SEC │
;│分寄存器 |82H 83H | 00-59 | 0 | 10MIN | MIN │
;│时寄存器 |84H 85H |1-12 0-23|12/24| 0 10AP HR| HOUR │
;│日寄存器 |86H 87H | 01-31 | 0 | 0 10DATE | DATE │
;│月寄存器 |88H 89H | 01-12 | 0 | 0 0 10M| MONTH │
;│周寄存器 |8AH 8BH | 00-07 | 0 | 0 0 0 | 0 DAY │
;│年寄存器 |8CH 8DH | 00-99 | 0 | 10YEAR | YEAR │
;├──────────────────────────────┤
;│ 注释: │
;│ 1. CH:秒时钟触发位 │
;│ CH=1时钟禁止 │
;│ CH=0正常工作 │
;│ 2. 12/24:12小时、24小时选择位 │
;│ =1 12小时模式 │
;│ =0 24小时模式 │
;│ 3. AM/PM:上午、下午位 │
;│ =1 表示AM(上午) │
;│ =0 表示PM(下午) │
;├──────────────────────────────┤
;│ DS1303命令格式: │
;│ D7 D6 D5 D4 D3 D2 D1 D0 │
;│ 1 RAM/CLK A4 A3 A2 A1 A0 RD/WR │
;│ │
;│ D6=RAM/CLK="1" 指向DS1302的内部RAM │
;│ D6=RAM/CLK="0" 指向DS1302的内部时钟 │
;│ D0=RD/WR="1" 进行内部RAM或时钟读操作 │
;│ D0=RD/WR="0" 进行内部RAM或时钟写操作 │
;│ A0---A4: 内部RAM或时钟地址 │
;└──────────────────────────────┘
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIME0PR
ORG 0023H
LJMP RS_RECEIVE
ORG 100H
MAIN: LCALL DS1302_INIT ;DS1302初始化
LCALL RAM_INT ;内部存储器初始化
LCALL LED_INT ;数码管初始化
LCALL RS_SET ;RS232接口初始化
MOV SP,#60H
;-----------主程序-----------
START00:JNB T0_OVER,START01
CLR T0_OVER ; T0_OVER(T0中断溢出标志位)清零
LCALL SECOND
LCALL READ_KEY
;--------键盘按键处理----------
START01:JNB KEY_DW,START02
LCALL KEYPROG ;键盘处理
CLR KEY_DW
MOV MKEYN,#0FFH
START02:JNB RS_REVFB,START00
MOV A,RS_BUFFER+1 ;设置时间、日期
CJNE A,#01H,START00
LCALL SET_TIME
LCALL DISPLAY_TIME
LCALL CLR_BUFFER
LJMP START00
;-----------秒处理程序------------
SECOND: MOV WRITE_DATA,#81H
LCALL LOAD_SDAT
MOV SECOND_DAT,A ; 1302读来的数据送SECOND_DAT
ANL SECOND_DAT,#7FH ; 并将其最高位清零
JB SEC_FRT,SEC_NA ; 秒二极管亮灭标志位为1则转SEC_NA
MOV SEC_OLD,A
SETB SEC_FRT
LJMP SEC_RET
SEC_NA: CJNE A,SEC_OLD,SEC_NB
LJMP SEC_RET
SEC_NB: JB SECOND_ON,SEC_NC
SETB SECOND_ON
CLR CTRL_SEC
LJMP SEC_ND
SEC_NC: CLR SECOND_ON
SETB CTRL_SEC
SEC_ND: MOV SEC_OLD,SECOND_DAT
LCALL DISPLAY_TIME
SEC_RET:RET
;--显示时间、日期、温/湿度数据----
DISPLAY_TIME:
LCALL READ_TIMER
LCALL WRITE_LED
RET
;-------------------------------
SET_TIME:
MOV YEAR_DAT,RS_BUFFER+2
LCALL BCD_HYEAR
MOV MOTH_DAT,RS_BUFFER+3
LCALL BCD_HMOTH
MOV DATE_DAT,RS_BUFFER+4
LCALL BCD_HDATE
MOV WEEK_DAT,RS_BUFFER+5
MOV HOUR_DAT,RS_BUFFER+6
LCALL BCD_HMINUTE
MOV MINUTE_DAT,RS_BUFFER+7
MOV SECOND_DAT,RS_BUFFER+8
LCALL WRITE_TIMER
RET
;------- 定时器“0”中断 ------
TIME0PR:PUSH ACC
PUSH PSW
MOV TH0,#0C0H
MOV TL0,#58H
MOV A,TACOM
INC A
CJNE A,#08H,TIME0PB
TIME0PA:MOV A,#00H
MOV TACOM,A
SETB T0_OVER
LJMP TIME0PD
TIME0PB:JNC TIME0PA
MOV TACOM,A
TIME0PD:SETB TR0
POP PSW
POP ACC
RETI
;********读键值程序*************
READ_KEY:JB MCU_KEY,READ_REC
JB K_DOWN,READ_RET
MOV DAT_OUT,#93H
LCALL SEND_A
LCALL RECEIVE
MOV A,DAT_IN
CJNE A,#05,READ_REA
LJMP READ_REB
READ_REA:JNC READ_RET
READ_REB:SETB K_DOWN
RET
READ_REC:JNB K_DOWN,READ_RET
MOV MKEYN,DAT_IN
SETB KEY_DW
CLR K_DOWN
READ_RET:RET
;*********主键盘处理程序*******
KEYPROG:MOV A,MKEYN
CJNE A,#0FFH,KEYPRA
LJMP KEYPRET
KEYPRA: CJNE A,#05H,KEYPRB
LJMP KEYPRC
KEYPRB: JC KEYPRC
LJMP KEYPRET
KEYPRC: CLR C
MOV B,#3
MUL AB
MOV DPTR,#JMPTBL
JMP @A+DPTR
RET
;********功能键跳转*********
JMPTBL: LJMP KEY_SET
LJMP INC_KEY
LJMP DEC_KEY
LJMP MOVE_KEY
LJMP ENTER_KEY
LJMP KEYPRET
KEYPRET:RET
;---------------------------------
KEY_SET:
LJMP KEYPRET
;---数字增加键处理程序---
INC_KEY:JNB KEY_MOVE,KEYPRET
LCALL KEY_INCPROG
LJMP KEYPRET
;---数字减少键处理程序---
DEC_KEY:JNB KEY_MOVE,KEYPRET
LCALL KEY_DECPROG
LJMP KEYPRET
;------数字移动键处理程序--------
MOVE_KEY:
SETB KEY_MOVE
LCALL KEY_MOVPROG
LJMP KEYPRET
;-----确认键按下处理程序------
ENTER_KEY:
JNB KEY_MOVE,KEYPRET
MOV BCD_A,#0FFH
MOV BCD_B,#0FFH
LCALL WRITE_BLINK
LCALL WRITE_LED
ANL 20H,#0E0H
CLR CURSOR_1
LJMP KEYPRET
;------光标位置检查处理程序---
KEY_MOVPROG:
JNB CURSOR_1,MOV_001
CLR CURSOR_1 ;光标在第“1”位
SETB CURSOR_2
SETB BLINK1
CLR BLINK2
MOV BCD_A,BLINK_A
MOV BCD_B,BLINK_B
LCALL WRITE_BLINK
LJMP MOV_RET
MOV_001:JNB CURSOR_2,MOV_002
CLR CURSOR_2 ;光标在第“2”位
SETB CURSOR_3
SETB BLINK2
CLR BLINK3
MOV BCD_A,BLINK_A
MOV BCD_B,BLINK_B
LCALL WRITE_BLINK
LJMP MOV_RET
MOV_002:JNB CURSOR_3,MOV_003
CLR CURSOR_3 ;光标在第“3”位
SETB CURSOR_4
SETB BLINK3
CLR BLINK4
MOV BCD_A,BLINK_A
MOV BCD_B,BLINK_B
LCALL WRITE_BLINK
LJMP MOV_RET
MOV_003:JNB CURSOR_4,MOV_004
CLR CURSOR_4 ;光标在第“4”位
SETB CURSOR_5
SETB BLINK4
CLR BLINK5
MOV BCD_A,BLINK_A
MOV BCD_B,BLINK_B
LCALL WRITE_BLINK
LJMP MOV_RET
MOV_004:JNB CURSOR_5,MOV_005
CLR CURSOR_5 ;光标在第“5”位
SETB CURSOR_6
SETB BLINK5
CLR BLINK6
MOV BCD_A,BLINK_A
MOV BCD_B,BLINK_B
LCALL WRITE_BLINK
LJMP MOV_RET
MOV_005:JNB CURSOR_6,MOV_006
CLR CURSOR_6 ;光标在第“6”位
SETB CURSOR_7
SETB BLINK6
CLR BLINK7
MOV BCD_A,BLINK_A
MOV BCD_B,BLINK_B
LCALL WRITE_BLINK
LJMP MOV_RET
MOV_006:JNB CURSOR_7,MOV_007
CLR CURSOR_7 ;光标在第“7”位
SETB CURSOR_8
SETB BLINK7
CLR BLINK8
MOV BCD_A,BLINK_A
MOV BCD_B,BLINK_B
LCALL WRITE_BLINK
LJMP MOV_RET
MOV_007:JNB CURSOR_8,MOV_008
CLR CURSOR_8 ;光标在第“8”位
SETB CURSOR_13
SETB BLINK8
CLR BLINK13
MOV BCD_A,BLINK_A
MOV BCD_B,BLINK_B
LCALL WRITE_BLINK
LJMP MOV_RET
MOV_008:JNB CURSOR_9,MOV_009
CLR CURSOR_9 ;光标在第“09”位
SETB CURSOR_10
SETB BLINK9
CLR BLINK10
MOV BCD_A,BLINK_A
MOV BCD_B,BLINK_B
LCALL WRITE_BLINK
LJMP MOV_RET
MOV_009:JNB CURSOR_10,MOV_010
CLR CURSOR_10 ;光标在第“10”位
SETB CURSOR_11
SETB BLINK10
CLR BLINK11
MOV BCD_A,BLINK_A
MOV BCD_B,BLINK_B
LCALL WRITE_BLINK
LJMP MOV_RET
MOV_010:JNB CURSOR_11,MOV_011
CLR CURSOR_11 ;光标在第“11”位
SETB CURSOR_12
SETB BLINK11
CLR BLINK12
MOV BCD_A,BLINK_A
MOV BCD_B,BLINK_B
LCALL WRITE_BLINK
LJMP MOV_RET
MOV_011:JNB CURSOR_12,MOV_012
CLR CURSOR_12 ;光标在第“12”位
SETB CURSOR_1
SETB BLINK12
CLR BLINK1
MOV BCD_A,BLINK_A
MOV BCD_B,BLINK_B
LCALL WRITE_BLINK
LJMP MOV_RET
MOV_012:SETB CURSOR_1
CLR BLINK1
MOV BCD_A,BLINK_A
MOV BCD_B,BLINK_B
LCALL WRITE_BLINK
MOV_RET:RET
;-------数字增加处理程序-------
KEY_INCPROG:
JNB CURSOR_1,INC_002
MOV A,YEAR_A ;光标在第“01”位
CJNE A,#09H,INC_001
LJMP INC_RET
INC_001:INC A
MOV YEAR_A,A
LJMP INC_RET
INC_002:JNB CURSOR_2,INC_004
MOV A,YEAR_B ;光标在第“02”位
CJNE A,#09H,INC_003
LJMP INC_RET
INC_003:INC A
MOV YEAR_B,A
LJMP INC_RET
INC_004:JNB CURSOR_3,INC_006
MOV A,YEAR_H ;光标在第“03”位
CJNE A,#09H,INC_005
LJMP INC_RET
INC_005:INC A
MOV YEAR_H,A
LJMP INC_RET
INC_006:JNB CURSOR_4,INC_008
MOV A,YEAR_L ;光标在第“04”位
CJNE A,#09H,INC_007
LJMP INC_RET
INC_007:INC A
MOV YEAR_L,A
LJMP INC_RET
INC_008:JNB CURSOR_5,INC_010
MOV A,MOTH_H ;光标在第“05”位
CJNE A,#09H,INC_009
LJMP INC_RET
INC_009:INC A
MOV MOTH_H,A
LJMP INC_RET
INC_010:JNB CURSOR_6,INC_012
MOV A,MOTH_L ;光标在第“06”位
CJNE A,#09H,INC_011
LJMP INC_RET
INC_011:INC A
MOV MOTH_L,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -