51单片机-双模式函数封装

发布者:平和的心情最新更新时间:2021-08-20 来源: eefocus关键字:51单片机  封装 手机看文章 扫描二维码
随时随地手机看文章

学了这两种按键模式的代码,我们现在决定将这两种模式封装成一个函数,然后通过参数选择是支持连按还是不支持连按。

 

1.双按键

一直以来我们都是只用一个按键,现在利用两个按键来实现按键模式的切换,K3负责用来给K4做“支持连按”还是“不支持连按”的选择。

5.png                             

开发板的原理图告诉我们,在P2.3输出低电平的情况下,K1,K2,K3,K4就可以当独立按键。

 

2.题目

我们用最左端的数码管5来提示此时的K4是“支持连按”还是“不支持连按”,这个数码管显示0的时候不支持连按,显示1的时候支持连按。

用K3来切换按键模式,K3的按键模式是不支持连按的,按下松开就是把K4切换为另一种按键模式。

然后我们通过按K4,同样右边的3个数码管显示cnt的值,支持连按时,按下不放就一直自动累加,不支持连按时,按下松开才累加1。

 

3.代码


#include  

sbit ADDR2 = P1^2;

sbit ADDR1 = P1^1;

sbit ADDR0 = P1^0;

sbit ENLED = P1^4;

sbit ADDR3 = P1^3;

   

sbit LED2  = P0^0;

sbit KEY4  = P2^7;

sbit KEY3  = P2^6;

unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化

unsigned char LedBuff[6]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//数码管显示缓存区

unsigned char cnt;//在KEY_task()和SEG_task()里用

   

void SEG_task()//数码管显示函数

{

    static unsigned char i=0;

    LedBuff[0] = LedChar[cnt%10];   

    if(cnt>=10)  LedBuff[1]= LedChar[(cnt/10)%10]; //cnt没到达10之前不更新LedBuff[1]的初始值

    if(cnt>=100) LedBuff[2]= LedChar[(cnt/100)%10];//cnt没到达100之前不更新LedBuff[2]的初始值

    if(cnt==0){  LedBuff[1]=0xFF;LedBuff[2]=0XFF; }//cnt到达255之后再加1就溢出变为0了,这时候要再次熄灭这两个数码管

    

    P0=0xFF;//端口状态全部熄灭数码管里的LED达到刷新作用

    switch(i)

    {

        case 0:

        ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[0];i++;break;

        case 1:

        ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[1];i++;break;     

        case 2:

        ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0=LedBuff[2];i++;break;  

        case 3:

        ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[5];i=0;break; 

    }  

}

   

void KEY_task()//按键按下所需要执行的任务

{

    cnt++;

}

   

void KEY_mode(unsigned char mode)

{

    static unsigned char key_up=1;

    static unsigned int times=0; //用来记录进入过按键判断语句的次数 

    

    if(key_up==0)

    {      

        times++;   

        if(mode==1 && times>=1000)//mode等于1,该部分代码是用来实现支持连按的,1000是为了让连按的执行速度没那么快,如果改为500,那么连按速度将会加快

        {

            times=0;

            KEY_task();

        }

     

        else if(mode==0 && times>=500)//mode等于0,该部分代码是用来实现不支持连按的

        {

            if(KEY4==1)//按键已抬起

            {

                times=0;

                KEY_task();  

            }

        }

    }

    key_up=KEY4; //如果不松手,key_up就会等于0 

}

  

void main()

{  

    unsigned char mode=0;//初始时是不支持连按

    unsigned char key_up=1;

    unsigned int times=0;//用来记录进入过按键判断语句的次数

    ADDR3 = 1;//使能三八译码器

    ENLED = 0;// 

    

    P2 = 0xF7;//让K3,K4能具备有被拉低的条件先

    LedBuff[5]=LedChar[mode];//填充好数码管5要显示的按键模式参数

    while(1)

    {     

        SEG_task();    //数码管显示函数

        KEY_mode(mode);//K4的执行函数

     

        //以下是K3按键的功能代码

        if(key_up==0)

        {      

            times++;     

            if(times>=500&&KEY3==1)

            {

                times=0;

                mode=!mode;//每按一次K3就改变参数的传递

                LedBuff[5]=LedChar[mode];//用来显示此时的K4是支持连按还是不支持连按,显示0则不支持,1就是支持

            }

        }

        key_up=KEY3;

    }

}


主函数里的mode充当了两个身份,一个作用是作为参数传给“KEY_mode(mode);”,另一个作用是用来在数码管5上显示0或者1。所有知识点我们都已学过,不过还是希望大家认真地去分析每一处代码的作用。

关键字:51单片机  封装 引用地址:51单片机-双模式函数封装

上一篇:51单片机-代码对比
下一篇:51单片机-综合例程

推荐阅读最新更新时间:2024-10-25 10:24

51单片机-双模式函数封装
学了这两种按键模式的代码,我们现在决定将这两种模式封装成一个函数,然后通过参数选择是支持连按还是不支持连按。 1.双按键 一直以来我们都是只用一个按键,现在利用两个按键来实现按键模式的切换,K3负责用来给K4做“支持连按”还是“不支持连按”的选择。 开发板的原理图告诉我们,在P2.3输出低电平的情况下,K1,K2,K3,K4就可以当独立按键。 2.题目 我们用最左端的数码管5来提示此时的K4是“支持连按”还是“不支持连按”,这个数码管显示0的时候不支持连按,显示1的时候支持连按。 用K3来切换按键模式,K3的按键模式是不支持连按的,按下松开就是把K4切换为另一种按键模式。 然后我们通过按K4
[单片机]
<font color='red'>51单片机</font>-<font color='red'>双模式</font><font color='red'>函数</font><font color='red'>封装</font>
stm32—按键(双模式,双函数选择)
不使用CubeMX 一、新建方法不说了,记得将key和led文件封装进去 二、ked.c代码: 1、按键初始化部分 2、第一个按键函数 注意: 这个函数提供两种模式(是否连按) 注意这个函数存在响应优先级 3、第二个按键函数 三、key.h部分: 注意: 有两种方式读取电位,一种用位带操作读取,一种用HAL库读取 声明了.c文件里的三个函数,宏定义了一些特殊常量 四、main.c中: 通过这个KEY_Scan();内的数字来选择扫描模式 0和1 使用CubeMX 一、首先记得先把delay函数和KEY函数封装好 二、端口初始化部分都在gpio.c里面
[单片机]
stm32—按键(<font color='red'>双模式</font>,双<font color='red'>函数</font>选择)
51单片机-函数封装
1.简洁代码 单片机程序阅读一般都是先从主函数开始,上一讲的程序写法在主函数中显得不简洁,影响人阅读代码的效率。有时我们只需要知道一条语句代表什么意思即可,所以我们把延时部分封装为一个函数,在主函数里调用函数名表示此处语句延时1秒,这样可读性就强的多,也简洁地多,读者也可以先了解一下《手把手教你学51单片机》文档中的4.6节先。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #include reg52.h sbit LED2 = P0^0; sbit ADDR2 = P1^2; sb
[单片机]
<font color='red'>51单片机</font>-<font color='red'>函数</font><font color='red'>封装</font>
采用 3mm x 3mm DFN 封装的500mA 低噪声、高效率双模式充电泵
   凌特公司( Linear Technology Corporation )推出采用紧凑型 3mm x 3mm DFN 封装的模式可择、高效率 500mA 升压型充电泵 LTC3203-1/B/B-1 。 LTC3203B 具有低噪声恒定频率( 1MHz )工作模式和 2.7V 至 5.5V 的宽输入电压范围,并提供可调输出电压;而 LTC3203-1 和 LTC3203B-1 则具有 4.5V 或 5V 的用户可选固定输出电压选项,用来为 LED 或逻辑电路供电。这些芯片还具有用户可选的转换模式( 1 : 1.5 和 1 : 2 )以优化充电泵的效率,非常
[新品]
MSP430flash封装读写函数
封装好读写函数,输入地址可写入和读出,都是long数据类型 void flash_w(int add,long value) { Flash_ptrD = (unsigned long *) add; // 初始化Flash pointer FCTL3 = FWKEY; // FWKEY为写入密码 FCTL1 = FWKEY+ERASE; // FWKEY为写入密码,ERASE为段擦除 *Flash_ptrD = 0; // 擦除 FCTL1 = FWKEY+BLKWRT; // FWKEY为写入密码,BLKWRT为lon
[单片机]
stm32 串口格式化打印字符串 函数封装
#include iostream #include windows.h //********************************************** #include stdarg.h #include stdio.h int uart_printf(void* UartHandle,char* buf,size_t bufLen, const char *fmt, ...) { va_list arg; int cnt; #if 1 va_start(arg, fmt); cnt = vsnprintf(buf, bufLen, fmt, arg); //生成的字符串的长度至多
[单片机]
STC89C52RC单片机额外篇 | 05 - 把NOP指令封装成微秒级延时函数
延时函数是单片机开发中是必不可少的功能函数,在每个工程里都能找到它的踪影。虽然看起来不起眼,但在有些时序控制的场合,使用了一点点延时,往往能解决大问题。特别对于某些模块,往往需要微秒级的延时,例如超声波模块与红外接收器等。 以前我们使用延时函数的时候,基本上类似这样: /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,i=1时,大约延时10us *************************************************
[单片机]
指针的第一大好处,让一个函数可以封装多个相当于return语句返回的参数
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: Pointer ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200808 ---- @ModifiedTime: 20200808 ---
[单片机]
指针的第一大好处,让一个<font color='red'>函数</font>可以<font color='red'>封装</font>多个相当于return语句返回的参数
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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