03独立按键左移、右移、加一、清零

需求:初始状态数码管显示1111 1111,按键SW1左移;按键SW2右移;按键SW3加一;按键SW4清零。

Int_DigitalTube.h代码如下:

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

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

/**
 * @brief 初始值
 * 
 */
void Int_DigitalTube_InitialValue();

/**
 * @brief 左移
 * 
 */
void Int_DigitalTube_Left();

/**
 * @brief 右移
 * 
 */
void Int_DigitalTube_Right();

/**
 * @brief 加一
 * 
 */
void Int_DigitalTube_PlusOne();

/**
 * @brief 清零
 * 
 */
void Int_DigitalTube_Reset();

/**
 * @brief 字码对应数字
 * 
 * @param value 字码
 * @return u8 返回对应数字
 */
u8 Int_DigitalTube_ReturnValue(u8 value);

/**
 * @brief 判断当前位是0 还是 1
 * 
 * @param howMany 判断哪一位
 * @return u8 如果当前位是0 加一返回1;
*             如果当前位是1 加一返回0;
              如果当前位是第0位(最高位)返回0;
 */
u8 Int_DigitalTube_Binary(u8 howMany); 
#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);
    }
}

void Int_DigitalTube_InitialValue()
{
    u8 i;
    // s_buffer 里存储的数值为1
    for (i = 0; i < 8; i++) {
        s_buffer[i] = s_digital_codes[1];
    }
}

void Int_DigitalTube_Left()
{
    u8 i;
    // 左移
    for (i = 0; i < 7; i++) {
        s_buffer[i] = s_buffer[i + 1];
    }
    s_buffer[7] = s_digital_codes[0];
}

void Int_DigitalTube_Right()
{
    u8 i;
    // 右移
    for (i = 7; i > 0; i--) {
        s_buffer[i] = s_buffer[i - 1];
    }
    s_buffer[0] = s_digital_codes[0];
}

void Int_DigitalTube_PlusOne()
{
    u8 i;
    for (i = 7; i >= 0; i--) {
        if (Int_DigitalTube_Binary(i)) {
            break;
        }
    }
}

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

u8 Int_DigitalTube_ReturnValue(u8 value)
{
    switch (value) {
        case 0x3F:
            return 0;
        case 0x06:
            return 1;
    }
}

u8 Int_DigitalTube_Binary(u8 howMany)
{
    u8 i;
    i = Int_DigitalTube_ReturnValue(s_buffer[howMany]);
    if (i) {
        if (howMany == 0) {
            return 1;
        }
        s_buffer[howMany] = s_digital_codes[0];
        return 0;
    } else {
        s_buffer[howMany] = s_digital_codes[1];
        return 1;
    }
}

main.c代码如下:

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

void main()
{
    Int_DigitalTube_InitialValue();
    while (1) {
        Int_DigitalTube_Refresh();

        if (Int_Keyboard_IsSW1Pressed()) {
            P00 = ~P00;
            Int_DigitalTube_Left();
        }

        if (Int_Keyboard_IsSW2Pressed()) {
            P01 = ~P01;
            Int_DigitalTube_Right();
        }

        if (Int_Keyboard_IsSW3Pressed()) {
            P02 = ~P02;
           Int_DigitalTube_PlusOne();
        }

        if (Int_Keyboard_IsSW4Pressed()) {
            P03 = ~P03;
            Int_DigitalTube_Reset();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路x飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值