智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1966|回复: 2
打印 上一主题 下一主题

奇葩的矩阵键盘

[复制链接]

42

主题

1054

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3034

优秀会员奖章活跃会员奖章

QQ
威望
1650
贡献
780
兑换币
625
注册时间
2012-7-6
在线时间
302 小时
跳转到指定楼层
1#
发表于 2013-8-7 10:59:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 穆旦阿斗 于 2013-8-7 11:03 编辑

我的矩阵键盘是行扫描,液晶显示1~16。前面两行和后面一行可以正常显示,第三行液晶没反应,这个是哪错了呢?我直接短路第三行和任意列也没有反应

IO口初始化
void IO_Init(void)
{
    DDRA = 0xFF;//A口用于液晶
   
    DDRB = 0x0F;//高位输入低位输出 //低位是行
    PORTB= 0xFF;
    PUCR_PUPBE = 1;
}

矩阵键盘
void KeyScan(void)
{
    PORTB = 0xF0;
    _asm(nop);   
    if( PORTB ^ 0xF0 )
    {
        PORTB = 0xFE;
        _asm(nop);
        switch( PORTB & 0xF0 )
        {
            case 0xE0:Num=1;break;
            case 0xD0:Num=2;break;
            case 0xB0:Num=3;break;
            case 0x70:Num=4;break;
        }
                    
        PORTB = 0xFD;
        _asm(nop);
        switch( PORTB & 0xF0 )
        {
            case 0xE0:Num=5;break;
            case 0xD0:Num=6;break;
            case 0xB0:Num=7;break;
            case 0x70:Num=8;break;
        }
        
        PORTB = 0xFB;
        _asm(nop);
        switch( PORTB & 0xF0 )
        {
            case 0xE0:Num=9; break;
            case 0xD0:Num=10;break;
            case 0xB0:Num=11;break;
            case 0x70:Num=12;break;
        }
        
        PORTB = 0xF7;
        _asm(nop);      
        switch( PORTB & 0xF0 )
        {
            case 0xE0:Num=13;break;
            case 0xD0:Num=14;break;
            case 0xB0:Num=15;break;
            case 0x70:Num=16;break;
        }        
    }   
}

4

主题

190

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2184

优秀会员奖章活跃会员奖章在线王奖章

威望
933
贡献
591
兑换币
531
注册时间
2012-10-23
在线时间
330 小时
2#
发表于 2013-8-7 11:09:02 | 只看该作者
看看扫描连续性,和点平上拉,中断处理有没问题~
回复 支持 反对

使用道具 举报

42

主题

1054

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3034

优秀会员奖章活跃会员奖章

QQ
威望
1650
贡献
780
兑换币
625
注册时间
2012-7-6
在线时间
302 小时
3#
 楼主| 发表于 2013-8-7 11:42:50 | 只看该作者
本帖最后由 穆旦阿斗 于 2013-8-7 11:44 编辑
mirsfzrx520 发表于 2013-8-7 11:09
看看扫描连续性,和点平上拉,中断处理有没问题~

呵呵 解决了事实证明不是这些的问题

把扫描第三行按键的程序改为
PORTB = 0xFB;
        _asm(nop);
        temp = PORTB & 0xF0;
        switch( temp )
        {
            case 0xE0:Num=9; break;
            case 0xD0:Num=10;break;
            case 0xB0:Num=11;break;
            case 0x70:Num=12;break;
        }

但是我其他行都没改都没有问题啊,为什么这个要这样处理呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-6-29 08:43 , Processed in 0.043544 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表