按键检测与程序结构

2019-07-25 16:37发布

//                                      //          MC430F224                     //        -----------------                 //    /||                 |                 //     | |                 |           //     --|RST          in1 |--~^~-------|GND KEY1   1              //       |             in2 |--~^~-------|GND KEY2 //       |             in3 |--~^~-------|GND KEY3                    //       |                 |               //       |            out1 |------|<|---|Vcc  D1 LED     //       |            out2 |------|<|---|Vcc  D2 LED   //       |            out3 |------|<|---|Vcc  D3 LED   //                           //************************MC430F224******************************************** #include <msp430x22x4.h> //初级用户要习惯采用宏定义,以方便的编写和修改 #define keyio 0xf1       //定义按键IO,所有键口为0. #define key_1 0xfd       //定义返回键值1 #define key_2 0xfb       //定义返回键值2 #define key_3 0xf7       //定义返回键值3 #define LED_D1_flash  P1OUT ^= BIT1 #define LED_D2_flash  P1OUT ^= BIT2 #define LED_D3_flash  P1OUT ^= BIT3 #define bell_delay 7000 //声明子程序 unsigned char key_chcek(void); void display_update(unsigned char dta); void key_process_0(void); void key_process_1(void); void key_process_2(void); //************************************************************************* //将单片机初始化程序放在main()前面是方便查看单片机的初始化状态情况. void MCU_int(void) {//默认MCLK主时钟频率为DCO=~800K P1OUT |= BIT1+BIT2+BIT3;     //设置LED,上电为灭.电路可以查看MC430F14电路图. P1DIR |= BIT1+BIT2+BIT3;     //P1.1设置为输出. //MSP430单片机IO口上电默认方向为输入,所以接按键的IO无需再设为输入. } //************************************************************************* void main (void) { unsigned char key_value;          //定义键值全局变是   WDTCTL = WDTPW + WDTHOLD;         //关狗   MCU_int();                        //初始化单片机     while(1)                          //主程序主循环   {   key_value=key_chcek();            //检测,有键按下并松开,返回一个键值.     switch (key_value)                //对键值进行处理.switch语法结构查询   {   case key_1: key_process_0();      //调用键处理程序1               break;   case key_2: key_process_1();      //调用键处理程序2               break;     case key_3: key_process_2();      //调用键处理程序2               break;   default: ;                        //调用键处理程序4               break;       } display_update(key_value);        //如果有需要可以在这里加上显示更新程序. key_value=0x00;                   //最后清除键值.将继续主循环.   } } //************************************************************************* //按键检测程序 //返回值: 无符号字符型键值 unsigned char key_chcek(void) { unsigned int i; unsigned char timp,active; active=0; while(!active) {    while(0xff ==( P2IN | keyio));   //一直等待有键按下    timp = P2IN | keyio;             //若有键接下了,则读入IO状态.    for(i=0;i<7000;i++);             //延时,是为了去按键抖动.    if (timp ==(P2IN | keyio))       //经延时后,还是那键吗?     { active = 1;                   //,则按键有效.        while(0xff !=( P2IN | keyio));   //一直等待按键松开      }    else     {                               //去按键抖动后读入的键值与之前不同.则先效.      active = 0;                    //再循环检测.     } }     return timp;                    //返回一个键值. } //************************************************************************* void key_process_0(void)          //值处理,用户可以自己修改... { LED_D1_flash; } //************************************************************************* void key_process_1(void)         //值处理,用户可以自己修改... { LED_D2_flash; } //************************************************************************* void key_process_2(void)        //值处理,用户可以自己修改... { LED_D3_flash; } //************************************************************************* void display_update(unsigned char dta)   { ; //用户可以根据需要来放置显示程序,LCD,LED,Digital-LED....    //灵活应用, } //*************************************************************************
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
dirtwillfly
1楼-- · 2019-07-25 17:19
key.rar (1.49 KB, 下载次数: 1) 2015-8-29 11:55 上传 点击文件名下载附件
hxfxt
2楼-- · 2019-07-25 20:29
加个定时器定时扫描应该会更好点
51xlf
3楼-- · 2019-07-26 02:12
这个好久没有用到了。
51xlf
4楼-- · 2019-07-26 02:57
 精彩回答 2  元偷偷看……
尤彼卡
5楼-- · 2019-07-26 05:27
这样的程序结构很清晰呢,谢谢分享了

一周热门 更多>