打印
[Cortex-M0技术交流]

RyanHsiung学习第一贴,0耗时按键!向大叔致敬!

[复制链接]
1408|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AN, TI, ST, ic, LED
本帖最后由 Ryanhsiung 于 2011-10-13 11:27 编辑

第一贴,写的不好,请多多指教
    前天晚上拿到板子,昨天就迫不及待的开始玩起来了! 最早想写一个简单按键控制LED的程序来入入门。写的差不多的时候,我想起了大叔的0耗时按键,决定向大叔学习!
我这个0耗时按键还不完善,现只有按下 松开检测,没有长按、双击检测。
程序功能
  若1 2 按键有按键按下动作,则则会触发LED4点亮的动作,若有松开动作,则会触发灭LED4的动作,按键1和按键2是相互独立的,且会通过串口返回 当前动作。
不说了上代码!
#include "includes.h"       
/********************NUC120学习板测试程序********************
**         本人在这一系列学习程序一些用法:
**      1、所有模块一般都会独立出来,放在独立的文件中
**                2、为了方便移植,大多都使用了宏定义替换先前的无意义的定义
**      3、为了方便移植,正常程序中,一般不对寄存器直接进行操作,而是使用内联函数(或宏定义)
**                                 除了一些初始化程序,和一些与底层密切相关的程序
**                 4、为了节省时间,很多应该使用枚举的地方,为了方便直接使用了宏定义
**                 5、要求不高时,一般默认非0即1的原则
**                 6、为了便于理解,一般传参中不会直接使用 数字,会使用宏定义替换(除 延时 ..等等程序)
************************************/
//以下主程序
int main (void)
{       
        User_SystemInit(); //初始化
        while(1)
        {
                //全部放在了SysTick中       
        }
}
//以下是初始化的代码,我已模块化,具体实现可以看我的工程
void User_SystemInit(void)
{
  RCC_Configuration();      //配置系统时钟         
  Serial_Init();                        //串口初始化
  SysTick_Configuration();        //配置SysTick
  Button_Init();                        //按键模块初始化
  LED_Init();                                //LED模块初始化
  printf("系统全部初始完成!!\n");
}
//以下是0耗时检测按键,函数入口放在了SYSTICK中
void Button_Check(void)
{
        static uint8_t key_count;
        static uint8_t key_flag;                //连续检测辅助标志位
        if(key_count>=(KEY_MAX_NUM-1))
        {
         key_count=0;
        }
        else
        {
                key_count++;       
        }
        if(D_PIN_HIGH == DrvGPIO_GetBit(a_E_BUTTON_PORT[key_count],a_PIN_BUTTON[key_count]))
        {//松开按键                       
                if( KEY_PRESS_THRESHOLD <= a_KeyReleaseCount[key_count])
                { //触发动作
                        if(KEY_STATUS_RELEASE != a_KeyDoneStatus[key_count] )
                        {//若已是不是按下则不动作         
                         /*********以下已经检测到了按键,可发送消息或可执行按键程序************/
                                a_KeyDoneStatus[key_count] = KEY_STATUS_RELEASE;         //变更按键当前状态       
                                a_KeyPressCount[key_count] = 0;                                                 //清0按下计数器       
                                LED_Control(D_PIN_LED4,D_LED_OFF) ;
                                printf("KEY %d 松开!\n",key_count+1);
                        }                 
                }
                else
                {        //放在这里就不会溢出了,但是不能做长按键
                        if(key_flag == D_PIN_HIGH )  //只有连续的检测才有效,若不连续重0开始计数
                                {
                                           key_flag =  D_PIN_LOW ;
                                        a_KeyReleaseCount[key_count] = 0;
                                }
                        a_KeyReleaseCount[key_count]++;
                               
                }
        }
        else
                {// 按下按键       
                  if(KEY_PRESS_THRESHOLD <= a_KeyPressCount[key_count])
                  { //触发动作                                                 
                        if(KEY_STATUS_PRESS != a_KeyDoneStatus[key_count] )
                        {//若已是不是按下则不动作         
                         /*********以下已经检测到了按键,可发送消息或可执行按键程序************/
                                a_KeyDoneStatus[key_count] = KEY_STATUS_PRESS;                 //变更按键当前状态
                                a_KeyReleaseCount[key_count] = 0;                                         //清0松开计数器
                                printf("KEY %d 按下!\n",key_count+1);                                                 
                                LED_Control(D_PIN_LED4,D_LED_ON) ;
                        }                                 
                  }
                  else
                          {//放在这里就不会溢出了,但是不能做长按键
                                if(key_flag == D_PIN_LOW  )  //只有连续的检测才有效,若不连续重0开始计数
                                        {
                                                   key_flag = D_PIN_HIGH ;
                                                a_KeyPressCount[key_count] = 0;
                                        }
                                a_KeyPressCount[key_count]++;
                        }
                }
               
}
//这是我LED控制的代码
void LED_Control(uint8_t led ,uint8_t status)
{
        E_DRVGPIO_PORT e_temp;
        //在本个开发板中可以不需要SWITCH语句,因为都在GPA端口中
        //这么写只是为了方便移植
        switch(led)
        {
                case   D_PIN_LED1:
                        {
                                e_temp         = E_D_GPLED1;
                        }break;
                case   D_PIN_LED2:
                        {                                          
                                e_temp         = E_D_GPLED2;
                        }break;
                case   D_PIN_LED3:
                        {                                       
                                e_temp         = E_D_GPLED3;
                        }break;
                case   D_PIN_LED4:
                        {                                  
                                e_temp         = E_D_GPLED4;
                        }break;
                default:
                {
                         return;          //防止进入下面的执行程序
                };
        }               
       
        if(D_LED_OFF == status)
        {                                                        
                DrvGPIO_SetBit(e_temp,led);
        }
        else
                {                       
                        DrvGPIO_ClrBit(e_temp,led);                          
                }
}

GPIO(LED BOTTON) For RyanHsiung Study.rar

1.03 MB

相关帖子

沙发
Ryanhsiung|  楼主 | 2011-10-13 11:27 | 只看该作者
本帖最后由 Ryanhsiung 于 2011-10-13 11:45 编辑

这个0耗时按键还须完善一下,以后我会改进!
   程序里涉及到了LED,KEY,SYSTICK的基本操作,若有需要该方面的网友可以提出工程中的相应模块
再请教一个问题:KEIL中内联函数怎么写???

使用特权

评论回复
板凳
Ryanhsiung|  楼主 | 2011-10-13 11:29 | 只看该作者
我的代码有2个函数是COPY 其它网友的优秀作品!在这里感谢他们!

使用特权

评论回复
地板
hotpower| | 2011-10-14 02:03 | 只看该作者
不错~~~有些问题需要解决和明白~~~

用HotISP调试的???

实际虚拟控制台也有一个串口助手的~~~

使用特权

评论回复
5
Ryanhsiung|  楼主 | 2011-10-14 08:05 | 只看该作者
4# hotpower 恩,先前的串口助手不能用,后面就用了HotISP调试

使用特权

评论回复
6
lixupengarm| | 2011-11-1 21:55 | 只看该作者
收下 看来M0也不错!!

使用特权

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

本版积分规则

认证:嵌入式技术专家
简介:道阻且长,行则将至!

64

主题

4658

帖子

14

粉丝