AVR 微控制器记忆游戏

Posted

技术标签:

【中文标题】AVR 微控制器记忆游戏【英文标题】:AVR Microcontrollers memory game 【发布时间】:2020-07-06 14:52:29 【问题描述】:

我正在制作一个游戏,您需要重复点亮 LED 的顺序。该序列由两个 LED 设置。为了重复这个序列,我使用了操纵杆。​​p>

我有一个想法,创建两个布尔数组,其中 True 表示左侧 LED,False 表示右侧 LED。第一个数组必须包含一个需要重复的随机序列(真/假)。当我推到操纵杆的一侧或另一侧时,我想分别写入第二个数组 True / False 并一直比较它们。

这是我目前所拥有的。 (AT90USB647)

#define F_CPU 2000000UL
#include <avr/io.h>
#include <stdbool.h>

int main(void) 
    MCUCR |= 0x80;
    MCUCR |= 0x80;
    DDRA = 0xFF;
    PORTF = 0x20;
    
    bool seq2[100];
    
    while(1)
    
        uint8_t x = PINF;
        if(!(x & 0x20)) 
            PORTA = 0x80;   
        
        else if(!(x & 0x08)) 
            PORTA = 0x01;
        
        else 
            PORTA = 0x00;
        
    



主要问题是当我推动操纵杆时如何将 True 或 False 写入数组?

【问题讨论】:

你需要一个计数器,而且很可能需要一些去抖动的逻辑。然后只需读取并存储在计数器下的数组中。 您能否缩小您遇到的具体问题的范围?您知道如何读取操纵杆的状态并正确检测用户何时按下它吗?你知道用 C 写数组的语法吗? (例如seg2[i] = 1 我想我不知道写入数组的语法,也不知道如何将布尔值写入数组。 正如大卫格雷森所说,您应该询问您完全不知道的内容。如果您等待 ctrl + c/ctrl + v 解决方案,我认为您不会得到答案。你知道去抖是如何工作的吗?你知道如何在 C 中使用数组吗?您知道 AVR 中的 ISR 是如何工作的以及如何管理它们吗? 如果您不知道如何使用数组,那么请远离嵌入式系统编程,先阅读初级 C 书籍。 【参考方案1】:

一个基本的方法可能是:


#define F_CPU 2000000UL

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

volatile unsigned int counter;

static unsigned char pattern_position;
static unsigned char array_position;

static unsigned char pattern[] = 
    0b01010101,
    0b11010101,
    0b10010101
;

ISR(TIMER0_COMPA_vect)

    counter++;


int main(void)

    MCUCR |= 0x80;
    
    DDRA = 0xFF;
    PORTF = 0x20;
    
    // Timer initialization
    // Mode: CTC
    // Prescaler: 1024
    TCCR0A = (1<<WGM01);
    TCCR0B = (1<<CS02) | (1<<CS00);
    
    // Calculate a correct time
    //
    // we want 1 ms -> f_TIMER0 = 1/T = 1/(1 * 10^-3)s = 1 kHz
    //
    //                f_CPU                  f_CPU                20 MHz
    // f_TIMER0 = ------------- -> OCR0A = ---------------- = ------------- = ~ 20 (It is not exactly 1ms but it is ok) 
    //             k_H * OCR0A              k_H * f_TIMER0     256 * 1 kHz
    //
    OCR0A = 20;
    TIMSK0 = (1<<OCF0A);  // Enable Timer0 Overflow Compare Match interrupt
    
    // Show the sequence that the user should input
    for (unsigned char i=0; i < sizeof(pattern)/sizeof(&pattern[0]); i++)
    
        for (unsigned char j=0; j < 8; j +=2)
        
            // There is possible a signal missing to show the user that the next pattern occurs!

            PORTA = ((pattern[i]>>(j+1))<<PINA7) | ((pattern[i]>>j)<<PINA0);
            // That the user can see the patterns a delay is necessary!
            _delay_ms(1000);
        
    
    
    // Signalize that the game starts
    for (unsigned char i=0; i <8; i++)
    
        PORTA ^= 0x81;
        _delay_ms(1000);
    

    TCNT0 = 0x00;
    sei();
    
    while(1)
    
        // There is possible a signal missing to trigger next pattern input to the user!!!
        
        if(!(PINF & (1<<PINF5)))
         
            PORTA |= 0x80;
        
        
        if(!(PINF & (1<<PINF3)))
        
            PORTA |= 0x01;
        
        
        // Time is 4 seconds to match the correct pattern
        if(counter >= 4000)
        
            if(!((pattern[pattern_position] & (1<<array_position)) == (0x01 & PORTA)))
            
                // Wrong input end of game
            
            array_position++;
            
            if(!((pattern[pattern_position] & (1<<array_position)) == (0x01 & (PORTA>>8))))
            
                // Wrong input end of game
            
            array_position++;
            
            if(array_position >= 8)
            
                array_position = 0;
                pattern_position++;
            
            
            if(pattern_position >= (sizeof(pattern)/sizeof(&pattern[0])))
            
                // End of game reached winning!
            
            
            counter = 0x00;
            PORTA = 0x00;
            TCNT0 = 0x00;
        
    

我不确定您是否确实在尝试这样做,我也无法在您的目标平台上测试代码,但也许这是解决您的问题的基本方法...

【讨论】:

以上是关于AVR 微控制器记忆游戏的主要内容,如果未能解决你的问题,请参考以下文章

如何延迟 avr 微控制器的组装?

Linux / Windows Arduino IDE 上的 avr-gcc Atmel AVR 微控制器

使用带有 AVR 微控制器的旋转编码器

是否可以在 AVR 微控制器中永久保存一些数据?

使用预分频器确定微控制器 (AVR) 中时钟周期的周期

在 Mac 上与 AVR 微控制器交互