|
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- #include “msp430g2553.h”
- //定义NOKIA1202控制板的五个按键的控制管脚配置
- #define KEY_SWR BIT0 //P1.0
- #define KEY_SWUP BIT3 //P1.3
- #define KEY_SWDM BIT7 //P2.7
- #define KEY_SWL BIT6 //P2.6
- #define KEY_SWQ BIT5 //P2.5
- #define KEY_SW_R_UP_SEL P1SEL
- #define KEY_SW_L_DM_Q_SEL P2SEL
- #define KEY_SW_R_UP_DIR P1DIR
- #define KEY_SW_L_DM_Q_DIR P2DIR
- #define KEY_SW_R_UP_IN P1IN
- #define KEY_SW_L_DM_Q_IN P2IN
- #define KEY_SW_R_UP_REN P1REN
- #define KEY_SW_L_DM_Q_REN P2REN
- #define KEY_SW_R_UP_OUT P1OUT
- #define KEY_SW_L_DM_Q_OUT P2OUT
- unsigned char Trg;
- unsigned char Cont;
- void KEY_Init(void)
- {
- KEY_SW_R_UP_SEL &=~ (KEY_SWR + KEY_SWUP); //P1.0及P1.3为GPIO功能
- KEY_SW_L_DM_Q_SEL &=~ (KEY_SWDM + KEY_SWL + KEY_SWQ); //P2.5,P2.6,P2.7为GPIO功能
-
- KEY_SW_R_UP_DIR &=~ (KEY_SWR + KEY_SWUP); //P1.0及P1.3作为输入端口
- KEY_SW_L_DM_Q_DIR &=~ (KEY_SWDM + KEY_SWL + KEY_SWQ); //2.5,P2.6,P2.7作为输入端口
- //使能内部上拉电阻
- KEY_SW_R_UP_REN |= KEY_SWR + KEY_SWUP;
- KEY_SW_L_DM_Q_REN |= KEY_SWDM + KEY_SWL + KEY_SWQ;
- KEY_SW_R_UP_OUT |= KEY_SWR + KEY_SWUP;
- KEY_SW_L_DM_Q_OUT |= KEY_SWDM + KEY_SWL + KEY_SWQ;
- }
- void KEY_Read(void)
- {
- unsigned char ReadData = (KEY_SW_L_DM_Q_IN & KEY_SWL)^KEY_SWL;
- Trg = ReadData & (ReadData ^Cont);
- Cont = ReadData;
- }
- void main()
- {
- WDTCTL = WDTPW | WDTHOLD; // 禁用看门狗
- DCOCTL = 0x00; // Set DCOCLK to 16MHz
- BCSCTL1 =CALBC1_16MHZ; // Set DCO
- DCOCTL = CALDCO_16MHZ;
-
- BCSCTL1|=DIVA_1; //ACLK =MCLK/2=8M
- BCSCTL2|=DIVS_1; //SMCLK=MCLK/2=8M
- P1DIR |= BIT6;
- P2DIR |= BIT4;
- P1OUT &=~ BIT6;
- P2OUT &=~ BIT4;
- unsigned int i,y;
- KEY_Init();
- while(1)
- {
- KEY_Read();
- if(Trg&KEY_SWL)
- {
- P1OUT ^= BIT6;
- }
- if(Cont&KEY_SWL)
- {
- P2OUT ^= BIT4;
- for(i=0;i<36000;i++)
- {
- for(y=0;y<10;y++);
- }
- }
- }
- }
复制代码
|
赞赏
-
1
查看全部赞赏
-
|