51单片机的状态机消抖

发布者:耿高良最新更新时间:2016-01-20 来源: eefocus关键字:51单片机  状态机  消抖 手机看文章 扫描二维码
随时随地手机看文章
下午把状态机无延时按键消抖弄到51单片机上面,下面晒一下程序:
 
#include
 
enum State {Init, Press, Free}; //定义按键状态的枚举类型
enum State Key_State;    //按键状态
 
sbit Key1 =  P2^4;
sbit Key2 =  P2^5;
sbit Key3 =  P2^6;
sbit Key4 =  P2^7;
 
 
void Delay_ms(unsigned int x)
{
int i,j;
for(i=0; i<110; i++)
for(j=0; j
;
}
//===============================================================================
//函数名称:键盘扫描(状态机无延时消抖)
//说明:键盘接口对应: key1 = P2-4 key2 = P2-5  key3 = P2-6 key4 = P2-7
//参数:
//返回值:
//日期:2011-6-22
//修改:
//===============================================================================
void Keyscan(void)
{
 
switch (Key_State) 
{
  case Init :     // 按键初始态
    if((P2 | 0x0f) != 0xff)
    {
    Key_State = Press;        // 键被按下,但需要确认是否是干扰
    }
    break;
  case Press :     // 按键确认态
   if((P2 | 0x0f) != 0xff)       //如有键按下则不是干扰,判断键值     
   {           
        //判断是哪一个按键被按下
        if( (P2 | 0xef) != 0xff )     //第一个键被按下 
        {
P1 = 0xfe;
Delay_ms(500);
P1 = 0xff;
        }
        if( (P2 | 0xdf) != 0xff )     //第二个键被按下
        {
P1 = 0xfd;
Delay_ms(500);
P1 = 0xff;
        }
        if( (P2 | 0xbf) != 0xff )     //第三个键被按下
        {
P1 = 0xfb;
Delay_ms(500);
P1 = 0xff;
        }
        if( (P2 | 0x7f) != 0xff )     //第四个键被按下
        {
P1 = 0xf7;
Delay_ms(500);
P1 = 0xff;
        }
        Key_State = Free; // 状态转换到键释放态
   }
   else
   {
       Key_State = Init; // 按键已抬起,属于干扰,转换到按键初始态
   }
   break;
  case Free :
   if((P2 | 0x0f) == 0xff) //判断按键是否释放
   {
       Key_State = Init; //如果按键释放,转换到按键初始态
   }
   break;
}
}
 
这是另外一种,其实都差不多,只不过比较直观而已。
 
void Keyscan(void)
{
 
switch (Key_State) 
{
  case Init :     // 按键初始态
    if((Key1 == 0) | (Key2 == 0) | (Key3 == 0) | (Key4 == 0))
    {
    Key_State = Press;        // 键被按下,但需要确认是否是干扰
    }
    break;
  case Press :     // 按键确认态
   if((Key1 == 0) | (Key2 == 0) | (Key3 == 0) | (Key4 == 0))   //如有键按下则不是干扰,判断键值     
   {           
        //判断是哪一个按键被按下
        if(Key1 == 0)     //第一个键被按下 
        {
P1 = 0xfe;
Delay_ms(500);
P1 = 0xff;
        }
 
        if((Key2 == 0))     //第二个键被按下
        {
P1 = 0xfd;
Delay_ms(500);
P1 = 0xff;
        }
        if((Key3 == 0))    //第三个键被按下
        {
P1 = 0xfb;
Delay_ms(500);
P1 = 0xff;
        }
        if((Key4 == 0))     //第四个键被按下
        {
P1 = 0xf7;
Delay_ms(500);
P1 = 0xff;
        }
 
        Key_State = Free; // 状态转换到键释放态
   }
   else
   {
       Key_State = Init; // 按键已抬起,属于干扰,转换到按键初始态
   }
   break;
  case Free :
   if((Key1 == 1) & (Key2 == 1) & (Key3 == 1) & (Key4 == 1)) //判断按键是否释放
   {
       Key_State = Init; //如果按键释放,转换到按键初始态
   }
   break;
}
}
关键字:51单片机  状态机  消抖 引用地址:51单片机的状态机消抖

上一篇:keil 51启动代码
下一篇:c51中的intrins.h库函数

推荐阅读最新更新时间:2024-03-16 14:44

MCS-51单片机汇编中的“指针”
111条单片机指令中让我想起高级语言中的指针的功能。 数据传送类指令中的 指针 1)MOV A,@Ri 2)MOV direct,@Ri 3)MOV @Ri,A MOV @Ri,direct MOV @Ri,#data8 4)MOVX A,@Ri MOV A,@DPTR 5)MOVX @Ri,A 6)MOVX @DPTR,A @:指向的意思。
[单片机]
51单片机-继电器
继电器控制方式: * 单片机I/O口控制端 * 继电器控制端 * 光耦控制端 * 在原理图中TX-3那部分,用单片机控制继电器把P35与JDQ连接在一起,如果B极是低电平,那么VCC的电流流过B,电流流过C极,通过继电器的线圈,指针从常闭端打到常开端。对应上边继电器左边绿色的那三个中间的是中间端,一个常开端,一个常闭端。平时中间端和常闭端是导通的,一控制继电器吸合,中间端和常开端导通。 NPN与PNP的区别 NPN和PNP主要就是电流方向和电压正负不同,说得 专业 一点,就是 极性 问题。 NPN 是用 B E 的电流(IB)控制 C E 的电流(IC),E极电位最低,且正常放大
[单片机]
<font color='red'>51单片机</font>-继电器
51单片机计数器编程举例 计数值到一定大小后中断报警
程序: ORG 0000H AJMP START ORG 001BH AJMP TIMER1 ;定时器1的 中断 处理 ORG 30H START: MOV SP,#5FH MOV TMOD,#01010000B ;定时/计数器1作计数用,模式1,0不用全置0 MOV TH1,#0FFH MOV TL1,#0FAH ;预置值,要求每计到6个脉冲即为一个事件 SETB EA SETB ET1 ;开总中断和定时器1中断允许 SETB TR1 ;启动计数器1开始运行. AJMP $ TIMER1: PUSH ACC PUSH PSW CPL P1.0 ;计数值到,即取反P1.0 MOV TH1,#0F
[单片机]
基于AT89S51单片机设计的电子琴
1.实验任务 (1).由4X4组成16个按钮矩阵,设计成16个音。 (2).可随意弹奏想要表达的音乐。 2.电路原理图 3.系统板硬件连线 (1).把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上; (2).把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4R1-R4端口上; 4.相关程序内容 (1).4X4行列式键盘识别; (2).音乐产生的方法; 一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定
[单片机]
基于AT89S<font color='red'>51单片机</font>设计的电子琴
51单片机C编程(三、4位数码管飞入效果)
4位数码管飞入效果,PROTEUS仿真电路图如下: #include reg51.h #define uchar unsigned char #define LED P0 uchar code tab ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳数码管数字码 uchar disp1 ={{8,10,10,10},{0,8,10,10},{5,0,8,10},{1,5,0,8},{10,1,5,0},{10,10,1,5},{10,10,10,1},{10,10,10,10}}; //数码管的8个显示状态 uchar scan;
[单片机]
51单片机基础之1602显示器
代码: main.c文件 #include public.h #include lcd1602.h /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { int a=111; lcd160
[单片机]
<font color='red'>51单片机</font>基础之1602显示器
关于51单片机的定时器T0、T1总结
这是我总结的51单片机的中断定时器原理,之后会附上附件。第一次发帖,不足之处请多多包含! 我总结的文稿画面很花,所以给上个参考,各位不习惯的话,请酌情选择。 目录 一、原理: 1、对中断和定时器进行初始化: ①定时器/计数器工作方式寄存器 ②设定初值 ③开启中断和定时器 2、设置中断服务程序: 3、主函数: 二、各个定时器和工作方式: 方式0: 方式2: 方式3: 借鉴:郭天祥《新概念51单片机C语言教程》 一、原理: 51单片机,拥有两个定时器,用来中断计数,分别是T0和T1。而52单片机和51单片机的定时器是一样的,只是52比51多了一个定时器/计数器T2,它们的设置都大同小异,下面我来总结各个定时器的用法。 定时器
[单片机]
关于<font color='red'>51单片机</font>的定时器T0、T1总结
基于51单片机的车用数字仪表设计与实现
摘 要:介绍了一种以MCS 51单片机为主控器,以ADC0809为核心,以气压、油压、温度、霍尔元件等传感器为主要外围元件的车用数字仪表(VDI)的设计与实现。该仪表系统具有显示直观、准确,使用方便可靠等优点,代表了车用仪表的最新发展趋势。 关键词: MCS 51单片机;传感器;车用数字仪表 引言 ---车辆仪表是驾驶员与汽车进行信息交流的重要接口和界面,是车辆安全行驶的重要保证。随着电子技术的广泛应用,传统汽车仪表逐渐被微处理器为核心的电子控制数字仪表取代已成为必然趋势。然而,目前国内车辆仪表数字化水平还不高,绝大部分仪表还是模拟式的,而大多数模拟仪表表头的体积较大、数量多,使得显示系统拥挤不堪,影响美观;另外
[单片机]
基于<font color='red'>51单片机</font>的车用数字仪表设计与实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved