矩阵键盘的键值用数码管显示.docx
- 文档编号:14480552
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:13
- 大小:2.58MB
矩阵键盘的键值用数码管显示.docx
《矩阵键盘的键值用数码管显示.docx》由会员分享,可在线阅读,更多相关《矩阵键盘的键值用数码管显示.docx(13页珍藏版)》请在冰点文库上搜索。
矩阵键盘的键值用数码管显示
矩阵键盘的键值用数码管显示
�矩阵按键项目:
分别按下4*4矩阵键盘,一共16个按键,数码管会相应的
显示1-16不同的数字。
最终效果图:
现象说明:
效果图中我们看到:
按4键,数码管上即显示04,同理按5键数码
管上即显示05。
上面显示的2个LED灯是硬件上特意设计的,只要按键按下,
相应的灯就亮了。
目前不用太在意。
此项目练习的目的:
(1)认识矩阵键盘。
(2)了解矩阵键盘的原理。
(3)熟悉软件编程。
(4)熟悉软件的使用。
完整代码:
(注意,代码中省略的部分是我们目前可以不关心的内容,在下一阶
段将着重介绍,此代码已编译测试通过)
#include
#include"digitron_drv.h"//调用数码管显示程序,现在可以把它当做一个主体
#defineuintunsignedint//宏定义
#defineucharunsignedchar
ucharkey_num;//矩阵键盘键值
/*延时函数*/
voiddelay(ucharx)
{
uchari,j;
for(i=x;i>0;i--)
for(j=100;j>0;j--);
}
/*键盘键值显示*/
voiddisplay(void)
{
DigShowNumber(1,key_num%10,0);//个位除以10取余
DigShowNumber(2,key_num/10,0);//十位除以10取整
}
/*键盘扫描*/
voidkeyboard(void)
{
uchartemp;
P1=0xef;//将第1列置位低电平,其余的为高电平
temp=P1;//读取P1口当前的状态,赋值给临时变量temp,用于后面的计算
temp=temp&0x0f;//判断temp的,低四位是否为0,
if(temp!
=0x0f)//如果temp不等于0x0f,说明有按键按下
{
delay(10);//延时消抖
temp=P1;//重新读一次P1口数据
temp=temp&0x0f;//如果temp仍然不等于0x0f,这次说明第1列真的
有按键按下
if(temp!
=0x0f)
{
temp=P1;
switch(temp)//判断按下的是该列的第几行
{
case0xee:
//如果读到P1是0xee,说明是第1列和第1行的交叉
键,即数字键7
key_num=7;
break;
case0xed:
//如果读到P1是0xed,说明是第1列和第2行的交叉
键,即数字键4key_num=4;
break;
case0xeb:
//如果读到P1是0xeb,说明是第1列和第3行的交叉
键,即数字键1
key_num=1;
break;
case0xe7:
//如果读到P1是0xe7,说明是第1列和第4行的交叉
键,即数字键0
key_num=0;
break;
}
}
//在判断完按键序号后,还要等待按键被释放,检测释放语句如下:
while(temp!
=0x0f)//等待按键被释放
{
temp=P1;
temp=temp&0x0f;//不断的读取P1口数据,然后和0x0f“与”运
算,只要结果不等于0x0f,说明按键没有被
释放,直到按键被释放才退出while
display();
}
}
//以下程序意义同上,继续进行第2、3、4列的检测
P1=0xdf;
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P1;
switch(temp)
{
case0xde:
key_num=8;
break;
case0xdd:
key_num=5;
break;case0xdb:
key_num=2;
break;
case0xd7:
key_num=10;
break;
}
}
while(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
display();
}
}
P1=0xbf;
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P1;
switch(temp)
{
case0xbe:
key_num=9;
break;
case0xbd:
key_num=6;
break;
case0xbb:
key_num=3;
break;
case0xb7:
key_num=11;
break;
}
}
while(temp!
=0x0f){
temp=P1;
temp=temp&0x0f;
display();
}
}
P1=0x7f;
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P1;
switch(temp)
{
case0x7e:
key_num=12;
break;
case0x7d:
key_num=13;
break;
case0x7b:
key_num=14;
break;
case0x77:
key_num=15;
break;
}
}
while(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
display();
}
}
}
voidmain(void){
while
(1)
{
keyboard();
display();
}
}
长见识:
(1)按键实物:
也称轻触开关
按键之前也已经见过了,再回忆一下。
(2)单片机STC89C52实物
(3)开发板上的矩阵键盘
图上我们看到的是4*4矩阵键盘,4行4列总共16个按键。
矩阵键盘主要是
解决IO口不够用的问题,因为16个按键都是独立按键的话需要16个IO口,而
如果做成矩阵键盘的话则只需8个IO口,省了一半。
我们来看看矩阵键盘的原理:
下面我们来看,项目功能需要涉及到哪些东西:
1、4*4矩阵键盘
2、数码管
3、单片机STC89C52
简化框图:
接下来我们通过原理框图理顺思路,并进行相应代码的编写。
从框图我们了解到,功能的实现总共和3个东西有关,一个是矩阵键盘,一
个是数码管,还有单片机。
下面我们按照步骤来写:
�第一步:
配置IO口
包含头文件:
#include
由于矩阵键盘占用8个IO口,并且硬件上设计的就是P1口,所以这边就
不需要进行sbit定义,直接操作P1就行了。
当然数码管是需要进行位定义的,由于我们目前基础薄弱,所以,数码管这
部分驱动先不管它,认为他已经好了,只需要调用它的接口,往里面送数据就行。
�第二步:
编写驱动(判断按键)
循环扫描按键:
按照键盘扫描的原理进行编写。
如何编写将在《坚定航行篇》
里面详细介绍。
�第三步:
编写main函数
main函数的工作就是检测到有按键了,得到相应的按键值送往数码管进行
显示出来。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 矩阵 键盘 键值 数码管 显示