标题:
单片机独立按键状态机源程序
[打印本页]
作者:
练氏
时间:
2017-11-4 11:36
标题:
单片机独立按键状态机源程序
分享一个独立按键控制的状态机程序,赚点币。 有详细的注解,请看附录
单片机源程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED = P1^0;//继电器(P1.0)接口定义 P1口的其他口可以接LED,也可以接LED,反正效果一样
/**************************************/
/**************定时器中断**************/
/**************************************/
void Timer0_init()
{
TMOD = 0x01;//定时器定时模式,16位定时
TH0 = 0xf8;//设定定时器初值2ms
TL0 = 0xcc;
TR0 = 1;//开启定时器
ET0 = 1;//定时器中断
EA = 1;//总中断
}
/**************************************/
/*********状态机按键扫描函数***********/
/*********返回值: 按键码值************/
/**************************************/
uchar Key_Scan(void)
{
static uchar State_Cnt=0;//静态变量,用于改变状态过程
uchar Key_State = 0;//用于存储键值码
switch(State_Cnt)
{
case 0x00:P3 = 0x0f;//先往P3(1到4独立按键)口送0000 1111
if(P3 != 0x0f)//有无按键被按下
{
State_Cnt = 0x01;//改变状态
break;
}
case 0x01:
if(P3 != 0x0f)//经过定时器延时后,再次判断按键是否按下
{
State_Cnt = 0x02;//改变状态
Key_State = P3;//把键值保存下来
P3 = 0x0f;//恢复P3,以便下次按下重新保存键值
break;
}
else
{
State_Cnt = 0x00;//改变状态
break;
}
case 0x02:
if(P3 == 0x0f)//判断按键释放
{
State_Cnt = 0x00;//改变状态
break;
}
default:break;
}
return Key_State;//返回键值
}
/**************************************/
/************按键功能函数**************/
/***********参数:按键键码*************/
/**************************************/
void Display_Key(uchar key_value)
{
switch(key_value)
{
case 0x0e:LED = 1;break;//键值改变时,做出相应的动作(用户自定义动作)
case 0x0d:LED = 0;break;
case 0x0b:P1 = 0x00;break;
case 0x07:P1 = 0xff;break;
}
}
void main()
{
Timer0_init();
while(1);
}
/************定时器0中断函数**************/
void Timer0() interrupt 1
{
static Time_Counter = 0;//定义变量,以便计数
TH0 = 0xf8;//重新放入中断初值
TL0 = 0xcb;
Time_Counter++;//中断一次,值加1
if(Time_Counter == 5)//累计10ms的延时,以便消抖
{
Time_Counter = 0;
Display_Key(Key_Scan());//按键按下,键值码送入函数,以便做相应动作
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
状态机按键程序.rar
(14.62 KB, 下载次数: 86)
2017-11-4 11:35 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
bhjyqjs
时间:
2018-2-9 18:14
很好的状态机处理键盘例程
作者:
ldh119
时间:
2020-5-2 16:09
程序不错,但是有点小问题。case 0x01: if(P3 != 0x0f) 。。。。。
这个不能说明是同一个按键产生的状态,所以有肯能会误判。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1