c语言写程序轮询是什么意思,单片机轮询按键程序
#include
#define uchar unsigned char
//按鍵端口定義
sbit io_key_1 = P2^0 ;
sbit io_key_2 = P2^1 ;
sbit io_key_3 = P2^2 ;
sbit io_key_4 = P2^3 ;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
//定義長按鍵的TICK數(shù),以及連_發(fā)間隔的TICK數(shù)
#define KEY_LONG_PERIOD? ?? ?? ?100
#define KEY_CONTINUE_PERIOD? ???20
#define KEY_DOUDONG? ?? ?? ?? ? 20
//定義按鍵返回值狀態(tài)(按下,長按,連_發(fā),釋放)
#define KEY_DOWN? ?? ?? ?? ?0x80
#define KEY_LONG? ?? ?? ?? ?0x40
#define KEY_CONTINUE? ?? ???0x20
#define KEY_UP? ?? ?? ?? ???0x10
//定義按鍵狀態(tài)
#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
//按鍵值
#define KEY_VALUE_1? ?? ?? ?0x0e
#define KEY_VALUE_2? ?? ?? ?0x0d
#define KEY_VALUE_3? ?? ?? ?0x0b
#define KEY_VALUE_4? ?? ?? ?0x07
#define KEY_NULL? ?? ?? ?? ?0x0f
static uchar s_u8KeyState = KEY_STATE_INIT;? ???//關(guān)鍵狀態(tài)
static uchar s_u8KeyTimeCount = 0;? ?? ?//關(guān)鍵時(shí)間計(jì)數(shù)
static uchar s_u8LastKey = KEY_NULL;? ?//保存按鍵釋放時(shí)候的鍵值
void delay_nms(unsigned char k)
{
unsigned int i,j;
for(i=0;i
for(j=0;j<120;j++)
;
}
//按鍵初始化
void KeyInit(void)
{
io_key_1 = 1;
io_key_2 = 1;
io_key_3 = 1;
io_key_4 = 1;
}
//按鍵掃描
static uchar 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;
}
void GetKey(uchar *pKeyValue)
{
static uchar s_u8KeyState = KEY_STATE_INIT ;
static uchar s_u8KeyTimeCount = 0 ;
static uchar s_u8LastKey = KEY_NULL ;? ?//保存按鍵釋放時(shí)候的鍵值
static uchar s_doudong=0;
uchar KeyTemp = KEY_NULL ;
KeyTemp = KeyScan() ;? ?? ?? ?//獲取鍵值
switch(s_u8KeyState)
{
case KEY_STATE_INIT :? ?? ?? ? //初始化S1狀態(tài)
{
if(KEY_NULL != (KeyTemp))??//如果有按鍵按下 進(jìn)入狀態(tài)2
{
s_u8KeyState = KEY_STATE_WOBBLE ;
}
}
break ;
case KEY_STATE_WOBBLE :? ?? ???//去抖動(dòng)S2狀態(tài)
{
if(++s_doudong==KEY_DOUDONG)
{
s_doudong=0;
s_u8KeyState = KEY_STATE_PRESS ;
}
else
s_u8KeyState = KEY_STATE_WOBBLE;
}
break ;
case KEY_STATE_PRESS :? ?? ?? ?//確認(rèn)有按鍵按下S3狀態(tài) 并返回按鍵值
{
if(KEY_NULL != (KeyTemp))
{
s_u8LastKey = KeyTemp ; //保存鍵值,以便在釋放按鍵狀態(tài)返回鍵值
KeyTemp |= KEY_DOWN ;? ?//按鍵按下
s_u8KeyState = KEY_STATE_LONG ;? ? //保存下次進(jìn)入長按狀態(tài)
}
else? ?//如果沒有按鍵按下 返回初始化S1
{
s_u8KeyState = KEY_STATE_INIT ;
}
}
break ;
case KEY_STATE_LONG :? ?? ?? ? //進(jìn)入長按
{
if(KEY_NULL != (KeyTemp))??//確認(rèn)有按鍵按下??計(jì)數(shù)
{
if(++s_u8KeyTimeCount > KEY_LONG_PERIOD)? ?//到達(dá)閥值 返回長按鍵值
{
s_u8KeyTimeCount = 0 ;
KeyTemp |= KEY_LONG ;? ?//長按鍵事件發(fā)生
s_u8KeyState = KEY_STATE_LONG ;? ? //保存下次進(jìn)入
}
}
else
{
s_u8KeyState = KEY_STATE_RELEASE ;? ?? ?? ?//長按狀態(tài) 按鍵放開
}
}
break ;
case KEY_STATE_CONTINUE :? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //連發(fā)狀態(tài)
{
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 ;
}
*pKeyValue = KeyTemp ; //返回鍵值
}
void Key_Proc(uchar key_value)
{
switch(key_value)
{
case KEY_VALUE_1 | KEY_DOWN:
P3=0X0f;? ? //0000 1111
delay_nms(500);
break;
case KEY_VALUE_1 | KEY_LONG:
P3 = 0xf0;??//1111 0000
break;
case KEY_VALUE_1 | KEY_UP:
P3 = 0x33;??//0011 0011
break;
default:
break;
}
}
void main(void)
{
uchar KeyValue = KEY_NULL;
KeyInit();
P2=0xff;
P3=0x00;
while(1)
{
GetKey(&KeyValue) ;
Key_Proc(KeyValue);
}
}
總結(jié)
以上是生活随笔為你收集整理的c语言写程序轮询是什么意思,单片机轮询按键程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Go语言实战》学习笔记——包
- 下一篇: java 编译原理 字符串_Java编译