您当前的位置:t7t8网 >  创业指南 >矩阵键盘程序 矩阵键盘程序设计

矩阵键盘程序 矩阵键盘程序设计

更新时间:2023-01-26 15:02:36 点击: 来源:yutu

1、矩阵键盘扫描程序

你要放到“死循环”中不断扫描。他的原理图一般是这样的

以之一个按键为例,当你按下时I/O口读到的数据就不是0x0f了。好吧你最开始的赋值错了。你要用0xee,0xde检测的话你应该给0xfe。每四个按键是一组。我这有一个我做密码锁的程序你参考一下。

void key()

{

    P3=0xfe;

    if(P3!=0xfe)

    {

        time(50);

        if(P3!=0xfe)

            {

            switch(P3)

                {

case 0xee:num=1,cs++;

break;

case 0xde:num=2,cs++;

break;

case 0xbe:num=3,cs++;

break;

case 0x7e:num=4,cs++;

break;

                }

        }

        while(P3!=0xfe);

}

P3=0xfd;

if(P3!=0xfd)

{

time(50);

if(P3!=0xfd)

{

switch(P3)

{

case 0xed:num=5,cs++;

break;

case 0xdd:num=6,cs++;

break;

case 0xbd:num=7,cs++;

break;

case 0x7d:num=8,cs++;

break;

}

}

while(P3!=0xfd);

}

P3=0xfb;

if(P3!=0xfb)

{

time(50);

if(P3!=0xfb)

{

         switch(P3)

{

case 0xeb:num=9,cs++;

break;

case 0xdb:num=0,cs++;

break;

case 0xbb:cs++;

break;

case 0x7b:num=10,cs=0,a=b=c=d=e=f=10,ply=1;

break;

}

  }

while(P3!=0xfb);

}

}

2、c51矩阵键盘程序怎么写

#include reg52.h

#define key P2

int val;

char code sign[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};

void delay_10ms();

void key_scan(); //矩阵按键函数声明

void main()

{

while(1)

{

P0=sign[val];

key_scan();

}

}

void key_scan()

{

static char a,b; //a用于判断是不是之一次按下,b用于稍微延时

char state; //记录键值

key=0x0f;

if(key!=0x0f) //如果有按键按下

{

state=key; //记录之一次按键状态

if(a==0) //如果之一次按下

{

b++; //略微延时 不需要延时10ms以提高单片机效率

if(b3)

{

if(key==state) //判断键值是否和之一次一致

{

a=1,b=0; //复位状态值 a==1说明已经按下,等待后续松开

key=0x0f; //测试列

switch(key)

{

case (0x07): val=0;break;

case (0x0b): val=1;break;

case (0x0d): val=2;break;

case (0x0e): val=3;break;

}

key=0xf0; // 测试行

switch(key)

{

case (0x70): val=val;break;

case (0xb0): val=val+4;break;

case (0xd0): val=val+8;break;

case (0xe0): val=val+12;break;

}

}

}

}

}

else

{

a=b=0; //松开后复位状态机

}

}

3、矩阵键盘程序

假设按下的是S1键进行如下检测(4*4键盘)

先在P3口输出

p3 00001111

低四位 行会有变化

cord_h =0000111100001110 =00001110

if !=00001111

延时0.1us

cord_h=0000111000001111=00001110

if !=00001111

P3再输出11111110

P3 =00001110|11110000=11111110

输出高四位

cord_l=P30xf0 //此时P3口就是输入值01111110 而不是上面的11111110

cord_l=0111111011110000=01110000

cord_h+cord_l=00001110+01110000=01111110=0x7e //此编码即为S1的编码

#include reg52.h//包含头文件

#define uchar unsigned char

#define uint unsigned int

unsigned char const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F

uchar keyscan(void);

void delay(uint i);

void main()

{

uchar key;

P2=0x00;//1数码管亮 按相应的按键,会显示按键上的字符

while(1)

{

key=keyscan();//调用键盘扫描,

switch(key)

{

case 0x7e:P0=table[0];break;//0 按下相应的键显示相对应的码值

case 0x7d:P0=table[1];break;//1

case 0x7b:P0=table[2];break;//2

case 0x77:P0=table[3];break;//3

case 0xbe:P0=table[4];break;//4

case 0xbd:P0=table[5];break;//5

case 0xbb:P0=table[6];break;//6

case 0xb7:P0=table[7];break;//7

case 0xde:P0=table[8];break;//8

case 0xdd:P0=table[9];break;//9

case 0xdb:P0=table[10];break;//a

case 0xd7:P0=table[11];break;//b

case 0xee:P0=table[12];break;//c

case 0xed:P0=table[13];break;//d

case 0xeb:P0=table[14];break;//e

case 0xe7:P0=table[15];break;//f

}

}

}

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

{

uchar cord_h,cord_l;//行列值

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

cord_h=P30x0f; //读入列线值

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

{

delay(100); //去抖

cord_h=P30x0f; //读入列线值

if(cord_h!=0x0f)

{

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

cord_l=P30xf0; //读入行线值

return(cord_h+cord_l);//键盘最后组合码值

}

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

}

void delay(uint i)//延时函数

{

while(i--);

}

OK,本文到此结束,希望对大家有所帮助。

转载请备注原文地址:https://www.t7t8.net/chuangye/555011.html
移动端网站原文地址:https://m.t7t8.net/chuangye/555011.html