代码例程
开发资料中的例程有些瑕疵,上面是整理后的例程,修改了一些参数,也添加了不少函数,函数都有对应的注释,只要花心思去看一应该是能看懂怎么用的。此外,这个例程也可以作为你们工程的模板,往上面添加一些函数、完善一下内容,差不多就能做出一个作品了
TFT模块
介绍
TFT的全称:Thin Film Transistor,中文名字是薄膜晶体管。现在我们所使用的笔记本电脑以及台式电脑都运用了相对先进的TFT显示屏,这类显示屏都由液晶像素点组成,并由集成在像素点后面的薄膜晶体管驱动
不难看出,TFT也是属于LCD液晶屏的一种,它的每一液晶像素点都是由集成在其后的薄膜晶体管来驱动的
使用要点
减少刷新像素
我们使用到是一块1.8寸TFT LCD,分辨率是128X160,驱动芯片是ST7735S,支持SPI串口
虽然分辨率不高,但对于一款51单片机来说,这已经是在负重前行了,可以计算一下,128X160=20480个像素,每个像素是16位彩色数据,也就是刷新一个屏幕的数据量是40960Byte=40KB,这对于单片机的运行频率来说,无疑是个大数目了,烧录开发资料中的刷屏例程可以看出,刷新一帧画面需要5s~6s,这是不能接受的,为了提高画面刷新频率,必须要尽量减少刷新的内容,而对于固定的背景和元素,只在初始化时刷新的,因此设计得花里胡哨也没事
上图是链接中的例程运行效果,以一款贪吃蛇游戏为例,贪吃蛇在运动时,本质上只有头和尾需要做出改变,因此只需要把最后一格换成背景色,最前面一格前添加一个小元素,就可以完成一个流动帧,这样刷新的帧率完全足够
坐标系
/*************************************************
函数名:LCD_Set_Region
功能:设置lcd显示区域,在此区域写点数据自动换行
入口参数:xy起点和终点
返回值:无
*************************************************/
void Lcd_SetRegion(unsigned int x_start,unsigned int y_start,unsigned int x_end,unsigned int y_end)
{
Lcd_WriteIndex(0x2a);
Lcd_WriteData(0x02);
Lcd_WriteData(x_start+2);
Lcd_WriteData(0x02);
Lcd_WriteData(x_end+2);
Lcd_WriteIndex(0x2b);
Lcd_WriteData(0x01);
Lcd_WriteData(y_start+1);
Lcd_WriteData(0x01);
Lcd_WriteData(y_end+1);
Lcd_WriteIndex(0x2c);
}
这是开发资料中 TFT 驱动代码的一个函数,用于设置写入数据的范围,如果烧录可以看到,屏幕边缘会出现一些不能刷新的地方,在 TFT.zip
中,对这块内容做了修改,把+1/+2删掉了
使用时需要注意,Lcd_SetRegion函数参数传入的坐标是从0开始的,每个坐标点对应一个像素点,也就是最大坐标点为(127,159)
其他需要传入坐标数据的Lcd函数,都会引用到Lcd_SetRegion,因此使用时,要知道像素与坐标的对应关系
游戏设计
对象
typedef struct
{
u8 life;
u8 headX;
u8 headY;
u8 snakeX[300];
u8 snakeY[300];
u8 length;
int dir;
int tpdir;
u8 foodX;
u8 foodY;
}Snake;
游戏设计最重要的就是对象,这方面是面向对象编程语言的长处,而对于C语言,结构体也能体现这一点。上面代码是一个贪吃蛇对象(结构体),可以非常直观地表达贪吃蛇的状态,这在游戏设计中是很重要的,尤其是多对象的情况(现在大概率用不到),学会使用结构体,对变量的管理和内容的设计都会带来很大便利
VS Code
这里就推荐使用vs code作为代码的编辑器,因为它的自动补全真的很香,尤其是在使用结构体变量时
如果你有VS Code,只需安装一个插件Keil Assistant,再配置一下路径就可以用了
暂无评论
要发表评论,您必须先 登录