3379|12

30

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

请指点一下按键,谢谢大家 [复制链接]




#define  keyin  (P1IN&0xf0)//宏定义   判断按键是否按下,按下为keyin,否则为0xff
uchar keyz;
/****************
  用到的函数
*********************/
void delay(uchar t);
void key_int();
void keyscan();


/*****************
        延  时
***********************/
void delay(uchar t)
{
    uint i,j;
    for(i=0;i       for(j=0;j<1000;j++);
}


/********************
    键盘初始化
    配置P1引脚,
    关闭中断,
    使用边沿触发中断的模式,用下降沿
************************/
void key_int()
{
  
   P1DIR=0x0f;//高位输入,地位输出
   P1OUT=0xf0;//高四位输出为1,第四位输出为低
     P1IE=0;
     P1IFG=0;
     P1IES=0;
     
     
     P1IE |=BIT4;//允许中断
     P1IES |=BIT4;//下降沿触发
     P1IE |=BIT5;
     P1IES |=BIT5;
     P1IE |=BIT6;
     P1IES |=BIT6;
     P1IE |=BIT7;
     P1IES |=BIT7;

}

/**********************
    键     值
    通过高四位判断键位,低四位判断行
**************************/


void keyscan()

{
  uchar temp;
  P1DIR=0X0f;
  P1OUT=0xfe;
   
    if(keyin!=0xf0)
    {
        delay(5);
        if(keyin!=0xf0)
        {
          temp=keyin;
            delay(5);
            switch(temp)
            {
            case 0xee:keyz=1;break;
            case 0xde:keyz=2;break;
            case 0xbe:keyz=3;break;
            case 0x7e:keyz=4;break;
            }
           while(keyin!=0xf0);
        }
    }
/**************第二行****************/
   P1OUT=0Xfd;
   
    if(keyin!=0xf0)
    {
        delay(5);
        if(keyin!=0xf0)
        {  temp=keyin;
            delay(5);
            switch(temp)
            {
            case 0xed:keyz=5;break;
            case 0xdd:keyz=6;break;
            case 0xbd:keyz=7;break;
            case 0x7d:keyz=8;break;
            }
             while(keyin!=0xf0);
        }
    }
   
    /**************第3行****************/
  P1OUT=0Xfb;
   
    if(keyin!=0xf0)
    {
        delay(5);
        if(keyin!=0xf0)
        {
          temp=keyin;
            delay(5);
            switch(temp)
            {
            case 0xeb:keyz=9;break;
            case 0xdb:keyz=10;break;
            case 0xbb:keyz=11;break;
            case 0x7b:keyz=12;break;
            }
            while(keyin!=0xf0);
        }
    }
    /**************第4行****************/
    P1OUT=0Xf7;
   
    if(keyin!=0xf0)
    {
        delay(5);
        if(keyin!=0xf0)
        { delay(5);
          temp=keyin;
           
            switch(temp)
            {
            case 0xe7:keyz=13;break;
            case 0xd7:keyz=14;break;
            case 0xb7:keyz=15;break;
            case 0x77:keyz=16;break;
            }
            while(keyin!=0xf0);
        }
    }

}


不知道为什么这样子写不得,麻烦指点一二,小女子在此谢过了

最新回复

本帖最后由 仙猫 于 2014-11-1 23:35 编辑 是不是这张图啊? 看程序还以为是扫描4×4矩阵键盘呢,图里只有S2~S5四个键,而且接在P1的低4位。而程序似乎在用P1的高4位读入。 若仅有4个键的话都不必扫描,只一句就读完了。   详情 回复 发表于 2014-11-1 23:31
 
点赞 关注

回复
举报

3471

帖子

11

TA的资源

五彩晶圆(高级)

沙发
 
你要达到什么效果,现在遇到什么问题,具体现象是什么,先把情况描述清楚吧~~~~

点评

恩恩,我就是想简单的用按键在液晶上显示1到16而已,可是不显示,  详情 回复 发表于 2014-11-1 20:48
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

板凳
 
既然P1的高4位是给16个键复用的,恐怕就不好用跃变沿中断,而只能用定时器中断检测了。
另外一点细节:每行P1低位输出后,未加任何延迟立刻读回高位,会不会读漏?当然这要看电路了。

点评

可是他一旦变低,PIES=1—>下降沿触发,P1IFG置位—>中断产生,我就是利用这个中断来判断按键是否按下的  详情 回复 发表于 2014-11-1 21:20
 
 
 

回复

2781

帖子

419

TA的资源

五彩晶圆(中级)

4
 
别忘了内部使能上拉电阻
P1REN |= BIT4;                            // Enable P1.4 internal resistance
   P1OUT |= BIT4;                            // Set P1.4 as pull-Up resistance

点评

可是我用另一种方法也是可以的,不需要上拉电阻呢  详情 回复 发表于 2014-11-1 20:52
 
个人签名
 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

5
 
ienglgge 发表于 2014-11-1 16:46
你要达到什么效果,现在遇到什么问题,具体现象是什么,先把情况描述清楚吧~~~~

恩恩,我就是想简单的用按键在液晶上显示1到16而已,可是不显示,

点评

/************* 按键值 ****************/ void keyscan() { P1DIR=0xf0; uchar temp; P1OUT =0x7f; //选择第一列 if(keyin!=0x0f);//是否有按键按下 { delay(5); if(keyin!  详情 回复 发表于 2014-11-1 20:56
 
个人签名正在学习MSP430的5系列,希望大家多多指导
 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

6
 
qinkaiabc 发表于 2014-11-1 17:28
别忘了内部使能上拉电阻
P1REN |= BIT4;                            // Enable P1.4 internal resistance ...

可是我用另一种方法也是可以的,不需要上拉电阻呢
 
个人签名正在学习MSP430的5系列,希望大家多多指导
 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

7
 
沫沫律 发表于 2014-11-1 20:48
恩恩,我就是想简单的用按键在液晶上显示1到16而已,可是不显示,

/*************
按键值
****************/
void keyscan()
{
  P1DIR=0xf0;
  uchar temp;
  P1OUT =0x7f;      //选择第一列
  if(keyin!=0x0f);//是否有按键按下
  {
      delay(5);
      if(keyin!=0x0f)
      {  
        temp =keyin;
          delay(5);

          switch(temp)
          {
          case 0x07:keyz=0;break;
          case 0x0b:keyz=1;break;
          case 0x0d:keyz=2;break;
          case 0x0e:keyz=3;break;
          }
       while(keyin!=0x0f);  //松手检测

      }
  }


  P1OUT =0xbf;      //选择第2列
  if(keyin!=0x0f);//是否有按键按下
  {
      delay(5);
      if(keyin!=0x0f)
      {  
        temp =keyin;
          delay(5);

          switch(temp)
          {
          case 0x07:keyz=4;break;
          case 0x0b:keyz=5;break;
          case 0x0d:keyz=6;break;
          case 0x0e:keyz=7;break;
          }
       while(keyin!=0x0f);  //松手检测

      }
  }


  P1OUT =0xdf;      //选择第3列
  if(keyin!=0x0f);//是否有按键按下
  {
      delay(5);
      if(keyin!=0x0f)
      {  
        temp =keyin;
          delay(5);

          switch(temp)
          {
          case 0x07:keyz=8;break;
          case 0x0b:keyz=9;break;
          case 0x0d:keyz=10;break;
          case 0x0e:keyz=11;break;
          }
       while(keyin!=0x0f);  //松手检测

      }
  }


  P1OUT =0xef;      //选择第4列
  if(keyin!=0x0f);//是否有按键按下
  {
      delay(5);
      if(keyin!=0x0f)
      {  
        temp =keyin;
          delay(5);

          switch(temp)
          {
          case 0x07:keyz=12;break;
          case 0x0b:keyz=13;break;
          case 0x0d:keyz=14;break;
          case 0x0e:keyz=15;break;
          }
       while(keyin!=0x0f);  //松手检测

      }
  }
}

P1初始化
*******************/
void P1_int()
{
    P1DIR=0XF0;//高4位输出,低4位输入
    P1OUT =0X0f;//高4位0,低4位1
    P1IFG=0;//无中断挂起
    P1IES=0;//选择边沿触发中断,有必要先清除中断标志位
    P1IE =0;//禁止中断  
    P1IE |=BIT0;
    P1IES |=BIT0;//下降沿时置位P1.0的P1IFG0标志
    P1IE |=BIT1;
    P1IES |=BIT1;
    P1IE |=BIT2;
    P1IES |=BIT2;
    P1IE |=BIT3;
    P1IES |=BIT3;

}

这是用高4位判断是否有按下按键的,可行

 
个人签名正在学习MSP430的5系列,希望大家多多指导
 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

8
 
仙猫 发表于 2014-11-1 17:00
既然P1的高4位是给16个键复用的,恐怕就不好用跃变沿中断,而只能用定时器中断检测了。
另外一点细节:每 ...

可是他一旦变低,PIES=1—>下降沿触发,P1IFG置位—>中断产生,我就是利用这个中断来判断按键是否按下的

点评

假如16个键分别接16个引脚,用跃变沿中断的方法或可行,但现在是16个键复用4个引脚,未被监视的行的中断怎么发生呢? 建议贴出电路图来讨论,否则可能大家想的不是同一个讨论点。 而且,楼上提到的上拉没准还真是  详情 回复 发表于 2014-11-1 21:32
 
个人签名正在学习MSP430的5系列,希望大家多多指导
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

9
 
沫沫律 发表于 2014-11-1 21:20
可是他一旦变低,PIES=1—>下降沿触发,P1IFG置位—>中断产生,我就是利用这个中断来判断按键是否按下的

假如16个键分别接16个引脚,用跃变沿中断的方法或可行,但现在是16个键复用4个引脚,未被监视的行的中断怎么发生呢?
建议贴出电路图来讨论,否则可能大家想的不是同一个讨论点。
而且,楼上提到的上拉没准还真是问题,当然也有可能是你对的,在不看电路图的情况下无法判断。

点评

不需要监视行的中断啊,我首先就已经确定了行的位置了,所以只要有一个边沿触发就可以产生中断的  详情 回复 发表于 2014-11-2 16:37
恩恩,我不会发截图,所以上传了pdf,希望见谅  详情 回复 发表于 2014-11-1 22:10
 
 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

10
 
仙猫 发表于 2014-11-1 21:32
假如16个键分别接16个引脚,用跃变沿中断的方法或可行,但现在是16个键复用4个引脚,未被监视的行的中断 ...

恩恩,我不会发截图,所以上传了pdf,希望见谅

map430f5438原理图.pdf

207.05 KB, 下载次数: 1

点评

是不是这张图啊? 看程序还以为是扫描4×4矩阵键盘呢,图里只有S2~S5四个键,而且接在P1的低4位。而程序似乎在用P1的高4位读入。  详情 回复 发表于 2014-11-1 23:31
 
个人签名正在学习MSP430的5系列,希望大家多多指导
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

11
 
本帖最后由 仙猫 于 2014-11-1 23:35 编辑
沫沫律 发表于 2014-11-1 22:10
恩恩,我不会发截图,所以上传了pdf,希望见谅

是不是这张图啊?
看程序还以为是扫描4×4矩阵键盘呢,图里只有S2~S5四个键,而且接在P1的低4位。而程序似乎在用P1的高4位读入。
若仅有4个键的话都不必扫描,只一句就读完了。

点评

这是我的430板的图,我以为你说的是这个,呵呵不好意思,谢谢你啊,其实我程序没问题,就是按键坏了,我用的软按键是坏的,换了一个就可以了,谢谢哈  详情 回复 发表于 2014-11-2 16:34
 
 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

12
 
仙猫 发表于 2014-11-1 23:31
是不是这张图啊?
看程序还以为是扫描4×4矩阵键盘呢,图里只有S2~S5四个键,而且接在P1的低4位。而程 ...

这是我的430板的图,我以为你说的是这个,呵呵不好意思,谢谢你啊,其实我程序没问题,就是按键坏了,我用的软按键是坏的,换了一个就可以了,谢谢哈
 
个人签名正在学习MSP430的5系列,希望大家多多指导
 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

13
 
仙猫 发表于 2014-11-1 21:32
假如16个键分别接16个引脚,用跃变沿中断的方法或可行,但现在是16个键复用4个引脚,未被监视的行的中断 ...

不需要监视行的中断啊,我首先就已经确定了行的位置了,所以只要有一个边沿触发就可以产生中断的
 
个人签名正在学习MSP430的5系列,希望大家多多指导
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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