2192|4

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

矩阵键盘 [复制链接]

C:\Users\zhoukai\53670


#include
#include

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口还是高电平,感觉像是开关没有弹起一样,后来试了好久都找不到原因。后来我注释掉其中三行,只留一行按键却很正常,哪位大哥帮我看一看,我真的很想知道原因。

最新回复

[ 本帖最后由 Timson 于 2013-7-2 10:04 编辑 ]  详情 回复 发表于 2013-7-2 09:58
点赞 关注
 

回复
举报

4008

帖子

0

TA的资源

版主

沙发
 
你的扫描输出是输出口,扫描输入相应io口如果设置成输入上拉就用低电平扫比如1110,1101,1011,...
如果是输入下拉状态就用高电平扫,比如0001,0010,0100,1000...
 
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
估计你没有输入下拉
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

4
 
/*****************************************************
函 数 名:uchar Key_scan(void)
功    能:4x4按键,按键扫描
说    明:对按键进行扫描,从而得到键编码
入口参数:无
返 回 值:有键按下返回:键编码=行扫描值+列扫描值;无按键返回0  
*****************************************************/
uchar Key_scan(void)
{
  uchar key;         // 存放键编码
  P1=0xf0;           // 取高 4 位值.即:列扫描值
  key=P1&0xf0;       // 存放键编码的高4位
  P1=0x0f;           // 取低 4 位值.即:行扫描值
  key=(P1&0x0f)|key; // 低4位与高4位进行合并
  if(key!=0xff)
  {
    return(key);     // 有键按下,返回键编码
  }
    return(0);       // 无键按下,返回0
}

/*****************************************************
函 数 名:uchar Key_switch(void)
功    能:按键转换程序
说    明:对按键码进行转换
入口参数:无
返 回 值:ASCII码  
*****************************************************/
uchar Key_switch(void)
{
   uchar key;
   key=Key_scan();
   Delay5Ms();
   switch(key)
   {
      case 0xee:return(49);break;   /* "1"键  */
          case 0xed:return(50);break;   /* "2"键  */
          case 0xeb:return(51);break;   /* "3"键  */
          case 0xe7:return(65);break;   /* "A"键  */
      case 0xde:return(52);break;   /* "4"键  */
          case 0xdd:return(53);break;   /* "5"键  */
          case 0xdb:return(54);break;   /* "6"键  */
          case 0xd7:return(66);break;   /* "B"键  */                                 
          case 0xbe:return(55);break;   /* "7"键  */                             
          case 0xbd:return(56);break;   /* "8"键  */
          case 0xbb:return(57);break;   /* "9"键  */
          case 0xb7:return(67);break;   /* "C"键  */
          case 0x7e:return(42);break;   /* "*"键  */
          case 0x7d:return(48);break;   /* "0"键  */
          case 0x7b:return(35);break;   /* "#"键  */
          case 0x77:return(68);break;   /* "D"键  */
          case 0x00:return(00);break;   /* "无"键  */
   }

   return(00);
}
 
 
 

回复

227

帖子

2392

TA的资源

管理员

5
 


[ 本帖最后由 Timson 于 2013-7-2 10:04 编辑 ]
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表