14.3.2 程序设计
本例的程序功能是扫描查询4×4矩阵式键盘,如果检测到按键按下,则根据键值的大小来控制发光二极管闪烁的次数,否则将熄灭发光二
极管。程序中采用了线反转法。
1.创建项目
这里在KeilµVision3集成开发环境中,采用C51语言编写程序,具体操作步骤如下。
(1)首先在KeilµVision3集成开发环境中,选择“Project”→“New”→“µVision Project”命令新建一个工程,并保存。
图 14.9 选择单片机AT89S52
(2)在弹出的选择器件对话框中选择Atmel公司的AT89S52,如图14.9所示。
(3)单击“确定”按钮,此时询问是否添加启动代码,如图14.10所示。单击“是”按钮,选择添加启动代码,完成工程的建立。
图 14.10 添加启动代码
(4)选择“File”→“New”命令,新建一个程序文件,并保存为*.C文件,可以在其中输入程序源代码。
2.程序代码
主程序的流程图,如图14.11所示。C51主程序代码示例如下。
图 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中空循环的值可延长延时时间。如果需要更长的延时效果,还可使用多重循环进行处理。