c - 数字显示不正确,无法控制特定引脚的输出

标签 c avr led atmega atmega16

我正在尝试在微 Controller ATmega16 到 7 段显示器上显示我的输入。

我在 http://www.avr-tutorials.com/projects/atmega16-based-digital-clock 上找到了以下代码但是当我实现它时,它不起作用。我得到了一个波动的输出,即我无法控制特定引脚的输出。 我有两个输入 temp1 和 temp2,我想在三个 7 段显示器上显示它们中的每一个。另外,我没有使用引脚 2 和 3,因为它们是中断引脚,我在其他地方使用过它们。使用 Pin0,1,4,5,6,7。

添加一些延迟后,代码可以正常工作,否则会在随机引脚生成输出。 即我应该从 PIND1 显示的输出显示在所有引脚上,

我的代码:

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

    #define SegDataPort     PORTC
    #define SegDataPin      PINC
    #define SegDataDDR      DDRC

    #define SegCntrlPort    PORTD
    #define SegCntrlPin     PIND
    #define SegCntrlDDR     DDRD

/*
* Function Description:
* Encode a Decimal Digit 0-9 to its Seven Segment Equivalent.
*
* Function Arguments:
* digit - Decimal Digit to be Encoded
* common - Common Anode (0), Common Cathode(1)
* SegVal - Encoded Seven Segment Value 
*
* Connections:
* Encoded SegVal is return in the other G-F-E-D-C-B-A that is A is the least
* significant bit (bit 0) and G bit 6.
*/
unsigned char DigitTo7SegEncoder(int digit, unsigned char common)
{
    unsigned char SegVal;

    switch(digit)   
    {   
        case 0: if(common == 1) SegVal = 0b00111111;
                else            SegVal = ~0b00111111;
                break;
        case 1: if(common == 1) SegVal = 0b00000110;
                else            SegVal = ~0b00000110;
                break;
        case 2: if(common == 1) SegVal = 0b01011011;
                else            SegVal = ~0b01011011;
                break;
        case 3: if(common == 1) SegVal = 0b01001111;
                else            SegVal = ~0b01001111;
                break;
        case 4: if(common == 1) SegVal = 0b01100110;
                else            SegVal = ~0b01100110;
                break;
        case 5: if(common == 1) SegVal = 0b01101101;
                else            SegVal = ~0b01101101;
                break;
        case 6: if(common == 1) SegVal = 0b01111101;
                else            SegVal = ~0b01111101;
                break;
        case 7: if(common == 1) SegVal = 0b00000111;
                else            SegVal = ~0b00000111;
                break;
        case 8: if(common == 1) SegVal = 0b01111111;
                else            SegVal = ~0b01111111;
                break;
        case 9: if(common == 1) SegVal = 0b01101111;
                else            SegVal = ~0b01101111;       
    }       
    return SegVal;
}



int main(void)
{
int temp1,temp2;
//Suppose my input is 105 and 210, i.e. temp1=105 and temp2=210;
// it contains other information also, not required here
SegDataDDR = 0xFF;
SegCntrlDDR = 0xF3;
SegCntrlPort = 0xF3;
SegDataPort = 0x00;
  while(1){
            SegDataPort = DigitTo7SegEncoder(temp1%10,1);
        SegCntrlPort = ~0x01;
        SegDataPort = DigitTo7SegEncoder((temp1/10)%10,1); 
        SegCntrlPort = ~0x02;
        SegDataPort = DigitTo7SegEncoder(temp1/100,1);
        SegCntrlPort = ~0x10;
        SegDataPort = DigitTo7SegEncoder(temp2%10,1); 
        SegCntrlPort = ~0x20;
        SegDataPort = DigitTo7SegEncoder((temp2/10)%10,1); 
        SegCntrlPort = ~0x40;
        SegDataPort = DigitTo7SegEncoder(temp2/100,1);
        SegCntrlPort = ~0x80;
}}

最佳答案

您没有将 DDR 设置为在任何地方输出。要用作输出的引脚必须将 DDRx 中的相应位设置为 1。否则它仍然是输入引脚。

输入引脚将显示输出,但电流较低且上升沿较慢。用 LCD 吸收该电流可能会导调用压下降。

关于c - 数字显示不正确,无法控制特定引脚的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30593741/

相关文章:

c - 如何将 .o 文件转换为 .elf 文件?

c - 使用带有按钮的 CCS 切换 LED

javascript - 在 iOS 中显示格式化的 C 程序的选项

c - 光强与R、G、B的关系

c - 在 32 位机器上执行 C 程序

colors - Raspberry Pi + neopixel : If brightness of RGB LEDs are reduced, 这是否意味着某些颜色无法渲染?

安卓:LED 不打开/关闭

c - 如何在内核中记录大量数据

c - 为什么 avr-gcc 在调用 main() 时费心保存寄存器状态?

c++ - GCC 为 AVR 上的简单 ISR 生成不必要的寄存器推送