本帖最后由 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);
}
}
|