矩阵键盘数码管显示0-F,调试后按键只显示0

 是哪里出错了呢,按啥键盘都是零,大家帮忙看看吧

#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;   //选中第2行1111 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(高四位) 1列2行
              case 0xdd:key=5;break;     //     1101 1101  2列2行
              case 0xbd:key=6;break;     //     1011  1101     3列2行
              case 0x7d:key=7;break;     //      0111  1101  4行2列
        }
         while(temp!=0xf0)      //等待按键释放 等高四位无低电平跳出while
         {
              temp=P3;
            temp=temp&0xf0;
        }
          display(key);
    }
   }
/***************************************/

    P3=0xfb;   //选中第3行1111 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(高四位) 1列3行
              case 0xdb:  key=9;break;     //     1101 1011  2列3行
              case 0xbb:  key=10;break;     //     1011  1011     3列3行
              case 0x7b:  key=11;break;     //      0111  1011  4行3列
         } 
         while(temp!=0xf0)      //等待按键释放 等高四位无低电平跳出while
         {
              temp=P3;
            temp=temp&0xf0;
         }
          display(key);
    }
}
/***************************************/

    P3=0xf7;   //选中第4行1111 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(高四位) 1列4行
              case 0xd7:key=13;break;     //     1101  0111  2列4行
              case 0xb7:key=14;break;     //     1011  0111     3列4行
              case 0x77:key=15;break;     //     0111  0111  4行4列
         } 
         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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单的汇编语言程序,可以读取4x4矩阵键盘按键值,并将其显示在LCD1602上。 ``` .MODEL SMALL .STACK 100H .DATA KEYPAD PORTB LCD PORTC .CODE MAIN PROC MOV AX, @DATA MOV DS, AX MOV AL, 11110000B OUT KEYPAD, AL MOV AL, 00111100B CALL SEND_COMMAND MOV AL, 00001111B OUT KEYPAD, AL MOV AL, 00001100B CALL SEND_COMMAND READ_KEY: CALL DELAY CALL READ_KEYPAD CMP AL, 0FFH JE READ_KEY MOV AH, AL MOV AL, AH CALL SEND_COMMAND MOV AL, AH AND AL, 0FH ADD AL, 30H CALL SEND_DATA JMP READ_KEY SEND_COMMAND PROC MOV BL, AL MOV AL, AL AND 0F0H OUT LCD, AL CALL DELAY MOV AL, BL AND AL, 00001111B SHL AL, 4 OUT LCD, AL CALL DELAY RET SEND_COMMAND ENDP SEND_DATA PROC MOV BL, AL MOV AL, AL AND 0F0H OR AL, 00000001B OUT LCD, AL CALL DELAY MOV AL, BL AND AL, 00001111B SHL AL, 4 OR AL, 00000001B OUT LCD, AL CALL DELAY RET SEND_DATA ENDP READ_KEYPAD PROC MOV AL, 0FFH OUT KEYPAD, AL IN AL, KEYPAD MOV BL, AL MOV AL, 11110000B OUT KEYPAD, AL MOV AL, 0F0H AND AL, BL SHR AL, 4 CMP AL, 0FH JBE ROW1 MOV AL, 0FFH JMP FINISH ROW1: MOV AL, 0EFH AND AL, BL SHR AL, 0 CMP AL, 0BH JBE ROW2 MOV AL, 0FFH JMP FINISH ROW2: MOV AL, 0DFH AND AL, BL SHR AL, 4 CMP AL, 07H JBE ROW3 MOV AL, 0FFH JMP FINISH ROW3: MOV AL, 0BFH AND AL, BL SHR AL, 0 CMP AL, 03H JBE ROW4 MOV AL, 0FFH JMP FINISH ROW4: MOV AL, 07H AND AL, BL SHR AL, 4 FINISH: RET READ_KEYPAD ENDP DELAY PROC MOV CX, 0FFFFH D1: DEC CX JNE D1 RET DELAY ENDP MAIN ENDP END MAIN ``` 在这个程序中,读取4x4矩阵键盘的代码在READ_KEYPAD过程中实现,使用SEND_COMMAND和SEND_DATA过程来向LCD1602发送命令和数据。程序将通过DELAY过程来实现简单的延迟,以确保LCD1602有足够的时间来响应命令和数据。 请注意,这只是一个基本的示例程序,并且可能需要根据你的硬件配置进行修改。如果你遇到任何问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值