矩阵键盘

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条回答
Timson
2019-03-25 11:59


[ 本帖最后由 Timson 于 2013-7-2 10:04 编辑 ]

一周热门 更多>