您的位置:

c语言矩阵按键扫描,矩阵按键逐行扫描

本文目录一览:

需要一个STC89C52芯片的矩阵按键扫描程序,要求:每一个按键(共16个)对应数码管0~F显示出来

这个是单独的键盘扫描子程序,你可以借鉴一下..

我使用的P3口接的矩阵键盘,你可以根据需要适当改变. 还要注意我的键值可能和你不一样,这就要看你的硬件电路是怎么设计的了.

uint keyscan(void)//键盘扫描函数,使用行列反转扫描法

{

uint cord_h,cord_l,cord;//行列值

P3=0x0f; //行线输出全为0

cord_h=P30x0f; //读入列线值

if(cord_h!=0x0f) //先检测有无按键按下

{

delay(); //去抖

if(cord_h!=0x0f)

{

cord_h=P30x0f; //读入列线值

P3=cord_h|0xf0; //输出当前列线值

cord_l=P30xf0; //读入行线值

for(;;)

{

P3=0x0f;

if(P3==0x0f)

break;

}

P10=0;

delayring();

P10=1;

switch(cord_h+cord_l)

{

case 0x7e:P0=led[1];cord=1;break;

case 0x7d:P0=led[2];cord=2;break;

case 0x7b:P0=led[3];cord=3;break;

case 0x77:P0=led[4];cord=4;break;

case 0xbe:P0=led[5];cord=5;break;

case 0xbd:P0=led[6];cord=6;break;

case 0xbb:P0=led[7];cord=7;break;

case 0xb7:P0=led[8];cord=8;break;

case 0xde:P0=led[9];cord=9;break;

case 0xdd:P0=led[0];cord=0;break;

case 0xee:cord=13;break;

case 0xed:cord=14;break;

case 0xeb:cord=15;break;

case 0xe7:cord=16;break;

}

P2=h;

return(cord);//键盘最后组合码值

}

}return(0xff); //返回该值

}

如果有按键,就会返回按键值, 如果没按键则返回 0XFF, 通过读取返回值可以判断是否有按键, 在程序开头可以加上全局变量的断码表, 这就看你用的是共阴的还是共阳的数码管了~~

祝您的问题早日得到解决. 谢谢

C语言矩阵键盘函数疑问

看程序中P1.0-P1.3是行扫描输出,P1.4-P1.7是扫描输入。所以原理是P1.0-P1.3中每次只有一个引脚输出0,其余输出1,然后读取P1.4-P1.7是否有引脚为0;如果有0说明有按键按下,如果全1说明没有按键按下。

scancode这个变量就是用于控制P1.0-P1.3(P1 = scancode;由这句输出)中每次只有一个引脚输出0的。

scancode = 0xfe;这句中bit0值为0,其余bit为1,所以开始时,P1 = scancode;由这句输出后,P1.0为0,其余引脚为1。

scancode = (scancode  1) | 0x01;这句使为0的bit左移一位(依次值为0xFE, 0xFD, 0xFB, 0xF7, 0xEF)。0xFE, 0xFD, 0xFB, 0xF7都满足while ((scancode 0x10) != 0)这个条件,而0xEF则不满足了,所以说此语句只检查第五位是否为1,如果最低列按下后不就等于零了,就跳过此函数了,到这就所有按键都扫描过了,没有按键按下(如果有按键按下,中途就返回了)。

if ((P1 0xf0) != 0xf0)这句中P1 0xf0表示只判断P1.4-P1.7,只有当前按下的按键所在行扫描输出为0时,这个表达式才成立(这时(P1 0xf0) != 0xf0);否则这个表达式肯定不成立(这时(P1 0xf0) == 0xf0),所以说当前行。

return ((~scancode) + (~tmpcode));这句就是如果有按键按下,那么直接返回键值,并不再进行循环退出程序。

程序格式要注意,下面这样更清楚:

uchar keyscan(void)

{

  uchar scancode, tmpcode;

  P1 = 0xf0; // 发全0行扫描码

  if ((P1 0xf0) != 0xf0)

  // 若有键按下

  {

    delay(); // 延时去抖动

    if ((P1 0xf0) != 0xf0)

    // 延时后再判断一次,去除抖动影响

    {

      scancode = 0xfe;

      while ((scancode 0x10) != 0)

      // 逐行扫描此语句只检查第五位是否为1,如果最低列按下后不就等于零了,就跳过此函数了

      {

        P1 = scancode; // 输出行扫描码

        if ((P1 0xf0) != 0xf0)

        // 本行有键按下为什么是行?哪一列按下此句都成立啊

        {

          tmpcode = (P1 0xf0) | 0x0f;

          /* 返回特征字节码,为1的位即对应于行和列 */

          return ((~scancode) + (~tmpcode));

        }

        else

          scancode = (scancode  1) | 0x01;

        // 行扫描码左移一位

      }

    }

  }

  return (0); // 无键按下,返回值为0

}

C语言,4X4矩阵键盘怎么判断有再次按键发生?

你在程序检测到按键后,加个延时去抖,不要加松手检测。然后执行第一个按键相对应的程序。

然后继续按键扫描。注意这里说的是继续,也就是继续往下检测。否则你的程序就只能执行第一个按键所对应的程序了。这样,就能检测到你第二次按键的键值了。

当然,这个扫描是循环的。也就是说即使你第二次按的按键已经扫描完了,循环扫描任然能检测到。

求一个单片机4X4矩阵键盘扫描程序,C语言的。

淘bao 旺铺: 广州华电 单片机学习板 单片机外围学习模块/传感器模块

//4*4键盘检测程序,按下键后相应的代码显示在数码管上

#includereg51.h

sbit beep=P2^3;

sbit dula=P2^6;

sbit wela=P2^7;

unsigned char i=100;

unsigned char j,k,temp,key;

void delay(unsigned char i)

{

for(j=i;j0;j--)

for(k=125;k0;k--);

}

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

display(unsigned char num)

{

P0=table[num];

dula=1;

dula=0;

P0=0xc0;

wela=1;

wela=0;

}

void main()

{

dula=0;

wela=0;

while(1)

{

P3=0xfe;

temp=P3;

temp=temp0xf0;

if(temp!=0xf0)

{

delay(10);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xee:

key=0;

break;

case 0xde:

key=1;

break;

case 0xbe:

key=2;

break;

case 0x7e:

key=3;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp0xf0;

beep=0;

}

beep=1;

display(key);

P1=0xfe;

}

}

P3=0xfd;

temp=P3;

temp=temp0xf0;

if(temp!=0xf0)

{

delay(10);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xed:

key=4;

break;

case 0xdd:

key=5;

break;

case 0xbd:

key=6;

break;

case 0x7d:

key=7;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp0xf0;

beep=0;

}

beep=1;

display(key);

}

}

P3=0xfb;

temp=P3;

temp=temp0xf0;

if(temp!=0xf0)

{

delay(10);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xeb:

key=8;

break;

case 0xdb:

key=9;

break;

case 0xbb:

key=10;

break;

case 0x7b:

key=11;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp0xf0;

beep=0;

}

beep=1;

display(key);

}

}

P3=0xf7;

temp=P3;

temp=temp0xf0;

if(temp!=0xf0)

{

delay(10);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xe7:

key=12;

break;

case 0xd7:

key=13;

break;

case 0xb7:

key=14;

break;

case 0x77:

key=15;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp0xf0;

beep=0;

}

beep=1;

display(key);

}

}

}

}