最近学习C语言,偶然看到一句话很是赞同。
学会了的境界:
境界1是自己看会了;
境界2自己独立做出来了;
境界3自己可以独立做出来,并描述出来了;
境界4可以把别人教会了。
初学单片机C语言,本按键程序,自己一直在使用,特此分享,欢迎指正。
/***************** 按键函数的变量与位定义 *******************/
static uint data r_key_t1 =0; //长按时间变量1,静态变量
bit F_key_1ms =0; //1ms定时标志位 to 按键
bit F_Key_state =0; //按键状态标志位 1:有按键 0:无按键
bit F_key_long =0; //长按标志位
bit F_key_long_on =0; //长按进行中标志位
bit F_key_short =0; //短按标志位
标志位都要在 .h 文件中声明全局bit , 变量和标志位都要初始化,建议为0,
或者在程序0000H后初始化把RAM全部清0,不然在程序复位后,可能运行出错。
/************************************************************************
函 数:单个按键短按长按函数
操作步骤:
1、在key.h 文件中声明定义按键IO口,
2、在IO口初始化,默认输入带上拉,按键低有效,
3、定时器内定时 1ms置标志位F_key_1ms,1ms扫描一次按键,
*************************************************************************/
void key_scan()
{
if(F_key_1ms) //每1ms 进来扫描一次按键
{
F_key_1ms = 0; //标志位清0
if(IO_key) //按键低有效 P00口
{
key_release(); //按键释放
}
else
{
key_press(); //按键按下
}
}
}
void key_press() //按键按下子程序
{
if(!F_Key_state) //按键状态标志位=1,跳过消抖子程序
{
// if(++r_key_t1>50) //递增后判断,消抖时间50ms
if(++r_key_t1&0x40) //进阶版,替换上一行
{
r_key_t1 = 0; //消抖计数清0
F_Key_state = 1; //按键状态标志位=1
}
}
// if(F_key_long_on)
// {
// F_key_long = 1; //一直长按,一直置1,无极调光时连续使用,
// }
if(!F_key_long_on) // 不在长按状态
{
// if(++r_key_t1 >1000) //长按时间1ms*1000
if(++r_key_t1 & 0x400) //进阶版,替换上一行 ,用逻辑与,在keil中比用>更省ROM空间
{
r_key_t1 = 0; //按键时间清0
F_key_long = 1; //长按标志位=1
F_key_long_on = 1; //长按进行中标志位=1
}
}
}
void key_release() //按键松开子程序
{
r_key_t1 = 0; //按键时间清0
if(F_key_long_on) //F_key_long_on=1时
{
F_Key_state = 0; //按键状态标志位=0 ,避免长按后,识别到短按。
F_key_long_on = 0; //长按进行中标志位清0
}
if(F_Key_state) //
{
F_key_short = 1; //按键松开有效,短按标志位=1
}
F_Key_state = 0; //按键状态标志位=0
}