电脑时钟.docx
《电脑时钟.docx》由会员分享,可在线阅读,更多相关《电脑时钟.docx(18页珍藏版)》请在冰豆网上搜索。
电脑时钟
硬件电路图
实际按键的布局和原理图上的有些区别,所以需要查表;
;************************************************************************
;名称:
电脑时钟
;用途:
课程设计
;作者:
赵志新江苏大学京江学院
;说明:
4组特殊寄存器,只用了第0组(因为不涉及中断嵌套)。
;R0:
零时参数传递R1:
定时中断里零时参数传递R2:
列选码
;R3:
位选码R4:
列计数器R5:
定时循环计数器R6,R7:
延时计数用
;端口:
P1.1:
闹铃控制端
;功能键:
0A->闹钟设置键0B->闹钟查看键0C->时钟显示键
;非数字键->退出闹钟设置(用于输错,重新输入)0E->关闭定时闹铃功能
;0F->关闹铃0D->设时间初值
;注意:
闹铃时间现设小时,后分钟,后秒
;声明:
该程序只用于熟悉单片机汇编语言指令和对硬件电路的熟悉
;************************************************************************
ORG0000H
LJMPMAIN
ORG000BH
LJMPTI0
ORG0100H
DISP0EQU20H;RAM分配表
DISP1EQU21H
DISP2EQU22H
DISP3EQU23H
DISP4EQU24H
DISP5EQU25H
DTIMEEQU0FFDCH
SELKEYEQU0FFDDH
KEYINEQU0FFDEH
MSECEQU26H
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
RET
;***************
;计时、闹钟、显示缓冲区初始化
;使能功能初始化
;***************
;显示缓冲区初始化
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;压缩BCD码
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
RET
;*************************
;键盘子程序
;*************************
;判断有无按键
KS1:
MOVDPTR,#SELKEY;键扫口
MOVA,#00H
MOVX@DPTR,A;键扫口完为0
MOVDPTR,#KEYIN;键入口
MOVXA,@DPTR;从键入口读数剧
CPLA
ANLA,#0FH
RET
;扫描按键输入
KEYI:
ACALLKS1
JNZLK1;有键闭合
NI:
ACALLDIR;无键闭合,调用显示子程序,延时6ms
AJMPKEYI;没有按键,接着扫描
LK1:
ACALLDIR;调用显示子程序的6ms
ACALLDIR;调用显示子程序的6ms,延时12ms,去抖判断
ACALLKS1;判断有无按键
JNZLK2;确有按键,跳LK2执行
ACALLDIR;没有按键,调用显示子程序,延时6ms
AJMPKEYI;没有按键,接着扫描
LK2:
MOVR2,#0FEH;列选码赋值R2
MOVR4,#00H;R4为列计数器
LK4:
MOVDPTR,#SELKEY;键扫口的地址
MOVA,R2;
MOVX@DPTR,A;键扫口赋值
MOVDPTR,#KEYIN;键入口的地址
MOVXA,@DPTR;读键入口的值
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
AJMPLKP
LTHR:
JBACC.3,NEXT
MOVA,#18H
LKP:
ADDA,R4;计算键号,即行首键号+列号=键号
PUSHACC;键号保护
LK3:
ACALLDIR;调用显示延时,等待按键松开,键号出栈->A
ACALLKS1
JNZLK3
POPACC
RET
NEXT:
INCR4;列计数器加1,扫描下一行
MOVA,R2
JNBACC.7,KND;判断是否扫完一回
RLA;列选码左移,选择第2列
MOVR2,A
AJMPLK4;继续读键
KND:
AJMPKEYI;扫完,没有发现按键,退回,继续扫描按键输入
;*******************************
;按键处理程序
;*******************************
DEAL:
MOVDPTR,#TAB;给表格首地址
MOVCA,@A+DPTR;找到对应的值
MOVKEY,A;存储键值
RET
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
;********************************
;功能模块
;作用:
键盘输入删选
;功能键:
0A->闹钟设置键
;0B->闹钟查看键
;0C->时钟显示键
;0E->关闭定时闹铃功能
;0F->关闹铃
;1F->没定义,无用按键
;********************************
FUNC:
MOVA,KEY;判断是否按了无用键
CJNEA,#1FH,FUNC1;1F->没定义,无用按键
RET;是有用键,跳到FUNC1处理,不是,返回
FUNC1:
MOVA,KEY;判断按下闹钟设置键?
CJNEA,#0AH,FUNC2;0A->闹钟设置键
ACALLTIMING;是,调用定时闹铃程序
RET
FUNC2:
MOVA,KEY;判断按下闹钟查看键?
CJNEA,#0BH,FUNC3;0B->闹钟查看键
ACALLWATCH;是,调用闹钟查看程序
RET
FUNC3:
MOVA,KEY;判断按下时钟键?
CJNEA,#0CH,FUNC4;0C->时钟显示键
MOVEN,#01H
RET
FUNC4:
MOVA,KEY;判断按下关闭闹铃功能?
CJNEA,#0EH,FUNC5;0E->关闭定时闹铃功能
MOVCLOSE,#00H
RET
FUNC5:
MOVA,KEY
CJNEA,#0FH,FUNC6;关正在响的闹铃
SETBP1.1
FUNC6:
MOVA,KEY
CJNEA,#0DH,FUNC7
MOVTS,#01H
ACALLTIMING
MOVTS,#00H
RET
FUNC7:
RET
;********************************
;定时闹铃程序
;数字键:
0123456789
;功能键:
按非数字键退出->重置
;********************************
TIMING:
MOVEN,#00H;关闭时钟显示
MOVR5,#DISP5;第6LED管的显存位子
TIM3:
ACALLKEYI;调用按键子程序
ACALLDEAL;调用按键处理程序
MOVA,KEY;取键值
;*******排除非数值键*****************
CJNEA,#00H,ERR0
AJMPTIM0
ERR0:
CJNEA,#01H,ERR1;判断是否是重置键,是跳出,返回
AJMPTIM0
ERR1:
CJNEA,#02H,ERR2
AJMPTIM0
ERR2:
CJNEA,#03H,ERR3
AJMPTIM0
ERR3:
CJNEA,#04H,ERR4
AJMPTIM0
ERR4:
CJNEA,#05H,ERR5
AJMPTIM0
ERR5:
CJNEA,#06H,ERR6
AJMPTIM0
ERR6:
CJNEA,#07H,ERR7
AJMPTIM0
ERR7:
CJNEA,#08H,ERR8
AJMPTIM0
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
AJMPDFIN
DY51:
CJNEA,#02H,JJJ;JJJ
AJMPDFIN
MOVA,R5
DY4:
CJNEA,#24H,DY3
MOVA,DISP5
CJNEA,#02H,DFIN
MOVA,KEY
CJNEA,#00H,DY40
AJMPDFIN
DY40:
CJNEA,#01H,DY41
AJMPDFIN
DY41:
CJNEA,#02H,DY42
AJMPDFIN
DY42:
CJNEA,#03H,TIM1
AJMPDFIN
MOVA,R5
DY3:
CJNEA,#23H,DY1
DY10:
MOVA,KEY
CJNEA,#09H,DY30
JJJ:
AJMPTIM1
DY30:
CJNEA,#08H,DY31
AJMPTIM1
DY31:
CJNEA,#07H,DY32
AJMPTIM1
DY32:
CJNEA,#06H,DFIN
AJMPTIM1
DY1:
CJNEA,#21H,DFIN
AJMPDY10
;*********************************
DFIN:
MOVA,R5
CJNEA,#20H,TIM2
MOVA,DISP5;把显存里的数据转换成闹铃缓冲区的格式
SWAPA
ADDA,DISP4
;************************
PUSHACC
MOVA,TS
CJNEA,#00H,TSJ1
;************************
POPACC
MOVAHOUR,A
AJMPDSJ1
;************************
TSJ1:
POPACC
MOVHOUR,A
;************************
DSJ1:
MOVA,DISP3
SWAPA
ADDA,DISP2
PUSHACC
MOVA,TS
CJNEA,#00H,TSJ2
POPACC
MOVAMIN,A
AJMPDSJ2
TSJ2:
POPACC
MOVMIN,A
DSJ2:
MOVA,DISP1
SWAPA
ADDA,DISP0
PUSHACC
MOVA,TS
CJNEA,#00H,TSJ3
POPACC
MOVASEC,A
AJMPDSJ3
TSJ3:
POPACC
MOVSEC,A
AJMPTIM1
DSJ3:
MOVCLOSE,#01H;开闹铃工能
TIM1:
MOVEN,#01H;开时钟显示
RET
TIM2:
DECR5
AJMPTIM3
;********************************
;定时时间查看程序
;********************************
WATCH:
MOVEN,#00H
MOVA,ASEC
MOVR1,#DISP0;拆分,赋值给ASEC显存
ACALLSPL
MOVA,AMIN
MOVR1,#DISP2;拆分,赋值给AMIN显存
ACALLSPL
MOVA,AHOUR
MOVR1,#DISP4;拆分,赋值给AHOUR显存
ACALLSPL
RET
;********************************
;定时比较模块
;作用:
定时时间到,就响铃
;注意:
内涵数,只能定时中断调用
;********************************
ALARM:
;DJNZCLOSE,BACK;CLOSE=0,关闭定时闹铃功能
MOVA,CLOSE
CJNEA,#01,BACK
MOVA,ASEC
CJNEA,SEC,BACK
MOVA,AMIN
CJNEA,MIN,BACK
MOVA,AHOUR
CJNEA,HOUR,BACK
CLRP1.1;开闹铃
BACK:
RET
;********************************
;拆字程序
;作用:
把计时缓冲区里以压缩BCD码形式的SEC,MIN,HOUR
;转换成和显示缓存相匹配的非压缩BCD码DISP0~DISP5的形式
;注意:
内涵数,只能定时中断调用
;********************************
SPL:
MOVSAFE,A;保护A寄存器
ANLA,#0FH
MOV@R1,A
MOVA,SAFE
ANLA,#0F0H
SWAPA
INCR1
MOV@R1,A
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
DAA
CJNEA,#60H,TTT1;1HOUR
MOVMIN,#00H;MIN=0
AJMPTT1
TTT1:
MOVMIN,A;MIN赋新值
AJMPDONE;结束,显示,判断是否到定时时间
TT1:
MOVA,HOUR;HOUR加1
ADDA,#01H
DAA
CJNEA,#24H,TTT2;
MOVHOUR,#00H
AJMPDONE
TTT2:
MOVHOUR,A;HOUR赋新值
DONE:
MOVA,EN
CJNEA,#01H,DONE1;EN=1,显存给时钟。
EN=0,显存不赋值,结束
MOVA,SEC
MOVR1,#DISP0;拆分,赋值给S显存
ACALLSPL
MOVA,MIN
MOVR1,#DISP2;拆分,赋值给MIN显存
ACALLSPL
MOVA,HOUR
MOVR1,#DISP4;拆分,赋值给HOUR显存
ACALLSPL
ACALLALARM;判断是否到响铃时间
DONE1:
POPACC
RETI
END