#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 = 0;
    for (int i = 0; i < 8; i++) {
        if (switchValue & (1 << i)) {
            decimalValue += (1 << i);
        }
    }

    // 将十进制数显示在数码管上
    for (int i = 0; i < 4; i++) {
        // 设置位选引脚的值
        PORTB = (1 << i);

        // 获取当前位的数字
        int digit = decimalValue % 10;

        // 将数字显示在数码管上
        displayNumber(digit);

        // 右移十进制数
        decimalValue /= 10;

        // 延迟一段时间
        _delay_ms(100);
    }
}

return 0;

}

该代码实现了将八位拨码开关的状态转换为十进制数,并显示在四位数码管上。

代码分析:

  1. 代码首先包含了avr/io.h和util/delay.h头文件,这些头文件提供了与AVR微控制器相关的函数和宏定义。
  2. displayNumber函数用于将数字显示在数码管上。它使用一个整型数组segmentCode来存储数字0-9对应的段码,然后将数字转换为段码并输出到PORTD引脚上。
  3. 在main函数中,设置PD0-PD7引脚为输出,用于连接数码管的段选引脚。设置PB0-PB3引脚为输出,用于连接数码管的位选引脚。
  4. 在一个无限循环中,读取拨码开关的值,并调用displayNumber函数将其显示在数码管上。然后延迟100毫秒。

代码改进:

  1. 代码中增加了将拨码开关的值转换为十进制数的步骤,并通过循环逐位显示数字。
  2. 代码中使用了位操作来读取拨码开关的值,并设置位选引脚的值。
  3. 代码中加入了延迟函数,以控制数码管的刷新频率。

总结:

本代码实现了将八位拨码开关的状态转换为十进制数并显示在四位数码管上的功能。代码清晰易懂,并进行了合理改进,提高了代码的可读性和可维护性。

AVR单片机实现八位拨码开关控制四位数码管显示

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

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