学习水果 2024-05-23 20:05 采纳率: 84%
浏览 3
已结题

有了单片机的代码,但是不知道怎么改让两个显示器,一个显示数字11个,一个显示文字,并且是同时进行。

怎么改单片机代码让一个晶体管显示学号,另一个晶体管显示姓名了单片机的代码,但是不知道怎么改让两个显示器,一个显示数字11个,一个显示文字,并且是同时进行。

img

img

img


这里提供我的代码,能帮我解决吗?

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-23 20:05
    关注

    引自免费微信小程序:皆我百晓生

    要实现这个功能,首先你需要确保你的单片机有多个并行输出端口,用于连接两个不同的显示器(这里假设是LED数码管)。通常情况下,单片机会有一个或多个GPIO(通用输入/输出)端口,这些端口可以用来控制LED数码管的段选和位选线。为了简化起见,我们假设你有两个独立的8位数码管,每个都可以显示两位数字或一位字符。我们将使用C语言编写代码,但具体代码会因使用的单片机型号、库函数以及硬件配置而有所不同。这里提供一个基本的框架,你可以根据实际情况进行调整。

    #include <stdio.h>
    #include <stdlib.h>
    
    // 假设这是你的数码管驱动函数,实际代码可能不同
    void display_number_on_lcd(int number, LCD *lcd);
    void display_text_on_lcd(char *text, LCD *lcd);
    
    LCD lcd1; // 数字显示器1
    LCD lcd2; // 文字显示器2
    
    int main(void) {
        int num_to_display = 1234567890; // 需要显示的数字
        char text_to_display[] = "John Doe"; // 需要显示的文字
    
        while (1) {
            display_number_on_lcd(num_to_display % 100, &lcd1); // 显示两位数字
            display_text_on_lcd(text_to_display, &lcd2); // 显示文字
    
            num_to_display++; // 自增数字,以便循环显示不同数字
            if (num_to_display > 9999999999) { // 如果超过最大值,重置为最小值
                num_to_display = 1234567890;
            }
    
            // 这里可以根据需要添加延时,以控制更新频率
            delay(1000); // 延时1秒
        }
    
        return 0;
    }
    
    // 假设这是你的LCD类定义,实际可能会有更多成员变量和方法
    typedef struct {
        GPIO *segment_lines[8]; // 段选线
        GPIO *bit_lines[7];     // 位选线
    } LCD;
    
    void display_number_on_lcd(int number, LCD *lcd) {
        // 将数字转换为适合数码管显示的二进制格式
        int binary_number[8];
        for (int i = 0; i < 8; i++) {
            binary_number[i] = (number % 10) << (7 - i);
            number /= 10;
        }
    
        // 控制段选线和位选线,显示数字
        for (int bit = 0; bit < 7; bit++) {
            for (int segment = 0; segment < 8; segment++) {
                // 设置段选线和位选线,显示当前数字的位
                set_gpio(lcd->segment_lines[segment], binary_number[segment]);
                set_gpio(lcd->bit_lines[bit], (binary_number[bit / 8] >> (bit % 8)) & 1);
                
                // 在这里可以添加延时,以便于视觉效果
                delay(10);
            }
            
            // 清除位选线,准备下一个数字位
            for (int bit = 0; bit < 7; bit++) {
                clear_gpio(lcd->bit_lines[bit]);
            }
        }
    }
    
    void display_text_on_lcd(char *text, LCD *lcd) {
        // 根据字符映射表将文本转换为二进制格式
        for (char c : text) {
            int binary_char = get_character_code(c); // 假设get_character_code是一个获取字符对应二进制码的函数
    
            // 控制段选线和位选线,显示字符
            for (int bit = 0; bit < 7; bit++) {
                for (int segment = 0; segment < 8; segment++) {
                    set_gpio(lcd->segment_lines[segment], (binary_char >> segment) & 1);
                    set_gpio(lcd->bit_lines[bit], (binary_char >> (7 - bit)) & 1);
                    
                    // 在这里可以添加延时,以便于视觉效果
                    delay(10);
                }
                
                // 清除位选线,准备下一个字符
                for (int bit = 0; bit < 7; bit++) {
                    clear_gpio(lcd->bit_lines[bit]);
                }
            }
        }
    }
    

    这段代码只是一个基础示例,你需要根据你的单片机型号、所使用的开发板、库函数以及硬件连接方式来修改它。注意,这里的set_gpioclear_gpio函数是用来设置和清除GPIO引脚状态的,你需要根据实际单片机提供的API进行替换。同样,delay函数用于产生延迟,也需要根据实际情况替换。

    对于LED数码管的硬件连接,通常会有8条段选线(A~G和DP)和4到7条位选线(a~g或b~f),总共11条线。在代码中,我们使用了8条段选线和7条位选线,这样可以显示最多8位的数字或字符。如果你的显示器使用的是不同数量的位选线,需要相应地调整代码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月31日
  • 已采纳回答 5月23日
  • 修改了问题 5月23日
  • 创建了问题 5月23日