电脑时钟Word格式.docx
《电脑时钟Word格式.docx》由会员分享,可在线阅读,更多相关《电脑时钟Word格式.docx(18页珍藏版)》请在冰点文库上搜索。
SECEQU27H
MINEQU28H
HOUREQU29H
ASECEQU2AH
AMINEQU2BH
AHOUREQU2CH
SAFEEQU2DH;
暂存A等特殊寄存器的值,保护作用
KEYEQU2EH;
键值寄存器
ENEQU2FH;
时钟显示使能
CLOSEEQU30H;
关闭定时闹铃使能
TSEQU31H;
调时间使能
MAIN:
MOVSP,#32H
ACALLINIT;
缓冲区初始化
ACALLPT0M0;
T0初始化
L1:
ACALLKEYI;
调用按键子程序
ACALLDEAL;
调用按键处理程序
ACALLFUNC;
调用按键功能判断程序
AJMPL1
RET
***************
T0初始化
****************
PT0M0:
MOVTMOD,#01H;
T0,方式1
MOVTL0,#0B0H
MOVTL1,#3CH
SETBTR0
SETBET0
SETBEA
;
***************
计时、闹钟、显示缓冲区初始化
使能功能初始化
显示缓冲区初始化
INIT:
MOVDISP0,#00H
MOVDISP1,#05H
MOVDISP2,#09H
MOVDISP3,#05H
MOVDISP4,#03H
MOVDISP5,#02H
计时缓冲区初始化
MOVMSEC,#00H;
压缩BCD码
MOVSEC,#50H;
方便检测,设时间23:
59:
50
MOVMIN,#59H
MOVHOUR,#23H
闹钟缓存区
MOVASEC,#56H;
MOVAMIN,#34H
MOVAHOUR,#12H
使能初始化
MOVEN,#01H;
1:
显示缓存区给时钟用0:
显示缓存区给闹钟定时用
SETBP1.1;
关闭闹铃
MOVCLOSE,#00H;
关闭定时闹铃功能
MOVTS,#00H;
关闭调时
RET
****************************
动态显示程序
注意:
内部程序,只让键盘之程序调用
DIR:
MOVR0,#DISP0;
显示缓冲区,第一个地址
MOVR3,#01H;
选位码
MOVA,R3
LD0:
MOVDPTR,#SELKEY;
字位口
MOVX@DPTR,A
MOVDPTR,#TABLE;
给表格首地址
MOVA,@R0
MOVCA,@A+DPTR;
找到对应字码
MOVDPTR,#DTIME;
字形口
MOVX@DPTR,A;
输出数字
ACALLDELAY;
延时1ms
INCR0;
显示下一个字符
MOVA,R3;
未位选码送入A
JBACC.5,EXT;
6位一遍扫完退出
RLA;
左移,下一个LED亮
MOVR3,A
AJMPLD0
EXT:
RET
TABLE:
DB0C0H,0F9H,0A4H,0B0H,99H;
共阳01234
DB92H,82H,0F8H,80H,90H;
56789
DB0FFH;
0AH
DELAY:
MOVR7,#26H;
延时1ms子程序
DL:
MOVR6,#05H
DL1:
DJNZR6,DL1
DJNZR7,DL
*************************
键盘子程序
判断有无按键
KS1:
键扫口
MOVA,#00H
键扫口完为0
MOVDPTR,#KEYIN;
键入口
MOVXA,@DPTR;
从键入口读数剧
CPLA
ANLA,#0FH
扫描按键输入
KEYI:
ACALLKS1
JNZLK1;
有键闭合
NI:
ACALLDIR;
无键闭合,调用显示子程序,延时6ms
AJMPKEYI;
没有按键,接着扫描
LK1:
调用显示子程序的6ms
ACALLDIR;
调用显示子程序的6ms,延时12ms,去抖判断
ACALLKS1;
JNZLK2;
确有按键,跳LK2执行
没有按键,调用显示子程序,延时6ms
LK2:
MOVR2,#0FEH;
列选码赋值R2
MOVR4,#00H;
R4为列计数器
LK4:
键扫口的地址
MOVA,R2;
MOVX@DPTR,A;
键扫口赋值
键入口的地址
读键入口的值
JBACC.0,LONE;
第0行无键闭合,跳到LONE,转判第1行
MOVA,#00H;
第0行有键闭合,首键号0->
A
AJMPLKP;
跳LKP,计算键号
LONE:
JBACC.1,LTWO
MOVA,#08H
AJMPLKP
LTWO:
JBACC.2,LTHR
MOVA,#10H
LTHR:
JBACC.3,NEXT
MOVA,#18H
LKP:
ADDA,R4;
计算键号,即行首键号+列号=键号
PUSHACC;
键号保护
LK3:
调用显示延时,等待按键松开,键号出栈->
ACALLKS1
JNZLK3
POPACC
NEXT:
INCR4;
列计数器加1,扫描下一行
MOVA,R2
JNBACC.7,KND;
判断是否扫完一回
列选码左移,选择第2列
MOVR2,A
AJMPLK4;
继续读键
KND:
AJMPKEYI;
扫完,没有发现按键,退回,继续扫描按键输入
*******************************
按键处理程序
DEAL:
MOVDPTR,#TAB;
找到对应的值
MOVKEY,A;
存储键值
TAB:
DB07H,04H,08H,05H,09H,06H,0AH,0BH;
01234567
DB01H,00H,02H,0FH,03H,0EH,0CH,0DH;
89ABCDEF
DB1FH,1FH,1FH,1FH,1FH,1FH,1FH,1FH;
1617181920212223
DB1FH,1FH,1FH,1FH,1FH,1FH,1FH,1FH;
2425262728293031
********************************
功能模块
作用:
键盘输入删选
闹钟设置键
0B->
闹钟查看键
0C->
0E->
关闹铃
1F->
没定义,无用按键
FUNC:
MOVA,KEY;
判断是否按了无用键
CJNEA,#1FH,FUNC1;
1F->
RET;
是有用键,跳到FUNC1处理,不是,返回
FUNC1:
判断按下闹钟设置键?
CJNEA,#0AH,FUNC2;
闹钟设置键
ACALLTIMING;
是,调用定时闹铃程序
FUNC2:
判断按下闹钟查看键?
CJNEA,#0BH,FUNC3;
0B->
ACALLWATCH;
是,调用闹钟查看程序
FUNC3:
判断按下时钟键?
CJNEA,#0CH,FUNC4;
0C->
时钟显示键
MOVEN,#01H
FUNC4:
判断按下关闭闹铃功能?
CJNEA,#0EH,FUNC5;
0E->
MOVCLOSE,#00H
FUNC5:
MOVA,KEY
CJNEA,#0FH,FUNC6;
关正在响的闹铃
SETBP1.1
FUNC6:
CJNEA,#0DH,FUNC7
MOVTS,#01H
ACALLTIMING
MOVTS,#00H
FUNC7:
定时闹铃程序
数字键:
0123456789
功能键:
按非数字键退出->
重置
TIMING:
MOVEN,#00H;
关闭时钟显示
MOVR5,#DISP5;
第6LED管的显存位子
TIM3:
MOVA,KEY;
取键值
*******排除非数值键*****************
CJNEA,#00H,ERR0
AJMPTIM0
ERR0:
CJNEA,#01H,ERR1;
判断是否是重置键,是跳出,返回
AJMPTIM0
ERR1:
CJNEA,#02H,ERR2
ERR2:
CJNEA,#03H,ERR3
ERR3:
CJNEA,#04H,ERR4
ERR4:
CJNEA,#05H,ERR5
ERR5:
CJNEA,#06H,ERR6
ERR6:
CJNEA,#07H,ERR7
ERR7:
CJNEA,#08H,ERR8
ERR8:
CJNEA,#09H,JJJ;
JJJ
TIM0:
MOVA,R5
MOVR1,A
MOV@R1,KEY;
存值
*********排除输入格式错误*************
CJNEA,#25H,DY4
MOVA,KEY
CJNEA,#00H,DY50
AJMPDFIN
DY50:
CJNEA,#01H,DY51
DY51:
CJNEA,#02H,JJJ;
MOVA,R5
DY4:
CJNEA,#24H,DY3
MOVA,DISP5
CJNEA,#02H,DFIN
CJNEA,#00H,DY40
DY40:
CJNEA,#01H,DY41
DY41:
CJNEA,#02H,DY42
DY42:
CJNEA,#03H,TIM1
DY3:
CJNEA,#23H,DY1
DY10:
CJNEA,#09H,DY30
JJJ:
AJMPTIM1
DY30:
CJNEA,#08H,DY31
AJMPTIM1
DY31:
CJNEA,#07H,DY32
DY32:
CJNEA,#06H,DFIN
DY1:
CJNEA,#21H,DFIN
AJMPDY10
*********************************
DFIN:
CJNEA,#20H,TIM2
MOVA,DISP5;
把显存里的数据转换成闹铃缓冲区的格式
SWAPA
ADDA,DISP4
************************
PUSHACC
MOVA,TS
CJNEA,#00H,TSJ1
MOVAHOUR,A
AJMPDSJ1
TSJ1:
POPACC
MOVHOUR,A
DSJ1:
MOVA,DISP3
ADDA,DISP2
CJNEA,#00H,TSJ2
MOVAMIN,A
AJMPDSJ2
TSJ2:
MOVMIN,A
DSJ2:
MOVA,DISP1
ADDA,DISP0
CJNEA,#00H,TSJ3
MOVASEC,A
AJMPDSJ3
TSJ3:
MOVSEC,A
DSJ3:
MOVCLOSE,#01H;
开闹铃工能
TIM1:
MOVEN,#01H;
开时钟显示
TIM2:
DECR5
AJMPTIM3
定时时间查看程序
WATCH:
MOVEN,#00H
MOVA,ASEC
MOVR1,#DISP0;
拆分,赋值给ASEC显存
ACALLSPL
MOVA,AMIN
MOVR1,#DISP2;
拆分,赋值给AMIN显存
ACALLSPL
MOVA,AHOUR
MOVR1,#DISP4;
拆分,赋值给AHOUR显存
定时比较模块
定时时间到,就响铃
内涵数,只能定时中断调用
ALARM:
;
DJNZCLOSE,BACK;
CLOSE=0,关闭定时闹铃功能
MOVA,CLOSE
CJNEA,#01,BACK
CJNEA,SEC,BACK
CJNEA,MIN,BACK
CJNEA,HOUR,BACK
CLRP1.1;
开闹铃
BACK:
拆字程序
把计时缓冲区里以压缩BCD码形式的SEC,MIN,HOUR
转换成和显示缓存相匹配的非压缩BCD码DISP0~DISP5的形式
SPL:
MOVSAFE,A;
保护A寄存器
MOV@R1,A
MOVA,SAFE
ANLA,#0F0H
SWAPA
INCR1
RET
T0中断子程序
TI0:
PUSHACC
MOVTL0,#0B0H;
0.1S
MOVTH0,#3CH
INCMSEC
MOVA,MSEC
CJNEA,#0AH,DONE1;
1S
MOVMSEC,#00H
MOVA,SEC
ADDA,#01H;
SEC加1
DAA
CJNEA,#60H,TTT0;
1MIN
MOVSEC,#00H;
SEC=0
AJMPTT0
TTT0:
MOVSEC,A;
SEC赋新值
AJMPDONE;
结束,显示,判断是否到定时时间
TT0:
MOVA,MIN;
MIN加1
ADDA,#01H
CJNEA,#60H,TTT1;
1HOUR
MOVMIN,#00H;
MIN=0
AJMPTT1
TTT1:
MOVMIN,A;
MIN赋新值
TT1:
MOVA,HOUR;
HOUR加1
CJNEA,#24H,TTT2;
MOVHOUR,#00H
AJMPDONE
TTT2:
MOVHOUR,A;
HOUR赋新值
DONE:
MOVA,EN
CJNEA,#01H,DONE1;
EN=1,显存给时钟。
EN=0,显存不赋值,结束
拆分,赋值给S显存
MOVA,MIN
MOVR1,#DISP2;
拆分,赋值给MIN显存
MOVA,HOUR
MOVR1,#DISP4;
拆分,赋值给HOUR显存
ACALLALARM;
判断是否到响铃时间
DONE1:
RETI
END