MCU为430F149,编译环境为IAR,主时钟使用频率的800KHz,内部DCO。LED->P2.0, KEY1->P1.0, KEY2->P1.1。亲测可用。
/**********************************************
*程序描述:单片机的P1.0,P1.1连接两个独立按键,P1.0->KEY1,P1.1->kEY2,由外部中断下触发。P2.0->LED,MCLK = DCO 800KKHz
* 按键1按下每秒闪一下,按键2按下闪烁频率降低一半
*作者 :Zhenhua Liu
*时间 :2017.10.29 20:00
***********************************************/
#include #define keyin (P1IN & 0X0F) //用于读取按键接口的电平,延时消抖和松手检测 unsigned int KeyVal = 0; // 键值位全局变量,0表示异常,1,2分别为两个按键按下 void DelayXms(unsigned int i); void keyInit(void); //键盘设置的初始化 int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; keyInit(); //键盘初始化 P2DIR |= BIT0; //led口方向为输出 while(1){ P2OUT |= BIT0; //LED高电平 if(KeyVal==1)DelayXms(1000); //按键1按下延时1s if(KeyVal==2)DelayXms(2000); //按键2按下延时2s P2OUT &= ~BIT0; //LED低电平 if(KeyVal==1)DelayXms(1000); //按键1按下延时1s if(KeyVal==2)DelayXms(2000); //按键1按下延时2s } return 0; } /**************************************************************************** *函数名: PORT1_ISR() / *作用 :外部中断服务函数 / *返回值:无 / *参数 :无 / *作者 :Zhenhua Liu / *时间 :2017.10.29 / *****************************************************************************/ #pragma vector = PORT1_VECTOR __interrupt void PORT1_ISR(void){ if(P1IFG&0x0f){ switch(P1IFG){ case 0x01: if(keyin==0x0e) { DelayXms(5); //延时消抖 while(keyin==0x0e); //松手检测 KeyVal = 1; //键值为1 P1IFG = 0; //中断标志清零 return; } case 0x02: if(keyin==0x0d) { DelayXms(5); //延时消抖 while(keyin==0x0d); //松手检测 KeyVal = 2; //键值为2 P1IFG = 0; //中断标志清零 return; } default: { KeyVal = 0; LPM0_EXIT; P1IFG = 0; } } } } /**************************************************************************** *函数名: DelayXms() / *作用 :800KHz的MCLK下,延时大约1s / *返回值:无 / *参数 :无 / *作者 :Zhenhua Liu / *时间 :2017.10.29 / *****************************************************************************/ void DelayXms(unsigned int i){ unsigned int j; for( ; i>0; i--){ for(j=0;j<200;j++); } } /**************************************************************************** *函数名: keyInit() / *作用 :设置与四个独立按键相关的IO的配置,包括输入输出方向,中断触发方式 / *返回值:无 / *参数 :无 / *作者 :huasir / *时间 :2017.10.28 / *****************************************************************************/ void keyInit(void){ P1DIR &= ~(BIT0+BIT1+BIT2+BIT3);//设置四个按键的接受口为输入,注意,使用外部中断并不属于第二功能 P1IES |= BIT0+BIT1+BIT2+BIT3; //设置四个按键的中断触发方式为下降沿触发 P1IE |= BIT0+BIT1+BIT2+BIT3; //打开四个按键的外部中断 _EINT(); //打开总中断 }
上一篇:msp430ADC程序
下一篇:MSP430F149按键检测程序
推荐阅读最新更新时间:2024-11-08 11:44
设计资源 培训 开发板 精华推荐
- FRDM-KW38: 面向KW39/38/37 MCU的Freedom开发板
- 涂鸦APP控制RGB彩灯
- 使用 Infineon Technologies AG 的 IRU1205 的参考设计
- SECO-NCP51530HB-GEVB:NCP51530 半桥栅极驱动器的应用子卡
- 109990013,DSO Nano v3 评估套件是一款便携式数字存储示波器
- LT3755EUD 汽车降压-升压型 LED 驱动器的典型应用电路
- 面向智能设备,基于i.MX 6SoloX应用处理器的SABRE板
- MAXREFDES114#:隔离型24V至5V 10W电源
- NCL30073LED3GEVB:NCL30073LED3GEVB评估板
- LF18ABDT-TR 1.8V 极低压降稳压器的典型应用,带开关