chenyonken 2016-07-26 13:12 采纳率: 0%
浏览 2366
已结题

怎样在51单片几种同时使用4*4矩阵键盘和独立键盘而不让它们产生冲突

在进行键盘扫描的时候,我把矩阵键盘和独立键盘同时扫描,结果,按下矩阵键盘没有出错,但按下独立键盘则出错了,每次按下独立健得到的值都不一样,请教解决方法

 #include<reg52.h>
#include"bstv51.h"

uchar code table[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,
                   0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 
                   0x5e , 0x79 , 0x71 , 0x00};   //0-9&A-F&“不显示”  字型码

void delay(uint xms)    //延迟xms
{
    uint i,j;
    for(i=xms;i>0;i--)
      for(j=112;j>0;j--);
}

void display(uchar num)    //数码管显示函数
{
    P0=table[num];       //段选
    DU=1;
    DU=0;
}

void keyscan()
{
    uchar temp,key;

    ////////////////////////第一行扫描///////////////
    P3=0xfe;//1111 1110,让P3.0口输出低电平
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
        delay(10);
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
                case 0xee://1110 1110
                    key=7;
                //  flag_num=1;//数字键标记置1
                    break;
                case 0xde:
                    key=8;//1101 1110
                //  flag_num=1;
                    break;
                case 0xbe:
                    key=9;//1011 1110
                //  flag_num=1;
                    break;
                case 0x7e:
                    key=11;//代表加法,0111 1110
                //  flag_jia1=1;//第一个加法标记位置1
                //  flag_first_yunshuanjian=1;//第一个运算键存在标记置1
                    break;
            }
            while(temp!=0xf0)
            {
                temp=P3;
                temp=temp&0xf0;
                //FM=0;
            }
            //FM=1;

        }
    }
    /////////////////////////////第二行扫描//////////////////
    P3=0xfd;//111 1101
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
        delay(10);
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
                case 0xed://1110 1101
                    key=4;
                //  flag_num=1;
                    break;
                case 0xdd://1101 1101
                    key=5;
                //  flag_num=1;
                    break;
                case 0xbd://1011 1101
                    key=6;
                //  flag_num=1;
                    break;
                case 0x7d://0111 1101
                    key=12;//代表减法
                //  flag_jian1=1;
                //  flag_first_yunshuanjian=1;
                    break;
            }
            while(temp!=0xf0)
            {
                temp=P3;
                temp=temp&0xf0;
            //  FM=0;
            }
        //  FM=1;

        }
    }
    ///////////////////////第三行扫描/////////////////////////////////
    P3=0xfb;//1111 1011
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
        delay(10);
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
                case 0xeb://1110 1011
                    key=1; //突然想到这里key是字符型
                //  flag_num=1;
                    break;
                case 0xdb://1101 1011
                    key=2;
                //  flag_num=1;
                    break;
                case 0xbb://1011 1011
                    key=3;
                //  flag_num=1;
                    break;
                case 0x7b://0111 1011
                    key=13;//代表乘法
                //  flag_cheng1=1;
                //  flag_first_yunshuanjian=1;
                    break;
            }
            while(temp!=0xf0)
            {
                temp=P3;
                temp=temp&0xf0;
            //  FM=0;
            }
            //FM=1;

        }
        }
        /////////////////////////第四行扫描///////////////////////////////
        P3=0xf7;//1111 0111
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            delay(10);
            temp=P3;
            temp=temp&0xf0;
            if(temp!=0xf0)
            {
                temp=P3;
                switch(temp)
                {
                    case 0xe7:
                        key=15;//代表清零
                    //  flag_clear=1;//清零标记位置1
                        break;
                    case 0xd7:
                        key=0;
                    //  flag_num=1;
                        break;
                    case 0xb7:
                        key=16;//代表等号
                    //  flag_deng=1;//等号标记位置1
                        break;
                    case 0x77:
                        key=14;//代表除号
                    //  flag_chu1=1;
                    //  flag_first_yunshuanjian=1;
                        break;
                }
                while(temp!=0xf0)
                {
                    temp=P3;
                    temp=temp&0xf0;
                //  FM=0;
                }
            //  FM=1;

            }
        }
        /////////////////////////独立键盘扫描/////////////////////
        /*temp=P3;//读取P3的状态存进temp
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            delay(10);
            temp=P3;
            temp=temp&0xf0;
        if(temp!=0xf0)
        {
            //temp=P3;
            switch(temp)
            {
                case 0xe0://1110 0000
                    key=1;//代表独立键盘k1键
                //  flag_k1=1;
                    break;
                case 0xd0://1101 0000
                    key=2;//代表独立键盘k2键
                //  flag_k2=1;
                    break;
                case 0xb0://1011 0000
                    key=3;//代表独立键盘k3键
                //  flag_k3=1;
                    break;//0111 0000
                case 0x70:
                    key=4;//代表独立键盘k4键
                //  flag_k4=1;
                    break;
            }
            while(temp!=0xf0)
            {
                temp=P3;
                temp=temp&0xf0;
                FM=0;
            }
            FM=1;
        }
        }*/
        temp=P3&0xf0;
        if(temp!=0xf0)
        {
            delay(10);
            temp=P3&0xf0;
            if(temp!=0xf0)
            {   //temp=P3
                switch(temp)
                {
                case 0xe0://1110 0000
                    key=1;//代表独立键盘k1键
                //  flag_k1=1;
                    break;
                case 0xd0://1101 0000
                    key=2;//代表独立键盘k2键
                //  flag_k2=1;
                    break;
                case 0xb0://1011 0000
                    key=3;//代表独立键盘k3键
                //  flag_k3=1;
                    break;//0111 0000
                case 0x70:
                    key=4;//代表独立键盘k4键
                //  flag_k4=1;
                    break;
                }
            }
        }
        display(key);

}

void main()
{
    bstv51_init(); //学习板初始化 
    P0=0;        //位选 锁存为8位同时显示
    WE=1;
    WE=0;
    while(1)
    {
       keyscan();
    }
}

  • 写回答

1条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强