首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

行列反转扫描法在矩阵键盘中的应用及编程思想

行列反转扫描法在矩阵键盘中的应用及编程思想

我现在正在学习51单片机,学到矩阵键盘时,遇到了一些小问题,感觉行列扫描法原理简单,但编程较啰嗦,而且没有固定的编程模式,一个人一个编法,代码复杂,一会儿就能把人绕晕。于是我就想寻找有没有一种编程思想灵巧,代码简便的程序,通过苦苦在网上寻觅,终于找到了反转法。
行列反转扫描法法可能有些教材资料里都有,但是介绍都不够详细,我找到一个资料,代码非常简单,但是并不好理解,我苦苦思索了一个晚上才弄明白。于是根据反转法的思想,我写了一个代码不是最少,但却是非常容易理解的程序,在此拿来与大家共享。此程序已在开发板及Proteus软件中仿真成功。
单片机大学里也学过,但只是死记硬背了一些知识,基本没有什么实践,现在自己买了个开发板自学,希望以后能向单片机嵌入式方向发展。欢迎热爱单片机的同学联系交流,我的QQ:77329961。
好了,闲言少叙,先上电路原理图:

P1口接矩阵键盘,其中P1.0~P1.3接行线,P1.4~P.7接列线,P0口接共阴极7段数码管。
反转法的原理:
反转法就是通过给单片机的端口赋值两次,最后得出所按键的值的一种算法。
for example:

如图1所示,取P1口的低四位为行线,高四位为列线。


1.我们给P1口赋值0x0f,即00001111,假设0键按下了,则这时P1口的实际值为00001110;

2.我们给P1口再赋值0xf0,即11110000,如果0键按下了,则这时P1口的实际值为11100000;
3.我们把两次P1口的实际值相加得11101110,即0xee。
由此我们便得到了按下0键时所对应的数值0xee,以此类推可得出其他15个按键对应的数值,有了这种对应关系,矩阵键盘编程问题也就解决了,也就是程序的算法已经有了。对应关系见图2.


以下为程序:
/*反转法矩阵键盘的应用,我认为这是一个编程简便又容易理解的矩阵键盘编程应用,因此拿来与大家共享*/
/*殷传东对此程序拥有独家版权,仅可用于研究学习,严禁用于商业目的,欢迎喜爱单片机的大虾小虾皮皮虾联系交流QQ:77329961*/
#include //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
uchar key,n; //定义变量
uchar code table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //反转法矩阵键盘的各个按键的计算值
uchar code yin[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管显示0~F
void delay(uint i) //延时函数
{
while(i--);
}
void keyscan()
{
uchar l,h,i; //定义局部变量,用l得出低4位的值,用h得出高4位的值
P1=0x0f; //给P1赋值00001111
l=P1&0x0f;
if(l!=0x0f)
{
delay(100);
if(l!=0x0f)
l=P1&0x0f; //若有键按下,得出低四位的值
}
P1=0xf0; //给P1赋值11110000
h=P1&0xf0;
if(h!=0xf0)
{
delay(100);
if(h!=0xf0)
h=P1&0xf0; //若有键按下,得出高4位的值
}

key=l+h; //高4位的值与低4位的值相加
for(i=0;i<16;i++)
{
if(key==table) //通过查表得出n的值
n=i;
}
}

void main()
{
while(1)
{
keyscan();
P0=yin[n]; //在数码管上显示相应的键值
}
} www.kgzfp.com  www.kszfp.com www.kdlfp.com
返回列表