| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 571 人关注过本帖
标题:矩阵键盘扫描 最后一排不一定能扫描到
只看楼主 加入收藏
SaberLion
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:85
专家分:348
注 册:2014-1-4
结帖率:100%
收藏
 问题点数:0 回复次数:2 
矩阵键盘扫描 最后一排不一定能扫描到
单片机板块貌似没什么人 我就发这儿了。。

数码管是共阳极接法,数码管是单独接的 不用锁存器
键盘是4X4的键盘P2.0~P2.3控制行,2.4~2.7是列

下面这个程序,一道3排按了都有反应,第四排按下之后不一定有反应  (有时候有,排除键盘接触不良)

程序代码:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define MASK 0xf0

uchar code table[] = {0x3f,0x06,0x5b,0x4f,
                      0x66,0x6d,0x7d,0x07,
                      0x7f,0x6f,0x77,0x7c,
                      0x39,0x5e,0x79,0x71,
                      0xff};        //  段码表
uchar code table2[] = {0xfe,0xfd,0xfb,0xf7};    //  扫描
void delay(uint i);
void display(uchar num);
void keyscan(uchar * num);

int main(void)
{
    uchar num = 16;                  //  让数码管开始显示全亮
        
    while(1)
    {
        keyscan(&num);
        display(num);        
    }
    return 0;
}

void keyscan(uchar * num)
{
    uchar temp;
    uint i;


    for(i = 0; i < 4; i++)
    {
        P2 = table2[i];               
        temp = P2;
        temp &= MASK;
        if(temp != MASK)                         //  消抖
        {
            delay(5);
            temp = P2;
            temp &= MASK;
            if(temp != MASK)
                break;
        }
    }
    switch(temp)
        {
            case 0xe0 : 
                (*num) = 4 * i + 0;
                break;
            case 0xd0 : 
                (*num) = 4 * i + 1;
                break;
            case 0xb0 : 
                (*num) = 4 * i + 2;
                break;
            case 0x70 :
                (*num) = 4 * i + 3;
                break;
            default:
                break;
        }
    while((P2 & MASK) != MASK);          //  松手消抖
    delay(5);
    while((P2 & MASK) != MASK);
}    

void delay(uint i)
{
    uint j;

    for(;i > 0; i--)
        for(j = 0; j < 100; j++)
            continue;
}

void display(uchar num)
{
    P0 = ~table[num];            //  共阳极数码管
}    
搜索更多相关主题的帖子: 单片机 数码管 键盘 MASK 
2014-03-14 09:20
SaberLion
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:85
专家分:348
注 册:2014-1-4
收藏
得分:0 
想了一上午也没想出来
减少for循环   改成3次的话  就只能扫描出2排了(相当于也是最后一行扫描不出来
2014-03-14 13:22
SaberLion
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:85
专家分:348
注 册:2014-1-4
收藏
得分:0 
啊 找到问题了  抬手消抖那边  应该放在循环里面

程序代码:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define MASK 0xf0

//sbit DULA = P2^6;
//sbit WELA = P2^7;

uchar code table[] = {0x3f,0x06,0x5b,0x4f,
                      0x66,0x6d,0x7d,0x07,
                      0x7f,0x6f,0x77,0x7c,
                      0x39,0x5e,0x79,0x71,
                      0xff};        //  段码表
uchar code table2[] = {0xfe,0xfd,0xfb,0xf7};    //  扫描
void delay(uint i);
void display(uchar num);
void keyscan(uchar * num);

int main(void)
{
    uchar num = 16;
    
/*    WELA = 1;
    P0 = 0xc0;
    WELA = 0;    */
    while(1)
    {
        keyscan(&num);
        display(num);        
    }
    return 0;
}

void keyscan(uchar * num)
{
    uchar temp;
    uint i;

    //   扫描按键并比较
    for(i = 0; i < 4; i++)
    {
/*        P3 = table2[i];
        temp = P3;     */
        P1 = table2[i];
        temp = P1;
        temp &= MASK;
        if(temp != MASK)
        {
            delay(5);
    //        temp = P3;
            temp = P1;
            temp &= MASK;
            if(temp == MASK)
                continue;
            switch(temp)
            {
                case 0xe0 : 
                    (*num) = 4 * i + 0;
                    break;
                case 0xd0 : 
                    (*num) = 4 * i + 1;
                    break;
                case 0xb0 : 
                    (*num) = 4 * i + 2;
                    break;
                case 0x70 :
                    (*num) = 4 * i + 3;
                    break;
            //    default:
            //        break;
            }
            while((P1 & MASK) != MASK);
            delay(5);
            while((P1 & MASK) != MASK);      //  抬手消抖
        }

    }

}    

void delay(uint i)
{
    uint j;

    for(;i > 0; i--)
        for(j = 0; j < 100; j++)
            continue;
}

void display(uchar num)
{
//    DULA = 1;
    P0 = ~table[num];
//    DULA = 0;
}    
2014-03-14 14:52
快速回复:矩阵键盘扫描 最后一排不一定能扫描到
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029746 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved