📄 pcf8563.txt
字号:
;**************************定义PCF8563芯片端口*****************************
SCK EQU P1.1 ;定义P1.0为I2C总线的时钟线
SDA EQU P1.0 ;定义P1.1为I2C总线的数据线
;************************定义按键位*********************
SW EQU P1.7 ;定义P1.7调整键
UP EQU P1.6 ;定义P1.6加一键
DOWN EQU P1.5 ;定义P1.5减一键
CONF EQU P1.4 ;定义P1.4键为确认键
COUNT EQU 48H ;判别选择键按的次数
;****************液晶变量声明部分*******************
E1 EQU P3.1
E2 EQU P3.5
RES EQU P3.0
RW EQU P3.6
A0 EQU P3.7
DAT EQU P2
X EQU 30H
Y EQU 31H
;******************定义PCF8563 RAM 映射地址******************
;首地址为30H
CNTRL0 EQU 30H ;定义控制/状态0数据存储地址
CNTRL1 EQU 31H ;定义控制/状态1数据存储地址
SEC EQU 32H ;定义秒初值存储地址
MIN EQU 33H ;定义分初值存储地址
HOUR EQU 34H ;定义时初值存储地址
DAY EQU 35H ;定义天初值存储地址
WEEK EQU 36H ;定义周初值存储地址
MONTH EQU 37H ;定义月初值存储地址
YEAR EQU 38H ;定义年初值存储地址
MINBJ EQU 39H ;定义分定时初值存储地址
HOURBJ EQU 3AH ;定义时定时初值存储地址
DATBJ EQU 3BH ;定义日定时初值存储地址
WEEKJ EQU 3CH ;定义星定时初值存储地址
CLOCK EQU 3DH ;定义CLOCK 输出频率初值地址
CTIMER EQU 3EH ;定义定时器控制存储地址
ITIMER EQU 3FH ;定义定时器倒计数初值存储地址
;********************定义PCF8563 数据读出缓冲地址***********************
;首地址为40H
;数据格式为BCD码
;定义读出时间、日期数据存储地址
SECBUF EQU 40H ;秒
MINBUF EQU 41H ;分
HOUBUF EQU 42H ;时
DAYBUF EQU 43H ;天
WEKBUF EQU 44H ;星期
MONBUF EQU 45H ;月
YERBUF EQU 46H ;年
;***********************定义LCD显示缓冲区地址******************
;首地址50H
YER1 EQU 50H
YER0 EQU 51H
MON1 EQU 52H
MON0 EQU 53H
DAY1 EQU 54H
DAY0 EQU 55H
WEK EQU 56H
HOU1 EQU 57H
HOU0 EQU 58H
MIN1 EQU 59H
MIN0 EQU 5AH
SEC1 EQU 5BH
SEC0 EQU 5CH
;*****************中断入口跳转部分********************
ORG 0000H ;主程序跳转入口
AJMP MAIN
ORG 000BH ;计数器T0跳转入口
AJMP TIMER0
;*****************主程序部分********************
ORG 0030H
MAIN:
;****************写入PCF8563初值***********************
LCALL LOAD8563 ;载入初值
MOV R0,#30H ;指向初值寄存器首地址
MOV R1,#00H ;初始化8563寄存器单元地址
MOV R3,#0CH ;需初始化字节数
WRDATA:
LCALL WR_PCF8563 ;向PCF8563写入初值
INC R0
INC R1
DJNZ R3,WRDATA
;******************设置PCF8563频率端口***********************
MOV CLOCK,#82H;启动32HZ脉冲
mov R0,#3DH
MOV R1,#0DH
MOV R3,#01H
LCALL WR_PCF8563 ;向PCF8563写入启动脉冲命令
;********************读取PCF8563时钟时间*************
LCALL TIMEBUF
LCALL LCDBUF
;*********************计数器T0设置*******************
MOV SP,#60H
MOV TMOD,#05H
MOV TH0,#0FFH
MOV TL0,#0E0H
SETB EA
SETB ET0
SETB TR0
;***********************液晶初始化**********************
SETB RES
LCALL INITIAL ;调用初始化
MOV COUNT,#00H
;**********************清屏*****************************
MOV 30H,#0
MOV 31H,#0
LCALL DISPLAY1
lcall delay1s
;****************** 静态显示*************
MOV DPTR, #TAB2 ;星
MOV X,#00
MOV Y,#16
MOV R3,#2
MOV A,#00H
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY6
MOV DPTR, #TAB2 ;期
MOV X,#00
MOV Y,#32
MOV R3,#2
MOV A,#01H
MOV B,#32
MUL AB
MOV R2,A
LCALL DISPLAY6
MOV DPTR, #TAB1 ;-
MOV X,#00
MOV Y,#32
MOV R3,#2
MOV A,#11
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY3
MOV DPTR, #TAB1 ;-
MOV X,#00
MOV Y,#56
MOV R3,#2
MOV A,#11
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY3
MOV DPTR, #TAB1 ;:
MOV X,#02
MOV Y,#16
MOV R3,#2
MOV A,#10
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY4
MOV DPTR, #TAB1 ;:
MOV X,#02
MOV Y,#56
MOV R3,#2
MOV A,#10
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY3
;*******************按键输入程序****************
KEY: CLR TR0
JB SW,KEY0 ;调整程序
LCALL DELAY250MS
JB SW,KEY0
INC COUNT
MOV A,COUNT
CJNE A,#8,KEYOVER
MOV COUNT,#00H
KEYOVER:
JB SW,KEY0
LJMP KEYOVER
;**********************秒钟调整程序********
KEY0: MOV A,COUNT;秒钟加1
CJNE A,#1,KEY1
JB UP,KEY00
LCALL DELAY250MS
JB UP,KEY00
INC SEC0
MOV A,SEC0
CJNE A,#10,KEY0OVER
MOV SEC0,#00H
INC SEC1
MOV A,SEC1
CJNE A,#6,KEY0OVER
MOV SEC1,#00H
LJMP KEY0OVER
KEY0OVER:
JB UP,KEY00
LJMP KEY0OVER
KEY00:
JB DOWN,KEY1;秒钟减1
LCALL DELAY250MS
JB DOWN, KEY1
MOV A,SEC0
CJNE A,#0,CCC
MOV SEC0,#9
MOV A,SEC1
CJNE A,#0,CCCC
MOV SEC1,#5
LJMP KEY00OVER
CCCC: DEC SEC1
LJMP KEY00OVER
CCC: DEC SEC0
KEY00OVER:
JB DOWN,KEY1
LJMP KEY00OVER
;*************分钟调整程序*********************
KEY1: MOV A,COUNT;分钟加1
CJNE A,#2,KEY2
JB UP,KEY11
LCALL DELAY250MS
JB UP,KEY11
INC MIN0
MOV A,MIN0
CJNE A,#10,KEY1OVER
MOV MIN0,#00H
INC MIN1
MOV A,MIN1
CJNE A,#6,KEY1OVER
MOV MIN1,#00H
LJMP KEY1OVER
KEY1OVER:JB UP,KEY11
LJMP KEY1OVER
KEY11: JB DOWN,KEY2;分钟减1
LCALL DELAY250MS
JB DOWN, KEY2
MOV A,MIN0
CJNE A,#0,AAA
MOV MIN0,#9
MOV A,MIN1
CJNE A,#0,AAAA
MOV MIN1,#5
LJMP KEY11OVER
AAAA: DEC MIN1
LJMP KEY11OVER
AAA: DEC MIN0
KEY11OVER:JB DOWN,KEY2
LJMP KEY11OVER
;***********时调整程序******************
KEY2: MOV A,COUNT;时加1
CJNE A,#3,KEY3
JB UP,KEY22
LCALL DELAY250MS
JB UP,KEY22
INC HOU0
MOV A,HOU1
CJNE A,#2,HOURS
MOV A,HOU0
CJNE A,#4,KEY2OVER
MOV HOU0,#00H
MOV HOU1,#00H
LJMP KEY2OVER
HOURS: MOV A,HOU0
CJNE A,#10,KEY2OVER
MOV HOU0,#00H
INC HOU1
KEY2OVER:JB UP,KEY22
LJMP KEY2OVER
KEY22: JB DOWN,KEY3;时钟减1
LCALL DELAY250MS
JB DOWN, KEY3
MOV A,HOU0
CJNE A,#0,H4
MOV A,HOU1
CJNE A,#0,H5
MOV HOU0,#3
MOV HOU1,#2
LJMP KEY22OVER
H5: MOV HOU0,#9
DEC HOU1
LJMP KEY22OVER
H4: DEC HOU0
KEY22OVER:JB DOWN,KEY3
LJMP KEY22OVER
;************星期调整程序****************
KEY3: MOV A,COUNT;星期加1
CJNE A,#4,KEY4
JB UP,KEY33
LCALL DELAY250MS
JB UP,KEY33
INC WEK
MOV A,WEK
CJNE A,#7,KEY3OVER
MOV WEK,#00H
KEY3OVER:JB UP,KEY33
LJMP KEY3OVER
KEY33: JB DOWN,KEY4;星期减1
LCALL DELAY250MS
JB DOWN, KEY4
MOV A,WEK
CJNE A,#0,A2
MOV WEK,#6
LJMP KEY33OVER
A2: DEC WEK
KEY33OVER:JB DOWN,KEY4
LJMP KEY33OVER
;*******************日调整*****************
KEY4: MOV A,COUNT;日加1
CJNE A,#5,KEY5
JB UP,KEY44
LCALL DELAY250MS
JB UP,KEY44
INC DAY0
MOV A,DAY1
CJNE A,#3,DAYY
MOV A,DAY0
CJNE A,#2,KEY4OVER
MOV DAY0,#1
MOV DAY1,#00H
LJMP KEY4OVER
DAYY: MOV A,DAY0
CJNE A,#10,KEY4OVER
MOV DAY0,#00H
INC DAY1
KEY4OVER:JB UP,KEY44
LJMP KEY4OVER
KEY44: JB DOWN,KEY5;日减1
LCALL DELAY250MS
JB DOWN,KEY5
MOV A,DAY0
CJNE A,#0,D4
MOV A,DAY1
CJNE A,#0,D0
MOV DAY0,#1
MOV DAY1,#3
LJMP KEY44OVER
D0: MOV DAY0,#9
DEC DAY1
LJMP KEY44OVER
D4: DEC DAY0
KEY44OVER:JB DOWN,KEY5
LJMP KEY44OVER
;**************月调整程序*******************
KEY5: MOV A,COUNT;月加1
CJNE A,#6,KEY6
JB UP,KEY55
LCALL DELAY250MS
JB UP,KEY55
INC MON0
MOV A,MON1
CJNE A,#1,MUNTCOUNT
MOV A,MON0
CJNE A,#3,KEY5OVER
MOV MON0,#1
MOV MON1,#00H
LJMP KEY5OVER
MUNTCOUNT: MOV A,MON0
CJNE A,#10,KEY5OVER
MOV MON0,#00H
INC MON1
KEY5OVER:JB UP,KEY55
LJMP KEY5OVER
KEY55: JB DOWN,KEY6;月减1
LCALL DELAY250MS
JB DOWN, KEY6
MOV A,MON0
CJNE A,#0,M2
MOV A,MON1
CJNE A,#0,M3
MOV MON0,#2
MOV MON1,#1
LJMP KEY55OVER
M3: MOV MON0,#9
DEC MON1
LJMP KEY55OVER
M2: DEC MON0
KEY55OVER:JB DOWN,KEY6
LJMP KEY55OVER
;****************年调整程序*******************
KEY6: MOV A,COUNT;年加1
CJNE A,#7,KEY7
JB UP,KEY66
LCALL DELAY250MS
JB UP,KEY66
INC YER0
MOV A,YER0
CJNE A,#10,KEY6OVER
MOV YER0,#00H
INC YER1
MOV A,YER1
CJNE A,#10,KEY66OVER
MOV YER1,#00H
KEY6OVER:JB UP,KEY66
LJMP KEY6OVER
KEY66: JB DOWN,KEY7;年减1
LCALL DELAY250MS
JB DOWN, KEY7
MOV A,YER0
CJNE A,#0,Y3
MOV YER0,#9
MOV A,YER1
CJNE A,#0,Y4
MOV YER1,#9
LJMP KEY66OVER
Y4: DEC YER1
LJMP KEY66OVER
Y3: DEC YER0
KEY66OVER:JB DOWN,KEY7
LJMP KEY66OVER
;**************************确认键*********************
KEY7:
JB CONF,KEY77
LCALL DELAY250MS
JB CONF,KEY77
LCALL PCF8563BUF
LCALL TIMEBUF
LCALL LCDBUF
KEY77: SETB TR0
LCALL DISPLAY
KEY7OVER: LJMP KEY
;****************计数中断T0响应*******************
TIMER0:
PUSH ACC;中断程序
PUSH PSW
MOV TH0,#0FFH
MOV TL0,#0E0H
INC SEC0
MOV A,SEC0
CJNE A,#10,LOOP1
MOV SEC0,#00H
INC SEC1
MOV A,SEC1
CJNE A,#6,LOOP1
MOV SEC1,#00H
INC MIN0
MOV A,MIN0
CJNE A,#10,LOOP1
MOV MIN0,#00H
INC MIN1
MOV A,MIN1
CJNE A,#6,LOOP1
MOV MIN1,#00H
INC HOU0
MOV A,HOU1
CJNE A,#2,HOUR1
MOV A,HOU0
CJNE A,#4,LOOP1
MOV HOU1,#00H
MOV HOU0,#00H
INC WEK
MOV A,WEK
CJNE A,#07,DAY89
MOV WEK,#00H
DAY89:
INC DAY0 ;天加一
MOV A,MON1
CJNE A,#0,ZZ1
MOV A,MON0
CJNE A,#1,MUNTH2
DMUNTH: ; 大月31天
MOV A,DAY1
CJNE A,#3,ZZ3
MOV A,DAY0
CJNE A,#2,LOOP1
MOV DAY1,#0
MOV DAY0,#1
LJMP MUNTHADD
LOOP1: LJMP TIMER0END
HOUR1: MOV A,HOU0
CJNE A,#10,LOOP1
MOV HOU0,#00h
INC HOU1
LJMP TIMER0END
ZZ3:
MOV A,DAY0
CJNE A,#10,LOOP1
MOV DAY0,#0
INC DAY1
LJMP TIMER0END
MUNTH2: ;二月
CJNE A,#2,MUNTH3
MOV A,YER1
MOV B,#10
MUL AB
ADD A,YER0
MOV B,#4
DIV AB
MOV A,B
JZ YUNNIAN
MOV A,DAY1
CJNE A,#2,ZZ4
MOV A,DAY0
CJNE A,#9,LOOP1
MOV DAY1,#0
MOV DAY0,#1
INC MON0
MUNTH3: ;三月
CJNE A,#3,MUNTH4
LJMP DMUNTH
ZZ1: MOV A,MON0
CJNE A,#0,MUNTH11
LJMP DMUNTH
MUNTH4: CJNE A,#4,MUNTH5 ;四月
SMUNTH: MOV A,DAY1 ;小月30天
CJNE A,#3,ZZZ3
MOV A,DAY0
CJNE A,#1,LOOP1
MOV DAY1,#0
MOV DAY0,#1
LJMP MUNTHADD
ZZZ3:
MOV A,DAY0
CJNE A,#10,LOOP1
MOV DAY0,#0
INC DAY1
LJMP TIMER0END
YUNNIAN: ;闰年
MOV A,DAY1
CJNE A,#2,ZZ4
MOV A,DAY0
CJNE A,#10,LOOP1
MOV DAY1,#0
MOV DAY0,#1
LJMP MUNTHADD
ZZ4: MOV A,DAY0
CJNE A,#10,TIMER0END
INC DAY1
MOV DAY0,#0
LJMP LOOP1
MUNTH5:CJNE A,#5,MUNTH6 ;五月
LJMP DMUNTH
MUNTH6:CJNE A,#6,MUNTH7 ;六月
LJMP SMUNTH
MUNTH7:CJNE A,#7,MUNTH8 ;七月
LJMP DMUNTH
MUNTH8:CJNE A,#8,MUNTH9 ;八月
LJMP DMUNTH
MUNTH9:CJNE A,#9,ZZ1 ;九月
LJMP SMUNTH
MUNTH11:CJNE A,#1,MUNTH12 ;十一月
LJMP SMUNTH
MUNTH12:LJMP DMUNTH ;十二月
MUNTHADD:
INC MON0
MOV A,MON1
CJNE A,#0,ZZ6
MOV A,MON0
CJNE A,#10,TIMER0END
INC MON1
MOV MON0,#0
LJMP TIMER0END
ZZ6: MOV A,MON0
CJNE A,#3,TIMER0END
MOV MON0,#1
MOV MON1,#0
INC YER0
MOV A,YER0
CJNE A,#10,TIMER0END
MOV YER0,#0
INC YER1
TIMER0END:
POP PSW
POP ACC
RETI
;****************液晶显示*******************
DISPLAY:
; SETB TR0
MOV DPTR, #TAB1
MOV X,#2
MOV Y,#32
MOV R3,#2
MOV A,SEC0
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY4
MOV DPTR, #TAB1
MOV X,#2
MOV Y,#24
MOV R3,#2
MOV A,SEC1
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY4
MOV DPTR, #TAB1
MOV X,#2
MOV Y,#08
MOV R3,#2
MOV A,MIN0
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY4
MOV DPTR, #TAB1
MOV X,#2
MOV Y,#00
MOV R3,#2
MOV A,MIN1
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY4
MOV DPTR, #TAB1
MOV X,#2
MOV Y,#48
MOV R3,#2
MOV A,HOU0
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY3
MOV DPTR, #TAB1
MOV X,#2
MOV Y,#40
MOV R3,#2
MOV A,HOU1
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY3
MOV DPTR, #TAB1
MOV X,#0
MOV Y,#48
MOV R3,#2
MOV A,WEK
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY4
MOV DPTR, #TAB1
MOV X,#0
MOV Y,#08
MOV R3,#2
MOV A,DAY0
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY4
MOV DPTR, #TAB1
MOV X,#0
MOV Y,#00
MOV R3,#2
MOV A,DAY1
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY4
MOV DPTR, #TAB1
MOV X,#0
MOV Y,#48
MOV R3,#2
MOV A,MON0
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY3
MOV DPTR, #TAB1
MOV X,#0
MOV Y,#40
MOV R3,#2
MOV A,MON1
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY3
MOV DPTR, #TAB1
MOV X,#0
MOV Y,#24
MOV R3,#2
MOV A,YER0
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY3
MOV DPTR, #TAB1
MOV X,#0
MOV Y,#16
MOV R3,#2
MOV A,YER1
MOV B,#16
MUL AB
MOV R2,A
LCALL DISPLAY3
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -