如何在上述键盘设定的情况下,输入四个数字并循环显示?(关键词-数码管)

在上述键盘设定的情况下,输入四个数字并循环显示。

img

例如:以输入2761为例,数码管显示:2761-276.1-27.61-2.761-7612-761.2-76.123-7.612-7127-612.7-61.27-6.127-1276-127.6-12.76-1.276-2761-...。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7746739
  • 除此之外, 这篇博客: 实验四 交流扫描分析中的 1、共射极放大电路如下图所示。试分析出中频区放大倍数、上限截止频率和下限截止频率,电路输入电阻和输出电阻。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在这里插入图片描述
    在这里插入图片描述
    步骤
    (1)、作出电路图,将V2信号源的 AC 设置为1
    (2)、在Analysis type中选择AC Sweep/Noise,在Options中选中General Settings。AC Sweep的分析频率从0.01Hz到1GHz,采用十倍频,每十倍频采样点数为50。运行仿真。
    (3)、在Probe窗口中,键入幅频响应表达式:DB(V(out)/V(in)),显示出电压增益的幅频特性曲线。启动标尺,测量并列出中频电压增益(分贝)=( 45.448 )。下限截止频率fL和上限截止频率fH大约是:fL=( 4.3368HZ ),fH=( 8.9149HZ)。(上限截止频率fH和下限截止频率的分贝数要比中频电压增益(分贝)少3分贝)

    在这里插入图片描述
    (4)be窗口中,键入相频响应表达式:P(V(out)/V(in)),显示出电压增益的相频特性曲线。启动标尺,测量并列出中频区相位差大约为( 89.2 )。
    在这里插入图片描述

    (5)、在Probe窗口中,显示出输入电阻的特性曲线。输入电阻表达式:V(in)/I(c2)。启动标尺,测量并列出中频区输入电阻大约为(899.767 )。
    在这里插入图片描述
    在Probe窗口中,显示出输入电阻的特性曲线。方法如下:
    ①将电路输入端短路。即将电源V1去掉,用 wire 代替。
    ②负载电阻R4去掉,在输出端加入信号源Vt(将信号源 AC设置为1 )。
    ③进行交流扫描分析,键入表达式:
    在这里插入图片描述

    启动标尺,测量并列出中频区的输出电阻数值大约为( 1.7492K )。

    在这里插入图片描述

  • 以下回答来自chatgpt:

    这道题目需要先让用户输入一个四位数字,然后循环显示这个数字和它的不同组合。具体实现方法如下:

    1. 首先,我们需要定义一个变量来表示用户输入的四位数字。这个变量可以是一个四位数的整数或者一个字符串。

    2. 接下来,我们可以使用一个循环来依次显示这个数字和它的不同组合。在每次循环中,我们可以使用数学公式来计算当前需要显示的数字,然后将其显示在数码管上。

    3. 在计算当前需要显示的数字时,我们可以将输入的四位数字拆分成单独的数字,并将它们分别赋值给不同的变量。然后,我们可以使用四个循环来依次计算这个数字的各个组合。具体来说,我们可以设计一个双重循环,在外层循环中计算数字的小数点位置,在内层循环中计算数字的值。

    4. 在每次循环中,我们需要根据当前计算的值来更新数码管上的显示。我们可以使用一个位移运算来将数字的二进制代码发送到数码管的段选和位选引脚上。为了避免闪烁,我们可以使用循环来控制数码管的刷新速度。

    下面是部分代码示例:

    #include <STC15F2K60S2.H>
    
    u16 num = 0;              // 存储用户输入的数字
    u8 digits[4] = {0};       // 将数字拆分成单独的数字
    u8 point_pos = 0;         // 小数点位置
    u8 segs[4] = {0};         // 数码管段选值
    u8 coms[4] = {0};         // 数码管位选值
    
    /* 将数字拆分成单独的数字 */
    void split_digits(u16 num, u8 *digits) {
        digits[0] = num % 10;
        digits[1] = (num / 10) % 10;
        digits[2] = (num / 100) % 10;
        digits[3] = (num / 1000) % 10;
    }
    
    /* 计算当前需要显示的数字 */
    u16 calc_number(u8 pos, u8 *digits) {
        u16 num = 0;
        for (u8 i = 0; i < 4; i++) {
            if (i == pos) {
                num += 1;
            } else {
                num = num * 10 + digits[i];
            }
        }
        return num;
    }
    
    /* 将数字的二进制代码发送到数码管上 */
    void display_number(u8 *segs, u8 *coms) {
          for (u8 i = 0; i < 4; i++) {
            P0 = ~(segs[i]);
            choose(7);
            P0 = coms[i];
            choose(6);
            delay(2);   // 控制刷新速度
        }
    }
    
    /* 主程序 */
    void main() {
        /* 初始化数码管和按键 */
        init();
    
        /* 让用户输入一个四位数字 */
        while (num < 1000 || num > 9999) {
            num = get_number();
        }
    
        /* 将数字拆分成单独的数字 */
        split_digits(num, digits);
    
        /* 计算并显示数字的各个组合 */
        for (u8 i = 0; i < 4; i++) {
            for (u8 j = 0; j < 10; j++) {
                u16 num = calc_number(i, digits) * 10 + j;
                split_digits(num, digits);
                if (i == 0) {
                    point_pos = 0;
                } else if (i == 1) {
                    point_pos = 1;
                } else if (i == 2) {
                    point_pos = 2;
                } else {
                    point_pos = 3;
                }
                /* 计算数码管的段选和位选值 */
                calc_segs_coms(digits, point_pos, segs, coms);
    
                /* 显示数字 */
                display_number(segs, coms);
    
                /* 等待一段时间 */
                delay(100);
            }
        }
    
        /* 循环显示数字 */
        while (1) {
            for (u8 i = 0; i < 4; i++) {
                /* 计算当前需要显示的数字 */
                u16 num = calc_number(i, digits);
                split_digits(num, digits);
                if (i == 0) {
                    point_pos = 0;
                } else if (i == 1) {
                    point_pos = 1;
                } else if (i == 2) {
                    point_pos = 2;
                } else {
                    point_pos = 3;
                }
                /* 计算数码管的段选和位选值 */
                calc_segs_coms(digits, point_pos, segs, coms);
    
                /* 显示数字 */
                display_number(segs, coms);
    
                /* 等待一段时间 */
                delay(100);
            }
        }
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^