📄 1302-12232f.asm
字号:
;****************************************************************;
; 1302时钟程序( 用12232F显示) ;
; ;
; AT89C52/12M晶振/编写者hewende/2008.10.30 ;
; ;
;****************************************************************;
;
; 从1302中读出的数据放在 52H(小时)51H(分钟)50H(秒)
; 显示缓冲单元 72H-73H(45H-44H)小时,75H-76H(43H-42H)分钟,78H-79H(41H-40H)秒
; 定时器T1为调整时候闪烁用。
; 显示式样第一行为: 时间: 15:38:12
; 显示式样第二行为: 中文字符共7个
;*****************定义*********************;
;
SCLK EQU P3.2 ; 1302时钟口,1302第7脚
IO EQU P3.3 ; 数据口,1302第6脚
RST EQU P3.4 ; 使能EQU302第5脚
KEYSW0 EQU P1.0 ; 调时按键
KEYSW1 EQU P1.1 ; 加1按键
KEYSW2 EQU P1.2 ; 减1按键
KEYSW3 EEQU P1.3 ;定时闹钟设定
hour DATAEQUH ; 1302读出时
mintue DATA 51H ; 1302读出分
second DATA 50H ; 1302读出秒
DS1302_ADDR DATA 32H ; 1302需操作的地址数据存放
DS1302_DATA DATA 31H ; 1302读出或需写入的数据存放
INTCON DATA 30H ; 闪烁中断计时用
CON_DATA DATA 06H ; 闪烁时间=65*6=0.39秒
;************LCD定义***********************;
LAMPBLAK EQU P2.4 ;背光灯控制,=0时开,=1时关.
CS EQU P2.5 ;液晶使能,=1操作,=0禁止.
SID EQU P2.6 ;液晶串行数据输入口
CLK EQU P2.7 ;液晶EQU作时钟口
;
;*********************程序入口*********************;
;
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
LJMP INTT1
ORG 0023H
RETI
ORG 002BH
RETI
;
;*****************;主程序;*********************;
;
START:
CLR CS ;液晶操作禁止
mov SP, #80H ;堆栈在80H上
MOV 70H,#0AH ;放北京时间后的“:”代码字
MOV 71H,#0FH ;空
MOV 74H,#0AH ; ": "
MOV 77H,#0AH ; ": "
MOV TMOD,#10H ;计数器1,方式1
MOV TL1,#00H
MOV TH1,#00H
MOV INTCON,#CON_DATA
CLR 00H ;清闪烁标志
CLR 01H ;清闪烁标志
SETB EA
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302 ,#80,禁止
LCALL WRITE
MOV DS1302_ADDR,#90H
MOV DS1302_DATA,#0A6H;1302充电充电电流1.1MA;#A5:2.2MA,#A7:0.6MA
LCALL WRITE
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H ;1302晶振开始振荡;#80H,禁止
LCALL WRITE
;
LCALL SETUP ;LCD初始化
LCALL LOGON ;开机显示画面
LCALL TIME ;上行显示"时间: 00:00:00"
;以下主程序
MAIN1: MOV DS1302_ADDR,#85H ;读出小时
LCALL READ
MOV hour,DS1302_DATA
MOV DS1302_ADDR,#83H ;读出分钟
LCALL READ
MOV mintue,DS1302_DATA
MOV DS1302_ADDR,#81H ;读出秒
LCALL READ
MOV second,DS1302_DATA
;
MOV R0,hour ;小时分离,送显示缓存
LCALL DIVIDE
MOV 73H,R1 ;时个位
MOV 44H,R1
MOV 72H,R2 ;时十位
MOV 45H,R2
MOV R0,mintue ;分钟分离,送显示缓存
LCALL DIVIDE
MOV 76H,R1 ;时个位
MOV 42H,R1
MOV 75H,R2 ;时十位
MOV 43H,R2
MOV R0,second ;秒分离,送显示缓存
LCALL DIVIDE
MOV 79H,R1 ;秒个位
MOV 40H,R1
MOV 78H,R2 ;秒十位
MOV 41H,R2
LCALL TIMEUP ;显示涮新
;
JNB KEYSW0,SETG ;调整时间控制键
LJMP MAIN1
;
;******************公历设置程序*********************;
;
SETG : SETB TR1
SETB ET1
MOV 78H,#00H ;调时时秒位为0
MOV 79H,#00H ;调时时秒位为0
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#80H ;1302停止振荡
LCALL WRITE
;
SETG8: LCALL DELAY1
JNB KEYSW0,SETG8
SETG9:
JNB KEYSW0,SETG10
JNB KEYSW1,GADDHOUR
AJMP SETG9
GADDHOUR: LCALL DELAY1
JNB KEYSW1,GADDHOUR
MOV R7,52H ;小时加一
LCALL ADD1
MOV 52H,A
CJNE A,#24H,GADDHOUR11
GADDHOUR11: JC GADDHOUR1
MOV 52H,#00H
GADDHOUR1: MOV DS1302_ADDR,#84H ;小时值送人1302
MOV DS1302_DATA,52H
LCALL WRITE
MOV R0,52H
LCALL DIVIDE ;小时值分离送显示缓存
MOV 73H,R1
MOV 44H,R1
MOV 72H,R2
MOV 45H,R2
WAITT5:
JNB KEYSW1,WAITT5
AJMP SETG9
SETG10: SETB 01H ;调分时候闪标志
GWAIT10: LCALL DELAY1
JNB KEYSW0,GWAIT10
SETG11:
JNB KEYSW0,SETGOUT
JNB KEYSW1,GADDMINTUE
AJMP SETG11
GADDMINTUE: LCALL DELAY1
JNB KEYSW1,GADDMINTUE
MOV R7,51H ;分钟加一
LCALL ADD1
MOV 51H,A
CJNE A,#60H,GADDMINTUE11
GADDMINTUE11: JC GADDMINTUE1
MOV 51H,#00H
GADDMINTUE1: MOV DS1302_ADDR,#82H ;分钟值送人1302
MOV DS1302_DATA,51H
LCALL WRITE
MOV R0,51H
LCALL DIVIDE ;分钟值分离送显示缓存
MOV 76H,R1
MOV 42H,R1
MOV 75H,R2
MOV 43H,R2
WAITT6:
JNB KEYSW1,WAITT6
AJMP SETG11
SETGOUT: LCALL DELAY1
JNB KEYSW0,SETGOUT
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H ;1302晶振开始振荡
LCALL WRITE
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H ;禁止写入1302
LCALL WRITE
CLR 00H
CLR 01H
CLR ET1 ;关闪中断
CLR TR1
LJMP MAIN1
;
;****************闪动调时程序*********************;
;
INTT1: PUSH ACC
PUSH PSW
DJNZ INTCON,GFLASHOUT
MOV INTCON,#CON_DATA
GFLASH: CPL 00H
JB 00H,GFLASH5
MOV 72H,45H ;全显示
MOV 73H,44H
MOV 75H,43H
MOV 76H,42H
MOV 78H,41H
MOV 79H,40H
GFLASHOUT: LCALL TIMEUP
POP PSW
POP ACC
RETI
;
GFLASH5: JB 01H,GFLASH6 ;调小时闪
MOV 72H,#0FH
MOV 73H,#0FH
AJMP GFLASHOUT
GFLASH6: MOV 75H,#0FH ;调分钟闪
MOV 76H,#0FH
AJMP GFLASHOUT
;
;*******************加一程序***************;
;
ADD1: MOV A,R7
ADD A,#01H
DA A
RET
;
;*****************分离程序**********************;
;
DIVIDE: MOV A,R0
ANL A,#0FH
MOV R1,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV R2,A
RET
;
;****************写1302程序****************;
;
WRITE: CLR SCLK
NOP
SETB RST
NOP
MOV A,DS1302_ADDR
MOV R4,#8
WRITE1: RRC A ;送地址给1302
NOP
NOP
CLR SCLK
NOP
NOP
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R4,WRITE1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -