找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

矩阵键盘学习

[复制链接]
admin 发表于 2012-9-2 12:39:20 | 显示全部楼层 |阅读模式

本文包含原理图、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();
}
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 23:26 , Processed in 0.057332 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表