应用行列反转法操纵矩阵键盘

应用行列反转法操纵矩阵键盘

  行列反转法的简单实用,我自己整理了一下,分享给大家。根据开发板原理图可知,P3口接为矩阵键盘,其中P3.0~P3.3接行线,P3.4~P3.7接列线,P0口接共阴极6段数码管。

                  图 1

反转法的原理:反转法就是通过给单片机的端口两次赋值,最后得出所按键的值的一种算法。具体操作如下:

1.我们给P3口赋值0x0f,即00001111,假设S6键(TX开发板中,S6键相当于第一个按键)按下了,则这时P3口的实际值为00001110;     

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

 3.我们把两次P3口的实际值相加得11101110,即0xee。     由此我们便得到了按下S6键时所对应的数值0xee,以此类推可得出其他15个按键对应的数值,有了这种对应关系,对应关系见图2.

                                      图2

以下为程序:  反转法矩阵键盘的应用,通过按下矩阵按键,使数码管第一位(0xFE)显示数值,是我自己敲的可执行的程序,拿来与大家共享

#include<reg52.h>

#define ucharunsigned char

#define uintunsigned int

uchar n,key;

sbit dula=P2^6;

sbit wela=P2^7;

void  delayms(uint xms);          //延时函数

void keyscan()   ;                       //按键扫描函数

void display();   //数码管显示函数

 

uchar code table[]={         //数码管的显示程序

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

 

uchar code jian[]={            //矩阵按键显程序

0xee,0xDe,0xbe,0X7e,

0Xed,0xdd,0xbd,0x7d,

0xeb,0xdb,0xbb,0x7b,

0xe7,0xd7,0xb7,0x77};

void main()        //主函数

{

    while(1)

    {

           keyscan();         //执行按键扫描函数

           display();            //执行数码管显示函数

    }

}

void  delayms(uint xms)         //延时函数

{

    uint i,j;

    for(i=xms;i>0;i--)          i=xms,也就是xms毫秒

           for(j=110;j>0;j--);       

}

void keyscan()          //按键扫描函数

{

    uchar l,h,i;     //l为第四位,h为高四位

   P3=0x0f;     令P3=0x00001111

    l=P3&0X0f;        //l为低四位,即行

    if(l!=0x0f)      //如果按键被按下,此时执行if循环

    {

           delayms(10);     // 延时10毫秒,目的是消抖

           if(l!=0x0f)     //再次检测是否按下

           {

                  l=P3&0x0f;      //此时低四位确定,即某一行有按键被按下了

           }

   

    }

 

    P3=0xf0;    //P3=0X11110000

    h=P3&0Xf0;            //h为高四位,即列

    if(h!=0xf0) //如果按键有被按下

    {

           delayms(10);  //延时

           if(h!=0xf0)      

           {

                  h=P3&0xf0;   //此时得出高四位,即列

           }     

    }

    key=l+h;    //相加确定出某一个按键被按下

    for(i=0;i<16;i++)    //查找i,确定i的值。目的是接下来对应到数码管的哪一位

    {

           if(key==jian[i])    //算出i

           n=i;

    }

}

void display()   //显示函数

{

           dula=1;

           P0=table[n];

           dula=0;

           P0=0xff;   //目的是消影

           wela=1;

           P0=0xfe;

           wela=0;

           delayms(5);

}

 实验现象如下:

        

猜你喜欢

转载自blog.csdn.net/weixin_41092597/article/details/79164053
今日推荐