矩阵键盘扫描程序

矩阵键盘扫描程序,第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);

}

}

这个程序中没有熄灭的程序,单片机当然不会有熄灭的 *** 作。修改如下:

if(k1==0)

P2=0xee;

else

P2=0xff;

if(k2==0)

P2=0xfd;

else

P2=0xff;

这是按住就亮,松开就灭的程序。

如果想实现按一次亮,再按一次熄灭。程序如下:

bit a=0,b=0;//做按键点亮熄灭标志

while(1)

{

if(k1==0&&a==0)

{

P2=0xee;

a=1;

}

else if(k1==0&&a==1)

{

P2=0xff;

a=0;

}

if(k2==0&&b==0)

{

P2=0xfd;

b=1;

}

else if(k1==0&&b==1)

{

P2=0xff;

b=0;

}

}

此程序实现独立按键的检测功能,每次按下按键 key5 时,数码管最后一位显示的数 值加 1,按键同时响蜂鸣器 #include<reg52h> sbit key5 = P1^4; //独立按键 sbit P3_6 = P3^6; //蜂鸣器控制端口 unsigned char code BitSet[8] = { 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f }; //用于设置(低电平位选)数码管的位选信号,从低到高对应 8 个数码管 unsigned char code NumberCode[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, }; //用于设置(共阴极)数码管的段选信号,从 0~f 共 16 个数值 void delay_ms(unsigned int n) { //软件延时函数,延时 n 毫秒 unsigned int i, j; for(i=n;i>0;i--) for(j=110;j>0;j--); } void beep(int n) { int i = n; while(i>0) { P3_6 = 1; delay_ms(1); P3_6 = 0; delay_ms(1); i--; } } void main() //喇叭连续响 n 毫秒 //向喇叭输入 1000HZ 的方波震荡源 //05 毫秒高电平 //05 毫秒低电平 { int num=0; while(1) { P2=BitSet[7]; //选择最低位的数码管 if(key5==0) //判断按键 key5 是否按下 { delay_ms(10); //延时重新判断按键是否按下,延时消除抖动 if(key5==0) { num++; //每按下一次显示的数值加 1 beep(200); //喇叭响 200 毫秒 if(num==16) num=0; while(!key5); //直到按键释放,按下时 key5==0,持续循环 } } P0=~NumberCode[num]; } } // 2、 此程序实现独立按键的检测功能,key5 和 key6 每次按下按键时,数码管次低位和最 低位显示的数值加 1,按键同时响蜂鸣器 #include<reg52h> sbit key5 = P1^4; sbit key6 = P1^5; sbit P3_6 = P3^6; unsigned char code BitSet[8] = { 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f }; //用于设置(低电平位选)数码管的位选信号,从低到高对应 8 个数码管 unsigned char code NumberCode[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, }; //用于设置(共阴极)数码管的段选信号,从 0~f 共 16 个数值 void delay_ms(unsigned int n) { //软件延时函数,延时 n 毫秒 unsigned int i, j; for(i=n;i>0;i--) for(j=110;j>0;j--); } void beep(int n) { int i = n; while(i>0) { P3_6 = 1; delay_ms(1); P3_6 = 0; delay_ms(1); i--; } } void main() { int num=0, num2=0; while(1) { P2=BitSet[6]; //喇叭连续响 n 毫秒 //向喇叭输入 1000HZ 的方波震荡源 //05 毫秒高电平 //05 毫秒低电平 //选择最低位的数码管 if(key5==0) //判断按键 key5 是否按下 { delay_ms(10); //延时重新判断按键是否按下,延时消除抖动 if(key5==0) { num++; //每按下一次显示的数值加 1 beep(100); //喇叭响 100 毫秒 if(num==16) num=0; while(!key5) { P2=BitSet[6]; //选择次低位的数码管 P0=~NumberCode[num]; delay_ms(3); P2=0xff; }; } } P2=BitSet[7]; //选择最低位的数码管 P0=~NumberCode[num2]; delay_ms(3); P2=0xff; //直到按键释放,按下时 key5==0,持续循环 P0=~NumberCode[num]; delay

#include<reg52h>

sbit key1=P2^4;

sbit D1=P1^0;

void delay(unsigned char y)

{

unsigned char j,k;

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

for(k=0;k<57;k--);

}

void keyo()

{

if(key1==0)

{

delay(5);

if(key1==0)

{

D1=0;

}

}

}

void keyc()

{

if(key1==0)

{

delay(5);

if(key1==0)

{

D1=1;

}

}

}

void main()

{

while(1)

{

keyo();

delay(10);

key1=1;

delay(10);

keyc();

delay(10);

}

}

最简单的程序了,由于延时程序的问题,不保证你下载到板子上后成功率100%一次性控制成功,自己摸索着改一下延时的时常,效果会好很多。 程序已经测试过,没有问题。

以上就是关于矩阵键盘扫描程序全部的内容,包括:矩阵键盘扫描程序、c51独立按键程序,按下k1按键后对应的灯亮,但松开k1按键后灯还亮,k2也是如此,求大侠!、若51单片机的PLOD接了1个独立按键,编写程序完成按键检测程序要求每按下按钮一次P1.1端口电子改变一次等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10626853.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存