矩阵式键盘的程序设计
发布时间:2014/7/27 15:20:47 访问次数:880
在计算机控制系统中,SL490B键盘扫描只是CPU工作的一部分。因此在设计键盘扫描程序时,必须要保证键盘操作的实时性,又不能占有CPU太多的时间,还要充分考虑到抖动干扰的消除。一般可根据情况选用编程扫描、定时扫描或中断扫描中的一种方式。
下面来考虑扫描程序的编写与准备。逐行输出行扫描信号“0”,即是CPU依次使行线Xo—X,为低电平,其输出数据代码分别为OIH(X。线)、02H(X.线)、04H(X:线)、08H(X,线)、10H(X。线)、20H(X,线)、40H(X。线)、80H(X,线)。
为消除按键的抖动干扰.程序中需调用延时lOOms的子程序,以便认定确有键按下,再识别其键值。
求十进制键值的方法是分别设一个行值寄存器CL和列值寄存器DL。接口电路中跨接在行列线上的64个键,由于同一列相邻行之间相隔数8,所以每进行一次“0”行扫描后,如果此行无键按下,则行寄存器CL应加08再进行下一行的“0”行扫描;若有键按下,则不加08而转求列值,由于列值比键值小1,如第一行第一列的键按下时列值Y。(即数据位D。)=0比01键值小1,所以列值寄存器DL应先加1,然后将读入的列值循环右移,判断进位位CF是否等
于零(即有否键按下),若无键按下,再继续加l、右移、判断,重复上述过程,直到有键按下。最后把行值和列值相加并进行DAA修正,即可得到所求的十进制键值。
例如,跨接在X:行与Y.列的18键按下,其键值计算方法如下:第一次“0”行扫描X。行,无键按下,CL= 00 +08= 08,接下来扫X,行,仍无键按下,加08并进行DAA修正,CL =08+
08 =16,再扫X:行,此时读人的列值不等于FFH即表明有键下,则CL =16不变。然后转求列值,列值寄存器先加1,再把读入的列值循环移位,由于按下的键在Y,列,所以需移位丙次才能移出0值,因此DL =02,然后将行值寄存器与列值寄存器之值相加,并进行DAA修正,得到AL=CL+DL=16+02=18,即键值为18。
在计算机控制系统中,SL490B键盘扫描只是CPU工作的一部分。因此在设计键盘扫描程序时,必须要保证键盘操作的实时性,又不能占有CPU太多的时间,还要充分考虑到抖动干扰的消除。一般可根据情况选用编程扫描、定时扫描或中断扫描中的一种方式。
下面来考虑扫描程序的编写与准备。逐行输出行扫描信号“0”,即是CPU依次使行线Xo—X,为低电平,其输出数据代码分别为OIH(X。线)、02H(X.线)、04H(X:线)、08H(X,线)、10H(X。线)、20H(X,线)、40H(X。线)、80H(X,线)。
为消除按键的抖动干扰.程序中需调用延时lOOms的子程序,以便认定确有键按下,再识别其键值。
求十进制键值的方法是分别设一个行值寄存器CL和列值寄存器DL。接口电路中跨接在行列线上的64个键,由于同一列相邻行之间相隔数8,所以每进行一次“0”行扫描后,如果此行无键按下,则行寄存器CL应加08再进行下一行的“0”行扫描;若有键按下,则不加08而转求列值,由于列值比键值小1,如第一行第一列的键按下时列值Y。(即数据位D。)=0比01键值小1,所以列值寄存器DL应先加1,然后将读入的列值循环右移,判断进位位CF是否等
于零(即有否键按下),若无键按下,再继续加l、右移、判断,重复上述过程,直到有键按下。最后把行值和列值相加并进行DAA修正,即可得到所求的十进制键值。
例如,跨接在X:行与Y.列的18键按下,其键值计算方法如下:第一次“0”行扫描X。行,无键按下,CL= 00 +08= 08,接下来扫X,行,仍无键按下,加08并进行DAA修正,CL =08+
08 =16,再扫X:行,此时读人的列值不等于FFH即表明有键下,则CL =16不变。然后转求列值,列值寄存器先加1,再把读入的列值循环移位,由于按下的键在Y,列,所以需移位丙次才能移出0值,因此DL =02,然后将行值寄存器与列值寄存器之值相加,并进行DAA修正,得到AL=CL+DL=16+02=18,即键值为18。