AVR单片机实现八位拨码开关状态到四位数码管显示
#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单片机将八位拨码开关的状态转换为对应的十进制数,并将该数显示在四位数码管上。代码详细解释了各个步骤和功能,并提供了更合理的代码实现,确保程序的稳定性和可读性。
-
引入头文件
#include <avr/io.h>:包含了与AVR芯片相关的输入输出操作函数。#include <util/delay.h>:包含了延时函数_delay_ms()。
-
定义函数
displayNumber()- 该函数用于将传入的数字参数转换为对应的段码,并输出到PORTD引脚控制数码管显示。
segmentCode数组存储了0-9每个数字对应的段码。
-
主函数
main()- 设置PD0-PD7引脚为输出,用于控制数码管的段选。
- 设置PB0-PB3引脚为输出,用于控制数码管的位选。
- 进入无限循环,读取拨码开关的值并将其转换为十进制数。
- 将十进制数的个位、十位、百位、千位分别取出,并依次在四位数码管上显示。
- 通过控制PB0-PB3引脚的状态选择要显示的数码管位。
- 使用延时函数
_delay_ms()保持每个位显示一段时间,然后取消选择该位。 - 最后再延时100毫秒,以便观察显示效果。
该代码逻辑清晰,结构合理,便于理解和修改。同时,代码中使用了延时函数,确保了数码管的显示效果稳定。
代码优化的点:
- 使用
segmentCode数组存储段码,提高代码可读性和可维护性。 - 将十进制数的各位分离,并依次显示,确保了四位数码管的正常显示。
- 使用延时函数
_delay_ms()控制显示速度,提高显示效果。 - 通过控制
PORTB引脚选择要显示的数码管位,确保了准确的显示位置。
代码的应用场景:
该代码适用于使用 AVR 单片机实现数字显示的功能,例如:
- 数码管显示温度、湿度等传感器数据。
- 数码管显示计时器或计数器信息。
- 数码管显示其他需要数字显示的应用场景。
原文地址: https://www.cveoy.top/t/topic/fx02 著作权归作者所有。请勿转载和采集!