智能车制作

标题: 奇葩的矩阵键盘 [打印本页]

作者: 穆旦阿斗    时间: 2013-8-7 10:59
标题: 奇葩的矩阵键盘
本帖最后由 穆旦阿斗 于 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;
        }        
    }   
}


作者: mirsfzrx520    时间: 2013-8-7 11:09
看看扫描连续性,和点平上拉,中断处理有没问题~
作者: 穆旦阿斗    时间: 2013-8-7 11:42
本帖最后由 穆旦阿斗 于 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;
        }

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





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2