打印
[经验分享]

4X4矩阵键盘

[复制链接]
122|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bartonalfred|  楼主 | 2024-12-16 23:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
P3口接矩阵键盘,其中P3.0~P3.3接行线,P3.4~P3.7接列线,P0口接共阴极7段数码管。

反转法的原理:

反转法就是通过给单片机的端口赋值两次,最后得出所按键的值的一种算法。

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

给P3口再赋值0xf0,即11110000,如果0键按下了,则这时P3口的实际值为11100000;

通过这两次P3口的实际值相加得11101110,即0xee。

由此我们便得到了按下0键时所对应的数值0xee,以此类推可得出其他15个按键对应的数值,有了这种对应关系,矩阵键盘编程问题也就解决了,也就是程序的算法已经有了。

(上述方法来源于网络)

好了下面直接进入程序

#include                //头文件

#define uchar unsigned char         //宏定义

#define uint unsigned int

uchar key,n,i;                 //定义变量

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位的值

P3=0x0f;                           //给P3赋值00001111

l=P3&0x0f;

if(l!=0x0f)

{

delay(100);   //延迟后再检测

P3=0x0f;                                      

l=P3&0x0f;

if(l!=0x0f)

{

h=P3&0xf0; //若有键按下,得出高四位的值

P3=0xf0;                         //给P3赋值11110000

h=P3&0xf0;                       //若有键按下,得出低四位的值

key=l+h;                         //高4位的值与低4位的值相加

for(i=0;i

{

if(key==table[i])            //通过查表得出n的值

n=i;

}

}

}

}

void main()

{

while(1)

   {

          keyscan();

    for(i=0;i   //送入位选信号控制数码管

{

P2_6=1;P2_7=0;

P0=yin[n];

P2_6=0;P2_7=1;

switch(i)

{

case 0:P0=0xfe;break;

case 1:P0=0xfd;break;

case 2:P0=0xfb;break;

case 3:P0=0xf7;break;

case 4:P0=0xef;break;

case 5:P0=0xdf;break;

default:break;

}

P2_6=0;P2_7=0;

delay(100);

     }

   }

}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

1314

帖子

1

粉丝