当前位置:首页 > 单片机 > 单片机
[导读] ;**************************************************;带键盘设置的秒计时器;功能:倒计时的秒计时器,从59倒计到0,然后又从59开始倒计到0;;各个键的功能;S1:开始运行;S2:停止运行;S3:高位加1,按

;**************************************************
;带键盘设置的秒计时器
;功能:倒计时的秒计时器,从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


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

晶体振荡器被广泛应用到军、民用通信电台,微波通信设备,程控电话交换机,无线电综合测试仪,BP机、移动电话发射台,高档频率计数器、GPS、卫星通信、遥控移动设备等。它有多种封装,特点是电气性能规范多种多样。它有好几种不同的...

关键字: 石英晶体振荡器 计时器

数码管里面相当于有8个段码管(或叫发光二极管)。 数码管分阳极管(CA),阴极管(CC)。阳极管是接高电平然后通过每个段选为来控制数码管亮灭(高电平灭,低电平亮)。阴极管则是接低电平,通过段选来控制亮灭(高电平亮,低电...

关键字: 数码管 使用

数码管引脚图

关键字: 数码管 编程

共阳极、共阴极数码管编码表(0~9、A~P……全亮)

关键字: 数码管 段码

【单片机自学】3.数码管静态及动态显示

关键字: 数码管 数字

LED数码管驱动芯片选型指南

关键字: 数码管 芯片

数码管是嵌入式开发中比较常用的一个模块,本篇文章根据查阅的资料以及学习笔记整理成文,尽可能详尽的讲解常用数码管原理和使用方法。若有不足和疏忽的地方,请不吝指正。一、工作原理数码管是一种半导体发光器件,其基本单元是发光二极...

关键字: 数码管

led数码管(LEDSegmentDisplays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。

关键字: 发光二极管 数码管

数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP)这个小数点可以更精确的表示数码管想要显示的内容;按能显示...

关键字: 数码管 LED数码管

数码管是嵌入式开发中比较常用的一个模块,本篇文章根据查阅的资料以及学习笔记整理成文,尽可能详尽的讲解常用数码管原理和使用方法。

关键字: 数码管 半导体发光器件
关闭
关闭