洪嵐峰 發表於 2023-4-6 06:35:57

STC90C52RC製作打磚塊遊戲

STC90C52RC單片機可以用來製作各種有趣的遊戲,包括打磚塊遊戲。下面是一個簡單的打磚塊遊戲的程式碼示例,使用STC90C52RC單片機和一個16x2的LCD顯示屏,同時還需要一些按鈕、蜂鳴器和其他電子元件。

以下是示例程式碼:


#include <STC89.H>

#define LCD_RS P2_5
#define LCD_RW P2_6
#define LCD_E  P2_7

#define LCD_DATA P0

#define BTN_LEFT P3_1
#define BTN_RIGHT P3_2

#define BEEPER P3_3

unsigned char const BARRIER[] = { 0x0F, 0x1F, 0x3E, 0x7C, 0x7C, 0x3E, 0x1F, 0x0F }; //磚塊位圖
unsigned char const BALL[]    = { 0x04, 0x0E, 0x1F, 0x0E, 0x04 };                       //球的位圖

unsigned char buf;    //顯示屏緩存區
unsigned char score = 0;  //分數
unsigned char bar_x = 7;  //磚塊橫向位置
unsigned char ball_x = 7; //球的橫向位置
unsigned char ball_y = 1; //球的縱向位置
signed char ball_dx = 1;  //球的橫向速度
signed char ball_dy = 1;  //球的縱向速度

void delay(unsigned int t)
{
    unsigned int i, j;

    for (i = 0; i < t; i++)
        for (j = 0; j < 1000; j++);
}

void lcd_write_cmd(unsigned char cmd)
{
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_E = 0;
    LCD_DATA = cmd;
    LCD_E = 1;
    delay(1);
    LCD_E = 0;
    delay(1);
}

void lcd_write_data(unsigned char dat)
{
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_E = 0;
    LCD_DATA = dat;
    LCD_E = 1;
    delay(1);
    LCD_E = 0;
    delay(1);
}

void lcd_init()
{
    lcd_write_cmd(0x38);
    lcd_write_cmd(0x08);
    lcd_write_cmd(0x01);
    lcd_write_cmd(0x06);
    lcd_write_cmd(0x0C);
}

void lcd_clear()
{
    lcd_write_cmd(0x01);
}

void lcd_puts(unsigned char x, unsigned char y, unsigned char *str)
{
    unsigned char i;

    if (y == 0)
        lcd_write_cmd(0x80 + x);
    else
        lcd_write_cmd(0xC0 + x);

    for (i = 0; str; i++)
        lcd_write_data(str);
}

void draw_barrier()
{
    unsigned char i, j;

for (i = 0; i < 8; i++) {
    for (j = 0; j < 8; j++) {
        if (BARRIER & (1 << j))
            buf |= (1 << j);
        else
            buf &= ~(1 << j);
    }
}
}

void draw_ball()
{
unsigned char i;

for (i = 0; i < 5; i++)
    buf[(ball_y + i) * 2 + ball_x / 8] |= BALL << (ball_x % 8);

for (i = 0; i < 5; i++)
    buf[(ball_y + i) * 2 + ball_x / 8 + 1] |= BALL >> (8 - ball_x % 8);
}

void draw_screen()
{
unsigned char i;

lcd_clear();

for (i = 0; i < 16; i++) {
    lcd_write_data(buf);
    lcd_write_data(buf);
}

lcd_puts(0, 0, "SCORE:");
lcd_puts(6, 0, (unsigned char *)score + '0');
}

void beep()
{
unsigned char i;

scss
Copy code
for (i = 0; i < 20; i++) {
    BEEPER = 1;
    delay(1);
    BEEPER = 0;
    delay(1);
}
}

void main()
{
unsigned char i;

lcd_init();

for (i = 0; i < 32; i++)
    buf = 0;

draw_barrier();
draw_ball();
draw_screen();

while (1) {
    if (BTN_LEFT == 0 && bar_x > 0) {
        bar_x--;
        draw_barrier();
        draw_screen();
    }

    if (BTN_RIGHT == 0 && bar_x < 14) {
        bar_x++;
        draw_barrier();
        draw_screen();
    }

    buf &= ~(BALL << (ball_x % 8));
    buf &= ~(BALL >> (8 - ball_x % 8));
    ball_x += ball_dx;
    ball_y += ball_dy;

    if (ball_x == 0 || ball_x == 15)
        ball_dx = -ball_dx;

    if (ball_y == 0)
        ball_dy = 1;

    if (ball_y == 7) {
        if (ball_x >= bar_x && ball_x <= bar_x + 2) {
            ball_dy = -1;
            score++;
            beep();
        } else {
            lcd_puts(5, 1, "GAME OVER");
            while (1);
        }
    }

    draw_ball();
    draw_screen();
    delay(10);
}
}



這個程式碼使用了16x2的LCD顯示屏來顯示分數和遊戲畫面,同時還使用了幾個按鈕和一個蜂鳴器。在遊戲開始時,磚塊和球的初始位置會被設置,並且畫面會被繪製出來。
頁: [1]
查看完整版本: STC90C52RC製作打磚塊遊戲