|
发表于 2011-8-18 20:55:00
|
显示全部楼层
【32楼】 duxingkei 独行客
-------------------------------
下面是单双击程序,上面的是带12864串口驱动,很好用的程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#include<intrins.h>
#include<stdlib.h>
#define LCD_data P0
sbit cs=P2^4;
sbit sid=P2^5;
sbit sclk=P2^6;
sbit PSB=P2^1;
//根据按键硬件连接定义按键键值
#define KEY_VALUE_1 0x0e
#define KEY_VALUE_2 0x0d
#define KEY_VALUE_3 0x0b
#define KEY_VALUE_4 0x07
#define KEY_NULL 0x0f
//定义长按键的TICK数,以及连_发间隔的TICK数
#define KEY_LONG_PERIOD 300
#define KEY_CONTINUE_PERIOD 150
//定义按键返回值状态(按下,长按,连_发,释放)
#define KEY_DOWN 0x80
#define KEY_LONG 0x40
#define KEY_CONTINUE 0x20
#define KEY_UP 0x10
//定义按键状态
#define KEY_STATE_INIT 0
#define KEY_STATE_WOBBLE 1
#define KEY_STATE_PRESS 2
#define KEY_STATE_LONG 3
#define KEY_STATE_CONTINUE 4
#define KEY_STATE_RELEASE 5
//其中io_key_1等是我们按键端口的定义,如下所示:
sbit io_key_1 = P3^0 ;
sbit io_key_2 = P3^1 ;
sbit io_key_3 = P3^2 ;
sbit io_key_4 = P3^3 ;
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
static uint KeyScan(void)
{
if(io_key_1 == 0)return KEY_VALUE_1 ;
if(io_key_2 == 0)return KEY_VALUE_2 ;
if(io_key_3 == 0)return KEY_VALUE_3 ;
if(io_key_4 == 0)return KEY_VALUE_4 ;
return KEY_NULL ;
}
uint GetKey()
{
static uint s_u8KeyState = KEY_STATE_INIT ;
static uint s_u8KeyTimeCount = 0 ;
static uint s_u8LastKey = KEY_NULL ; //保存按键释放时候的键值
uint KeyTemp = KEY_NULL ;
KeyTemp = KeyScan() ; //获取键值
switch(s_u8KeyState)
{
case KEY_STATE_INIT :
{
if(KEY_NULL != (KeyTemp))
{
s_u8KeyState = KEY_STATE_WOBBLE ;
}
}
break ;
case KEY_STATE_WOBBLE : //消抖
{
s_u8KeyState = KEY_STATE_PRESS ;
}
break ;
case KEY_STATE_PRESS :
{
if(KEY_NULL != (KeyTemp))
{
s_u8LastKey = KeyTemp ; //保存键值,以便在释放按键状态返回键值
KeyTemp |= KEY_DOWN ; //按键按下
s_u8KeyState = KEY_STATE_LONG ;
}
else
{
s_u8KeyState = KEY_STATE_INIT ;
}
}
break ;
case KEY_STATE_LONG :
{
if(KEY_NULL != (KeyTemp))
{
if(++s_u8KeyTimeCount > KEY_LONG_PERIOD)
{
s_u8KeyTimeCount = 0 ;
KeyTemp |= KEY_LONG ; //长按键事件发生
s_u8KeyState = KEY_STATE_CONTINUE ;
}
}
else
{
s_u8KeyState = KEY_STATE_RELEASE ;
}
}
break ;
case KEY_STATE_CONTINUE :
{
if(KEY_NULL != (KeyTemp))
{
if(++s_u8KeyTimeCount > KEY_CONTINUE_PERIOD)
{
s_u8KeyTimeCount = 0 ;
KeyTemp |= KEY_CONTINUE ;
}
}
else
{
s_u8KeyState = KEY_STATE_RELEASE ;
}
}
break ;
case KEY_STATE_RELEASE :
{
s_u8LastKey |= KEY_UP ;
KeyTemp = s_u8LastKey ;
s_u8KeyState = KEY_STATE_INIT ;
}
break ;
default : break ;
}
return KeyTemp ; //返回键值
}
delay(uint a)
{
uint x,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}
void main(void)
{
uint KeyValue = KEY_NULL;
uint temp = 0 ;
while(1)
{
delay(50);
KeyValue=GetKey();
KeyValue&=KeyValue;
if(KeyValue == (KEY_VALUE_1 | KEY_DOWN)) P1=0xfe ;
if(KeyValue == (KEY_VALUE_1 | KEY_LONG))P1=0xef ;
if(KeyValue == (KEY_VALUE_1 | KEY_CONTINUE)) P1=0xf0;
//if(KeyValue == (KEY_VALUE_1 | KEY_UP))P1=0x0f;
KeyValue=0;
}
} |
|