c - 使用相同的代码,我从 ATMEGA16A 的两个端口得到两个不同的答案

标签 c keyboard calculator avr lcd

我正在尝试制作一个需要两个带有 ATMEGA16A 键盘的计算器 我已经编写了一个从键盘获取输入的代码,它可以在 PORTB 上工作,但相同的代码(只需将 B 更改为 C)在 PORTC 上不起作用!!

请帮助我,我快疯了:(

 while(y[1]== 0 || y[0] ==24) 
        {
            getB(y);
            if(y[1]== 0 || y[0] ==24)
            {
                getC(y);
            }
        }

    int* getB(int *y)
{
    int key;
    DDRB = 0x0F;
    PORTB = 0xF0;
    delay_ms(5);
    key = PINB;
    DDRB = 0xF0;
    PORTB = 0x0F;
    delay_ms(5);       
    key = key | PINB;
    delay_ms(10); 
    if(key != 0xFF) {keyboardB(y);}
    return y;
}

int* keyboardB(int* y)
{
    DDRB = 0x0F;

    PORTB.0 = 1;
    PORTB.1 = 0;
    PORTB.2 = 0;
    PORTB.3 = 0;
    if(PINB.5 == 1){y[0] = 14; y[1] = 1; lcd_puts("*");while(PINB.5 == 1){PORTD.0 = 1;}PORTD.0 = 0;return y;}
    if(PINB.4 == 1){y[0] = 15; y[1] = 1; lcd_puts("/");while(PINB.4 == 1){PORTD.0 = 1;}PORTD.0 = 0; return y;}
    if(PINB.6 == 1){y[0] = 13; y[1] = 1; lcd_puts("-");while(PINB.6 == 1){PORTD.0 = 1;}PORTD.0 = 0; return y;}
    if(PINB.7 == 1){y[0] = 12; y[1] = 1; lcd_puts("+");while(PINB.7 == 1){PORTD.0 = 1;}PORTD.0 = 0; return y;}
    //=================================================
    PORTB.0 = 0;
    PORTB.1 = 1;
    PORTB.2 = 0;
    PORTB.3 = 0;
    if(PINB.5 == 1){y[0] = 9; y[1] = 1; lcd_puts("9");while(PINB.5 == 1){PORTD.0 = 1;}PORTD.0 = 0;return y;}
    if(PINB.4 == 1){y[0] = 11; y[1] = 1; lcd_puts("=");while(PINB.4 == 1){PORTD.0 = 1;}PORTD.0 = 0; return y;}
    if(PINB.6 == 1){y[0] = 6; y[1] = 1; lcd_puts("6");while(PINB.6 == 1){PORTD.0 = 1;}PORTD.0 = 0; return y;}
    if(PINB.7 == 1){y[0] = 3; y[1] = 1; lcd_puts("3");while(PINB.7 == 1){PORTD.0 = 1;}PORTD.0 = 0; return y;}
    //=================================================
    PORTB.0 = 0;
    PORTB.1 = 0;
    PORTB.2 = 1;
    PORTB.3 = 0;
    if(PINB.5 == 1){y[0] = 8; y[1] = 1; lcd_puts("8");while(PINB.5 == 1){PORTD.0 = 1;}PORTD.0 = 0;return y;}
    if(PINB.4 == 1){y[0] = 0; y[1] = 1; lcd_puts("0");while(PINB.4 == 1){PORTD.0 = 1;}PORTD.0 = 0; return y;}
    if(PINB.6 == 1){y[0] = 5; y[1] = 1; lcd_puts("5");while(PINB.6 == 1){PORTD.0 = 1;}PORTD.0 = 0; return y;}
    if(PINB.7 == 1){y[0] = 2; y[1] = 1; lcd_puts("2");while(PINB.7 == 1){PORTD.0 = 1;}PORTD.0 = 0; return y;}
    //=================================================
    PORTB.0 = 0;
    PORTB.1 = 0;
    PORTB.2 = 0;
    PORTB.3 = 1;
    if(PINB.4 == 1)     //Mode
    {
        //delay_ms(1000);
        //if(PINB.4 == 1) {while(PINB.4 == 1){}y[0] = 10; y[1] = 1; return y;}
        //else {y[0] = 10; y[1] = 0; return y;}  //value of y[0] is not important
        y[0] = 24; y[1] = 1;while(PINB.4 == 1){PORTD.0 = 1;}PORTD.0 = 0; return y;
    }
    if(PINB.5 == 1){y[0] = 24; y[1] = 1;while(PINB.5 == 1){PORTD.0 = 1;}PORTD.0 = 0; return y;}
    if(PINB.6 == 1){y[0] = 24; y[1] = 1;while(PINB.6 == 1){PORTD.0 = 1;}PORTD.0 = 0; return y;}
    if(PINB.7 == 1){y[0] = 24; y[1] = 1;;while(PINB.7 == 1){PORTD.0 = 1;}PORTD.0 = 0; return y;}
}

最佳答案

很可能您没有停用使用端口 C 上某些引脚的 JTAG 端口。查看 fuse 并将其设置为停用 JTAG,以便能够在您的应用程序中使用该端口。

关于c - 使用相同的代码,我从 ATMEGA16A 的两个端口得到两个不同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34904259/

相关文章:

c - Altera DE2 的定点和浮点用法?

c - 9 键键盘打印 qwerty 键的逻辑

javascript - 带有逗号和小数的正确 JS 货币格式

Java 确定哪个文本字段具有焦点

为 C 程序创建 MATLAB MEX 文件

c - 如何通过 Cmake 在另一个库中使用 pico-SDK 库?

ios - Swift - 在用户输入时获取键盘输入

javascript - 使用 JavaScript 模拟 Tab 按键

android - 如何在android中行走时计算距离?

c++ - 我使用什么 C/C++ 库来更改 Windows 中的 HTTP 数据包?