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

// 数码管显示的数字表 const uint8_t digitTable[10] = { 0b00111111, // 0 0b00000110, // 1 0b01011011, // 2 0b01001111, // 3 0b01100110, // 4 0b01101101, // 5 0b01111101, // 6 0b00000111, // 7 0b01111111, // 8 0b01101111 // 9 };

// 读取八位拨码开关的状态 uint8_t readSwitches() { return PINA; }

// 将一个十进制数显示在数码管上 void displayNumber(uint8_t number) { // 分离个位、十位和百位数字 uint8_t digit1 = number % 10; uint8_t digit2 = (number / 10) % 10; uint8_t digit3 = (number / 100) % 10;

// 将数字转换为对应的数码管段码
uint8_t segment1 = digitTable[digit1];
uint8_t segment2 = digitTable[digit2];
uint8_t segment3 = digitTable[digit3];

// 依次显示三个数码管
PORTD = segment1;
PORTB = 0b00000001; // 选择第一个数码管
_delay_ms(1);

PORTD = segment2;
PORTB = 0b00000010; // 选择第二个数码管
_delay_ms(1);

PORTD = segment3;
PORTB = 0b00000100; // 选择第三个数码管
_delay_ms(1);

}

int main(void) { // 设置PA0~PA7为输入 DDRA = 0x00; // 设置PD0~PD7为输出 DDRD = 0xFF; // 设置PB0~PB3为输出 DDRB = 0x0F;

// 初始化数码管状态为熄灭
PORTD = 0x00;
PORTB = 0x00;

while (1) {
    // 读取拨码开关的状态
    uint8_t switchState = readSwitches();
    
    // 将拨码开关的状态转换为二进制数
    uint8_t binaryNumber = switchState;
    
    // 将二进制数转换为十进制数
    uint8_t decimalNumber = 0;
    for (int i = 0; i < 8; i++) {
        if (binaryNumber & (1 << i)) {
            decimalNumber += (1 << i);
        }
    }
    
    // 将拨码开关状态的十进制数显示在数码管上
    displayNumber(decimalNumber);
}

return 0;

}

ATMEGA16 单片机程序:八位拨码开关控制三位数码管显示二进制数转换后的十进制数

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

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