打印

菜鸟高分求助———矩阵键盘扫描

[复制链接]
1981|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
思宁|  楼主 | 2013-1-23 19:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
下面的程序是想实现 顺序按下矩阵键盘后,在数码管上依次显示0~F,不按显示 —  但是现在不管按什么键都只显示—  电路原理图如下

程序如下
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code smgDx[17]={0xc0,0xf9,0xa4,0xb0,
                                        0x99,0x92,0x82,0xf8,0x80,0x90,
                                        0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//0~F - 段码

void DelayMs(uint xms);
uchar ScanKey(void);

void main()
{
        P2 = 0x00;
        while(1)
        {
        P0 = smgDx[ScanKey()];
        }
}
uchar ScanKey(void)
{
        uchar i, temp, m, n;//m为列号,n为行号
        bit find = 0;//有键按下标志
        P1 = 0xff;

        for(i=0; i<4; i++)
        {
                P1 = 0xef<<i;//逐列送低电平
                temp = ~P1;
                temp &= 0x0f;//屏蔽高四位,得出行值
                while(temp!=0x00)//判断有无按键按下,为0则无键按下
                {
                        DelayMs(10);//消抖
                        temp = ~P1;
                        temp &= 0x0f;//屏蔽高四位,得出行值

                        while(temp!=0x00)
                        {
                                find = 1;//有键按下
                                m = i;//列值
                                switch(temp)
                                {
                                        case 0x01: n=0; break; //第0行
                                        case 0x02: n=1; break; //第1行
                                        case 0x04: n=2; break; //2
                                        case 0x08: n=3; break; //3
                                        default: break;
                                }
                        }
                }
        if(!find) return 16;
         return (n*4+m);                  
        }

}
void DelayMs(uint xms)
{
        uint i,j;
        for(i=0;i<xms;i++)
                for(j=0;j<110;j++);
}
请大家帮我看看哪里出了问题,先谢谢各位了。

相关帖子

沙发
dong_abc| | 2013-1-23 20:19 | 只看该作者
板凳
dirtwillfly| | 2013-1-23 23:18 | 只看该作者
你的程序有问题。
函数的返回值:
        if(!find) return 16;
         return (n*4+m);
这两句位置有问题。你放到 for(i=0; i<4; i++)的循环里面了,应该放在for循环外面。
其他的还有没问题我没仔细看,你再检查一下看看。

使用特权

评论回复
地板
ayb_ice| | 2013-1-24 09:22 | 只看该作者
本帖最后由 ayb_ice 于 2013-1-25 13:50 编辑


enum{
        BIT0 = 0x01,
        BIT1 = 0x02,
        BIT2 = 0x04,
        BIT3 = 0x08,
        BIT4 = 0x10,
        BIT5 = 0x20,
        BIT6 = 0x40,
        BIT7 = 0x80,
};

enum{
        KEY_S0 = 1,
        KEY_S1 = 2,
        .......
};

typedef U8 unsigned char;




U8 scan_key(void)
{
        U8 k,x;
        U8 key;

        P1 = 0x0f;
        k = P1;
        if(k == 0x0f){
                return 0;
        }
        
        delay_10ms();
        
        P1 = 0x0f;
        k = P1;
        k = ~k & 0x0f;

        
        P1 = 0xf0;
        x = P1;
        x = ~x & 0xf0;

        k |= x;
        
        key = 0;
        switch(k){
        case BIT0+BIT4:
                k = KEY_S0;
                break;
        case BIT0+BIT5:
                k = KEY_S1;
                break;
        ......
        case BIT3+BIT7:
                k = KEY_SF;
                break;
        }
        
        return key;
}
















使用特权

评论回复
5
思宁|  楼主 | 2013-1-26 08:47 | 只看该作者
多谢各位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:行李再重我自己搬 脚步再沉我移的开 心情再黑我看的淡

5

主题

344

帖子

3

粉丝