自己测试没有什么问题,求鉴定
这个按键要每20MS 调用一下,然后用
原程序如下
/********************************
用之前把IO设置为上拉输入后每20ms调用一次就行了
每次调用 Skcankeystep()后再测试什么按键
按键处理
*****/
#ifndef _stm8_key
#define _stm8_key 1
#include "stm8s207r.h"
#define key1 0
#define key2 1
#define key3 2
#define key4 3
#define Keyport PB_IDR
#define Key1up (Keyport&(1<<key1))
#define Key1down !(Keyport&(1<<key1))
#define Key2up (Keyport&(1<<key2))
#define Key2down !(Keyport&(1<<key2))
#define Key3up (Keyport&(1<<key3))
#define Key3down !(Keyport&(1<<key3))
#define Key4up (Keyport&(1<<key4))
#define Key4down !(Keyport&(1<<key4))
#define Key_mode_scan 1
#define Key_mode_delay 2
#define Key_mode_valu 3
#define Key_mode_K4UP 4
#define GIC_Key_Valu_Key1down 1
#define GIC_Key_Valu_Key2down 2
#define GIC_Key_Valu_Key3down 3
#define GIC_Key_Valu_Key4down 4
#define GIC_Key_Valu_Key1up 5
#define GIC_Key_Valu_Key2up 6
#define GIC_Key_Valu_Key3up 7
#define GIC_Key_Valu_Key4_long_up 8
#define GIC_Key_Valu_Key4_short_up 9
#define GIC_Key_Longkey_Delaytiem 250 //0.02S*250 =5s
#define GIC_Key_Step_time 300
#define GIC_Nokey 0;
#define GIC_Cleardelay_time 0;
unsigned long int GLV_Key_Scan_time;
unsigned int GIV_Key_valu;
unsigned int GIV_Key_Mode_Step=Key_mode_scan;
unsigned int GIV_Key4_delaytime ;
void Skcankey(void)
{
if(Key4down)
{
GIV_Key_valu=4;
}
if(Key3down)
{
GIV_Key_valu=3;
}
if(Key2down)
{
GIV_Key_valu=2;
}
if(Key1down)
{
GIV_Key_valu=1;
}
if(Key1up&&Key2up&&Key3up&&Key4up)
{
{
GIV_Key_valu=5;
}
}
}
/**
以下程序是为了测试有状态机测试写的
2011年12月25日21时34分39秒
ver 01
*/
void Skcankeystep (void)
{
switch(GIV_Key_Mode_Step)
{
case Key_mode_scan:
{
if (Key4down||Key3down||Key2down||Key1down)
{
if(Key1down)
{
GIV_Key_valu=GIC_Key_Valu_Key1down;
}
if(Key2down)
{
GIV_Key_valu=GIC_Key_Valu_Key2down;
}
if(Key3down)
{
GIV_Key_valu=GIC_Key_Valu_Key3down;
}
if(Key4down)
{
GIV_Key_valu=GIC_Key_Valu_Key4down;
}
GIV_Key_Mode_Step=Key_mode_delay;
}
else
{
GIV_Key_valu=GIC_Nokey;//把上次的值清去 2011年12月26日09时24分37秒test
}
break;
}
case Key_mode_delay://
{
if (Key4down||Key3down||Key2down||Key1down)
{
if(Key1down)
{
GIV_Key_valu=GIC_Key_Valu_Key1down;
GIV_Key_Mode_Step=Key_mode_valu;
}
if(Key2down)
{
GIV_Key_valu=GIC_Key_Valu_Key2down;
GIV_Key_Mode_Step=Key_mode_valu;
}
if(Key3down)
{
GIV_Key_valu=GIC_Key_Valu_Key3down;
GIV_Key_Mode_Step=Key_mode_valu;
}
if(Key4down)
{
GIV_Key_valu=GIC_Key_Valu_Key4down;
GIV_Key_Mode_Step=Key_mode_valu;
GIV_Key4_delaytime=GIC_Cleardelay_time;
}
}
else
{ GIV_Key_valu=GIC_Nokey;
GIV_Key_Mode_Step=Key_mode_scan;//这个是防止按键太快时
//在状态2中一直等待
}
break;
}
case Key_mode_valu:
{
switch(GIV_Key_valu)
{
case GIC_Key_Valu_Key1down:
{ if(Key1up)
{
GIV_Key_valu=GIC_Key_Valu_Key1up;
GIV_Key_Mode_Step=Key_mode_scan;
}
break;
}
case GIC_Key_Valu_Key2down:
{ if(Key2up)
{
GIV_Key_valu=GIC_Key_Valu_Key2up;
GIV_Key_Mode_Step=Key_mode_scan;
}
break;
}
case GIC_Key_Valu_Key3down:
{ if(Key3up)
{
GIV_Key_valu=GIC_Key_Valu_Key3up;
GIV_Key_Mode_Step=Key_mode_scan;
}
break;
}
case GIC_Key_Valu_Key4down:
{ GIV_Key4_delaytime++;
if(Key4down&&(GIV_Key4_delaytime>GIC_Key_Longkey_Delaytiem))
{
GIV_Key_Mode_Step=Key_mode_K4UP;
GIV_Key4_delaytime=GIC_Cleardelay_time;
}
if(Key4up&&(GIV_Key4_delaytime<GIC_Key_Longkey_Delaytiem))
{
GIV_Key_valu=GIC_Key_Valu_Key4_short_up;
GIV_Key_Mode_Step=Key_mode_scan;
GIV_Key4_delaytime=GIC_Cleardelay_time; //n2011年12月25日23时03分36秒 test ok
}
break;
}
}
break;
}
case Key_mode_K4UP:
{
if(Key4up)
{
GIV_Key_valu=GIC_Key_Valu_Key4_long_up;
GIV_Key_Mode_Step=Key_mode_scan;
GIV_Key4_delaytime=GIC_Cleardelay_time;
}
break;
}
}
}
/*
状态机测试程序 2011年12月26日09时04分54秒
*/
#endif
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
都是在状态机的基础上做的
点击此处下载 ourdev_708004JHV2RX.doc(文件大小:32K) (原文件名:多功能按键.doc)
点击此处下载 ourdev_708005PD3DPE.doc(文件大小:44K) (原文件名:新型按键程序.doc)
一周热门 更多>