刚学51,搞矩阵键盘加按键音的时候遇到问题了

2019-07-16 05:29发布

程序如下,想加个按键音,结果自己搞了好久搞不定,如果把beep()加到显示函数里,拿一开机就一直响,加到键盘消抖之后,开机不响,但是一按键就一直响,程序都进不到键码的判断里面也就是说无法再按键之后再数码管上显示键值。。大家帮忙看看啊。纠结了一晚上。


#include<reg52.h>
#define uchar unsigned char  //数据类型的宏定义
#define uint  unsigned int         //数据类型的宏定义
sbit P27=P2^7;
sbit fmq=P3^6;
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF};  
         //共阳数码管显示字型码数组  1011 1111 "-"


void delay500us()
{
    unsigned char k;

      for(k=0;k<57;k++); //0.5ms 基准延时程序
}




void delay1ms(uint i)
{
uchar j;
  while(i--)
   {
    for(j=0;j<115;j++);          //1ms基准延时程序
   }
}


void beep() //无源蜂鸣器发生子程序
{
fmq=0;
delay500us();
fmq=1;
delay500us();
}


uchar t;
void display(unsigned char i)
{
  P27=0;        //选通最有端的数码管显示
  P0=table[i];   //显示i参数传来的字型码
}



void main(void)
{
unsigned char temp;
display(16); //初始显示 "-"
  while(1)
   {

     P1=0xff; //先向P1口写1;端口读状态
     P1=0xf0;
     temp=P1;
      if(temp!=0xf0)
       {
             delay1ms(15);  
           if(temp!=0xf0)
             {
                   P1=0xfe;
                   temp=P1;
                 switch(temp)
                   {
                         case(0xee):display(0);break;
                         case(0xde):display(1);break;
                         case(0xbe):display(2);break;
                         case(0x7e):display(3);break;
                   }

               P1=0xfd;
               temp=P1;
                 switch(temp)
                   {
                         case(0xed):display(4);break;
                         case(0xdd):display(5);break;
                         case(0xbd):display(6);break;
                         case(0x7d):display(7);break;
                   }

               P1=0xfb;
               temp=P1;
                 switch(temp)
                   {
                         case(0xeb):display(8);break;
                         case(0xdb):display(9);break;
                         case(0xbb):display(10);break;
                     case(0x7b):display(11);break;
                   }

               P1=0xf7;
               temp=P1;
                 switch(temp)
                   {
                           case(0xe7):display(12);break;
                         case(0xd7):display(13);break;
                         case(0xb7):display(14);break;
                         case(0x77):display(15);break;
                   }

             }
       }

   }

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
lite_student
1楼-- · 2019-07-16 08:03
你把其他的程序直接注释了,单独运行beep() 函数,看看会有什么情况!如下所示:
void main(void)
{
beep();
while(1);
}
如果蜂鸣器一直响个不停,说明你的beep()函数有问题,你看看电路图,是高电平发声,还是低电平发声。
lite_student
2楼-- · 2019-07-16 13:26
51的端口复位之后是弱上拉,这个有可能会导致开机蜂鸣器就响!
andyyaoytu
3楼-- · 2019-07-16 14:54
你的键盘检测是不是存在问题
w995612220
4楼-- · 2019-07-16 19:36
 精彩回答 2  元偷偷看……
540960708
5楼-- · 2019-07-17 00:18
你的键盘检测是不是存在问题
sirius08
6楼-- · 2019-07-17 03:05
查一下硬件的连接

一周热门 更多>