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

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转:C#串口编程

本文用来简单介绍一下C#串口编程的知识&#xff0c;主要以实例为内容。 凡是串口设备和计算机交互的时候都用到串口&#xff0c;在C#中我们如何来操作串口呢&#xff1f; 大话串口工作原理 实际串口是用来和外部设备进行交换数据的&#xff0c;我抽象出下面一个图形&#xff0c…

new一个数组

public class Demo {public static void main(String[] args) {Demo1 dnew Demo1();int []arr{1,2,3,4,5};for (int i 0; i < arr.length; i) {System.out.print(arr[i]" ");}System.out.println(arr);d.shuZu(arr);//发送arr并调用shuZu。System.out.println();…

c command语言学例子,乔姆斯基语言学理论发展史研究

乔姆斯基语言学理论发展史研究论文目录内容摘要第1-4 页ABSTRACT第4-5 页中文提要第5-13 页SYNOPSIS第13-24 页Introduction第24-28 页0&#xff0e;1&#xff0e;Chomskys Achievement and Influence第24-25 页0&#xff0e;2&#xff0e; Creativity of Human Language第25-2…

oracle用户权限的管理

概述&#xff1a;创建的新用户是没有任何权限&#xff0c;甚至连登陆数据库的权限都没有。因此对于新创建的用户&#xff0c;需要为其制定 权限。用于给用户赋予权限的命令为grant&#xff0c;会搜权限的命令是revoke 1. 授予权限 a) 只有system和sys用户可以给新…

社团管理信息系统C语言,学生社团信息管理系统.doc

第一章 课题背景1.1开发背景随着校园文化的不断丰富&#xff0c;大学里各种社团越来越多&#xff0c;社团活动也越来越频繁&#xff0c;社员也越来越多&#xff0c;而且大学生退社&#xff0c;入社比较频繁&#xff0c;社团管理就显得非常繁琐而又复杂的的事情&#xff0c;如果…

JavaScript创建命名空间

引入命名空间之前&#xff0c;一个令开发人员头疼的问题就是如何防止函数名/类名和其他人的冲突&#xff0c;在一个公司内部项目组之间可以通过命名预定&#xff08;比如加前缀等&#xff09;解决这个问题&#xff0c;但是把视线放到整个软件开发领域&#xff0c;在当今协作开发…

String类的方法

public class A {public static void main(String[] args) {// TODO Auto-generated method stubStringBuilder sbnew StringBuilder();//长度可变的字符串sb//可以往字符串里添加任何字符串的方法。sb.append("haha");sb.append(s).append("jjjxxx");//链…

android c聊天功能,Android实现简单C/S聊天室应用

Android的网络应用&#xff1a;简单的C/S聊天室&#xff0c;供大家参考&#xff0c;具体内容如下服务器端&#xff1a;提供两个类创建ServerSocket监听的主类:MyServer.java负责处理每个Socket通信的线程类:ServerThread.java客户端&#xff1a;是一个Android应用程序>Multi…

ID生成策略(一)

ID生成策略&#xff1a;主键手工设定很不方便&#xff0c;在我们实际工作中在MySQL里面用自增字段auto increment&#xff0c;在oracel中一般用sequence。所以把表建成auto increment&#xff0c;对于类里面对象的对应的值就不能指定了&#xff0c;得靠程序或数据库自动生成&am…

android tabpageindicator 参数,Android实现Tab布局的4种方式(Fragment+TabPageIndicator+ViewPager)...

Android现在实现Tab类型的界面方式越来越多&#xff0c;今天就把常见的实现方式给大家来个总结。目前写了&#xff1a;1、传统的ViewPager实现2、FragmentManagerFragment实现3、ViewPagerFragmentPagerAdapter实现4、TabPageIndicatorViewPagerFragmentPagerAdapter1、传统的V…

冒泡与选择排序

public class B {public static void main(String[] args) {// 冒泡排序int[] arr{1,2,34,54,5,3};//从小到大的顺序for (int j 0; j < arr.length-1; j) {//得到4个maxfor (int i 0; i < arr.length-1; i) {//内循环得到一个maxif (arr[i]>arr[i1]) {int carr[i];a…

基于visual Studio2013解决C语言竞赛题之0304整除数

&#xfeff;&#xfeff;&#xfeff;&#xfeff;题目解决代码及点评按照题目要求&#xff0c;判断数值对3和5取模的结果&#xff0c;是否为0#include <stdio.h> #include <stdlib.h> void main() {int a;printf("please input a\n");scanf_s("%d…

android驱动代码,GitHub - rumengsuifeng/AndroidDrivers: Android驱动的代码

1. 创建hardware目录&#xff0c;在该目录下创建HardCor.java文件(参考HelloWorldActivity.java文件)2. 在build.gradle(app路径)文件中添加指定so文件的目录&#xff0c;so文件的源文件是C语言编写的&#xff0c;可以放在任意一个目录&#xff0c;它就是JNI文件3. 如果工程里a…

html的路径

##html的路径 1.绝对路径&#xff1a;在不同的盘符下或者不在同一个盘符下的不同文件夹下的引用 <!--相对路径&#xff1a;1.同一个目录的.html文件和图片&#xff0c;直接引用图片文件名--> <!--2.同一个目录的.html文件和在其目录的文件夹里的图片&#xff0c;要引…

kendo-ui学习笔记——题记

1.Kendo UI基于最新技术HTML5、CSS3和JavaScript标准设计开发。2.官方网址&#xff1a;http://www.kendoui.com/3.API网上查阅英文版网址&#xff1a;http://docs.kendoui.com/api/dataviz/barcode正在使用kendo ui中HTML库进行项目开发&#xff0c;期间遇到过不少的问题&#…

搜狗输入法Android5.1,ESXI 服务器断电之后一直 LOADING MODULE IPMI_SI_DRV 的解决办法...

今日家中忽然断电&#xff0c;之后 ESXi 服务器就一直疯狂转&#xff0c;连接显示器&#xff0c;发现原来一直没有启动。停留在ESXi Loading module ipmi_si_drv 是ipmi_si_drv模块没有加载。于是各种找原因&#xff0c;google&#xff0c;看到了一个帖子如下&#xff0c;需要关…

利用CSS、JavaScript及Ajax实现图片预加载的三大方法及优缺点分析

预加载图片是提高用户体验的一个很好方法。图片预先加载到浏览器中&#xff0c;访问者便可顺利地在你的网站上冲浪&#xff0c;并享受到极快的加载速度。这对图片画廊及图片占据很大比例的网站来说十分有利&#xff0c;它保证了图片快速、无缝地发布&#xff0c;也可帮助用户在…