[电工&电子] 普中科技51单片机矩阵按键

[复制链接]
查看214 | 回复0 | 2024-7-28 11:04:48 | 显示全部楼层 |阅读模式
>

一、电路

二、显示、延时、蜂鸣器程序

//*************显示函数**************void display(uchar shu,uchar wei){  P2=(P2&0xe3)+(wei<<2);//P2.4 P2.3 P2.2控制公共端 wei 0-7  P0=tab[shu];//显示数据0-F  delay(2);  P0=0x00;//消影}
//*************延时函数**************void delay(uint ms){  uint i,j;  for(i=ms;i>0;i--)    for(j=100;j>0;j--);}
//************didi******************void didi(uint di){  while(di--)  {    bz=0;    delay(1);    bz=1;    delay(1);  }}

三、循环扫描原理

1、第一行

  P1=0x7f;//第一行    if(P1!=0x7f)    {      delay(20);//消抖      if(P1!=0x7f)      {        v=P1;//0x77 0x7b 0x7d 0x7e        while(P1!=0x7f);//松手检测        switch(v)        {          case 0x77:key=1;break;          case 0x7b:key=2;break;          case 0x7d:key=3;break;          case 0x7e:key=4;break;          default: key=0;break;        }        }    }      

2、第二行

P1=0xbf;//第二行    if(P1!=0xbf)    {      delay(20);//消抖      if(P1!=0xbf)      {        v=P1;//b7 bb bd be        while(P1!=0xbf);//松手检测        switch(v)        {          case 0xb7:key=5;break;          case 0xbb:key=6;break;          case 0xbd:key=7;break;          case 0xbe:key=8;break;          default:key=0;break;        }      }    }

3、第三行

  P1=0xdf;//第三行    if(P1!=0xdf)    {      delay(20);//消抖      if(P1!=0xdf)      {        v=P1;//d7 db dd de        while(P1!=0xdf);//松手检测        switch(v)        {          case 0xd7:key=9;break;          case 0xdb:key=10;break;          case 0xdd:key=11;break;          case 0xde:key=12;break;          default:key=0;break;        }      }    }

4、第四行

  P1=0xef;//第四行    if(P1!=0xef)    {      delay(20);//消抖      if(P1!=0xef)      {        v=P1;//e7 eb ed ee        while(P1!=0xef);//松手检测        switch(v)        {          case 0xe7:key=13;break;          case 0xeb:key=14;break;          case 0xed:key=15;break;          case 0xee:key=16;break;          default:key=0;break;        }      }    }

四、完整程序

#include <REGX52.H>#define uchar unsigned char#define uint  unsigned intvoid delay(uint ms);void display(uchar shu,uchar wei);void didi(uint di);uchar tab[]={0x3f,0x06,0x5b,0x4f,       0x66,0x6d,0x7d,0x07,       0x7f,0x6f,0x77,0x7c,       0x39,0x5e,0x79,0x71};//显示0~F的值sbit bz=P1^5;void main(){  uchar key,v;  while(1)  {    display(key/10%10,7);    display(key/1%10,6);//显示按键值    P1=0x7f;//第一行    if(P1!=0x7f)    {      delay(20);//消抖      if(P1!=0x7f)      {        v=P1;//0x77 0x7b 0x7d 0x7e        while(P1!=0x7f);//松手检测        didi(50);        switch(v)        {          case 0x77:key=1;break;          case 0x7b:key=2;break;          case 0x7d:key=3;break;          case 0x7e:key=4;break;          default: key=0;break;        }        }    }    P1=0xbf;//第二行    if(P1!=0xbf)    {      delay(20);//消抖      if(P1!=0xbf)      {        v=P1;//b7 bb bd be        while(P1!=0xbf);//松手检测        didi(50);        switch(v)        {          case 0xb7:key=5;break;          case 0xbb:key=6;break;          case 0xbd:key=7;break;          case 0xbe:key=8;break;          default:key=0;break;        }      }    }    P1=0xdf;//第三行    if(P1!=0xdf)    {      delay(20);//消抖      if(P1!=0xdf)      {        v=P1;//d7 db dd de        while(P1!=0xdf);//松手检测        didi(50);        switch(v)        {          case 0xd7:key=9;break;          case 0xdb:key=10;break;          case 0xdd:key=11;break;          case 0xde:key=12;break;          default:key=0;break;        }      }    }    P1=0xef;//第四行    if(P1!=0xef)    {      delay(20);//消抖      if(P1!=0xef)      {        v=P1;//e7 eb ed ee        while(P1!=0xef);//松手检测        didi(50);        switch(v)        {          case 0xe7:key=13;break;          case 0xeb:key=14;break;          case 0xed:key=15;break;          case 0xee:key=16;break;          default:key=0;break;        }      }    }    }}//************didi******************void didi(uint di){  while(di--)  {    bz=0;    delay(1);    bz=1;    delay(1);  }}//*************显示函数**************void display(uchar shu,uchar wei){  P2=(P2&0xe3)+(wei<<2);//P2.4 P2.3 P2.2控制公共端 wei 0-7  P0=tab[shu];//显示数据0-F  delay(2);  P0=0x00;//消影}//*************延时函数**************void delay(uint ms){  uint i,j;  for(i=ms;i>0;i--)    for(j=100;j>0;j--);}



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则