#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数,以及连_发间隔的TICK数

#define KEY_LONG_PERIOD         100

#define KEY_CONTINUE_PERIOD     20

#define KEY_DOUDONG             20

//定义按键返回值状态(按下,长按,连_发,释放)

#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

//按键值

#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;     //关键状态

static uchar s_u8KeyTimeCount = 0;      //关键时间计数

static uchar s_u8LastKey = KEY_NULL;   //保存按键释放时候的键值

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 ;   //保存按键释放时候的键值

static uchar s_doudong=0;

uchar KeyTemp = KEY_NULL ;

KeyTemp = KeyScan() ;         //获取键值

switch(s_u8KeyState)

{

case KEY_STATE_INIT :          //初始化S1状态

{

if(KEY_NULL != (KeyTemp))  //如果有按键按下 进入状态2

{

s_u8KeyState = KEY_STATE_WOBBLE ;

}

}

break ;

case KEY_STATE_WOBBLE :        //去抖动S2状态

{

if(++s_doudong==KEY_DOUDONG)

{

s_doudong=0;

s_u8KeyState = KEY_STATE_PRESS ;

}

else

s_u8KeyState = KEY_STATE_WOBBLE;

}

break ;

case KEY_STATE_PRESS :         //确认有按键按下S3状态 并返回按键值

{

if(KEY_NULL != (KeyTemp))

{

s_u8LastKey = KeyTemp ; //保存键值,以便在释放按键状态返回键值

KeyTemp |= KEY_DOWN ;   //按键按下

s_u8KeyState = KEY_STATE_LONG ;    //保存下次进入长按状态

}

else   //如果没有按键按下 返回初始化S1

{

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_LONG ;    //保存下次进入

}

}

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 ;

}

*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);

}

}

c语言写程序轮询是什么意思,单片机轮询按键程序相关推荐

  1. C语言写300k文件大概多少行,为什么 DELPHI 编译出的程序一般的来说至少都有300k呢?...

    满意答案 rdfjl 2013.10.06 采纳率:45%    等级:7 已帮助:163人 其实,只要用到类.函数库,你的法度榜样长度都邑增长的.小结: EXE文件长度要想变小,可: 1) 不应用类 ...

  2. C语言第五篇 python调用C语言写的动态链接库DLL文件

    学习目标:1.学会C语言写windows下的DLL文件.2.用gcc命令将C程序编译成DLL文件.3.学会用python调用C语言写的DLL. 学习内容1:先用C语言写一个简单程序,先建立dll.c文 ...

  3. 单片机c语言的按键程序,51单片机按键扫描C程序

    原标题:51单片机按键扫描C程序 大二上学期做过80 的按键程序,当时项目要求实现按键控制 屏显示并且接收GPRS传来的数据.当时为了节省成本,就去大西电子市场买来8*8的LED块,然后自己一点一点的 ...

  4. mapreduce编程实例python-使用Python语言写Hadoop MapReduce程序

    原标题:使用Python语言写Hadoop MapReduce程序 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 在本教程中,我将描述如何使用Pytho ...

  5. C语言写CGI程序【转】

    一.CGI概述 CGI(公用网关接口)规定了Web服务器调用其他可执行程序(CGI程序)的接口协议标准.Web服务器通过调用CGI程序实现和Web浏览器的交互, 也就是CGI程序接受Web浏览器发送给 ...

  6. C语言写的流氓关机程序及破解

    记得大二刚开始接触电脑的那个时候,偶尔会弹出一个强制关机的窗口,当时没有办法,如下: 现在看来只是一个小程序而已,用C语言编写的: #include<windows.h>int main( ...

  7. c语言程序会使cpu变高,用 C 语言写个程序,运行时,cpu占用率一直保持50%

    好记性不如烂笔头 --东西太多,脑子永远不够用 问题 用 C 语言写个程序,运行时,cpu占用率一直保持50% 解决方案 一看题目好眼熟!<编程之美>!然而已经记不清楚了,果然东西需要经常 ...

  8. 编写程序乘法口诀表C语言,陈广川问:c语言编程九九乘法口诀表 怎样用c语言写九九乘法口诀表?...

    怎样用c语言写九九乘法口诀表? 哈哈,我刚刚用javascript写好乘法口诀表. C语言,如何编写程序输出九九乘法表.形式如下 ********* ******** ******* ****** * ...

  9. c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...

    求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束 /* 以下是主要的逻辑代码,还有些.c和.h就没发了 ...

最新文章

  1. openssl的实践应用
  2. [cocos2d-x·总结]关于cocos2d-x几种画图方法的用法与思考
  3. nyist 一笔画问题
  4. VirtualBox使用技巧
  5. Ubuntu12.04下Linux内核编译
  6. 施一公谈自己35岁和53岁的区别
  7. 天津科技大学计算机基础,天津科技大学大学计算机基础样卷
  8. 【人工智能】利用C语言实现KNN算法进行手写数字识别
  9. Spark MLib 数据类型
  10. matlab 模拟滤波器转换为数字滤波器,一种模拟滤波电路数字化方法
  11. pbp 读取 mysql数据_pbp: Django项目开发,个人博客网站类。
  12. 接口Request传参的常用注解
  13. ELK详解(七)——Kibana部署
  14. Java前端自定义错误信息封装_SpringBoot2.3定制错误页面的方法示例
  15. 软件测试理论试题及答案
  16. [CTF]RAR加密原理
  17. 速达启动时显示“对象名ACCSET无效“
  18. No MyBatis mapper was found in ‘[xx.mapper]‘ package. Please check your configuration.特殊处理
  19. ubuntu使用certbot给nginx添加ssl证书
  20. 20170627总结

热门文章

  1. 前端学习(662):逻辑运算符练习
  2. java面试题33 Math.round(11.5) 等于多少 (). Math.round(-11.5) 等于多少 ( ).
  3. exp/imp和expdp/impdp在功能上的区别:
  4. MySQL之——The slave I/O thread stops because master and slave have equal...
  5. Centos7中Memcached安装使用说明
  6. C++const的多种用法
  7. unity之中级工程师
  8. 【iCore3应用开发平台】发布 iCore3 应用开发平台出厂代码rev0.0.2
  9. 解决Unity3D导出apk失败:Failed to re-package resources
  10. win7创建虚拟无线网络