一个电子钟的程序.docx
- 文档编号:24345301
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:29
- 大小:21.53KB
一个电子钟的程序.docx
《一个电子钟的程序.docx》由会员分享,可在线阅读,更多相关《一个电子钟的程序.docx(29页珍藏版)》请在冰豆网上搜索。
一个电子钟的程序
一个电子钟的程序
文章长度[35276] 更新时间[] 文章分级[80] [评论] [收藏]
;r2=0是常规模式,1是校时模式,2是定时设置模式,3是误差校正模式
;r5表示当前操作数,校时时12345678分别表示时分秒年月日星期12345和67,
;r5表示当前操作数,定时时时表示路数,分表示时,秒表示分,8路只有一路亮,年表示自动关断是分还是秒,月日表示自动关断时间
;r3表示当前扫描led的路数
;60h-66h保存当前时间,30-3b保存6个数码管的显示值,40h-4fh保存8路倒计时时间,位10h-1fh表示自动关和倒计时单位。
;p0.0-0.6显示星期几。
3cH-3dH分别保存上一次的分和秒,检查到分和秒不同时,对倒计时数进行减时,位3ch-3dh表示减过
;定时记录格式顺序@00h-@01H保存定时时间,@02H保存有效的星期和延时的单位,@03H-@04H保存延时的时间,@04保存第几路
;3FH保存误差误正的秒数0-25秒,每天最大修正为正负25秒,位3FH表示加强和减慢时间,3eH表示校正过。
;3eH保存当前定时的路数,2a/2b/2c/2d/2e保存定时时间/延时单位(2cH的位7)/星期/延时时间;
sclkbitp2.0
io bitp2.1
rst bitp3.7
psw5bit0d5H
secdata60H
mindata61H
Hrdata62H
datedata63H
montHdata64H
daYdata65H
Yeardata66H
org00h
clrrst
jmpsta1
org01bh
jmpt1int
sta1:
movtmod,#00100010b;t1工作方式
mov7ch,#10
movth1,#100
setbtr1
setbet1
setbea
setb54h
mov40h,#2;年初置数
mov41h,#0;年初置数
movr5,#0;校时当前数
mov3fh,#22;误差校正时间
mov7ch,#10
;lcallinit
mov3eh,#0
mov2ah,#00010001b
mov2bh,#00110100b
mov2ch,#11010101b
mov2dh,#01010110b
mov2eh,#01111000b
mov8eh,#0 ;允许使用内部扩展的ram
callreadfsh
movr0,#255
movxa,@r0
mov3fh,a ;误差校正数据
movr0,#254
movxa,@r0
mov27h,a ;保存了误差校正数据
movr0,#253 ;保存初始化数据;新机必须初始化数据
movxa,@r0
cjnea,#51,clrs
jmpstart
clrs:
callclearam
start:
jb00h,$
setb00h
cjner2,#0,main0;54h确定是正常走时,还是校时,校时时时间不要走动
movr0,#sec
movr7,#7
setbpsw5
movp2,#0ffh
lcallrwrtc
mova,60h
cjnea,3ch,secbt
jmpsecbt0 ;秒和上次的秒是相同的,跳到检查分
secbt:
mov3ch,60h
clr3ch ;新的一秒到来了,通知倒计时减秒
secbt0:
mova,61h
cjnea,3dh,minbt
jmpminbt0 ;分和上次的分是相同的,跳到正常主程序
minbt:
mov3dh,61h
clr3dh ;新的一分钟到来了,通知倒计时减分
minbt0:
mova,62h ;检查当前小时3点时准备误差校正,4点00分30秒时实施误差校正工作,这时秒会有大幅的跳动
cjnea,#3,wcjz
clr3eh ;准许误差校正
wcjz:
cjnea,#4,main0
jb3eh,main0 ;误差已经校正过就跳过
mova,61h
cjnea,#0,main0
mova,60h
cjnea,#00110000b,main0;为什么选在30秒校正误差?
因为30正负25后都是一个合法的秒数,并且不产生进位和借位,程序比较好写
setb3eh ;误差已经校正过,以防一天校正多次(输入负数后会再次进入30秒进入死循环)
jnb3fh,wcjz1 ;看误差校正是加秒还是减秒
mova,#30
subba,3fh
daa
jmpwcjz2
wcjz1:
mova,#30
adda,3fh
daa
wcjz2:
inca
deca
daa
mov60h,a
mov5eh,#10001110b;解锁,保证字节可以写入
mov5fh,#00000000b
callsave
mov5eh,#10000000b
mov5fh,60h
callsave
mov5eh,#10001110b;写锁,防止字节补修改
mov5fh,#10000000b
callsave
main0:
calldisp1
calljs
callhled
djnz67h,mhled
mov67h,#50
callkey ;主循环50次后才执行一次键盘扫描程序,起到键盘消抖动效果
mhled:
callhleda
mend:
jmp start
t1int:
pushacc
pushpsw
movtl1,#018h
movth1,#0fch
soud:
;jb59h,send;59h是禁止发声标志;5a、5b是声音响的时间长短
mova,5ah
cjnea,#0,yyyy
setbp0.7
jmpsend
yyyy:
cplp0.7
djnz5bh,send
mov5bh,#126
dec5ah
send:
djnz7eh,t1end
mov7eh,#20
cpl00h
tend1:
djnz7fh,t1end
mov7fh,#100
cpl01h
jb01h,t1end
cpl02h
t1end:
poppsw
popacc
reti
key:
movr7,#0 ;按键值先清零
orlp3,#01111111b
anlp3,#11111000b
mova,p3
orlp3,#01111111b
anlp3,#10000111b
orla,p3
orla,#10000000b
ky0:
cjnea,#11110101b,ky1
movr7,#1
ky1:
cjnea,#11101101b,ky2
movr7,#2
ky2:
cjnea,#11011101b,ky3
movr7,#3
ky3:
cjnea,#10111101b,ky4
movr7,#4
ky4:
cjnea,#11110110b,ky5
movr7,#5
ky5:
cjnea,#11101110b,ky6
movr7,#6
ky6:
cjnea,#11011110b,ky7
movr7,#7
ky7:
cjnea,#10111110b,ky8
movr7,#8
djnz29h,ky8
mov29h,#1
; cjner5,#1,ky8
cjner2,#2,ky8
mov5ah,#4
pushacc
mov52h,r7
callsaveds
dec3eh
movr6,3eh
cjner6,#0,dssz1a0
mov3eh,#42
dssz1a0:
callreadds
movr7,52h
popacc
;clr04h
ky8:
cjne a,#11110011b,ky9
movr7,#9
djnz29h,ky9
mov29h,#1
mov5ah,#4
clr03h ;让闪动的数加1
clr04h
ky9:
cjne a,#11101011b,ky10
movr7,#10
ky10:
cjnea,#11011011b,ky11
movr7,#11
ky11:
cjnea,#10111011b,ky12
movr7,#12
ky12:
cjner7,#0,kk9;有没有键按下,无键按下退出
jmprun
kk9:
mov55h,r7;存下按键值
clr04h;表示run可以执行
rend:
ret
run:
jb04h,rend
movr7,55h
run0:
cjner7,#1,run1
cpl78h
mov5ah,#4
setb04h
run1:
cjner7,#2,run2
cpl79h
mov5ah,#4
setb04h
run2:
cjner7,#3,run3
cpl7ah
mov5ah,#4
setb04h
run3:
cjner7,#4,run4
cpl7bh
mov5ah,#4
setb04h
run4:
cjner7,#5,run5
cpl7ch
mov5ah,#4
setb04h
run5:
cjner7,#6,run6
cpl7dh
mov5ah,#4
setb04h
run6:
cjner7,#7,run7
cpl7eh
mov5ah,#4
setb04h
run7:
cjner7,#8,run8
cpl7fh
mov5ah,#4
setb04h
run8:
cjner7,#9,run9
mov5ah,#4
setb04h
clr03h ;让闪动的数加1
run9:
cjner7,#10,run10
mov5ah,#4
setb04h
decr5
cjner5,#0,run10
movr5,5dh
decr5
run10:
cjner7,#11,run11
mov5ah,#4
setb04h
incr5
mova,r5
cjnea,5dh,run11
movr5,#1
run11:
cjner7,#12,rrend
incr2
cjner2,#4,ms1
movr2,#0
ms1:
cjner2,#0,ms2;常规走时模式
mov5eh,#10001110b;写锁,防止字节补修改
mov5fh,#10000000b
callsave
movr5,#0
callsavefsh ;保存全部到FlasH
callreadfsh ;保存全部到FlasH
ms2:
cjner2,#1,ms3;时间设置模式
mov5eh,#10001110b;解锁,保证字节可以写入
mov5fh,#00000000b
callsave
movr5,#4
mov5dh,#8
ms3:
cjner2,#2,ms4;定时设置模式
movr5,#1
mov5dh,#10
mov3eh,#1
callreadds
ms4:
cjner2,#3,ms5;误差校正模式
movr5,#1
mov5dh,#3
ms5:
mov5ah,#4
setb04h
rrend:
mov29h,#5;长按键时间
ret
js:
mova,60h
anla,#00001111b
mov30h,a
mova,60h
swapa
anla,#00001111b
mov31h,a
mova,61h
anla,#00001111b
mov32h,a
mova,61h
swapa
anla,#00001111b
mov33h,a
mova,62h
anla,#00001111b
mov34h,a
mova,62h
swapa
anla,#00001111b
mov35h,a
mova,63h
anla,#00001111b
mov36h,a
mova,63h
swapa
anla,#00001111b
mov37h,a
mova,64h
anla,#00001111b
mov38h,a
mova,64h
swapa
anla,#00001111b
mov39h,a
mova,66h
anla,#00001111b
mov3ah,a
mova,66h
swapa
anla,#00001111b
mov3bh,a
orlp0,#01111111b
mova,65h
xq0:
cjnea,#1,xq1
clrp0.6
xq1:
cjnea,#2,xq2
clrp0.5
xq2:
cjnea,#3,xq3
clrp0.4
xq3:
cjnea,#4,xq4
clrp0.3
xq4:
cjnea,#5,xq5
clrp0.2
xq5:
cjnea,#6,xq6
clrp0.1
xq6:
cjnea,#7,js1
clrp0.0
js1:
cjner2,#2,js2 ;下面显示定时设置模式的显示数据,3eH是当前路数
mova,3eh
movb,#10
divab
mov34h,b
mov35h,a
mova,2ah
anla,#00001111b
mov32h,a
mova,2ah
swapa
anla,#00001111b
mov33h,a
mova,2bh
anla,#00001111b
mov30h,a
mova,2bh
swapa
anla,#00001111b
mov31h,a
mov3ah,#18;
mov3bh,#18;
mova,2dh
anla,#00001111b
mov38h,a
mova,2dh
swapa
anla,#00001111b
mov39h,a
mova,2eh
anla,#00001111b
mov36h,a
mova,2eh
swapa
anla,#00001111b
mov37h,a
anlp0,#10000000b
mova,2ch
anla,#01111111b
orlp0,a
movp1,2fh
mov2ch,a
rlca
mov10h,c
mov11h,c
mov12h,c
mov13h,c
mov14h,c
mov15h,c
mov16h,c
mov17h,c
xq27:
xq28:
js2:
cjner2,#3,js3 ;下面显示误差校正模式的显示数据,位3fH是加或者减,3fH是误差修正值,在0-28之间
jb3fh,js30
mov30h,#19
mov31h,#19
mov32h,#19
mov33h,#19
mov34h,#19
mov35h,#19
jmpjs31
js30:
mov30h,#18
mov31h,#18
mov32h,#18
mov33h,#18
mov34h,#18
mov35h,#18
js31:
mova,3fh
movb,#10
divab
mov36h,b
mov38h,b
mov3ah,b
mov37h,a
mov39h,a
mov3bh,a
js3:
ret
hled:
jb01h,hd ;根据01的状态让数码管闪动
ret
hd:
cjner2,#1,hd8 ;校时模式的数码管闪动状态
hd0:
cjner5,#1,hd1
mov35h,#17
mov34h,#17
hd1:
cjner5,#2,hd2
mov33h,#17
mov32h,#17
hd2:
cjner5,#3,hd3
mov31h,#17
mov30h,#17
hd3:
cjner5,#4,hd4
mov3bh,#17
mov3ah,#17
hd4:
cjner5,#5,hd5
mov39h,#17
mov38h,#17
hd5:
cjner5,#6,hd6
mov37h,#17
mov36h,#17
hd6:
cjner5,#7,hd7
movp0,#11111111b
hd7:
hd8:
cjner2,#2,hd18 ;定时模式的数码管闪动
hd10:
cjner5,#1,hd11
mov35h,#17
mov34h,#17
hd11:
cjner5,#2,hd12
mov33h,#17
mov32h,#17
hd12:
cjner5,#3,hd13
mov31h,#17
mov30h,#17
hd13:
cjner5,#4,hd14
mov3bh,#17
mov3ah,#17
hd14:
cjner5,#5,hd15
mov39h,#17
mov38h,#17
hd15:
cjner5,#6,hd16
mov37h,#17
mov36h,#17
hd16:
movr6,#100
cjner5,#7,hd17
cplp0.6
cplp0.5
cplp0.4
djnzr6,$
cplp0.6
cplp0.5
cplp0.4
hd17:
cjner5,#8,hd17a
cplp0.2
cplp0.3
djnzr6,$
cplp0.2
cplp0.3
hd17a:
cjner5,#9,hd17b
cplp0.1
cplp0.0
djnzr6,$
cplp0.1
cplp0.0
hd17b:
cjner5,#10,hd18
hd18:
cjner2,#3,hd28 ;误差校正模式的闪动情况
hd20:
cjner5,#1,hd21
mov35h,#17
mov34h,#17
mov33h,#17
mov32h,#17
mov31h,#17
mov30h,#17
hd21:
cjner5,#2,hd22
mov3bh,#17
mov3ah,#17
mov39h,#17
mov38h,#17
mov37h,#17
mov36h,#17
hd22:
hd23:
hd28:
ret
hleda:
jb03h,hdend;根据加1键和当前状态来确定对那个数计数和保存
setb03h
jmpsav0
hdend:
ret
sav0:
cjner2,#1,sav1a;执行校时模式的修改和保存
jmphd0a
sav1a:
jmpsav1
hd0a:
cjner5,#3,hd1a
inc60h
mova,60h
daa
mov60h,a
cjnea,#01100000b,hd1aa
mov60h,#0
hd1aa:
mov5eh,#10000000b
mov5fh,60h
callsave
hd1a:
cjner5,#2,hd2a
inc61h
mova,61h
daa
mov61h,a
cjnea,#01100000b,hd2aa
mov61h,#0
hd2aa:
mov5eh,#10000010b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一个 电子钟 程序