以下是AT89C51的代码实现:

#include <reg51.h>

#define DIGIT_DISP P0 // 数码管控制端口
#define SWITCH P1 // 开关输入端口

void delay(unsigned int time) // 延时函数
{
    while(time--);
}

unsigned char read_switch() // 读取开关状态
{
    unsigned char input = 0;
    if (SWITCH & 0x01) input |= 0x01; // K1按下
    if (SWITCH & 0x02) input |= 0x02; // K2按下
    if (SWITCH & 0x04) input |= 0x04; // K3按下
    if (SWITCH & 0x08) input |= 0x08; // K4按下
    return input;
}

void display_digit(unsigned char digit) // 数码管显示
{
    static unsigned char code[10] = { // 数码管编码表
        0x3F, // 0
        0x06, // 1
        0x5B, // 2
        0x4F, // 3
        0x66, // 4
        0x6D, // 5
        0x7D, // 6
        0x07, // 7
        0x7F, // 8
        0x6F  // 9
    };
    DIGIT_DISP = code[digit]; // 显示数字
}

void main()
{
    while (1)
    {
        unsigned char input = read_switch(); // 读取开关状态
        if (input == 0) // 无效键
        {
            display_digit(0); // 显示0
        }
        else
        {
            display_digit(input); // 显示数字
        }
        delay(1000); // 延时1秒
    }
}

该程序首先定义了延时函数和数码管编码表,然后在read_switch()函数中读取开关输入状态,通过位运算将开关状态转化为一个4位二进制数,最后在display_digit()函数中根据数码管编码表将数字转化为数码管可以显示的编码。在main()函数中,循环读取开关状态并进行数码管显示,如果没有按下任何开关则显示0,否则根据按下的开关显示相应的数字。程序中还加入了1秒的延时,使得数码管显示的数字可以持续一段时间,避免数码管显示太快导致无法观察。

1通过AT89C51读入4位开关K1、K2、K3、K4的输入状态并按照二进制编码关系1-4输出到数码管显示。如K1按下则显示1;K2按下则显示2等多个按键按下作为无效键显示0

原文地址: https://www.cveoy.top/t/topic/bapv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录