3087|3

2057

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

430launchpad—NOKIA1202扩展板,简单高效好用的按键扫描代码 [复制链接]

本帖最后由 IC爬虫 于 2014-5-7 09:51 编辑

在处理按键的时候,对按键按下和长按这两种模式的判要写一个高效,方便移植的程序可能并不是那么容易,参考了网络上前辈的代码,将其移植到了我的430Launchpad——NOKIA1202液晶扩展板上,效果很好!特点: 1.支持长短按键同时并行触发。
          2.将短按键触发判据改为下降沿触发,即增加了检测短按键释放功能
说明:我板子上有5个按键,这里提供的代码只演示检测左边的一个按键,这种按键检测的方式不适合用在阻塞式的程序中,在执行KEY_Read()这个函数的周期不能太长,可以在定时器的中断中去执行这个函数是较好的选择。有兴趣的同学可以细细推倒一下,并且烧到板子上试验一下,加深对其的理解。

提供给大家: 演示效果视频 http://v.youku.com/v_show/id_XNzA4NjM5MDY4.html?firsttime=40
  1. #include “msp430g2553.h”

  2. //定义NOKIA1202控制板的五个按键的控制管脚配置
  3. #define KEY_SWR       BIT0    //P1.0
  4. #define KEY_SWUP      BIT3    //P1.3
  5. #define KEY_SWDM      BIT7    //P2.7
  6. #define KEY_SWL       BIT6    //P2.6
  7. #define KEY_SWQ       BIT5    //P2.5

  8. #define KEY_SW_R_UP_SEL    P1SEL
  9. #define KEY_SW_L_DM_Q_SEL  P2SEL

  10. #define KEY_SW_R_UP_DIR    P1DIR
  11. #define KEY_SW_L_DM_Q_DIR  P2DIR

  12. #define KEY_SW_R_UP_IN     P1IN
  13. #define KEY_SW_L_DM_Q_IN   P2IN

  14. #define KEY_SW_R_UP_REN    P1REN
  15. #define KEY_SW_L_DM_Q_REN  P2REN

  16. #define KEY_SW_R_UP_OUT    P1OUT
  17. #define KEY_SW_L_DM_Q_OUT  P2OUT

  18. unsigned char Trg;
  19. unsigned char Cont;

  20. void KEY_Init(void)
  21. {
  22.   KEY_SW_R_UP_SEL   &=~ (KEY_SWR + KEY_SWUP); //P1.0及P1.3为GPIO功能
  23.   KEY_SW_L_DM_Q_SEL &=~ (KEY_SWDM + KEY_SWL + KEY_SWQ); //P2.5,P2.6,P2.7为GPIO功能
  24.   
  25.   KEY_SW_R_UP_DIR   &=~ (KEY_SWR + KEY_SWUP); //P1.0及P1.3作为输入端口
  26.   KEY_SW_L_DM_Q_DIR &=~ (KEY_SWDM + KEY_SWL + KEY_SWQ); //2.5,P2.6,P2.7作为输入端口
  27.   //使能内部上拉电阻
  28.   KEY_SW_R_UP_REN   |= KEY_SWR + KEY_SWUP;
  29.   KEY_SW_L_DM_Q_REN |= KEY_SWDM + KEY_SWL + KEY_SWQ;
  30.   KEY_SW_R_UP_OUT   |= KEY_SWR + KEY_SWUP;
  31.   KEY_SW_L_DM_Q_OUT |= KEY_SWDM + KEY_SWL + KEY_SWQ;
  32. }

  33. void KEY_Read(void)
  34. {
  35.   unsigned char ReadData = (KEY_SW_L_DM_Q_IN & KEY_SWL)^KEY_SWL;
  36.   Trg = ReadData & (ReadData ^Cont);
  37.   Cont = ReadData;
  38. }

  39. void main()
  40. {
  41.   WDTCTL = WDTPW | WDTHOLD; // 禁用看门狗
  42.   DCOCTL = 0x00;         // Set DCOCLK to 16MHz
  43.   BCSCTL1 =CALBC1_16MHZ; // Set DCO
  44.   DCOCTL = CALDCO_16MHZ;
  45.   
  46.   BCSCTL1|=DIVA_1;       //ACLK =MCLK/2=8M
  47.   BCSCTL2|=DIVS_1;       //SMCLK=MCLK/2=8M
  48.   P1DIR |= BIT6;
  49.   P2DIR |= BIT4;
  50.   P1OUT &=~ BIT6;
  51.   P2OUT &=~ BIT4;
  52.   unsigned int i,y;
  53.   KEY_Init();
  54.   while(1)
  55.   {
  56.     KEY_Read();
  57.     if(Trg&KEY_SWL)
  58.     {
  59.       P1OUT ^= BIT6;
  60.     }
  61.     if(Cont&KEY_SWL)
  62.     {
  63.       P2OUT ^= BIT4;
  64.       for(i=0;i<36000;i++)
  65.       {
  66.         for(y=0;y<10;y++);
  67.       }
  68.     }
  69.   }
  70. }
复制代码

最新回复

怎么识别长按的?没看明白。 是否需要添加按键消抖?  详情 回复 发表于 2014-5-9 09:25

赞赏

1

查看全部赞赏

 
点赞 关注(1)

回复
举报

384

帖子

2

TA的资源

纯净的硅(初级)

沙发
 
顶起!

点评

不细看这个程序是无法知道这个程序好在哪里的。 感觉不错就分享给大家了。  详情 回复 发表于 2014-5-9 09:08
 
个人签名

I-Love-MCU

 

回复

2057

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 

不细看这个程序是无法知道这个程序好在哪里的。
感觉不错就分享给大家了。
 
 
 

回复

384

帖子

2

TA的资源

纯净的硅(初级)

4
 
怎么识别长按的?没看明白。
是否需要添加按键消抖?
 
个人签名

I-Love-MCU

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表