微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 顺序按下矩阵键盘 数码管依次显示0-F 但是下载后没有反应...

顺序按下矩阵键盘 数码管依次显示0-F 但是下载后没有反应...

时间:10-02 整理:3721RD 点击:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;   //定义段选锁存器锁存端
sbit wela=P2^7;   //定义位选锁存器锁存端
uchar code table[]={0x3f,0x06,0x5b,0x4f,
      0x66,0x6d,0x7d,0x07,
      0x7f,0x6f,0x77,0x7c,
      0x39,0x5e,0x79,0x71,0x76};
  void delayms(uint xms)  //延时函数
  {
   uint i,j;
  for (i=xms;i>0;i++)
   for(j=110;j>0;j--);
  
  }
  void display(uchar num)
  {     
   P0=table[num];
   dula=1;
  dula=0;
  
     
  }
  void matrixkeyscan()
  {
   uchar temp,key;
  P3=0xfe; //11111110 第一行是低电平,其余三行为高电平 P3低四位是行线,高四位是列线
  temp=P3; //读取当前P3口的状态赋予temp
  temp=temp&0xf0;   //temp与0xf0求"与",再赋予temp
  if(temp!=0xf0)
  {
   delayms(10);   //延时去抖操作
   temp=P3;    //重新读取当前P3口状态
   temp=temp&0xf0;  //重新求与
   if(temp!=0xf0)
   {
    temp=P3;  //读取P3口状态
    switch(temp)
    {
     case 0xee:  //第一行第一列低电平(按键按下)  11101110
     key=0;
     break;
     
     case 0xde:   //第一行第二列低电平(按键按下) 11011110
     key=1;
     break;
      
     case 0xbe:   //第一行第三列低电平(按键按下) 10111110
     key=2;
     break;
   
     case 0x7e:   //第一行第四列低电平(按键按下) 01111110
     key=3;
     break;
    }
    while(temp!=0xf0) //等待按键是否释放
    {           
    temp=P3;   //不断取P3口状态
    temp=temp&0xf0;  // 用来检测按键是否释放 如果求与后temp不等于0xf0,则说明高四位有低电平,说明按键没有释放,继续取P3口状态用来求与比较
                  //如果求与后temp等于0xf0(11111110),则说明按键释放
    }   
    display(key);  //显示被按下按键对应的字符
   
   }
        
  }
   P3=0xfd; //11111101 第二行是低电平,其余三行为高电平 P3低四位是行线,高四位是列线
  temp=P3; //读取当前P3口的状态赋予temp
  temp=temp&0xf0;   //temp与0xf0求"与",再赋予temp
  if(temp!=0xf0)
  {
   delayms(10);   //延时去抖操作
   temp=P3;    //重新读取当前P3口状态
   temp=temp&0xf0;  //重新求与
   if(temp!=0xf0)
   {
    temp=P3;  //读取P3口状态
    switch(temp)
    {
     case 0xed:  //第二行第一列低电平(按键按下)11101101
     key=4;
     break;
     
     case 0xde:   //第二行第二列低电平(按键按下) 11011101
     key=5;
     break;
      
     case 0xbd:   //第二行第三列低电平(按键按下) 10111101
     key=6;
     break;
   
     case 0x7d:   //第二行第四列低电平(按键按下) 01111101
     key=7;
     break;
    }
       while(temp!=0xf0) //等待按键是否释放
    {           
    temp=P3;   //不断取P3口状态
    temp=temp&0xf0;  // 用来检测按键是否释放 如果求与后temp不等于0xf0,则说明高四位有低电平,说明按键没有释放,继续取P3口状态用来求与比较
                  //如果求与后temp等于0xf0(11111110),则说明按键释放
    }
    display(key);  //显示被按下按键对应的字符
   
   }
        
  }
   P3=0xfb; //11111011 第三行是低电平,其余三行为高电平 P3低四位是行线,高四位是列线
  temp=P3; //读取当前P3口的状态赋予temp
  temp=temp&0xf0;   //temp与0xf0求"与",再赋予temp
  if(temp!=0xf0)
  {
   delayms(10);   //延时去抖操作
   temp=P3;    //重新读取当前P3口状态
   temp=temp&0xf0;  //重新求与
   if(temp!=0xf0)
   {
    temp=P3;  //读取P3口状态
    switch(temp)
    {
     case 0xed:  //第三行第一列低电平(按键按下)11101011
     key=8;
     break;
     
     case 0xde:   //第三行第二列低电平(按键按下) 11011011
     key=9;
     break;
      
     case 0xbd:   //第三行第三列低电平(按键按下) 10111011
     key=10;
     break;
   
     case 0x7d:   //第三行第四列低电平(按键按下) 01111011
     key=11;
     break;
    }
    while(temp!=0xf0) //等待按键是否释放
    {           
    temp=P3;   //不断取P3口状态
    temp=temp&0xf0;  // 用来检测按键是否释放 如果求与后temp不等于0xf0,则说明高四位有低电平,说明按键没有释放,继续取P3口状态用来求与比较
                  //如果求与后temp等于0xf0(11111110),则说明按键释放
    }  
    display(key);  //显示被按下按键对应的字符
   
   }
        
  }
  P3=0xfb; //11110111 第四行是低电平,其余三行为高电平 P3低四位是行线,高四位是列线
  temp=P3; //读取当前P3口的状态赋予temp
  temp=temp&0xf0;   //temp与0xf0求"与",再赋予temp
  if(temp!=0xf0)
  {
   delayms(10);   //延时去抖操作
   temp=P3;    //重新读取当前P3口状态
   temp=temp&0xf0;  //重新求与
   if(temp!=0xf0)
   {
    temp=P3;  //读取P3口状态
    switch(temp)
    {
     case 0xe7:  //第四行第一列低电平(按键按下)11100111
     key=12;
     break;
     
     case 0xd7:   //第四行第二列低电平(按键按下) 11010111
     key=13;
     break;
      
     case 0xb7:   //第四行第三列低电平(按键按下) 10110111
     key=14;
     break;
   
     case 0x77:   //第四行第四列低电平(按键按下) 01110111
     key=15;
     break;
    }
    while(temp!=0xf0) //等待按键是否释放
    {           
    temp=P3;   //不断取P3口状态
    temp=temp&0xf0;  // 用来检测按键是否释放 如果求与后temp不等于0xf0,则说明高四位有低电平,说明按键没有释放,继续取P3口状态用来求与比较
                  //如果求与后temp等于0xf0(11111110),则说明按键释放
    }
    display(key);  //显示被按下按键对应的字符
   
   }
        
  }
  }
  void main()
  {
     P0=0x00;
   dula=1;  //关闭所有数码管的段选
  dula=0;
  wela=1;
  P0=0xc0;  //打开所有数码管的位选
  wela=0;
  while(1)
  {
   matrixkeyscan();
  }
  
  }

有点长,看起来挺累的

矩阵键盘算法太复杂了,参考论坛里面的代码吧!

用仿真器跟差跑一下,看到底是哪儿的问题,程序是调出来的!没有仿真器的话用个仿真软件也行,你这个功能简单,仿真软件实现起来也方便!

谢谢 指点 我找到原因了 是因为粗心把延时函数外循环写错了 呵呵

谢谢大虾们 有什么问题还请多多指点啊

学习了

你这程序是仿真的还是实物

是实物 在实验板上实现的

不错的文件,值得收藏

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top