经典防抖动键C51源程序

发布者:cw57324588最新更新时间:2016-10-28 来源: eefocus关键字:防抖动键  C51  源程序 手机看文章 扫描二维码
随时随地手机看文章
********************************************************/
//单片机四独立按键控制四LED;
//四个独立按键对应四个独立的LED.
//当某一按键按下时对应的LED亮,当第二次按下时灭。
//四个LED只能有一个亮,初学者可以参考以下程式:

/********************************************************/

#i nclude   < reg52.h >
unsigned char k_scan();
unsigned char k_pro();
unsigned char k_new,k_old;
unsigned char k;

void delay(unsigned char m);

sbit k1=P1^4;   sbit k2=P1^5;
sbit k3=P1^6;   sbit k4=P1^7; 
sbit led0=P0^0; sbit led1=P0^1;
sbit led2=P0^2; sbit led3=P0^3;

bit n;

/********************************************************/
void main(void)
{  
   P0=0xff;
   k_old=0x00;     

   while(1)
  {
    k_new=k_scan();

     if(k_new!=k_old)
      {  delay(1);
          if(k_new!=k_old)
          {k_old=k_new;
            k=k_pro();}
      }
 
     switch(k)
      {
         case 1:{if(n)led0=0;else if(!n)led0=1;} break;
         case 2:{if(n)led1=0;else if(!n)led1=1;} break;
         case 3:{if(n)led2=0;else if(!n)led2=1;} break;
         case 4:{if(n)led3=0;else if(!n)led3=1;} break;
         default: break;
       }
   }
}

/********************************************************/
unsigned char k_pro()
 {
    switch (k_new)
    {
        case 0x01:{k=1;if(led1&led2&led3){n=!n;}
        else {P0=0xff;}} 
        break;
        case 0x02:{k=2;if(led0&led2&led3){n=!n;}P0=0xff;}
        break;
        case 0x04:{k=3;if(led0&led1&led3){n=!n;}P0=0xff;} 
        break;
        case 0x08:{k=4;if(led0&led1&led2){n=!n;}P0=0xff;}
        break;

       default:
       break;
    }
     return(k);
 }

/********************************************************/
unsigned char k_scan()
{  
    P1=0xff;
    k_new=0x00;
    k_new=k_new|(!k4);
    k_new=k_new<<1;
    k_new|=(!k3);
    k_new=k_new<<1;
    k_new|=(!k2);
    k_new=k_new<<1;
    k_new|=(!k1);
    return(k_new);                      //无键按下k_new=0x00
}

/********************************************************/
void delay(unsigned char m)
{
   while(m--)
   {
    unsigned char i=255;
    while(i--);
    }
}

/********************************************************/

/*

还可以将 k_scan 函数更改为:

unsigned char k_scan()
{  
    P1=0xff;
    k_new=0x00;
    k_new=(~(P1) & 0xf0)>>4;
    return(k_new);                        //无键按下k_new=0x00
}

*/

关键字:防抖动键  C51  源程序 引用地址:经典防抖动键C51源程序

上一篇:X25045驱动程序
下一篇:LCD12864 驱动 ,采用串行方式

推荐阅读最新更新时间:2024-03-16 15:18

单片机C51编程几个有用的模块
Keil C51常用功能模块使用说明 说明 本文档包括单片机系统中常用到的时钟中断、通讯及键盘扫描等模块(见所附源程序)的说明。这些模块使用前后台系统模型。为达到最大的灵活性, 需要在用户工程中定义config.h文件, 在其中定义各模块可选参数的设置,而不是直接更改源代码。 这些可选内容大部分为宏定义,如果不定义宏相应的功能在编译时被屏蔽,不会增加代码长度。 具体可选内容见各模块中的说明。 在Config.h文件中还要包含一个单片机硬件的资源头文件。 各模块使用了定义在Common.h中的一些数据类型。如:BIT(bit) BYTE(unsigned char)等,具体请参见源程序。 时钟模块 在单片机软件设计中, 时钟是
[单片机]
C51驱动步进电机
代码: 采用1-2相励磁的方式使步进电机正向转动起来 #include reg52.h #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; 数码管段选定义 uchar code step_table ={0xc4,0xcc,0xc8,0xd8,0xd0,0xf0,0xe0,0xe4}; void delay(uint t) void main() { uint i; P0=00; 关掉数码管避免乱显示,因为没有用到 delay(500); dula=1; delay(500); dula=0;
[单片机]
<font color='red'>C51</font>驱动步进电机
PIC单片机驱动TM1616源程序
/*本程序适用于没有SIP功能的单片机添加SIP发送功能*/ #include pic.h __CONFIG(0x1832); //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define clk P10 //定义时钟管脚 #define clk RC3 //定义时钟管脚 #define dio RC5 //定义数据管脚 #define stb RC2 //定义片选管脚 //#define nop _nop_(); #define uchar unsigned char #define uint unsigned int
[单片机]
51单片机C51毫秒级(ms)精确延时
如下程序能实现ms毫秒级的比较精确的延时 void Delayms(unsigned int n) { unsigned int i,j; for(j=n;j 0;j--) for(i=112;i 0;i--); } 用keil可以看出这个延时的时间,我们先延时1ms(Delayms(1))。 进入Delayms前,sec=0.00042209s 延时后,sec=0.00142253s 可以知道Delayms(1)实际延时0.00142253s—0.00042209s=0.00100044s≈1ms 同样如果想延时15ms的话,用Delayms(15),实际延时0.01480903s≈15m
[单片机]
C51---6.1 矩阵键盘+6.2 矩阵密码锁
矩阵键盘 原理图 代码 按下的按键会在LCD上显示按下了哪一个按键 mian函数 #include REGX52.H #include Delay.h //包含Delay头文件 #include LCD1602.h //包含LCD1602头文件 #include MatrixKey.h //包含矩阵键盘头文件 unsigned char KeyNum; void main() { LCD_Init(); //LCD初始化 LCD_ShowString(1,1, MatrixKey: ); //LCD显示字符串 while(1) { KeyNum=MatrixKe
[单片机]
C51---6.1 矩阵键盘+6.2 矩阵密码锁
STC89C52+LCD12864+DS1302+DS18B20时钟原理图+源程序
STC89C52+LCD12864+DS1302 +DS18B20+PCB 时钟供大家学习。 电子智能时钟程序 单 片 机:STC89C52 晶 振:12MHz 时钟芯片:DS1302 液 晶 屏:LCD12864 时 间:2020年1月1日 LCD12864使用并口连接方式,PSB、RST接高电平 /*-------------------------------头文件---------------------------------------*/ #include reg52.h #include intrins.h
[单片机]
STC89C52+LCD12864+DS1302+DS18B20时钟原理图+<font color='red'>源程序</font>
单片机iic+pca9685驱动控制9路舵机源程序
利用stc12c5a60s2单片机的iic通信,驱动pca9685,因为采用了9个舵机,所以不需要短接驱动板上的焊点,驱动的scl,sda对应接单片机的就好,vcc接3.3v,然后v+和gnd要给5v,插上9个舵机,我任务需要控制舵机90度来回转即可,用的串口,蓝牙控制,很简单,给需要的朋友参考 pca9685驱动板驱动9个舵机单片机源程序如下: #include reg52.h #include intrins.h #include stdio.h #include math.h typedef unsigned char uchar; typedef unsigned int uint;
[单片机]
单片机iic+pca9685驱动控制9路舵机<font color='red'>源程序</font>
C51单片机的IO口介绍(下)
上一篇文章我们对C51的IO简单的介绍了一下,现在我们来简单了解C51的IO的结构 这里我们学习一下比较常见的单片机的IO模式,分别是准双向,开漏输出和推挽输出 (这里要提一嘴,我们用的STC88C52RC是没有推挽输出功能的,STC公司后续推出的一些机型才有推挽输出功能) 接下来我们来看看这几种模式 1.准双向 看看下面的原理图,机内信号通过一个非门取反后送入一个MOS管,MOS管负责控制这个IO的高低电平,配合内部上拉电阻完成高低电平的输出 为了方便我们分析,我们把这个MOS管看成一只NPN三极管。区别是三极管靠电流导通,MOS管靠电压导通 结合前面我们讲过的知识,对于一只NPN三极管,基极b电压比集电极c电压
[单片机]
<font color='red'>C51</font>单片机的IO口介绍(下)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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