电脑时钟.docx

上传人:b****7 文档编号:10630415 上传时间:2023-02-22 格式:DOCX 页数:18 大小:69.09KB
下载 相关 举报
电脑时钟.docx_第1页
第1页 / 共18页
电脑时钟.docx_第2页
第2页 / 共18页
电脑时钟.docx_第3页
第3页 / 共18页
电脑时钟.docx_第4页
第4页 / 共18页
电脑时钟.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

电脑时钟.docx

《电脑时钟.docx》由会员分享,可在线阅读,更多相关《电脑时钟.docx(18页珍藏版)》请在冰豆网上搜索。

电脑时钟.docx

电脑时钟

硬件电路图

实际按键的布局和原理图上的有些区别,所以需要查表;

;************************************************************************

;名称:

电脑时钟

;用途:

课程设计

;作者:

赵志新江苏大学京江学院

;说明:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1