51的矩阵键盘,proteus做的,运行不了,求助!谢谢。

2019-07-15 10:02发布

如题,始终只显示默认的内容,按下按键没有变化,麻烦帮我看看。

代码如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar data dir_buf;
uchar key;
uchar code dir_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
uchar code key_tab[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};

void delay(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);       
}

void dir()
{
        P2=dir_tab[dir_buf];
}

void keyscan()
{
        uchar code_h,code_l,i;
        P1=0xf0;
        code_l=P1&0xf0;
        if(code_l!=0xf0)
        {
                delay(5);
                P1=0xf0;
                code_l=P1&0xf0;
                if(code_l!=0xf0)
                {
                        code_h=0xfe;
                        for(i=0;i<4;i++)
                        {
                                P1=code_h;
                                code_l=P1&0xf0;
                                if(code_l!=0xf0)
                                        break;
                                else
                                        code_h=(code_h<<1)|0x01;
                        }
                        P1=0xff;
                        while(P1!=0xff);
                        code_h=code_h&0x0f;
                        key=code_h+code_l;
                        for(dir_buf=0;dir_buf<16;dir_buf++)
                        {
                                if(key==key_tab[dir_buf])
                                        break;
                        }
                }         
        }
}

void main()
{
        dir_buf=16;
        dir();
        while(1)
        {
                keyscan();
                dir();
        }
}


接线如下:
QQ截图20170801135304.jpg

最后是全部的工程文件:
test7.rar (52.06 KB, 下载次数: 12)

谢谢了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
人中狼
2019-07-15 21:01
本帖最后由 人中狼 于 2017-8-14 19:46 编辑

试试这样改
if(code_l!=0xf0)
        {
                delay(5);
                P1=0xf0;
                code_l=P1&0xf0;
                if(code_l!=0xf0)
                {
                        code_h=0xfe;
                        for(i=0;i<4;i++)
                        {
                                P1=code_h;
                                code_l=P1&0xf0;
                                if(code_l!=0xf0)
                                {                                                                            code_h=code_h&0x0f;
                                      key=code_h+code_l;
                                }
                                else
                                        code_h=(code_h<<1)|0x01;
                        }
                        P1=0xf0;
                        while(P1!=0xf0);
                           for(dir_buf=0;dir_buf<16;dir_buf++)
                        {
                                if(key==key_tab[dir_buf])
                                        break;
                        }
                }         
        }

评分

参与人数 1积分 +5 收起 理由 fantasy1and + 5 谢谢!

查看全部评分

一周热门 更多>