星河清梦. 2022-06-10 19:13
浏览 35
已结题

矩阵键盘只扫到了一行

问题遇到的现象和发生背景

矩阵键盘按键 数码管显示0-F

问题相关代码,请勿粘贴截图

#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

// 按键0—F静态显示

sbit dula=P2^6; //申明U1锁存器锁存端
sbit wela=P2^7; //U2

uchar code table[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
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; //选中第一行1111 1110
temp=P3; //读数据
temp=temp&0xf0; //与1111 0000相与,高四位有低电平,temp值发生改变
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee: key=0;break; // 1110 1110 1行1列
case 0xde: key=1;break; // 1101 1110 2行1列
case 0xbe: key=2;break; // 1011 1110 3行1列
case 0x7e: key=3;break; // 0111 1110 4行1列
}
while(temp!=0xf0) //等待按键释放 等高四位无低电平跳出while
{
temp=P3;
temp=temp&0xf0;
}

      display(key);
}

}
/***************************************/

P3=0xfd;   //选中第21111 1101
temp=P3;    //读数据
temp=temp & 0xf0;        //1111 0000相与,高四位有低电平,temp值发生改变
if(temp != 0xf0)
{
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp != 0xf0)
    {
     temp=P3;
     switch(temp)
     {
          case 0xed: key=4;break;     //     1110(低四位) 1101(高四位) 12行
          case 0xdd: key=5;break;     //     1101 1101  22行
          case 0xbd: key=6;break;     //     1011  1101     32行
          case 0x7d: key=7;break;     //      0111  1101  42列
    }
     while(temp!=0xf0)      //等待按键释放 等高四位无低电平跳出while
     {
          temp=P3;
        temp=temp&0xf0;
    }
      display(key);
}

}
/***************************************/

P3=0xfb;   //选中第31111 1011
temp=P3;    //读数据
temp=temp&0xf0;        //1111 0000相与,高四位有低电平,temp值发生改变
if(temp!=0xf0)
{
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
     temp=P3;
     switch(temp)
     {
          case 0xeb:  key=8;break;     //     1110(低四位) 1011(高四位) 13行
          case 0xdb:  key=9;break;     //     1101 1011  23行
          case 0xbb:  key=10;break;     //     1011  1011     33行
          case 0x7b:  key=11;break;     //      0111  1011  43列
     } 
     while(temp!=0xf0)      //等待按键释放 等高四位无低电平跳出while
     {
          temp=P3;
        temp=temp&0xf0;
     }
      display(key);
}

}
/***************************************/

P3=0xf7;   //选中第41111 0111
temp=P3;    //读数据
temp=temp&0xf0;        //1111 0000相与,高四位有低电平,temp值发生改变
if(temp!=0xf0)
{
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
     temp=P3;
     switch(temp)
     {
          case 0xe7: key=12;break;     //     1110(低四位) 0111(高四位) 14行
          case 0xd7: key=13;break;     //     1101  0111  24行
          case 0xb7: key=14;break;     //     1011  0111     34行
          case 0x77: key=15;break;     //     0111  0111  44列
     } 
     while(temp!=0xf0)      //等待按键释放 等高四位无低电平跳出while
     {
          temp=P3;
        temp=temp & 0xf0;
     }

      display(key);
    }
 }

}

void main()
{
P0=0; //关闭所有数码管段选
dula=1;
dula=0;

P0=0xc0; //位选中所有数码管
wela=1;
wela=0;

while(1)
{
matrixkeyscan(); //不停的调用键盘扫描
}
}

//0xc0 1100 0000

运行结果及报错内容

仿真仅第一行按键有效,其他行按下为0,或者没反应

我的解答思路和尝试过的方法

进行相同模块代码对照,未发现错误i

我想要达到的结果
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 6月18日
    • 创建了问题 6月10日

    悬赏问题

    • ¥300 寻抓云闪付tn组成网页付款链接
    • ¥15 请问Ubuntu要怎么安装chrome呀?
    • ¥15 视频编码 十六进制问题
    • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
    • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
    • ¥15 FileNotFoundError 解决方案
    • ¥15 uniapp实现如下图的图表功能
    • ¥15 u-subsection如何修改相邻两个节点样式
    • ¥30 vs2010开发 WFP(windows filtering platform)
    • ¥15 服务端控制goose报文控制块的发布问题