6位LED时钟设计的源程序清单Word文件下载.docx
《6位LED时钟设计的源程序清单Word文件下载.docx》由会员分享,可在线阅读,更多相关《6位LED时钟设计的源程序清单Word文件下载.docx(38页珍藏版)》请在冰豆网上搜索。
CONR6EQU36H
CONR7EQU37H
CONR5EQU35H;
以上唱歌程序寄存器
DELAYR3EQU38H;
以下延时程序用寄存器
DELAYR5EQU39H;
DELAYR6EQU3AH;
DELAYR7EQU3BH;
****************************************;
中断入口程序;
ORG0000H;
程序执行开始地址
LJMPSTART;
跳到标号START执行
ORG0003H;
外中断0中断程序入口
RETI;
外中断0中断返回
ORG000BH;
定时器T0中断程序入口
LJMPINTT0;
跳至INTT0执行
ORG0013H;
外中断l中断程序人口
RETI;
外中断1中断返回
ORG001BH;
定时器T1中断程序入口
LJMPINTTI;
跳至INTTI执行
ORG0023H;
串行中断程序入口地址
串行中断程序返回
***************************************;
以下为程序开始;
****************************************;
整点报时功能程序
ZDBS:
MOVA,#10;
十位数乘10加上个位数为报时的次数
MOVB,79H
MULAB
ADDA,78H
MOVCONBS,A;
报时次数计算完成
JZOUT00;
如为午夜零点不报时
BSLOOP:
LCALLDS20ms;
以下按次数鸣叫
MOVP3,#00H
LCALLDLIS
MOVP3,#0FFH
DJNZCONBS,BSLOOP;
报时完成
OUT00:
CLR08H;
清整点报时标志
AJMPSTART1;
返回主程序
以下为闹钟功能时的唱歌程序
SPPP:
;
LCALLMUSIC0;
调用唱歌程序
MOVB,#10;
闹钟叫10下
BLOOP:
LCALLDS20ms
LCALLDLIS;
LCALLDLIS;
DJNZB,BLOOP
CLR0AH;
清闹钟时的唱歌标志
CLR05H;
清止闹标志
AJMPSTART1;
倒计时程序进入程序
DJS:
LCALLDS20mS
JBP1.4,START1
WAITH111:
JNBP1.4,WAITH111;
等待键释放
LJMPDJSST
*******************************;
主程序开始;
******************************;
START:
MOVSP,#80H;
堆栈在80H以上
LCALLST;
上电显示年月日及班级学号
LCALLSTFUN0;
流水灯
LCALLSTMEN;
时钟程序初始化子程序
SETBEA;
中断开放
SETBET0;
允许T0中断
SETBTR0;
开启T0定时器
MOVR4,#14;
1s定时用计数值(50ms×
20)
MOVDISPFIRST,#70H;
显示单元为70H~75H
LCALLLMUSIC0;
唱歌测试程序
以下为主程宇循环
START1:
LCALLDISPLAY;
调用显示子程序
JNBP1.0,SETMM1;
PI.0口为0时转时间调整程序
JNBPl.1,FUNSS;
秒表功能,P1.1按键调时作减l功能
JNBPl.2,FUNPT;
秒表STOP,PUSE,CLR
JNBPl.3,TSFUN;
定时闹铃设定
JNBPl.4,DJS;
倒计时功能
JB08H,ZDBS;
08H为l,整点到,进行整点报时
JB0AH,SPPP;
0AH为1时,闹铃时间到,进行提醒
P1.0口为l时跳回START1
FUNPT:
LJMPFUNPTT
以下为闹铃时间设定程序,按P1.3进入设定
TSFUN:
LCALLDS20ms
JBPl.3,STARTI;
WAIT113:
JNBPl.3,WAIT113;
JB05H,CLOSESP;
闹铃已开的话,关闹铃
MOVDISPFIRST,#50H;
显示50H~55H闹钟定时单元
MOV50H,#0CH;
”--”闹铃设定时显示格式00:
--
MOV5IH,#0AH;
”黑”
DSWAIT:
SETBEA
LCALLDISPLAY
JNBPl.2,DSFINC;
分加l
JNBPl.0,DSDEC;
分减1
JNBPl.3,DSSFU;
进入时调整
AJMPDSWAIT
CLOSESP:
CLR05H;
关闹铃标志
CLRBELL
AJMPSTARTI
DSSFU:
LCALLDS20ms;
消抖
JBPl.3.DSWAIT
LJMPDSSFUNN;
SETMM1:
LJMPSETMM;
转到时间调整程序SETMM
DSFINC:
LCALLDS20ms;
消抖
JBPl.2.DSWAIT
DSWAIT12:
LCALLDISPLAY;
等键释放
JNBPl.2,DSWAIT12
CLREA
MOVR0,#53H
LCALLADD1;
闹铃设定分加l
MOVA,R3;
分数据放入A
CLRC;
清进位标志
CJNEA,#60H,ADDHH22
ADDHH22:
JCDSWAIT;
小于60分时返回
ACALLCLR0;
大于或等于60分时分计时单元清o
DSDEC:
JBPl.0.DSWAIT
DSWAITEE:
LCALLDISPLAY;
等键释放
JNBPl.0,DSWAITEE
MOVR0,#53H
LCALLsubl;
闹铃设定分减1
LJMPDSWAIT
以下为秒表功能/时钟转换程序
按下P1.1可进行功能转换
FUNSS:
JBPl.1,START11
WAIT11:
JNBPl.1,WAIT11
CPL03H
JNB03H,TIMFUN
MOVDISPFIRST,#60H;
显示秒表数据单元
MOV60H,#00H
MOV6IH,#00H
MOV62H,#00H
MOV63H,#00H
MOV64H,#00H
MOV65H,#00H
MOVTL1,#0F0H;
l0ms定时初值
MOVTHl,#0D8H;
SETBTR1
SETBET1
START11:
LJMPSTART1
TIMFUN:
MOVDISPFIRST,#70H;
显示时钟数据单元
CLRET1
CLRTR1
START12:
LJMPSTART1
以下为秒表暂停/清零功能程序
按下P1.2暂停或清0,按下P1.1退出秒表回到时钟计时
FUNPTT:
JBPl.2,START12
WAIT22:
JNBPl.2,WAIT21
WAIT33:
JNBP1.1,FUNSS
JBPl.2,WAIT31
JBPl.2,WAIT33
WAIT66:
JNBPl.2,WAIT61
MOV60H,#00H
MOV6IH,#00H
MOV62H,#00H
WAIT44:
JNBPl.1,FUNSS
JBPl.2.WAIT41
JBPl.2,WAIT44
WAIT55:
JNBPl.2,WAIT51
AJMPSTART1
以下为键等待释放时显示不会熄灭程序
WAIT21:
AJMPWAIT22
WAIT31:
AJMPWAIT33
WAIT41:
AJMPWAIT44
WAIT51:
AJMPWAIT55
WAIT61:
AJMPWAIT66
1秒计时程序;
T0中断服务程序
INTT0:
PUSHACC;
累加器入栈保护
PUSHPSW;
状态字入栈保护
CLRET0;
关T0中断允许
CLRTR0;
关闭定时器T0
MOVA,#0B7H;
中断响应时间同步修正
ADDA,TL0;
低8位初值修正
MOVTL0,A;
重装初值(低8位修正值)
MOVA,#3CH;
高8位初值修正
ADDCA,TH0;
MOVTH0,A;
重装初值(高8位修正值)
SETBTR0;
开启定时器T0
SETBP3.6
SETBP3.5
DJNZR4,OUTT0;
20次中断未到中断退出
ADDSS:
MOVR4,#14H;
20次中断到(ls)重赋初值
CLRP3.6
CLRP3.5
CPL07H;
闹铃时间隔呜叫用
MOVR0,#7IH;
指向秒计时单元(7IH~72H)
ACALLADD1;
调用加l程序(加1s操作)
MOVA,R3;
秒数据放入A(R3为2位十进制数组合)
CJNEA,#60H,ADDMM;
ADDMM:
JCOUTT0;
小于60s时中断退出
ACALLCLR0;
大于或等于60s时对秒计时单元清0
MOVR0,#77H;
指向分计时单元(76H~77H)
分计时单元加1分钟
CLRC;
CJNEA,#60H,ADDHH;
ADDHH:
小于60min时中断退出
ACALLCLR0;
大于或等于60min时分计时单元清0
正点报时
SETB08H
MOVR0,#79H;
指向小时计时单元(78H~79H)
ACALLADD1;
小时计时单元加l小时
MOVA,R3;
时数据放八A
CLRC;
清进位标志
CJNEA,#24H,HOUR
HOUR:
小于24小时中断退出
大于或等于24小时,计时单元清0
OUTT0:
MOV72H,76H;
中断退出时将分、时计时单元数据移入
MOV73H,77H;
对应显示单元
MOV74H,78H;
MOV75H.79H;
LCALLBAOJ
POPPSW;
恢复状态字(出栈)
POPACC;
恢复累加器
SETBET0;
开放T0中断
中断返回
闪动调时程序/秒表功能程序;
TI中断服务程序,用作时间调整时调整单元闪烁指示或秒表计时
INTT1I:
PUSHACC;
中断现场保护
PUSHPSW;
JB09H,SPCC
JB06H,DJSFUN
JB03H,MMFUN;
03H=1时秒表
MOVTL1,#0B0H;
装定时器T1定时初值
MOVTH1,#3CH
DJNZR2,INTTlOUT;
0.3s未到退出中断(50ms中断6次
MOVR2,#06H;
重装0.3s定时用初值
CPL02H;
0.3s定时到对闪烁标志取反
JB02H,FLASH1;
02H位为1时显示单元”熄灭”
MOV72H,76H;
02H位为0时正常显示
MOV73H,77H;
MOV74H,78H;
MOV75H,79H;
INTT1OUT:
POPPSW;
恢复现场
POPACC;
中断退出
FLASH1:
JB01H,FLASH2;
01H位为1时,转小时熄灭控制
MOV72H,7AH;
01H位为0时,”熄灭符”数据放入分
MOV73H,7AH;
显示单元(72H~73H),将不显示分数据
MOV74H,78H;
MOV75H,79H;
AJMPINTT1OUT;
转中断退出
FLASH2:
01H位为1时,“熄灭符”数据放入小时
MOV73H,77H;
显示单元(74H~75H),小时数据将不显示
MOV74H,7AH;
MOV75H,7AH;
AJMPINTT1OUT;
SPCC:
INCSONGCON;
中断服务.中断计数器加1
MOVTH1.#0D8H
MOVTL1,#0EFH;
DJSFUN:
LJMPDJSS
MMFUN:
MOVA,#0F7H;
中断响应时间同步修正,重装初值(l0ms)
ADDA,TL1;
MOVTL1,A;
MOVA,#0D8H;
ADDCA,TH1
MOVTH1,A;
SETBTR1;
MOVR0,#61H;
调用加1程序(加1s操作)
CLRC
MOVA,R3
JZFSS1;
加1后为00,C=0
AJMPOUTT01;
加l后不为00,C=1
FSS1:
MOVR0.#63H;
指向分计时单元(76H~77H)
CJNEA,60H,ADDHH1
ADDHH1:
JCOUTT01;
LCALLCLR0;
大于或等于60min时,计时单元清0
MOVR0.#65H;
指向小时计时单元(78H~79H)
小时计时单元加l小时
OUTT01:
中断返回;
加l子程序;
ADD1:
MOVA,@R0;
取当前计时单元数据到A
DECR0;
指向前一地址
SWAPA;
A中数据高四位与低四位交换
ORLA,@R0;
前一地址中数据放入A中低四位
ADDA,#01H;
A加1操作
DAA;
十进制调整
MOVR3,A;
移入R3寄存器
ANLA,#0FH;
高四位变0
MOV@R0,A;
放回前一地址单元
取回R3中暂存数据
INCR0;
指向当前地址单元
ANLA,#0FH;
MOV@R0,A;
数据放入当前地址单元中
RET;
子程序返回
分减1子程序;
**************************************;
SUB1:
SWAPA;
A中数据高4位与低4位交换
ORLA.@R0;
前一地址中数据放入A中低4位
JZSUB11
DECA;
A减1操作
SUB111:
MOVR3,A;
移入R3寄存器
高4位变0
SUBBA,#0AH
SUB1111:
JCSUB1110
MOV@R0,#09H;
大于等于0AH,为9
SUB110:
A中数据高4位与低4位交换
ANLA,#0FH;
MOV@R0,A;
RET;
SUB11:
MOVA,#59H
AJMPSUB111
SUB1110:
MOVA,R3;
移人R3寄存器
MOV@R0,A
AJMPSUB110
**************************************;
时减l子程序;
SUBB1:
DECR0;
JZSUBB11;
00减l为23(小时)
DECA;
SUBBl11:
MOVR3,A;
SUBBA,#0AH;
时个位大于9,为9
SUBB1111:
JCSUBB1110:
SUBB110:
MOVA.R3;
SWAPA;
ANLA,#0FH;
时十位数数据放入
SUBB11:
MOVA,#23H
AJMPSUBB111
SUBB1110:
MOVA,R3;
时个位小于0A不处理
ANLA,#0FH;
个位移入
AJMPSUBB110
清零程序;
对计时单元复零用
CLR0:
CLRA;
清累加器
MOV@R0,A;
清当前地址单元
前一地址单元清0
RET;
*****