本帖最后由 xiao_yp2014 于 2016-1-21 14:37 编辑
大家好!我叫肖亚平,从小热爱上了电子技术,读书时阴差阳错的选择了电子这方面的专业,学习电子技术。对于我的理解来说,学校里面学到的技术不是全部实用,但是必须有用,所以一直奋斗在前线。我对学习总结出一句话“压力不是有人努力,而是比你牛X N倍的人依然在努力
说在前面:
做单片机开发少不了的就是通过按键和单片机交流,按键是单片机交流的一个桥梁,所以状态机按键扫描犹如嵌入式一样的火爆,在网上一搜一大把,一说起按键,学了单片机的人都知道有个叫做“状态机扫描的方法”,这个方法确实比其它的按键方法要好得多,我记得在星期五的一个下午,一个网友叫我帮他调一个程序,他当时说按下按键显示就不显示了,我一想,按键肯定有问题,我打开程序一看,里面居然还有像这样的语句存在“ while(!Key); ”这明显是给自己找麻烦,给CPU挖陷阱嘛,下面分享一个状态机的按键扫描方法,据说这种方法是实时最高的,今天我也是亲自试过,确定如此。
程序如下:main.c
- /********************************************************************************************
- 名 称:状态机按键扫描
- 功 能:运用状态机思想,实现按下按键LED点亮,再按一下LED灯熄灭。
- 作 者:肖亚平
- 创建时间:2014年12月14日
- 修改时间:
- 备 注:
- **************************************************************************************************/
- #include<reg52.h> //头文件
- #include"Key_State.h" //按键扫描头文件
- sbit Led = P0^7; //LED灯输出
- unsigned char Key_Number = 0; //按键值
- /********************************************************************************************
- 函数名称:主程序
- 功 能:程序执行的入口
- 返 回 值:无
- 时 间:2014-12-14
- 备 注:
- **************************************************************************************************/
- void main()
- {
- while(1)
- {
- Key_Number = read_key(); //调用按键扫描函数,取得按键值,10MS调用一次,这里我没有计时
- if(Key_Number == 1) //按键返回值是1
- {
- Led = ~Led; //LED灯取反
- }
- }
- }
复制代码
Key_State.c
- #include<reg52.h>
- sbit key_sr1 = P1^6; // 按键输入口
- #define key_state_0 0 //按键的初始状态
- #define key_state_1 1 //按键按下的状态
- #define key_state_2 2 //按键释放的状态
- /********************************************************************************************
- 函数名称:按键扫描程序
- 功 能:检测按键,并返回按键值
- 返 回 值:key_press
- 时 间:2014-12-14
- 备 注:
- **************************************************************************************************/
- unsigned char read_key(void)
- {
- static char key_state = 0; //按键的状态
- unsigned char key_press; //按键是否被按下
- unsigned char key_return = 0; //按键返回值
- key_press = key_sr1; // 读按键I/O电?
-
- switch (key_state)
- {
- case key_state_0: // 按键初始态
- if (!key_press)
- {
- key_state = key_state_1;// 键被按下,状态转换到键确认态
- }
- break;
-
- case key_state_1: // 按键确认态
- if (!key_press)
- {
- key_return = 1; // 按键仍按下,按键确认输出为“1”
- key_state = key_state_2;// 状态转换到键释放态
- }
- else
- {
- key_state = key_state_0; // 按键已抬起,转换到按键初始态
- }
- break;
-
- case key_state_2:
- if (key_press)
- {
- key_state = key_state_0;//按键已释放,转换到按键初始态
- }
- break;
- }
- return key_return; //返回按键值
- }
复制代码
Key_State.h
- #ifndef __Key_State_H__
- #define __Key_State_H__
- unsigned char read_key(void);
- #endif
复制代码
Key_State.zip
(34.43 KB, 下载次数: 1413)
|