14.3.2 程序设计

本例的程序功能是扫描查询4×4矩阵式键盘,如果检测到按键按下,则根据键值的大小来控制发光二极管闪烁的次数,否则将熄灭发光二

极管。程序中采用了线反转法。

1.创建项目

这里在KeilµVision3集成开发环境中,采用C51语言编写程序,具体操作步骤如下。

(1)首先在KeilµVision3集成开发环境中,选择“Project”→“New”→“µVision Project”命令新建一个工程,并保存。

14.3.2 程序设计 - 图1

图 14.9 选择单片机AT89S52

(2)在弹出的选择器件对话框中选择Atmel公司的AT89S52,如图14.9所示。

(3)单击“确定”按钮,此时询问是否添加启动代码,如图14.10所示。单击“是”按钮,选择添加启动代码,完成工程的建立。

14.3.2 程序设计 - 图2

图 14.10 添加启动代码

(4)选择“File”→“New”命令,新建一个程序文件,并保存为*.C文件,可以在其中输入程序源代码。

2.程序代码

主程序的流程图,如图14.11所示。C51主程序代码示例如下。

14.3.2 程序设计 - 图3

图 14.11 流程图


include<stdio.h>//头文件

include<reg52.h>//头文件

int row;//定义行号

int tier;//定义列号

int KeyScan();//声明键盘扫描子函数

void Delay();//声明延时子函数

void main()//主函数

{

int Key,i;

P2=0x00;//初始化为LED灭

while(1)//开始循环扫描键盘

{

Key=KeyScan();//调用键盘扫描子函数,获取键值

for(i=0;i<Key;i++)//根据键值,控制LED闪烁的次数

{

P2=0x01;//点亮发光二极管

Delay();

P2=0x00;//熄灭发光二极管

Delay();

}

Key=0;//键值归零

}

}


该程序中,首先初始化端口,熄灭发光二极管。然后主函数通过while循环来调用KeyScan函数来扫描查询键盘并获取键值。接着根据键值来控制点亮熄灭发光二极管的次数。最后,键值归零,并重新开始扫描键盘。如果键盘没有输入,则Key=0,发光二极管不亮。

该程序中键盘扫描部分由自定义函数KeyScan来实现,其中采用了线反转法来获取键值,并通过return语句返回。键盘扫描程序代码示例如下。


int KeyScan()//键盘扫描子函数

{

P1=0xF0;//列输出全0

if((P1&0xF0)!=0xF0)//扫描行,如果不全为0,则进入

{

switch(P1)//获得行号

{

case 0x70:

row=1;//行号

break;

case 0xB0:

row=2;//行号

break;

case 0xD0:

row=3;//行号

break;

case 0xE0:

row=4;//行号

break;

default:

break;

}

Delay();//延时去抖动

P1=0x0F;//行输出全0

if((P1&0x0F)!=0x0F)//扫描列,如果不全为0,则确认按键按下

{

switch(P1)//获得列号

{

case 0x07:

tier=1;//列号

break;

case 0x0B:

tier=2;//列号

break;

case 0x0D:

tier=3;//列号

break;

case 0x0E:

tier=4;//列号

break;

default:

break;

}

return 4*(row-1)+tier;//计算键值并返回

}

}

else

{

return 0;//未扫描到按键按下,返回0

}}


另外,程序中还用到了延时函数,以实现软件去抖动的方法来消除按键抖动的影响。延时函数程序代码示例如下。


void Delay()//延时子函数

{

int i;

for(i=1000;i>0;i—);//空循环,延时

}


技巧以上延时函数延时较短,运行该例子时发光二极管闪烁很快,通过修改延时函数Delay中空循环的值可延长延时时间。如果需要更长的延时效果,还可使用多重循环进行处理。