| 
 
| 本帖最后由 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);
 }
 }
 
 
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册 
  |