02独立按键计数

需求:数码管第0、第1显示SW1按键次数;数码管第2、第3显示SW2按键次数;数码管第4、第5显示SW3按键次数;数码管第6、第7显示SW4按键次数;

方法一:

Int_DigitalTube.h 代码如下:

#ifndef __INT_DIGITALTUBE_H__
#define __INT_DIGITALTUBE_H__
#include <STC89C5xRC.H>
#include "Util.h"

/**
 * @brief 第 n 个数码管 显示 num
 * 
 * @param n 第几位
 * @param num 显示数字
 */
static void Int_DigitalTube_DisplaySingle(u8 n, u8 num);

/**
 * @brief 缓存中存入数码管显示的值
 * 
 * @param num 数值
 */
void Int_DigitalTube_DisplayNum(unsigned long num);


/**
 * @brief 刷新显示
 * 
 */
void Int_DigitalTube_Refresh();


/**
 * @brief 四个按键计数
 * 
 * @param num1 SW1 计数
 * @param num2 SW2 计数
 * @param num3 SW3 计数
 * @param num4 SW4 计数
 */
void Int_DigitalTube_DisplayKey(u8 num1,u8 num2,u8 num3,u8 num4);
#endif

Int_DigitalTube.c 代码如下:

#include <Int_DigitalTube.h>

// 数码管显示缓存
static u8 s_buffer[8];

// 数字0-9的编码
static char s_digital_codes[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

// 刷新显示
void Int_DigitalTube_Refresh()
{
    u8 i;
    for (i = 0; i < 8; i++) {
        Int_DigitalTube_DisplaySingle(i, s_buffer[i]);
        Com_Util_Delay1ms(1);
    }
}

/**
 * @brief 缓存中存入数码管显示的值
 *
 * @param num 数值
 */
void Int_DigitalTube_DisplayNum(unsigned long num)
{
    u8 i;

    // 清空 buffer 里存储的数值
    for (i = 0; i < 8; i++) {
        s_buffer[i] = 0;
    }

    i = 7;
    // 判断 num 是否为大于等于 0 并小于等于 9
    if (num >= 0 && num <= 9) {
        s_buffer[i] = s_digital_codes[num];
    }

    // 循环对num 进行取余和除操作
    while (num > 0) {
        s_buffer[i] = s_digital_codes[num % 10];
        num /= 10;
        i--;
    }
}

/**
 * @brief 第 n 个数码管 显示 num
 *
 * @param n 第几位
 * @param num 显示数字
 */
static void Int_DigitalTube_DisplaySingle(u8 n, u8 num)
{
    // 关掉数码管
    P0 = 0;
    // 清除片选位
    P1 &= 0xC7;
    // 将显示变量左移3位
    n <<= 3;
    // 选中 片选位
    P1 |= n;
    // 显示
    P0 = num;
}

void Int_DigitalTube_DisplayKey(u8 num1, u8 num2, u8 num3, u8 num4)
{
    u8 i;

    // 清空 buffer 里存储的数值
    for (i = 0; i < 8; i++) {
        s_buffer[i] = 0;
    }

    i = 7;
    // 循环对num1 进行取余和除操作
    while (num1 > 0) {
        if (num1 <= 9 && num1 >= 0) {
            s_buffer[i] = s_digital_codes[0];
        }
        s_buffer[i] = s_digital_codes[num1 % 10];
        num1 /= 10;
        i--;
    }

    i = 5;
    // 循环对num2 进行取余和除操作
    while (num2 > 0) {
        if (num2 <= 9 && num2 >= 0) {
            s_buffer[i] = s_digital_codes[0];
        }
        s_buffer[i] = s_digital_codes[num2 % 10];
        num2 /= 10;
        i--;
    }

    i = 3;
    // 循环对num3 进行取余和除操作
    while (num3 > 0) {
        if (num3 <= 9 && num3 >= 0) {
            s_buffer[i] = s_digital_codes[0];
        }
        s_buffer[i] = s_digital_codes[num3 % 10];
        num3 /= 10;
        i--;
    }

    i = 1;
    // 循环对num4 进行取余和除操作
    while (num4 > 0) {
        if (num4 <= 9 && num4 >= 0) {
            s_buffer[i] = s_digital_codes[0];
        }
        s_buffer[i] = s_digital_codes[num4 % 10];
        num4 /= 10;
        i--;
    }
}

Int_Keyboard.h 代码如下:

#ifndef __INT_KEYBOARD_H__
#define __INT_KEYBOARD_H__
#include <STC89C5xRC.H>
#include "Util.h"

/**
 * @brief 检测SW1按键是否按下
 * 
 * @return bit  是或否
 */
bit Int_Keyboard_IsSW1Pressed();

/**
 * @brief 检测SW2按键是否按下
 * 
 * @return bit  是或否
 */
bit Int_Keyboard_IsSW2Pressed();

/**
 * @brief 检测SW3按键是否按下
 * 
 * @return bit  是或否
 */
bit Int_Keyboard_IsSW3Pressed();

/**
 * @brief 检测SW4按键是否按下
 * 
 * @return bit  是或否
 */
bit Int_Keyboard_IsSW4Pressed();

#endif

Int_Keyboard.c 代码如下:

#include "Int_Keyboard.h"

// 当按下按键时 SW1应该是0;当抬起按键时 SW1应该是1
#define SW1 P42
#define SW2 P43
#define SW3 P32
#define SW4 P33

bit Int_Keyboard_IsSW1Pressed()
{
    // SW1没有按下,返回0
    if (SW1 == 1) {
        return 0;
    }

    // 延时消除前抖
    Com_Util_Delay1ms(10);

    // SW1 为1,是抖动没有按下
    if (SW1 == 1) {
        return 0;
    }

    // 已经按下等待抬起
    while (1) {
        if (SW1 == 1) {
            // 延时消除后抖
            Com_Util_Delay1ms(10);
            if (SW1 == 1) {
                return 1;
            }
        }
    }
}


bit Int_Keyboard_IsSW2Pressed()
{
    // SW2没有按下,返回0
    if (SW2 == 1) {
        return 0;
    }

    // 延时消除前抖
    Com_Util_Delay1ms(10);

    // SW2 为1,是抖动没有按下
    if (SW2 == 1) {
        return 0;
    }

    // 已经按下等待抬起
    while (1) {
        if (SW2 == 1) {
            // 延时消除后抖
            Com_Util_Delay1ms(10);
            if (SW2 == 1) {
                return 1;
            }
        }
    }
}


bit Int_Keyboard_IsSW3Pressed()
{
    // SW3没有按下,返回0
    if (SW3 == 1) {
        return 0;
    }

    // 延时消除前抖
    Com_Util_Delay1ms(10);

    // SW3 为1,是抖动没有按下
    if (SW3 == 1) {
        return 0;
    }

    // 已经按下等待抬起
    while (1) {
        if (SW3 == 1) {
            // 延时消除后抖
            Com_Util_Delay1ms(10);
            if (SW3 == 1) {
                return 1;
            }
        }
    }
}


bit Int_Keyboard_IsSW4Pressed()
{
    // SW4没有按下,返回0
    if (SW4 == 1) {
        return 0;
    }

    // 延时消除前抖
    Com_Util_Delay1ms(10);

    // SW4 为1,是抖动没有按下
    if (SW4 == 1) {
        return 0;
    }

    // 已经按下等待抬起
    while (1) {
        if (SW4 == 1) {
            // 延时消除后抖
            Com_Util_Delay1ms(10);
            if (SW4 == 1) {
                return 1;
            }
        }
    }
}

main.c 代码如下:

#include <STC89C5XRC.H>
#include "Int_Keyboard.h"
#include "Int_DigitalTube.h"

void main()
{
    u8 num1, num2, num3, num4;
    num1 = num2 = num3 = num4 = 0;
    while (1) {
        Int_DigitalTube_RefreshKey();

        if (Int_Keyboard_IsSW1Pressed()) {
            num1++;
            P00 = ~P00;
          
        }

        if (Int_Keyboard_IsSW2Pressed()) {
            P01 = ~P01;
            num2++;
           
        }

        if (Int_Keyboard_IsSW3Pressed()) {
            P02 = ~P02;
            num3++;
         
        }

        if (Int_Keyboard_IsSW4Pressed()) {
            P03 = ~P03;
            num4++;
            
        }

        Int_DigitalTube_DisplayKey(num1,num2,num3,num4);

         Int_DigitalTube_Refresh();
    }
}

方法二:

Int_DigitalTube.h 代码如下:

#ifndef __INT_DIGITALTUBE_H__
#define __INT_DIGITALTUBE_H__
#include <STC89C5xRC.H>
#include "Util.h"

/**
 * @brief 第 n 个数码管 显示 num
 * 
 * @param n 第几位
 * @param num 显示数字
 */
static void Int_DigitalTube_DisplaySingle(u8 n, u8 num);

/**
 * @brief 缓存中存入数码管显示的值
 * 
 * @param num 数值
 */
void Int_DigitalTube_DisplayNum(unsigned long num);


/**
 * @brief 刷新显示
 * 
 */
void Int_DigitalTube_Refresh();


/**
 * @brief 第 n 个数码管显示什么数
 * 
 * @param n 第几个数码管
 * @param num 显示数字
 */
void Int_DigitalTube_Key(u8 n,u8 num);

/**
 * @brief 刷新显示
 * 
 */
void Int_DigitalTube_RefreshKey();

#endif

Int_DigitalTube.c 代码如下:

#include <Int_DigitalTube.h>

// 数码管显示缓存
static u8 s_buffer[8];

// 数码管显示按键次数
static u8 buffer[4][2];
static u8 number = 0;

// 数字0-9的编码
static char s_digital_codes[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

// 刷新显示
void Int_DigitalTube_Refresh()
{
    u8 i;
    for (i = 0; i < 8; i++) {
        Int_DigitalTube_DisplaySingle(i, s_buffer[i]);
        Com_Util_Delay1ms(1);
    }
}

/**
 * @brief 缓存中存入数码管显示的值
 *
 * @param num 数值
 */
void Int_DigitalTube_DisplayNum(unsigned long num)
{
    u8 i;

    // 清空 buffer 里存储的数值
    for (i = 0; i < 8; i++) {
        s_buffer[i] = 0;
    }

    i = 7;
    // 判断 num 是否为大于等于 0 并小于等于 9
    if (num >= 0 && num <= 9) {
        s_buffer[i] = s_digital_codes[num];
    }

    // 循环对num 进行取余和除操作
    while (num > 0) {
        s_buffer[i] = s_digital_codes[num % 10];
        num /= 10;
        i--;
    }
}

/**
 * @brief 第 n 个数码管 显示 num
 *
 * @param n 第几位
 * @param num 显示数字
 */
static void Int_DigitalTube_DisplaySingle(u8 n, u8 num)
{
    // 关掉数码管
    P0 = 0;
    // 清除片选位
    P1 &= 0xC7;
    // 将显示变量左移3位
    n <<= 3;
    // 选中 片选位
    P1 |= n;
    // 显示
    P0 = num;
}
void Int_DigitalTube_Key(u8 n, u8 num)
{
    u8 i;
    i = 1;
    // 循环对num4 进行取余和除操作
    while (num > 0) {
        if (num <= 9 && num >= 0) {
            buffer[n][0] = s_digital_codes[0];
        }
        buffer[n][i] = s_digital_codes[num % 10];
        num /= 10;
        i--;
    }
}

void Int_DigitalTube_RefreshKey()
{
    u8 i, n;

    if (number == 0) {
        for (n = 0; n < 4; n++) {
            for (i = 0; i < 2; i++) {
                buffer[n][i] = s_digital_codes[0];
            }
        }
        number++;
    }

    for (n = 0; n < 4; n++) {
        for (i = 0; i < 2; i++) {
            Int_DigitalTube_DisplaySingle(n * 2 + i, buffer[n][i]);
            Com_Util_Delay1ms(1);
        }
    }
}

Int_Keyboard.h 代码如下:

#ifndef __INT_KEYBOARD_H__
#define __INT_KEYBOARD_H__
#include <STC89C5xRC.H>
#include "Util.h"

/**
 * @brief 检测SW1按键是否按下
 * 
 * @return bit  是或否
 */
bit Int_Keyboard_IsSW1Pressed();

/**
 * @brief 检测SW2按键是否按下
 * 
 * @return bit  是或否
 */
bit Int_Keyboard_IsSW2Pressed();

/**
 * @brief 检测SW3按键是否按下
 * 
 * @return bit  是或否
 */
bit Int_Keyboard_IsSW3Pressed();

/**
 * @brief 检测SW4按键是否按下
 * 
 * @return bit  是或否
 */
bit Int_Keyboard_IsSW4Pressed();

#endif

Int_Keyboard.c 代码如下:

#include "Int_Keyboard.h"

// 当按下按键时 SW1应该是0;当抬起按键时 SW1应该是1
#define SW1 P42
#define SW2 P43
#define SW3 P32
#define SW4 P33

bit Int_Keyboard_IsSW1Pressed()
{
    // SW1没有按下,返回0
    if (SW1 == 1) {
        return 0;
    }

    // 延时消除前抖
    Com_Util_Delay1ms(10);

    // SW1 为1,是抖动没有按下
    if (SW1 == 1) {
        return 0;
    }

    // 已经按下等待抬起
    while (1) {
        if (SW1 == 1) {
            // 延时消除后抖
            Com_Util_Delay1ms(10);
            if (SW1 == 1) {
                return 1;
            }
        }
    }
}


bit Int_Keyboard_IsSW2Pressed()
{
    // SW2没有按下,返回0
    if (SW2 == 1) {
        return 0;
    }

    // 延时消除前抖
    Com_Util_Delay1ms(10);

    // SW2 为1,是抖动没有按下
    if (SW2 == 1) {
        return 0;
    }

    // 已经按下等待抬起
    while (1) {
        if (SW2 == 1) {
            // 延时消除后抖
            Com_Util_Delay1ms(10);
            if (SW2 == 1) {
                return 1;
            }
        }
    }
上一篇:保护C#代码的艺术:深入浅出代码混淆技术


下一篇:飞机降落蓝桥杯[2023蓝桥省赛B组]