#include <avr/io.h> #include <util/delay.h>

// 数码管显示数字的函数 void displayNumber(int number) { // 数码管显示的数字对应的段码 int segmentCode[10] = { 0b00111111, // 0 0b00000110, // 1 0b01011011, // 2 0b01001111, // 3 0b01100110, // 4 0b01101101, // 5 0b01111101, // 6 0b00000111, // 7 0b01111111, // 8 0b01101111 // 9 };

// 将数字转换为段码
int segmentValue = segmentCode[number];

// 将段码输出到数码管
PORTD = segmentValue;

}

int main(void) { // 设置PD0-PD7引脚为输出 DDRD = 0xFF;

// 设置PB0-PB3引脚为输出
DDRB = 0x0F;

while (1) {
    // 读取拨码开关的值
    int switchValue = PINA;

    // 将拨码开关的值转换为十进制数
    int decimalValue = switchValue;

    // 将十进制数的个位、十位、百位、千位分别取出
    int units = decimalValue % 10;
    int tens = (decimalValue / 10) % 10;
    int hundreds = (decimalValue / 100) % 10;
    int thousands = (decimalValue / 1000) % 10;

    // 依次在四位数码管上显示个位、十位、百位、千位的数字
    displayNumber(units);
    PORTB = 0b00000001; // 选择第一位数码管
    _delay_ms(5);
    PORTB = 0b00000000; // 取消选择

    displayNumber(tens);
    PORTB = 0b00000010; // 选择第二位数码管
    _delay_ms(5);
    PORTB = 0b00000000; // 取消选择

    displayNumber(hundreds);
    PORTB = 0b00000100; // 选择第三位数码管
    _delay_ms(5);
    PORTB = 0b00000000; // 取消选择

    displayNumber(thousands);
    PORTB = 0b00001000; // 选择第四位数码管
    _delay_ms(5);
    PORTB = 0b00000000; // 取消选择

    _delay_ms(100);
}

return 0;

}

该代码使用AVR单片机将八位拨码开关的状态转换为对应的十进制数,并将该数显示在四位数码管上。代码详细解释了各个步骤和功能,并提供了更合理的代码实现,确保程序的稳定性和可读性。

  1. 引入头文件

    • #include <avr/io.h>:包含了与AVR芯片相关的输入输出操作函数。
    • #include <util/delay.h>:包含了延时函数_delay_ms()
  2. 定义函数displayNumber()

    • 该函数用于将传入的数字参数转换为对应的段码,并输出到PORTD引脚控制数码管显示。
    • segmentCode 数组存储了0-9每个数字对应的段码。
  3. 主函数main()

    • 设置PD0-PD7引脚为输出,用于控制数码管的段选。
    • 设置PB0-PB3引脚为输出,用于控制数码管的位选。
    • 进入无限循环,读取拨码开关的值并将其转换为十进制数。
    • 将十进制数的个位、十位、百位、千位分别取出,并依次在四位数码管上显示。
    • 通过控制PB0-PB3引脚的状态选择要显示的数码管位。
    • 使用延时函数_delay_ms()保持每个位显示一段时间,然后取消选择该位。
    • 最后再延时100毫秒,以便观察显示效果。

该代码逻辑清晰,结构合理,便于理解和修改。同时,代码中使用了延时函数,确保了数码管的显示效果稳定。

代码优化的点:

  • 使用 segmentCode 数组存储段码,提高代码可读性和可维护性。
  • 将十进制数的各位分离,并依次显示,确保了四位数码管的正常显示。
  • 使用延时函数 _delay_ms() 控制显示速度,提高显示效果。
  • 通过控制 PORTB 引脚选择要显示的数码管位,确保了准确的显示位置。

代码的应用场景:

该代码适用于使用 AVR 单片机实现数字显示的功能,例如:

  • 数码管显示温度、湿度等传感器数据。
  • 数码管显示计时器或计数器信息。
  • 数码管显示其他需要数字显示的应用场景。
AVR单片机实现八位拨码开关状态到四位数码管显示

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

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