秒计时器程序
扫描二维码
随时随地手机看文章
;**************************************************
;带键盘设置的秒计时器
;功能:倒计时的秒计时器,从59倒计到0,然后又从59开始倒计到0;
;各个键的功能
;S1:开始运行
;S2:停止运行
;S3:高位加1,按一次,数码管的十位加1,从0-5循环变化
;S4:低位加1,按一次,数码管的个位加1,从0-9循环变化
;**************************************************
KEYOKBIT 00H
STARTRUNBIT01H
VALUEEQU21H
SETVALEQU22H;设置值
COUNTEREQU23H;用于显示的计数器
COUNTEQU24H;秒计数器
KEYVALEQU25H
DISPBUFEQU5EH
FIRSTBITP2.7;第一位数码管的位控制
SECONDBITP2.6;第二位数码管的位控制
P1LEDEQU22H
TMRVAREQU60110;65536-5000*12/11.0592定时器初值5毫秒
ORG0000H
JMPSTART
ORG0*8+3;INT0中断入口
RETI
ORG1*8+3;TIMER0中断入口
JMPINT_T0;转去定时器0中断服务程序入口
ORG2*8+3;INT1中断入口
RETI
ORG3*8+3;TIMER1中断入口
RETI
ORG4*8+3;串行中断入口
RETI
START:
MOV SP,#5FH
MOV P1,#0FFH;所有LED全部熄灭
MOV VALUE,#0
MOV P1LED,#0FEH
MOV SETVAL,#59
MOV VALUE,SETVAL
MOV DISPBUF,#5
MOV DISPBUF+1,#9
CLRSTARTRUN
CLRKEYOK
CALLINIT_T0
SETBEA
LOOP:
CALLKEY;调用键盘程序
JBKEYOK,KEYPROC;如果有键按下,转键盘处理
NEXT:
MOV A,VALUE;获得秒的数值
MOV B,#10
DIVAB;二进制转化为十进制,十位和个位分送显示缓冲区
NEXT1:
MOV DISPBUF,A
MOV DISPBUF+1,B;个位送显示缓冲区
JMPLOOP
;以下是键值处理
KEYPROC:
MOV A,KEYVAL;取得键值
JZKEYRUN;如果键值是0
DECA
JZKEYSTOP;如果键值是1
DECA
JZKEYLEFT;如果键值是2
JMPKEYRIGHT;键值是3,转
KEYRUN:
SETBSTARTRUN
JMPLOOP
KEYSTOP:
CLRSTARTRUN
JMPLOOP
KEYLEFT:
CLRSTARTRUN
INCDISPBUF
MOV A,DISPBUF
CJNEA,#6,LEFT0
MOV A,#0
LEFT0:
MOV B,#10
MULAB
MOV SETVAL,A
MOV VALUE,SETVAL
JMPLOOP
KEYRIGHT:
CLRSTARTRUN
INCDISPBUF+1
MOV A,DISPBUF+1
CJNEA,#10,REFT0
MOV DISPBUF+1,#0
REFT0:
MOV A,DISPBUF
MOV B,#10
MULAB
ADDA,DISPBUF+1
MOV SETVAL,A
MOV VALUE,SETVAL
JMPLOOP
;键盘程序
KEY:
MOV P3,#0FFH
CLRKEYOK
MOV A,P3
ORLA,#11000011B
CPLA
JZKEY_RET
CALLDELAY
MOV A,P3
ORLA,#11000011B
CPLA
JZKEY_RET
SETBKEYOK
JNBACC.2,KEY_1;S1没有按下,转
MOV KEYVAL,#0
JMPKEY_RET
KEY_1:
JNBACC.3,KEY_2;S2没有按下,转
MOV KEYVAL,#1
JMPKEY_RET
KEY_2:
JNBACC.4,KEY_3
MOV KEYVAL,#2
JMPKEY_RET
KEY_3:
MOV KEYVAL,#3
KEY_RET:
MOV A,P3
ORLA,#11000011B
CPLA
JNZKEY_RET
RET
DELAY:
PUSHPSW
SETBRS0
MOV R7,#50
D1: MOV R6,#50
D2:DJNZR6,D2
DJNZR7,D1
POPPSW
RET
INIT_T0:;初始化T0为5毫秒的定时器
MOV TMOD,#01H
MOV TH0,#HIGH(TMRVAR)
MOV TL0,#LOW(TMRVAR)
SETBET0;开T0中断
SETBTR0;定时器0开始运行
RET;返回
;以下是中断程序,实现秒计数和显示
INT_T0:;定时器T0的中断响应程序
PUSHACC;ACC入栈
PUSHPSW;PSW入栈
MOV TH0,#HIGH(TMRVAR)
MOV TL0,#LOW(TMRVAR)
INCCOUNT;软件计数器加1
MOV A,COUNT
CJNEA,#20,INT_N2
MOV COUNT,#0;计到20,软件计数器清0
INT_N1:
JNBSTARTRUN,INT_N2;停止运行,转
DECVALUE;计数器减1
MOV A,VALUE
JNZINT_N2;不等于0,转
MOV VALUE,SETVAL;否则,再置初值
INT_N2:;以下是显示部份
SETBFIRST
SETBSECOND;关显示
MOV A,#DISPBUF;显示缓冲区首地址
ADDA,Counter
MOV R0,A
MOV A,@R0;根据计数器的值取相应的显示缓冲区的值
MOV DPTR,#DISPTAB;字形表首地址
MOV CA,@A+DPTR;取字形码
MOV P0,A;将字形码送P0位(段口)
MOV A,Counter;取计数器的值
JZDISPFIRST;如果是0则显示第一位
CLRSECOND;否则显示第二位
AJMPDISPNEXT
DISPFIRST:
CLRFIRST;显示第一位
DISPNEXT:
INCCounter;计数器加1
MOV A,Counter
DECA;如果计数器计到2,则让它回0
DECA
JZRSTCOUNT
AJMPDISPEXIT
RSTCOUNT:
MOV Counter,#0;计数器的值只能是0或1
DISPEXIT:
POPPSW
POPACC
RETI
DISPTAB:DB28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60H
END