电子工程师技术服务社区
- 社区首页
- 下载
- 独立按键-状态机-控制LED灯protues仿真图.zip
资料描述
/*单次按键 指示灯依此点亮 连续按键,指示灯快速依此点亮*/
#include
#define uint unsigned int
#define uchar unsigned char
sbit key1=p3^2;// 按键位定义
typedef enum keystate1 {csstate,qrstate,dcstate,lxstate};
//按键状态有: 初始状态 确认状态 单次触发状态 连续触发状态 默认的话就是 0 1 2 3
typedef enum ledstate {d0,d1,d2,d3,d4,d5,d6,d7} ;
//指示灯状态有: 0 1 2 3 4 5 6 7
void time0init(void) //定时器t0
{
tmod=0x01;//定时器t0方式1
th0=(65536-10000)/256;//装10ms的初值
tl0=(65536-10000)%256;
tr0=1;//开启定时器t0
}
uchar keyscan(void)
{
static uchar keystate=0;//按键状态变量
static uchar keytime=0; //按键时间变量
uchar keyvalue;//按键值
uchar num;//指示灯点亮的变量
keyvalue=key1; //读取按键值 如果按键按下后 keyvalue=0 进入了csstate状态
switch(keystate)
{
case csstate:
if(keyvalue==0)//说明按键是按下 进入qrstate状态
{keystate=qrstate;}
else //否则是干扰,重新回到csstate状态 重新检测
{keystate=csstate;}
break;
case qrstate:
if(keyvalue==0)//说明按键是按下 进入dcstate状态
{keystate=dcstate;}
else //消抖没有完成 重新检测
{keystate=csstate;}
break;
case dcstate:
keytime++;
if(keyt