在单片机系统中,通过按键输入常量及命令以及通过显示器显示键值或功能提示符来实现人机对话的方式是常常用到的。下面通过一个按键输入和数码管显示的电路,讲一下数字显示代码转换的原理和条件转移、左环、右环等指令。
按键输入及显示电路图如下图所示。IClP3口的P3.0至P3.5等6条口线分别接有按钮开关Sl至S6来实现输入,Pl口的Pl.0至P1.7等8条口线与数码管LED1相接,实现键值显示。
由图可以看出,当初始化时首先使P3口的各口线呈高电位,然后再持续读取P3口的输入数据,就可以判断Sl至S6是否被按下;如果读得P3口的数据为#FFH,说明未有按键按下,如果读得P3口的数据不等于#FFH,说明P3口的各口线中有低电位输入,也就是说有口线被按钮开关S对地短路。同样的,为了消除抖动,要延时后再判。过程是这样的:
当读取P3口的数据不为#FFH时,就先将该数据存于片内RAM的30H单元内,经过一段时间的延时后再读P3口,如果读得的数据为#FFH,说明上次读得P3口的非#FFH的数据为干扰所致;如果延时后读得的数据不是#FFH,就将二次读得的数据与第一次读得的存于30H单元内的数据相比较,如果二者相等,说明确有按键被按下,如果两次数据不等,则放弃此次判断。判断确定有键按下后,还必须分析是哪一个键被按下才能准确地计算出键值。那么如何确定按键,如何计算键值呢?如果我们规定Sl至S6的键值分别是01至06,那么,由按键按下所建立的P3口的输人数据值就和我们对Sl至S6按键的赋值有了一定的对应关系。很显然,当我们将Sl至S6依次按下并读P3口,得到数据将分别是#FEH、#FDH、#FBH、#F7H、#EFH和#DFH;用二进制表达则是#11111110B、#1111110B、#11111011B、#11110111B、#11101111B、和#11011111B。由此可以看出,Sl至S6依次被按下,P3口数据中的“0”数据位就会从低位依次向高位移动直到移动到第六位。因此,我们可以将读得的原始键值由高位向低位移动,并将移出的位放到布尔累加器C中,然后判断移出的位是不是零。当移出的位为零时,移动的次数就是被按下的键的赋值,也就是要显示的键值。于是也就确定了被按下的键的身份。上述将一个数循环移动,用的是循环指令,我们将上述数据由高位向低位移动所用的指令为右循环指令,代码是13H,执行结果见下图。
由图可以看出,每执行一次“右环”指令,累加器A中的值就向右移动一位,并将原来的最低位移到布尔处理器的累加器C中,这样,我们就可通过对C中的数和右环次数进行判断,确定被按下的按键。比如,进行第一次右环后C中的值若为“0”,说明被按下的键是Sl,如果第二次右环后C中的值若为“0”,说明被按下的键是S2,依此类推。所以,当判断确有按键被按下后,就可采用上述办法将输入的数据进行处理,也就是将A中的数据右环并对C中的数据位进行判断,当C的值为“0”时,取出循环次数,即得到相应的键值。由上述可知,用此种方法得到的Sl至S6键值通常恰是01至06。键值可以通过寄存器RO或其它寄存器得到。开始判断时可将R0清零,当求键值时,A中的值每右环一次,R0中的值就加1。这样,R0通过对右环次数进行计数,也就得到了键值。
本文关键字:单片机 显示电路-显示屏,单元电路 - 显示电路-显示屏
上一篇:单片机键值的显示