矩阵键盘

2019-03-24 20:39发布

C:Userszhoukai53670


#include<avr/io.h>
#include<avr/delay.h>

int main()
{       
        char temp,key;
        DDRA = 0x0f;
        while(1)
        {
                PORTA = 0x08;//设置行4输出高电平,其它为低电平
                temp = PINA;//读取PA口电平
                temp &= 0xf0;//屏蔽行电平
                if(temp != 0x00)//是否有按键按下
                {
                        _delay_ms(20);//延时20ms消抖
                        temp = PINA;//再次读取PA口电平
                        temp &= 0xf0;//屏蔽行电平
                        if(temp != 0x00)//确认有按键按下
                        {
                                temp = PINA;
                                temp &= 0xf0;
                                switch(temp)
                                {
                                        case 0x10 : key =1;break;
                                        case 0x20 : key =2;break;
                                        case 0x40 : key =3;break;
                                        case 0x80 : key =4;break;
                                }
                        }

                }
                while(temp != 0x00)//松手检测
                {
                        temp = PINA;
                        temp &= 0xf0;
                }



                PORTA = 0x04;//设置行3输出高电平,其它为低电平
                temp = PINA;//读取PA口电平
                temp &= 0xf0;//屏蔽行电平
                if(temp != 0x00)//是否有按键按下
                {
                        _delay_ms(20);//延时20ms消抖
                        temp = PINA;//再次读取PA口电平
                        temp &= 0xf0;//屏蔽行电平
                        if(temp != 0x00)//确认有按键按下
                        {
                                temp = PINA;
                                temp &= 0xf0;
                                switch(temp)
                                {
                                        case 0x10 : key =5;break;
                                        case 0x20 : key =6;break;
                                        case 0x40 : key =7;break;
                                        case 0x80 : key =8;break;
                                }
                        }

                }
                while(temp != 0x00)//松手检测
                {
                        temp = PINA;
                        temp &= 0xf0;
                }



                PORTA = 0x01;//设置行2输出高电平,其它为低电平
                temp = PINA;//读取PA口电平
                temp &= 0xf0;//屏蔽行电平
                if(temp != 0x00)//是否有按键按下
                {
                        _delay_ms(20);//延时20ms消抖
                        temp = PINA;//再次读取PA口电平
                        temp &= 0xf0;//屏蔽行电平
                        if(temp != 0x00)//确认有按键按下
                        {
                                temp = PINA;
                                temp &= 0xf0;
                                switch(temp)
                                {
                                        case 0x10 : key =9;break;
                                        case 0x20 : key =10;break;
                                        case 0x40 : key =11;break;
                                        case 0x80 : key =12;break;
                                }
                        }

                }
                while(temp != 0x00)//松手检测
                {
                        temp = PINA;
                        temp &= 0xf0;
                }



                PORTA = 0x01;//设置行1输出电平,其它为低电平
                temp = PINA;//读取PA口电平
                temp &= 0xf0;//屏蔽行电平
                if(temp != 0x00)//是否有按键按下
                {
                        _delay_ms(20);//延时20ms消抖
                        temp = PINA;//再次读取PA口电平
                        temp &= 0xf0;//屏蔽行电平
                        if(temp != 0x00)//确认有按键按下
                        {
                                temp = PINA;
                                temp &= 0xf0;
                                switch(temp)
                                {
                                        case 0x10 : key =13;break;
                                        case 0x20 : key =14;break;
                                        case 0x40 : key =15;break;
                                        case 0x80 : key =16;break;
                                }
                        }

                }
                while(temp != 0x00)//松手检测
                {
                        temp = PINA;
                        temp &= 0xf0;
                }
        }

}       
哪位大哥帮我看一看这个程序有什么问题?
我用PROTUES仿真的时候,当按键被按下后,对应被设置为输入的IO口就出现高电平,这是正常的,可是我松手后对应被设置为输入的IO口还是高电平,感觉像是开关没有弹起一样,后来试了好久都找不到原因。后来我注释掉其中三行,只留一行按键却很正常,哪位大哥帮我看一看,我真的很想知道原因。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
Li_Lei
2019-03-24 22:10
你的扫描输出是输出口,扫描输入相应io口如果设置成输入上拉就用低电平扫比如1110,1101,1011,...
如果是输入下拉状态就用高电平扫,比如0001,0010,0100,1000...

一周热门 更多>