spi显示屏32F1代码实现2048
时间: 2023-08-02 11:10:31 浏览: 48
以下是使用SPI显示屏32F1实现2048游戏的代码:
```c
#include "stm32f10x.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_gpio.h"
#define SPI_PORT GPIOA
#define SPI_SCK GPIO_Pin_5
#define SPI_MOSI GPIO_Pin_7
#define LCD_DC GPIO_Pin_8
#define LCD_RST GPIO_Pin_9
#define LCD_CS GPIO_Pin_10
#define BLOCK_SIZE 32
#define BOARD_SIZE 4
#define BLACK 0x0000
#define WHITE 0xFFFF
#define RED 0xF800
#define GREEN 0x07E0
#define BLUE 0x001F
#define YELLOW 0xFFE0
uint16_t board[BOARD_SIZE][BOARD_SIZE];
uint16_t score;
void delay(uint32_t nCount)
{
uint32_t i;
for (i = 0; i < nCount; i++);
}
void spiInit(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = SPI_SCK | SPI_MOSI;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(SPI_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LCD_DC | LCD_RST | LCD_CS;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(SPI_PORT, &GPIO_InitStructure);
SPI_Cmd(SPI1, DISABLE);
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
}
void lcdWriteCmd(uint8_t cmd)
{
GPIO_ResetBits(SPI_PORT, LCD_DC | LCD_CS);
SPI_I2S_SendData(SPI1, cmd);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(SPI_PORT, LCD_CS);
}
void lcdWriteData(uint8_t data)
{
GPIO_SetBits(SPI_PORT, LCD_DC);
GPIO_ResetBits(SPI_PORT, LCD_CS);
SPI_I2S_SendData(SPI1, data);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(SPI_PORT, LCD_CS);
}
void lcdSetAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1)
{
lcdWriteCmd(0x2A);
lcdWriteData(x0 >> 8);
lcdWriteData(x0 & 0xFF);
lcdWriteData(x1 >> 8);
lcdWriteData(x1 & 0xFF);
lcdWriteCmd(0x2B);
lcdWriteData(y0 >> 8);
lcdWriteData(y0 & 0xFF);
lcdWriteData(y1 >> 8);
lcdWriteData(y1 & 0xFF);
lcdWriteCmd(0x2C);
}
void lcdFillScreen(uint16_t color)
{
uint32_t i;
lcdSetAddrWindow(0, 0, 239, 319);
GPIO_SetBits(SPI_PORT, LCD_DC);
GPIO_ResetBits(SPI_PORT, LCD_CS);
for (i = 0; i < 76800; i++)
{
SPI_I2S_SendData(SPI1, color >> 8);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(SPI1, color & 0xFF);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
}
GPIO_SetBits(SPI_PORT, LCD_CS);
}
void lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color)
{
lcdSetAddrWindow(x, y, x, y);
GPIO_SetBits(SPI_PORT, LCD_DC);
GPIO_ResetBits(SPI_PORT, LCD_CS);
SPI_I2S_SendData(SPI1, color >> 8);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(SPI1, color & 0xFF);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(SPI_PORT, LCD_CS);
}
void lcdDrawBlock(uint16_t x, uint16_t y, uint16_t color)
{
uint16_t i, j;
for (i = 0; i < BLOCK_SIZE; i++)
{
for (j = 0; j < BLOCK_SIZE; j++)
{
lcdDrawPixel(x + i, y + j, color);
}
}
}
void lcdDrawBoard(void)
{
uint16_t i, j;
uint16_t x, y;
for (i = 0; i < BOARD_SIZE; i++)
{
for (j = 0; j < BOARD_SIZE; j++)
{
x = j * BLOCK_SIZE;
y = i * BLOCK_SIZE;
lcdDrawBlock(x, y, board[i][j] ? WHITE : BLACK);
if (board[i][j])
{
lcdDrawBlock(x + 2, y + 2, board[i][j]);
}
}
}
}
void lcdDrawScore(void)
{
uint8_t i, j;
uint16_t x, y;
char str[10];
sprintf(str, "%05d", score);
for (i = 0; i < 5; i++)
{
x = i * BLOCK_SIZE;
y = BOARD_SIZE * BLOCK_SIZE;
for (j = 0; j < 16; j++)
{
if (font[str[i] - '0'][j / 2] & (0x80 >> (j % 2 * 4)))
{
lcdDrawBlock(x + j % 4 * 8, y + j / 4 * 8, YELLOW);
}
}
}
}
uint8_t isGameOver(void)
{
uint16_t i, j;
for (i = 0; i < BOARD_SIZE; i++)
{
for (j = 0; j < BOARD_SIZE; j++)
{
if (board[i][j] == 0)
{
return 0;
}
if (i < BOARD_SIZE - 1 && board[i][j] == board[i + 1][j])
{
return 0;
}
if (j < BOARD_SIZE - 1 && board[i][j] == board[i][j + 1])
{
return 0;
}
}
}
return 1;
}
void addBlock(void)
{
uint16_t i, j;
uint16_t count = 0;
uint16_t index[BOARD_SIZE * BOARD_SIZE];
for (i = 0; i < BOARD_SIZE; i++)
{
for (j = 0; j < BOARD_SIZE; j++)
{
if (board[i][j] == 0)
{
index[count++] = i * BOARD_SIZE + j;
}
}
}
if (count)
{
i = index[rand() % count] / BOARD_SIZE;
j = index[rand() % count] % BOARD_SIZE;
board[i][j] = (rand() % 10 == 0) ? 4 : 2;
}
}
void moveLeft(void)
{
uint16_t i, j, k;
for (i = 0; i < BOARD_SIZE; i++)
{
k = 0;
for (j = 1; j < BOARD_SIZE; j++)
{
if (board[i][j])
{
if (board[i][k] == board[i][j])
{
board[i][k++] *= 2;
score += board[i][k - 1];
board[i][j] = 0;
}
else if (board[i][k] == 0)
{
board[i][k] = board[i][j];
board[i][j] = 0;
}
else
{
board[i][++k] = board[i][j];
board[i][j] = 0;
}
}
}
}
}
void moveRight(void)
{
uint16_t i, j, k;
for (i = 0; i < BOARD_SIZE; i++)
{
k = BOARD_SIZE - 1;
for (j = BOARD_SIZE - 2; j >= 0; j--)
{
if (board[i][j])
{
if (board[i][k] == board[i][j])
{
board[i][k--] *= 2;
score += board[i][k + 1];
board[i][j] = 0;
}
else if (board[i][k] == 0)
{
board[i][k] = board[i][j];
board[i][j] = 0;
}
else
{
board[i][--k] = board[i][j];
board[i][j] = 0;
}
}
}
}
}
void moveUp(void)
{
uint16_t i, j, k;
for (j = 0; j < BOARD_SIZE; j++)
{
k = 0;
for (i = 1; i < BOARD_SIZE; i++)
{
if (board[i][j])
{
if (board[k][j] == board[i][j])
{
board[k++][j] *= 2;
score += board[k - 1][j];
board[i][j] = 0;
}
else if (board[k][j] == 0)
{
board[k][j] = board[i][j];
board[i][j] = 0;
}
else
{
board[++k][j] = board[i][j];
board[i][j] = 0;
}
}
}
}
}
void moveDown(void)
{
uint16_t i, j, k;
for (j = 0; j < BOARD_SIZE; j++)
{
k = BOARD_SIZE - 1;
for (i = BOARD_SIZE - 2; i >= 0; i--)
{
if (board[i][j])
{
if (board[k][j] == board[i][j])
{
board[k--][j] *= 2;
score += board[k + 1][j];
board[i][j] = 0;
}
else if (board[k][j] == 0)
{
board[k][j] = board[i][j];
board[i][j] = 0;
}
else
{
board[--k][j] = board[i][j];
board[i][j] = 0;
}
}
}
}
}
void gameInit(void)
{
uint16_t i, j;
for (i = 0; i < BOARD_SIZE; i++)
{
for (j = 0; j < BOARD_SIZE; j++)
{
board[i][j] = 0;
}
}
score = 0;
addBlock();
addBlock();
lcdFillScreen(BLACK);
lcdDrawBoard();
lcdDrawScore();
}
int main(void)
{
SystemInit();
spiInit();
srand(1234);
gameInit();
while (1)
{
if (isGameOver())
{
gameInit();
}
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
{
moveLeft();
addBlock();
lcdFillScreen(BLACK);
lcdDrawBoard();
lcdDrawScore();
}
else if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))
{
moveRight();
addBlock();
lcdFillScreen(BLACK);
lcdDrawBoard();
lcdDrawScore();
}
else if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2))
{
moveUp();
addBlock();
lcdFillScreen(BLACK);
lcdDrawBoard();
lcdDrawScore();
}
else if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3))
{
moveDown();
addBlock();
lcdFillScreen(BLACK);
lcdDrawBoard();
lcdDrawScore();
}
delay(50000);
}
}
```
该代码使用了SPI接口连接到显示屏,通过每个方块的颜色和分数来实现2048游戏。在主函数中,循环检测按键事件并执行相应的移动操作,然后添加新的方块并重新绘制游戏界面。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)