本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
刚开始学习矩阵键盘的时候 是一个按键一个按键来判断的
下面的程序 是用 键值=行号+列号 来进行扫描的
/***************************************
项目:矩阵键盘应用
版本:初级版
硬件:电子工程师之家论坛学习板
具体描述:数码管显示矩阵键盘的键值
时间:2009年7月
作者:电子隐者
****************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dx=P1^4; //数码管段选控制端口
sbit wx=P1^5; //数码管位选控制端口
sbit led_cs=P1^6; //LED控制端口
sbit wr=P3^6; //与USB通信有关的端口
sbit rd=P3^7; //与USB通信有关的端口
uchar Qjkeynum; //定义键值变量
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阴极数码管段值
/*延时函数*/
Delay(uint k)
{
uchar m,n;
while(k--)
{
for(m=100;m>0;m--);
for(n=10;n>0;n--);
}
}
/*键盘扫描函数*/
Keyscan()
{
uchar temp1; //赋给P1口的变量 (行扫描值)
uchar temp3; //赋给P3口的变量
uchar keystate; //矩阵键盘状态变量
uchar rnum; //行号
uchar lnum; //列号
temp1=0x0e; //行扫描的初始值
for(rnum=0;rnum<=12;rnum=rnum+4) //行扫描循环
{
P1=temp1; //行扫描初始值赋值给P1口
temp3=0x01;
for(lnum=0;lnum<4;lnum++) //列扫描循环
{
P3=temp3; //列扫描初始值赋值给P3口
keystate=P3&0x0f; //获取矩阵键盘的状态
if(keystate==0x00) //如果keystate不等于0x0f,则有可能有按键被按下
{
Delay(10); //延时消抖
if(keystate==0x00) //如果keystate依然不等于0x0f,则确有按键被按下
{
Qjkeynum=rnum+lnum; //获取键值 键值=行号+列号
}
}
temp3=temp3<<1;
}
temp1=((temp1<<1)|0x01)&0x0f; //改变行扫描值
}
wr=1;
rd=1;
}
/*显示函数*/
Display()
{
/*要显示的数据*/
P0=table[Qjkeynum];
dx=1;
dx=0;
Delay(5);
/*选定数码管*/
P0=0x01;
wx=1;
wx=0;
Delay(5);
P0=0xff;
dx=1;
dx=0;
Delay(5);
}
/*主函数*/
main()
{
led_cs=0;
while(1)
{
Keyscan();
Display();
}
}
|