【问题标题】:AVR C : 8 Bit Counter using buttonAVR C : 8 位计数器使用按钮
【发布时间】:2017-02-20 03:53:57
【问题描述】:

我有电路设置,每次按下按钮时都会打开 LED,它从 0 计数到 255,所以二进制 0000 0000 到 1111 1111。我的开关配置为 PB2,即板上的 D9。

我遇到了一个问题,正如您从我的计算机中看到的那样,我使用了 8 个引脚,6 个来自 D 寄存器,2 个来自 B 寄存器。当我增加 PORTB 并在某个时候它变为 0b00000100 时,它的值与输入引脚 pb2 相同,所以在我的无限循环中,即使我没有按下 PINB 按钮,它也会打开。我尝试将 PORTB 的值重置为 0,但它仍然无法关闭。

我需要一种机制,因此当我增加 PORTB 时,它不会影响我的输入引脚 PB2。

感谢您的帮助,我尝试发布视频,但它太大了。

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>

/*
    Board digital I/O pin to atmega328 registers for LEDS
    | d2  | d3  | d4  | d5  | d6  | d7  | d8  | d9  |
    | pd2 | pd3 | pd4 | pd5 | pd6 | pd7 | pb0 | pd1 |

    Input Button
    | d9  |
    | pb2 |


*/


int main(void) {

    int x;

    DDRD = 0b11111100; 
    PORTD = 0b00000000;

    DDRB = 0b00000011; 
    PORTB = 0b00000100;

    while(1) {

        if((PINB & 0b00000100) == 0) {

            if(x < 63) {

                PORTD = PORTD + 0b00000100;
                x++;

            } else if (x == 63) {

                x=0;
                PORTD = 0b00000000;
                PORTB = PORTB + 0b00000001;

                //problem here, when PORTB is incremented to 0b00000100 then the switch turns on automatically
                if((PORTB & 0b00000100) == 0b00000100) {
                    PORTB = 0b00000000;
                    PORTD = 0b00000000;
                }

            } 

            _delay_ms(80);


        }

    }

    return 0;
}

【问题讨论】:

    标签: c avr atmel


    【解决方案1】:

    简单的答案是避免使用 PORTB 作为变量。而是使用 x,并适当地移动 x 中的值以显示它。

    #include <avr/io.h>
    #define F_CPU 16000000UL
    #include <util/delay.h>
    
    /*
    Board digital I/O pin to atmega328 registers for LEDS
    | d2  | d3  | d4  | d5  | d6  | d7  | d8  | d9  |
    | pd2 | pd3 | pd4 | pd5 | pd6 | pd7 | pb0 | pd1 |
    
    Input Button
    | d9  |
    | pb2 |
    */
    
    
    int main(void) {
    
        uint8_t x = 0;
    
        DDRD = 0b11111100; 
        PORTD = 0b00000000;
    
        DDRB = 0b00000011; 
        PORTB = 0b00000100;
    
        while(1) {
    
            if((PINB & 0b00000100) == 0) {
    
                ++x;
    
                PORTD = x << 2;
                PORTB = (PORTB & 0b11111100) | ((x >> 6) & 0b00000011);
            } 
    
            _delay_ms(80);
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多