文档介绍:任务七计数器
在单片机应用系统中,很多时候需要对外部数据进行计数,例如记录按键次数。这时就需要数据显示,在任务五中已经介绍过数码管怎样显示数据,本任务通过按键与数码管的配合,来学习单片机怎样实现按键输入与计数。
在单片机应用系统中,很多时候需要对外部数据进行计数,例如记录按键次数。这时就需要数据显示,在任务五中已经介绍过数码管怎样显示数据,本任务通过按键与数码管的配合,来学习单片机怎样实现按键输入与计数。
【任务目的】
1、理解按键识别与消抖。
2、理解I/O端口的输入、输出功能。
3、学会编写多位数码管显示数字的程序。
【任务描述】
1、每按下1号键1次,显示的数据加一。
2、每按下2号键1次,显示的数据减一。
二、开关防抖
我们在使用开关时,每当我们按下或松开,在似接触却又没接触时,这时会出现多次的通断交替情况,通常称为抖动。抖动对于我们单片机这样的快速芯片,使单片机认为这个按键被多次按下。抖动的时间一般有几ms。所以编程的时候当我们检测到按键被按下时,先延时10ms,再检测此按键是否还是按下,如果是则说明次按键确实被正常按下,否则则可能是干扰或者是误操作。这样就可以避开抖动带来的误操作。当键松开时同样也要做这样的工作。
数据传送指令:MOV A , #data
ROM传送指令:MOVC A, ***@A+DPTR
A不等“0”转移:JNZ DEONE1
Rn减一不等“0”转移: DJNZ R0 , DEL1
根据端口状态进行转移操作:
JB , EXITAD
JNB , DEONE
基本指令2
绝对跳转: LJMP LOOP
异或指令:XRL A , direct
无条件调用及返回: LCALL DEL
RET
自加一与自减一: INC Rn
DEC Rn
四、显示程序
ORG 0000H ; 定位伪指令,指定下一条指令的地址, 第一条指令必须放在0000H
MOV 60H , #6 ;60H为显示缓冲区,60H数为多少(0—F之间) 就显示多少
MOV DPTR , #TAB ;将段码表的首址送给DPTR
MOV A , 60H ;取所要显示的数据
MOVC A , ***@A+DPTR ;查表取字形段码
MOV P0 , A ;将要显示的断码送到显示口显示
;下面的为段码表
TAB: DB 0C0H , 0F9H , 0A4H , 0B0H , 99H , 92H , 82H , 0F8H,
DB 80H , 90H , 88H , 83H , 0C6H , 0A1H , 86H , 8EH ,
END ;结束伪指令
五、按键程序
关于按键,我们先考虑一下按键的过程,当我们按下一次按键到松开,要有两个边沿,对于我们实验板上的,是低电平触发,那么一次按键的过程要经过下降沿和上升沿。所以程序当中我们就要考虑到这样的情况。
下面的程序中,我们以60H单元为计数器,每当一号键按下,60H数加一,当是0FH时再按一号键,60H变为0。每当二号键按下时,60H数减一,当是0时再按二号键,60H变为0FH。
ORG 0000H
MOV P3 , #0FFH ;将P3口设置为输入端口
MOV 60H , #0 ;先将60H置0
LOOP: JNB , ADONE ;判断一号键是否按下
JNB , DEONE ;判断二号键是否按下
LJMP LOOP ;都没有则继续检测
ADONE: LCALL DEL ;若一号键按下,判断是否真按下
JB , EXITAD ;消抖确认
INC 60H ;确定按下时,将60H数加一
MOV A , #10H ;
XRL A , 60H ;判断60H数是否等于10H
JNZ ADONE1 ;不是则等待一号键松开
MOV 60H , #0 ;是则将60H数置0
ADONE1:JNB , ADONE1 ;等待一号键松开
LCALL DEL ;消抖
JNB , ADONE1 ;
EXITAD:LJMP LOOP ;一号键的一次操作完成
DEONE: LCALL DEL ;若二号键按下,判断是否真按下
JB , EXITDE ;消抖确认
DEC 60H ;确定按下时,将60H数减一
MOV A , #0FFH
XRL A , 60H ;判断60H数是否等于-1
JNZ DEONE1 ;不是则等待二号键松开
MOV 60H , #0FH ;是则将60H数置0FH