;*****************************************************
;ds1302 引脚定义
;年月日等内存分配
EQU P3.5
SCLK
EQU P3.6
IO
EQU P3.7
RST
DATA 76H
year
week
DATA 75H
month DATA 74H
DATA 73H
day
hour
DATA 72H
mintue DATA 71H
second DATA 70H
RMINUTE DATA 77H
RHOUR DATA 78H
;1602 控制引脚定义
RS EQU P1.0
RW EQU P1.1
E EQU P1.2
;*****************************************************
SETRING EQU P2.6
RING_KEY EQU P2.7
YEARKEY EQU P2.5
MONTHKEY EQU P2.4
DAYKEY EQU P2.3
WEEKKEY EQU P2.2
HOURKEY EQU P2.1
MINUTEKEY EQU P2.0
;***************************************************
ORG 0000H
LJMP START
org 0030h
START:
MOV RMINUTE,#06H
MOV R7,RMINUTE
LCALL DIVIDE
MOV 6FH,R3
MOV 6EH,R2
MOV RHOUR,#17H
MOV R7,RHOUR
LCALL DIVIDE
MOV 6CH,R3
MOV 6BH,R2
MOV SP,#90H
ACALL LCDINT
ACALL DS1302INT
;堆栈设置
;1602 初始化
;1302 初始化
;1302 充电
MOV 32H,#90H
MOV 31H,#0A5H
ACALL WR1302
;固定显示区
MOV 50H,#02H
MOV 51H,#00H
MOV 54H,#0FDH
MOV 57H,#0FDH
MOV 5AH,#0F0H
MOV 5BH,#27H
MOV 5CH,#35H
MOV 5DH,#35H
MOV 5EH,#3BH
MOV 62H,#0AH
MOV 65H,#0AH
MOV 68H,#0F0H
MOV 69H,#0F0H
MOV 6AH,#0F0H
MOV 6DH,#0AH
;年份"2011"中的"2"
;年份"2011"中的"0"
;FDH+30H=2DH 为字符"-"
; "-"
;F0H+30H=20H 为字符空格" "
;"W"
;"e"
;"e"
;":"
;":"
;"k"
;" "
;" "
;" "
XX1:
JB RING_KEY,WS
LCALL ALARM
WS:JNB RING_KEY,WB
SETB P1.7
WB:LCALL KEY1
LCALL KEY2
LCALL KEY3
LCALL KEY4
LCALL KEY5
LCALL KEY6
LCALL DS1302
LCALL DISP1602
SJMP XX1
KEY1:
JB MINUTEKEY,Y1
NOP
NOP
NOP
JNB MINUTEKEY,$
LCALL JUDGE
LCALL MINSETKEYTEST
LCALL OUTTOMAIN1
Y1:RET
;关 DS1302,进入时间调整;
;返回主界面
KEY2:
JB HOURKEY,Y2
NOP
NOP
NOP
JNB HOURKEY,$
LCALL JUDGE
LCALL HRSETKEYTEST
LCALL OUTTOMAIN2
;返回主界面
Y2:RET
KEY3:
JB WEEKKEY,Y3
NOP
NOP
NOP
JNB WEEKKEY,$
LCALL JUDGE
LCALL WEEKSETKEYTEST
LCALL OUTTOMAIN3
Y3:RET
KEY4:
JB DAYKEY,Y4
NOP
NOP
NOP
JNB DAYKEY,$
LCALL JUDGE
LCALL DATSETKEYTEST
LCALL OUTTOMAIN4
Y4:RET
KEY5:
JB MONTHKEY,Y5
NOP
NOP
NOP
JNB MONTHKEY,$
LCALL JUDGE
LCALL MONSETKEYTEST
LCALL OUTTOMAIN5
Y5:RET
KEY6:
JB YEARKEY,Y6
NOP
NOP
NOP
JNB YEARKEY,$
LCALL JUDGE
LCALL YEARSETKEYTEST
LCALL OUTTOMAIN6
Y6:RET
;返回主界面子程序
OUTTOMAIN1:
MOV R0,#82H ;更新 DS1302 日期信息寄存器
MOV R1,#71H ;R0=82H,为写分命令字,R1=71H,为分的存储地址
MOV 32H,R0
MOV 31H,@R1
ACALL WR1302
MOV 32H,#80H ;开 ds1302
MOV 31H,#00H
ACALL WR1302
RET
;调写 1302 程序,完成更新
OUTTOMAIN2:
MOV R0,#84H
MOV R1,#72H
MOV 32H,R0
MOV 31H,@R1
ACALL WR1302
MOV 32H,#80H
MOV 31H,#00H
ACALL WR1302
RET
OUTTOMAIN3:
MOV R0,#8AH
MOV R1,#75H
MOV 32H,R0
MOV 31H,@R1
ACALL WR1302
MOV 32H,#80H
MOV 31H,#00H
ACALL WR1302
RET
OUTTOMAIN4:
MOV R0,#86H
MOV R1,#73H
MOV 32H,R0
MOV 31H,@R1
ACALL WR1302
MOV 32H,#80H
MOV 31H,#00H
ACALL WR1302
RET
OUTTOMAIN5:
MOV R0,#88H
MOV R1,#74H
MOV 32H,R0
MOV 31H,@R1
ACALL WR1302
MOV 32H,#80H
MOV 31H,#00H
ACALL WR1302
RET
OUTTOMAIN6:
MOV R0,#8CH
MOV R1,#76H
MOV 32H,R0
MOV 31H,@R1
ACALL WR1302
MOV 32H,#80H
MOV 31H,#00H
ACALL WR1302
RET
JUDGE:
MOV 32H,#80H
MOV 31H,#80H
ACALL WR1302
RET
;关 ds1302
;分钟调整按键检测程序
MINSETKEYTEST:
JNB SETRING,ZM
MOV A,#09H
CJNE A,64H,MINSET2 ;不为 9,转 MINSET2,分钟直接加一
MOV A,#05H
CJNE A,63H,MINSET3 ;不为 5,转 MINSET3
MOV mintue,#00H
AJMP MINSET4
;为 9,再判断十位是否为 5?
;个位先判断是否为 9?
;为 5,将分钟置为 0
;个位为 9,十位不为 5,则将分钟先加六
;进入 MINSET2 后再加一,即共加七
MINSET3:
MOV A,#06H
ADD A,mintue
MOV mintue,A
MINSET2:
INC mintue
MINSET4:
;分钟分离,送显示缓存 更新分钟
MOV R7,mintue
ACALL DIVIDE
MOV 64H,R3
MOV 63H,R2
ZM1: RET
ZM:
;个位先判断是否为 9?
MOV A,#09H
CJNE A,6FH,RMINSET2 ;不为 9,转 RMINSET2,分钟直接加一
MOV A,#05H
CJNE A,6EH,RMINSET3 ;不为 5,转 RMINSET3
;为 5,将分钟置为 0
MOV RMINUTE,#00H
AJMP RMINSET4
;为 9,再判断十位是否为 5?
;个位为 9,十位不为 5,则将分钟先加六
;进入 RMINSET2 后再加一,即共加七
RMINSET3:
MOV A,#06H
ADD A,RMINUTE
MOV RMINUTE,A
RMINSET2:
INC RMINUTE
RMINSET4:
MOV R7,RMINUTE
ACALL DIVIDE
MOV 6FH,R3
MOV 6EH,R2
AJMP ZM1
;小时设置按键检测程序
HRSETKEYTEST:
JNB SETRING,ZM2
MOV A,#09H
CJNE A,61H,HRSET0
MOV A,#06H
ADD A,hour
MOV hour,A
LJMP HRSET2
HRSET0:
MOV A,#03H
CJNE A,61H,HRSET2
MOV A,#02H
CJNE A,60H,HRSET2
MOV hour,#00H
AJMP HRSET4
HRSET2:
INC hour
HRSET4:
MOV R7,hour
;分离,送显示缓存 更新
LCALL DIVIDE
MOV 61H,R3
MOV 60H,R2
ZM3: RET
ZM2:
MOV A,#09H
CJNE A,6CH,RHRSET0
MOV A,#06H
ADD A,Rhour
MOV Rhour,A
LJMP RHRSET2
RHRSET0:
MOV A,#03H
CJNE A,6CH,RHRSET2
MOV A,#02H
CJNE A,6BH,RHRSET2
MOV Rhour,#00H
AJMP RHRSET4
RHRSET2:
INC rhour
RHRSET4:
MOV R7,RHOUR
LCALL DIVIDE
MOV 6CH,R3
MOV 6BH,R2
AJMP ZM3
;周设置按键检测程序
WEEKSETKEYTEST:
MOV A,#07H
CJNE A,5FH,WEEKSET2
MOV week,#01H
AJMP WEEKSET3
WEEKSET2:
INC week
WEEKSET3:
MOV 5FH,week
RET
;日设置按键检测程序
DATSETKEYTEST:
MOV A,#09H
CJNE A,59H,DATSET2
MOV A,#06H
ADD A,day
MOV day,A
AJMP DATSET3
DATSET2:
MOV A,#01H
CJNE A,59H,DATSET3
MOV A,#03H
CJNE A,58H,DATSET3
MOV day,#01H
AJMP DATSET4
DATSET3:
INC day
DATSET4:
MOV R7,day
LCALL DIVIDE
MOV 59H,R3
MOV 58H,R2
RET
;日分离,送显示缓存
;月设置按键检测程序
MONSETKEYTEST:
MOV A,#09H
CJNE A,56H,MONSET2
MOV A,#07H
ADD A,month
MOV month,A
LJMP MONSET4
MONSET2:
MOV A,#02H
CJNE A,56H,MONSET3
MOV A,#01H
CJNE A,55H,MONSET3
MOV month,#01H
AJMP MONSET4
MONSET3:
INC month
MONSET4:
MOV R7,month
LCALL DIVIDE
MOV 56H,R3
MOV 55H,R2
RET
;月分离,送显示缓存
;年设置按键检测程序
YEARSETKEYTEST:
MOV A,#09H
CJNE A,53H,YEARSET2
MOV A,#09H