首页 > 编程语言 >51单片机程序框架之单击与双击

51单片机程序框架之单击与双击

时间:2024-05-04 23:13:56浏览次数:28  
标签:CNT Handle DK 单击 void 51 Key 双击

/******************************************************************************
此程序是依据吴坚鸿程序框架,在普中51 A2单片机开发板上的程序练习
程序目标:按键单击与双击,单击LED取反,双击按下LED1取反
*******************************************************************************/
#include<REG51.H>
#define Main_Fosc 12000000L //默认系统时钟12Mhz
#define T1MS  (65536-Main_Fosc/12/1000)  //12分频下1ms定时器的装载值,n=t/T=t/(12/f)=0.001*f/12=f/12/1000
#define Key_Debounce 40  //按键debounce time
#define Key_DK_Debounce 300  //双击的间隔时间
sbit LED=P2^0;
sbit LED1=P2^1;
sbit Key=P3^1;
unsigned char Key_Handle=0;  //按键值,没有按下时,默认为0,单击为1,双击为2
void Sys_Init();    //系统初始化
void Delay_Long();   //长延时,等待系统稳定
void Perpherial_Init();  //端口初始化
void Key_Scan();  //按键扫描函数
void Key_Service(); //按键响应函数

void main()
{
    Sys_Init(); 
    Delay_Long();
    Perpherial_Init();
    while (1)
    {
        Key_Service();
    }
    
}

void Sys_Init()
{
    TMOD=0X01; //定时器0模式1
    TL0=T1MS;
    TH0=T1MS>>8;
}

void Delay_Long()
{
    unsigned char i,j;
    for(i=0;i++;i<220)
    {
        for(j=0;j<220;j++)
        ;
    }
}

void Perpherial_Init()
{
    ET0=1;
    TR0=1;
    EA=1;
}

void Timer0_ISR() interrupt 1   //定时器0中断函数
{
	TL0=T1MS;
    TH0=T1MS>>8;
    Key_Scan();
}

void Key_Scan()
{
    static unsigned int Key_CNT;
    static unsigned char Key_Lock;
    static unsigned int Key_DK_CNT;
    static unsigned char Key_Press_CNT;

    if (0!=Key)
    {
       Key_CNT=0;
       Key_Lock=0;
       if (Key_Press_CNT>=1)
       {
        Key_DK_CNT++;
        if (Key_DK_CNT>Key_DK_Debounce)
        {
            Key_Press_CNT=0;
            Key_DK_CNT=0;
            Key_Handle=1;
        }
        
       }   
    }
    else if (0==Key_Lock)
    {
        Key_CNT++;
        if (Key_CNT>Key_Debounce)
        {
            Key_Lock=1;
            Key_DK_CNT=0;
            Key_Press_CNT++;
           if (Key_Press_CNT>=2)
            {
                Key_Press_CNT=0;
                Key_Handle=2;
            }
            
            
        }
        
    }
        
}

void Key_Service()
{
    if (0==Key_Handle)
    {
        return;
    }
    
    switch (Key_Handle)
    {
    case 1:
        LED=!LED;
        Key_Handle=0;
        break;
    case 2:
        LED1=!LED1;
        Key_Handle=0;
        break;
    }
    
}

标签:CNT,Handle,DK,单击,void,51,Key,双击
From: https://www.cnblogs.com/boliuXun/p/18172930

相关文章

  • 51单片机程序框架之双击按键
    /******************************************************************************此程序是依据吴坚鸿程序框架,在普中51A2单片机开发板上的程序练习程序目标:按键组合键,按下后LED取反*******************************************************************************/#inc......
  • AtCoder Beginner Contest 351
    A-Thebottomoftheninth(abc351A)题目大意给定\(9\)个\(a_i\)和\(8\)个\(b_i\),问最后一个\(b_9\)是多少,使得\(\suma_i<\sumb_i\)。解题思路答案就是\(\suma_i-\sumb_i+1\)。神奇的代码a=sum(map(int,input().split()))b=sum(map(int,input().......
  • 51单片机程序框架之按键单击
    /******************************************************************************此程序是依据吴坚鸿程序框架,在普中51A2单片机开发板上的程序练习程序目标:按键单击,Key1按下,LED灯亮,Key2按下LED灭************************************************************************......
  • 长江存储PC411 512GB SSD实测:旗舰读写性能 温度表现逆天
    一、前言:搭载长江存储PC411512GBSSD的机械革命蛟龙16S不久前我们测试过某品牌的笔记本,其搭载的PCIe4.0SSD在高负载运行时温度轻松突破70度,导致性能下降了20%左右。对于笔记本而言,由于无法像台式电脑那样给SSD安装厚重的散热装甲,在搭载高性能PCIe4.0SSD时,很容易出现温度失......
  • acwing351
    https://www.acwing.com/activity/content/problem/content/9051/NOIP2007提高组T4。本题是加强版。题目描述设\(T=(V,E,W)\)是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称\(T\)为树网(treenetwork),其中\(V,E\)分别表示结点与边的集合,\(W\)表示各边......
  • ABC351
    Alink算出两个队分别得了几分,让木青队的总得分比高桥队多\(1\)即可。点击查看代码#include<bits/stdc++.h>usingnamespacestd;intgq,mq;signedmain(){ intx; for(inti=1;i<=9;++i){ cin>>x;gq+=x; } for(inti=1;i<=8;++i){ cin>>x;m......
  • 《自动机理论、语言和计算导论》阅读笔记:p215-p351
    《自动机理论、语言和计算导论》学习第11天,p215-p351总结,总计37页。一、技术总结1.constrainedproblem2.Fermat'slatstheoremFermat'sLastTheoremstatesthatnothreepositiveintegersa,bandcsatisfytheequationa^n+b^n=c^nforanyintegervalue......
  • 51单片机程序框架之跑马灯练习
    /******************************************************************************此程序是依据吴坚鸿程序框架,在普中51A2单片机开发板上的程序练习程序目标:LED以1HZ的频率闪烁*******************************************************************************/#include<......
  • 51单片机程序框架之LED闪烁_方法1
    /******************************************************************************此程序是依据吴坚鸿程序框架,在普中51A2单片机开发板上的程序练习程序目标:LED以1HZ的频率闪烁*******************************************************************************/#include<......
  • [atcoder 351] [F Double Sum] [线段树]
    解法,使用线段树。请看代码:importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.math.BigInteger;importjava.util.StringTokenizer;publicclassMain{staticclassSegmentNode{intleft;......