14.2.3 中断法及C51程序设计

中断法是将键盘扫描程序放置在单片机的中断服务例程中的方法。当有按键动作时,单片机响应中断,在中断服务例程中获取键值,然后根据键值进行后续的按键处理子程序。

中断法的电路原理图,如图14.7所示。其中,4×4矩阵式键盘的列线与单片机P1口的高4位相连,行线与单片机P1口的低4位相连。P1.0~P1.3作为输入端,P1.4~P1.7作为输出端。另外,矩阵式键盘的4根行线通过一个4输入与门连接单片机的外部中断#INT0。当有按键动作的时候,触发外部中断0,进而扫描键值。

14.2.3 中断法及C51程序设计 - 图1

图 14.7 中断法原理图

1.中断法的流程

单片机系统在初始化时,将键盘的输出端口P1.4~P1.7全部置低电平“0”,然后程序便可以执行其他任务。当有按键按下的时候,对应的行线和列线短路,行线便为低电平“0”,因此与门的输出变为低电平,触发#INT0中断,此时向CPU发出中断请求,CPU响应中断并进入中断服务程序。在中断服务程序中,可以按照前面的扫描查询的方法来获得按键的位置信息(X,Y),也就是键值。

对于前面介绍的扫描法和线反转法,都需要在程序循环调用键盘扫描子程序来获得按键信息。这样,即使按键没有按下,单片机CPU总是要不断的扫描键盘,占用很多CPU处理时间。而中断法则只有当按键按下的时候,才触发中断,进而扫描键值。因此,采用中断法进行键盘设计可以提高CPU的工作效率,特别适合于复杂的系统或者对实时性要求比较高的场合。

2.中断法C51程序设计

按照前面的电路连接方法,在C51语言中,中断法键盘扫描的程序示例如下。


01:#include<reg51. h>//头文件

02:

03:int KeyScan(void);//键盘扫描函数

04:int key;

05:

06:void main()

07:{//构造外部中断0,INT0(P3.2)

08:IT0=1;//下降沿触发

09:EX0=1;//开EX0中断

10:EA=1;//开发中断

11:P1=0x0F;//列线全部为0

12:while(1)//用户程序段

13:{

14:}

15:}

16:

17:void FuncEX0(void)interrupt 0//外部中断0程序

18:{

19:key=KeyScan();//获取键值

20:}


在该程序中,首先设置外部中断0为下降延触发,并打开相应的中断。然后再外部中断0的服务例程中,便可以调用前面介绍的扫描法来获取键值,并根据键值来进行相应的处理。

提示对比图14.5和图14.7,可看到矩阵键盘的列线接的位置不同,如果按图14.5所示将列线接在P1端口的低位,则以上程序第11行中应设置P1的初始值为0xF0,使列线全部为0。