按键检测与程序结构

[复制链接]
1168|5
手机看帖
扫描二维码
随时随地手机跟帖
dirtwillfly|  楼主 | 2015-8-29 11:48 | 显示全部楼层 |阅读模式
//                                      
//          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....
   //灵活应用,
}
//*************************************************************************

相关帖子

dirtwillfly|  楼主 | 2015-8-29 11:56 | 显示全部楼层
key.rar (1.49 KB)

使用特权

评论回复
hxfxt| | 2015-8-29 18:15 | 显示全部楼层
加个定时器定时扫描应该会更好点

使用特权

评论回复
51xlf| | 2015-8-30 23:04 | 显示全部楼层
这个好久没有用到了。

使用特权

评论回复
51xlf| | 2015-8-30 23:05 | 显示全部楼层
矩阵扫描。

使用特权

评论回复
尤彼卡| | 2015-8-31 20:09 | 显示全部楼层
这样的程序结构很清晰呢,谢谢分享了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入TI MCU论坛      21ic TI技术交流1群:61549143(已满),  21ic TI技术交流2群:311421422 我的博客:http://blog.timcu.com/

1179

主题

34648

帖子

1115

粉丝