精华内容
下载资源
问答
  • 51单片机键盘扫描

    2013-04-24 00:40:24
    初学者,刚刚写完51单片机键盘扫描,拿出来分享,求指点~
  • 51单片机按键扫描

    2015-05-02 10:38:05
    比行列扫描简单点,代码更短,之需要一次数据反转(2次的数据输入输出)就可以定位按键
  • C语言编写的C51单片机键盘扫描行扫描方法
  • 51单片机键盘扫描实验.zip
  • /****************************************键盘_不采用定时器_不延时特点:按键在松手后有效,灵敏度高,消耗资源少,运行效率高独立键盘为:K01=P2^4;K02=P2^5;K03=P2^6;K04=P2^7;矩阵键盘为:行(上到下)_P2.3_P...
  • 按键扫描还在用DELAY延时吗?你OUT啦 定时器扫描强势来袭,你值得拥有。最大的亮点就是解决了按键的WU操作
  • 用定时器扫描 可实现长安短按
  • #include "REG52.H" ... * 调整抖动时间阀值的大小,可以更改按键的触发灵敏度。 * 去抖动的时间本质上等于累计定时中断次数的时间。 */ #define const_key_time_short120//短按的按键去抖动延时的时间 #d...
    1. #include "REG52.H"  
    2.   
    3. #define const_voice_short  20   //蜂鸣器短叫的持续时间  
    4. #define const_voice_long   140   //蜂鸣器长叫的持续时间  
    5.   
    6. /* 注释一:
    7. * 调整抖动时间阀值的大小,可以更改按键的触发灵敏度。
    8. * 去抖动的时间本质上等于累计定时中断次数的时间。
    9. */  
    10. #define const_key_time_short1  20    //短按的按键去抖动延时的时间  
    11. #define const_key_time_long1   400     //长按的按键去抖动延时的时间  
    12.   
    13. #define const_key_time_short2  20    //短按的按键去抖动延时的时间  
    14. #define const_key_time_long2   400     //长按的按键去抖动延时的时间  
    15.   
    16. void initial_myself();      
    17. void initial_peripheral();  
    18. void delay_long(unsigned int uiDelaylong);  
    19. void T0_time();  //定时中断函数  
    20. void key_service(); //按键服务的应用程序  
    21. void key_scan(); //按键扫描函数 放在定时中断里  
    22.   
    23. sbit key_sr1=P3^2; //对应朱兆祺学习板的S1键  
    24. sbit key_sr2=P3^3; //对应朱兆祺学习板的S5键  
    25. sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平  
    26.   
    27. sbit beep_dr=P2^7; //蜂鸣器的驱动IO口  
    28.   
    29. unsigned char ucKeySec=0;   //被触发的按键编号  
    30.   
    31. unsigned int  uiKeyTimeCnt1=0; //按键去抖动延时计数器  
    32. unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志  
    33. unsigned char ucShortTouchFlag1=0; //短按的触发标志  
    34.   
    35. unsigned int  uiKeyTimeCnt2=0; //按键去抖动延时计数器  
    36. unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志  
    37. unsigned char ucShortTouchFlag2=0; //短按的触发标志  
    38.   
    39. unsigned int  uiVoiceCnt=0;  //蜂鸣器鸣叫的持续时间计数器  
    40.   
    41. void main()  
    42.   {  
    43.    initial_myself();    
    44.    delay_long(100);    
    45.    initial_peripheral();  
    46.    while(1)    
    47.    {  
    48.        key_service(); //按键服务的应用程序  
    49.    }  
    50.   
    51. }  
    52.   
    53. void key_scan()//按键扫描函数 放在定时中断里  
    54. {    
    55. /* 注释二:
    56. * 长按与短按的按键扫描的详细过程:
    57. * 第一步:平时只要按键没有被按下时,按键的自锁标志,去抖动延时计数器一直被清零。
    58. * 第二步:一旦两个按键都被按下,去抖动延时计数器开始在定时中断函数里累加,在还没累加到
    59. *         阀值const_key_time_short1或者const_key_time_long1时,如果在这期间由于受外界干扰或者按键抖动,而使
    60. *         IO口突然瞬间触发成高电平,这个时候马上把延时计数器uiKeyTimeCnt1
    61. *         清零了,这个过程非常巧妙,非常有效地去除瞬间的杂波干扰。这是我实战中摸索出来的。
    62. *         以后凡是用到开关感应器的时候,都可以用类似这样的方法去干扰。
    63. * 第三步:如果按键按下的时间超过了短按阀值const_key_time_short1,则马上把短按标志ucShortTouchFlag1=1;
    64. *         如果还没有松手,一旦发现按下的时间超过长按阀值const_key_time_long1时,
    65. *         先把短按标志ucShortTouchFlag1清零,然后触发长按。在这段程序里,把自锁标志ucKeyLock1置位,
    66. *         是为了防止按住按键不松手后一直触发。
    67. * 第四步:等按键松开后,自锁标志ucKeyLock12及时清零,为下一次自锁做准备。如果发现ucShortTouchFlag1等于1,
    68. *         说明短按有效,这时触发一次短按。
    69. * 第五步:以上整个过程,就是识别按键IO口下降沿触发的过程。
    70. */  
    71.   if(key_sr1==1)//IO是高电平,说明两个按键没有全部被按下,这时要及时清零一些标志位  
    72.   {  
    73.       ucKeyLock1=0; //按键自锁标志清零  
    74.       uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。      
    75.             if(ucShortTouchFlag1==1)  //短按触发标志  
    76.           {  
    77.              ucShortTouchFlag1=0;  
    78.                  ucKeySec=1;    //触发一号键的短按  
    79.           }  
    80.   }  
    81.   else if(ucKeyLock1==0)//有按键按下,且是第一次被按下  
    82.   {  
    83.      uiKeyTimeCnt1++; //累加定时中断次数  
    84.      if(uiKeyTimeCnt1>const_key_time_short1)  
    85.      {  
    86.             ucShortTouchFlag1=1;   //激活按键短按的有效标志    
    87.      }  
    88.   
    89.      if(uiKeyTimeCnt1>const_key_time_long1)  
    90.      {  
    91.             ucShortTouchFlag1=0;  //清除按键短按的有效标志  
    92.   
    93.         uiKeyTimeCnt1=0;  
    94.         ucKeyLock1=1;  //自锁按键置位,避免一直触发  
    95.   
    96.         ucKeySec=2;    //触发1号键的长按  
    97.                 
    98.      }  
    99.   
    100.   }  
    101.   
    102.   if(key_sr2==1)//IO是高电平,说明两个按键没有全部被按下,这时要及时清零一些标志位  
    103.   {  
    104.       ucKeyLock2=0; //按键自锁标志清零  
    105.       uiKeyTimeCnt2=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。      
    106.             if(ucShortTouchFlag2==1)  //短按触发标志  
    107.           {  
    108.              ucShortTouchFlag2=0;  
    109.                  ucKeySec=3;    //触发2号键的短按  
    110.           }  
    111.   }  
    112.   else if(ucKeyLock2==0)//有按键按下,且是第一次被按下  
    113.   {  
    114.      uiKeyTimeCnt2++; //累加定时中断次数  
    115.      if(uiKeyTimeCnt2>const_key_time_short2)  
    116.      {  
    117.             ucShortTouchFlag2=1;   //激活按键短按的有效标志    
    118.      }  
    119.   
    120.      if(uiKeyTimeCnt2>const_key_time_long2)  
    121.      {  
    122.             ucShortTouchFlag2=0;  //清除按键短按的有效标志  
    123.   
    124.         uiKeyTimeCnt2=0;  
    125.         ucKeyLock2=1;  //自锁按键置位,避免一直触发  
    126.   
    127.         ucKeySec=4;    //触发2号键的长按  
    128.                 
    129.      }  
    130.   
    131.   }  
    132.   
    133.   
    134. }  
    135.   
    136.   
    137. void key_service() //第三区 按键服务的应用程序  
    138. {  
    139.   switch(ucKeySec) //按键服务状态切换  
    140.   {  
    141.     case 1:// 1号键的短按  对应朱兆祺学习板的S1键  
    142.   
    143.           uiVoiceCnt=const_voice_short; //按键声音的短触发,滴一声就停。  
    144.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
    145.           break;          
    146.     case 2:// 1号键的长按  对应朱兆祺学习板的S1键  
    147.   
    148.           uiVoiceCnt=const_voice_long; //按键声音的长触发,滴一声就停。  
    149.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
    150.           break;        
    151.     case 3:// 2号键的短按  对应朱兆祺学习板的S5键  
    152.   
    153.           uiVoiceCnt=const_voice_short; //按键声音的短触发,滴一声就停。  
    154.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
    155.           break;          
    156.     case 4:// 2号键的长按  对应朱兆祺学习板的S5键  
    157.   
    158.           uiVoiceCnt=const_voice_long; //按键声音的长触发,滴一声就停。  
    159.           ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发  
    160.           break;    
    161.   }                  
    162. }  
    163.   
    164.   
    165.   
    166. void T0_time() interrupt 1  
    167. {  
    168.   TF0=0;  //清除中断标志  
    169.   TR0=0; //关中断  
    170.   
    171.   key_scan(); //按键扫描函数  
    172.   
    173.   if(uiVoiceCnt!=0)  
    174.   {  
    175.      uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫  
    176.          beep_dr=0;  //蜂鸣器是PNP三极管控制,低电平就开始鸣叫。  
    177.   }  
    178.   else  
    179.   {  
    180.      ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。  
    181.            beep_dr=1;  //蜂鸣器是PNP三极管控制,高电平就停止鸣叫。  
    182.   }  
    183.   
    184.   
    185.   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f  
    186.   TL0=0x2f;  
    187.   TR0=1;  //开中断  
    188. }  
    189.   
    190.   
    191. void delay_long(unsigned int uiDelayLong)  
    192. {  
    193.    unsigned int i;  
    194.    unsigned int j;  
    195.    for(i=0;i<uiDelayLong;i++)  
    196.    {  
    197.       for(j=0;j<500;j++)  //内嵌循环的空指令数量  
    198.           {  
    199.              ; //一个分号相当于执行一条空语句  
    200.           }  
    201.    }  
    202. }  
    203.   
    204.   
    205. void initial_myself()  //第一区 初始化单片机  
    206. {  
    207. /* 注释三:
    208. * 矩阵键盘也可以做独立按键,前提是把某一根公共输出线输出低电平,
    209. * 模拟独立按键的触发地,本程序中,把key_gnd_dr输出低电平。
    210. * 朱兆祺51学习板的S1和S5两个按键就是本程序中用到的两个独立按键。
    211. */  
    212.   key_gnd_dr=0; //模拟独立按键的地GND,因此必须一直输出低电平  
    213.   
    214.   
    215.   beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。  
    216.   
    217.   
    218.   TMOD=0x01;  //设置定时器0为工作方式1  
    219.   
    220.   
    221.   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f  
    222.   TL0=0x2f;  
    223.   
    224. }  
    225. void initial_peripheral() //第二区 初始化外围  
    226. {  
    227.   EA=1;     //开总中断  
    228.   ET0=1;    //允许定时中断  
    229.   TR0=1;    //启动定时中断  
    230.   
    展开全文
  • 本文为 51单片机矩阵键盘扫描程序,下面一起来学习一下
  • 运用51单片机来完成矩阵键盘电路扫描并把按键的编号通过LED显示出来
  • 51单片机c语言按键扫描及Proteus仿真,程序使用定时器进行了任务的时间片分配,同时实现了按键的“长按”检测
  • 电子科学与技术单片机按键扫描数码管显示C语言程序按键扫描数码管显示程序共定义了6个键的功能:K1、K2、K3、K4以及K5、K8组成的一对复合键,其中K2,K3为连击键,K5为上档键。在正常工作模式下按K1则切换至状态,在...

    电子科学与技术

    单片机按键扫描数码管显示C语言程序

    按键扫描数码管显示程序共定义了6个键的功能:K1、K2、K3、K4以及K5、K8组成的一对复合键,其中K2,K3为连击键,K5为上档键。在正常工作模式下按K1则切换至状态,在设定模式下按K1键循环选择4个数码管中的某个,被选中的数码管闪烁,此时单按K2键显示数值加1;常按K2显示数值以一定速度递增,同时数码管停止闪烁,当K2松开,数码管恢复闪烁,显示数值停留在K2松开前的值上。K3完成的功能和K2类似。其完成减操作。这2个键只有在设定状态才有效,可以有效防止误操作。K4为确认键,按下该键回到正常显示状态,所有指示灯熄灭,数码管显示刚刚设定的数值。K5+K8这对复合键执行复位操作,任何情况下同时按下K5和K8或先按下K5再按下K8,所有数码管的显示全为0,指示灯全灭,进入正常显示状态。同时程序还对如下几个异常操作进行了处理:

    1. 2个或多个功能键同时按下

    2. 一个功能键按下未释放,又按另一个功能键,然后再松开其中一个功能键

    3. 先按下功能键再按下上档键

    4. 多个上档键和一个功能键同时按下,此时不做处理。等到松开其他上档键,只剩下一个上

    5. 档键和一个功能键时才执行这对复合键;或松开所有上档键,处理单一功能键。 /*******************************************************************************/

    #include

    #include

    #define uchar unsigned char

    #define uint unsigned int

    #define RCtrl 0x20 //定义上挡键 第5键

    #define RConti 0xfe //定义连击键 第6键

    #define N 2 //去抖年龄下限

    #define MaxRate 50 //重复前的延迟值 600ms

    #define MinRate 20 //重复速度 240ms

    #define leddark 83 //闪烁时灭时间1s

    #define ledshow 83 //闪烁时亮时间1s

    #define decimal 0x80 //小数点的段数

    #define KEY_DDR DDRC

    #define KEY_PORTO PORTC

    #define KEY_PORTI PINC

    #define OUT 0x3f

    #define IN 0xc0

    #define KeyValue 0x3f

    #define LEDD_DDR DDRB

    #define LEDD_PORTO PORTB

    展开全文
  • 本文为51单片机矩阵键盘扫描程序,希望对你的学习有所帮助。
  • 原标题:51单片机按键扫描C程序大二上学期做过80 的按键程序,当时项目要求实现按键控制 屏显示并且接收GPRS传来的数据。当时为了节省成本,就去大西电子市场买来8*8的LED块,然后自己一点一点的拼接成128*16的。做...

    原标题:51单片机按键扫描C程序

    大二上学期做过80 的按键程序,当时项目要求实现按键控制 屏显示并且接收GPRS传来的数据。当时为了节省成本,就去大西电子市场买来8*8的LED块,然后自己一点一点的拼接成128*16的。做完之后虽然可以运行,但是很勉强,尤其是 程序没有下面这位哥写得简洁缜密,所以就贴过来,以后用到的时候直接研究:

    unsigned char key,key_h,kpush;

    unsigned int key_l;

    //按键连接到p1.0、p1.1、p1.2

    void int_t0(void) 1 {

    unsigned char dd,i;

    TL0=TL0+30;TH0=0xfb; //800

    /* 按键判别 */

    if ((P1&0x7)==0x7) {

    if ((key_l>30)&&(key_l<800)&&(key_h>30)) { //释放按键,如果之前按键时间少于1秒,读入键值

    key=kpush;

    }

    if ((++key_h)>200) key_h=200;

    key_l=0;

    if (key>=0x80) key=0; //如果之前的按键为1秒,清除键值

    } else {

    kpush=P1&0x7;

    key_l++;

    if ((key_l>800)&&(key_h>30)) { //如果按键超过1秒,键值加0x80标志键

    key=kpush|0x80;

    key_h=0;

    key_l=0;

    }

    }

    }

    void main(void) {

    TMOD=0x1;TR0=1;ET0=1;EA=1;

    while (1) {

    while (!key) {}

    switch (key) {

    case 1:break;

    case 2:break;

    }

    }

    }

    责任编辑:

    展开全文
  • 本文给大家分享了51单片机行列式键盘扫描程序。
  • 51单片机键盘扫描程序,算法简单有效,键盘_不采用定时器_不延时,按键在松手后有效,灵敏度高,消耗资源少,运行效率高.
  • #include //头文件#define uchar unsigned char//宏定义#define uint unsigned int//宏定义uchar shi,fen,nshi,nfen,ma 发表于 2020-12-17 51单片机做的温度显示,温度显示在LCD1602液晶屏上。然后按键可以调整温度...

    #include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

    #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换

    #define KeyPort  P1

    sbit LATCH1=P2^2;//定义锁存使能端口 段锁存

    sbit LATCH2=P2^3;//                 位锁存

    unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

    0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F

    unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码

    unsigned char TempData[8]; //存储显示值的全局变量

    void DelayUs2x(unsigned char t);//us级延时函数声明

    void DelayMs(unsigned char t); //ms级延时

    void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数

    unsigned char KeyScan(void);//键盘扫描

    unsigned char KeyPro(void);

    void Init_Timer0(void);//定时器初始化

    /*------------------------------------------------

    主函数

    ------------------------------------------------*/

    void main (void)

    {

    unsigned char num,i,j;

    unsigned char temp[8];

    Init_Timer0();

    while (1)         //主循环

    {

    num=KeyPro();

    if(num!=0xff)

    {

    if(i<8)

    {

    temp[i]=dofly_DuanMa[num];

    for(j=0;j<=i;j++)

    TempData[7-i+j]=temp[j];

    }

    i++;

    if(i==9)//多出一个按键输入为了清屏 原本应该为8

    {

    i=0;

    for(j=0;j<8;j++)//清屏

    TempData[j]=0;

    }

    }

    //Display(0,8); //显示全部8位

    //主循环中添加其他需要一直工作的程序

    }

    }

    /*------------------------------------------------

    uS延时函数,含有输入参数 unsigned char t,无返回值

    unsigned char 是定义无符号字符变量,其值的范围是

    0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

    长度如下 T=tx2+5 uS

    ------------------------------------------------*/

    void DelayUs2x(unsigned char t)

    {

    while(--t);

    }

    /*------------------------------------------------

    mS延时函数,含有输入参数 unsigned char t,无返回值

    unsigned char 是定义无符号字符变量,其值的范围是

    0~255 这里使用晶振12M,精确延时请使用汇编

    ------------------------------------------------*/

    void DelayMs(unsigned char t)

    {

    while(t--)

    {

    //大致延时1mS

    DelayUs2x(245);

    DelayUs2x(245);

    }

    }

    /*------------------------------------------------

    显示函数,用于动态扫描数码管

    输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示

    如输入0表示从第一个显示。

    Num表示需要显示的位数,如需要显示99两位数值则该值输入2

    ------------------------------------------------*/

    void Display(unsigned char FirstBit,unsigned char Num)

    {

    static unsigned char i=0;

    DataPort=0;   //清空数据,防止有交替重影

    LATCH1=1;     //段锁存

    LATCH1=0;

    DataPort=dofly_WeiMa[i+FirstBit]; //取位码

    LATCH2=1;     //位锁存

    LATCH2=0;

    DataPort=TempData[i]; //取显示数据,段码

    LATCH1=1;     //段锁存

    LATCH1=0;

    i++;

    if(i==Num)

    i=0;

    }

    /*------------------------------------------------

    定时器初始化子程序

    ------------------------------------------------*/

    void Init_Timer0(void)

    {

    TMOD |= 0x01;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响

    //TH0=0x00;       //给定初值

    //TL0=0x00;

    EA=1;            //总中断打开

    ET0=1;           //定时器中断打开

    TR0=1;           //定时器开关打开

    }

    /*------------------------------------------------

    定时器中断子程序

    ------------------------------------------------*/

    void Timer0_isr(void) interrupt 1

    {

    TH0=(65536-2000)/256;    //重新赋值 2ms

    TL0=(65536-2000)%256;

    Display(0,8);       // 调用数码管扫描

    }

    /*------------------------------------------------

    按键扫描函数,返回扫描键值

    ------------------------------------------------*/

    unsigned char KeyScan(void)  //键盘扫描函数,使用行列逐级扫描法

    {

    unsigned char Val;

    KeyPort=0xf0;//高四位置高,低四位拉低

    if(KeyPort!=0xf0)//表示有按键按下

    {

    DelayMs(10);  //去抖

    if(KeyPort!=0xf0)

    {           //表示有按键按下

    KeyPort=0xfe; //检测第一行

    if(KeyPort!=0xfe)

    {

    Val=KeyPort&0xf0;

    Val+=0x0e;

    while(KeyPort!=0xfe);

    DelayMs(10); //去抖

    while(KeyPort!=0xfe);

    return Val;

    }

    KeyPort=0xfd; //检测第二行

    if(KeyPort!=0xfd)

    {

    Val=KeyPort&0xf0;

    Val+=0x0d;

    while(KeyPort!=0xfd);

    DelayMs(10); //去抖

    while(KeyPort!=0xfd);

    return Val;

    }

    KeyPort=0xfb; //检测第三行

    if(KeyPort!=0xfb)

    {

    Val=KeyPort&0xf0;

    Val+=0x0b;

    while(KeyPort!=0xfb);

    DelayMs(10); //去抖

    while(KeyPort!=0xfb);

    return Val;

    }

    KeyPort=0xf7; //检测第四行

    if(KeyPort!=0xf7)

    {

    Val=KeyPort&0xf0;

    Val+=0x07;

    while(KeyPort!=0xf7);

    DelayMs(10); //去抖

    while(KeyPort!=0xf7);

    return Val;

    }

    }

    }

    return 0xff;

    }

    /*------------------------------------------------

    按键值处理函数,返回扫键值

    ------------------------------------------------*/

    unsigned char KeyPro(void)

    {

    switch(KeyScan())

    {

    case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值

    case 0x7d:return 1;break;//1

    case 0x7b:return 2;break;//2

    case 0x77:return 3;break;//3

    case 0xbe:return 4;break;//4

    case 0xbd:return 5;break;//5

    case 0xbb:return 6;break;//6

    case 0xb7:return 7;break;//7

    case 0xde:return 8;break;//8

    case 0xdd:return 9;break;//9

    case 0xdb:return 10;break;//a

    case 0xd7:return 11;break;//b

    case 0xee:return 12;break;//c

    case 0xed:return 13;break;//d

    case 0xeb:return 14;break;//e

    case 0xe7:return 15;break;//f

    default:return 0xff;break;

    }

    }

    关注eeworld公众号

    快捷获取更多信息

    关注eeworld服务号

    享受更多官方福利

    推荐阅读

    STC15单片机实验名称:使用NTC电阻测量温度实验内容:        使用NTC电阻测量温度并显示在数码管上        读取DS18B20模块测量温度作为参考实验器材:        STC15W408AS_DIP16 x1        DS18B20  x1        TM1637数码管 x1

    发表于 2020-12-17

    13c8c1f1db3591c57b81a47ceb4c8acf.png

    /*一款电子钟程序,此电子钟是四位电子钟数码管组成的,功能分别有走时、响闹、走时间调整、闹钟时间调整等功能!调整部分分别由三个按键实现,一个功能键,一个+(加)键,另一个为-(减)键,其它功能键是复用功能!*/硬键介绍:数码管个位.十位.百位.千位.小数点分别接P0.0 P0.1 P0.2 P0.3 P0.4。蜂鸣器接P3.5脚,功能按键接P3.2 加按键接P3.3 减按键接P3.4以下是两张图片!!!#include //头文件#define uchar unsigned char//宏定义#define uint unsigned int//宏定义uchar shi,fen,nshi,nfen,ma

    发表于 2020-12-17

    929b95366525f73860d9149dcc838369.png

    51单片机做的温度显示,温度显示在LCD1602液晶屏上。然后按键可以调整温度阈值,温度高于或低于所设温度,蜂鸣器就会响……单片机源程序如下:/***************************************************************************************                              基于单片机的实时温度报警系统设计        &nbsp

    发表于 2020-12-17

    d774af01611cbee573d22008cbada9a7.png

    程序代码 仿真图单片机源程序如下:#include#include/*********************宏定义************************/#define uchar unsigned char#define uint unsigned int/************位定义*****************************/sbit Trig=P3^7; //超声波模块触发位sbit LEDRED=P1^0;sbit LEDGREEN=P1^2;sbit speaker=P1^7;sbit person=P1^6;sbit

    发表于 2020-12-09

    ad21780f58d89bc4f43f43de86c206c0.png

    电子秤是基于STC89C51单片机,以及HX711称重模块,利用单片机控制A/D转换,屏幕数据显示,键盘实时输入,设计方案能够易于各种场合使用。单片机源程序如下:#include #include #include #include "main.h"#include "HX711.h"#include "eeprom52.h"#define uchar unsigned char#define uint  unsigned intunsigned long HX711

    发表于 2020-12-09

    f585aee1b43bfbb8d926f654ee1d4793.png

    展开全文
  • 51单片机矩阵键盘扫描

    千次阅读 多人点赞 2015-06-24 14:53:00
    矩阵键盘检测原理: 1、查询是否有键按下。 2、键的抖动处理。 3、查询按下键所在行和列位置,得到键值。先行后列扫描法#include<reg51.h> #define uchar unsigned char #define uint unsigned int #define t
  • 51单片机按键扫描

    千次阅读 2020-05-30 23:31:18
    //更新备份为当前值,以备进行下次比较 } } } 这是金沙滩51单片机按键部分的代码。我想问一下,while(1)那里进入循环后按键按下与弹起的时候,KEY4和backup的值具体怎样变化?这里我不太懂,希望有大佬能列举解答...
  • 单片机按键扫描

    2018-11-27 17:52:15
    4*4矩形键盘按键扫描程序及原理图,可仿真验证,正确
  • 51单片机矩阵键盘动态扫描,我就看见例程编的程序都有个把io口值赋给一个temp,例如P3=temp然后再位与,然后再判断temp。。。。。。我的问题就是为毛不直接判断P3口的值,多此一举干什么,直接用P3来判断按键按下不...
  • 51单片机矩阵按键扫描

    千次阅读 2018-10-03 10:43:55
    目标:获取矩阵键盘的按键值(按下按键,在单个数码管上显示出键值) 连线: P1与矩阵键盘连接,P0 与单个数码管连接 代码如下: #include &lt;reg51.h&gt; unsigned char code table[] = {0x80,0x40,0x...
  • stc89c51单片机矩阵键盘扫描

    千次阅读 2016-10-07 18:46:55
    c51单片机矩阵键盘扫描实现代码
  • 51单片机扫描键盘程序   //-----------------------函数声明,变量定义-------------------------------------------------------- #include sbit LED_1 =P1^4; sbit LED_2 =P1^5; sbit LED_3 =P1^6; sbit ...
  • 51单片机矩阵键盘扫描C语言程序,并用四位一体数码管显示。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,625
精华内容 1,450
关键字:

51单片机按键扫描原理