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 微控制器记忆游戏的主要内容,如果未能解决你的问题,请参考以下文章