单片机---HLK-W801移植Nes模拟器(三)

总目录

《单片机—HLK-W801移植Nes模拟器(一)》
《单片机—HLK-W801移植Nes模拟器(二)》
《单片机—HLK-W801移植Nes模拟器(三)》

本章重点—优化显示

前两章完成之后,测试了一下刷新速率,达到了惊人的3帧每秒

提高主频

main函数中,有设置时钟分频的位置,尝试修改为最高
单片机---HLK-W801移植Nes模拟器(三)_第1张图片

修改LCD初始

默认的ILI9341是竖屏,320*240的话,我们写数据,就需要进行截断处理,因为这个模拟器的每行是256个字符。
所以我们进行一下横屏,并且配置一下绘图范围的内存,我们就让它与模拟器提供的行buf一一对应,就避免了很多配置动作,只需要不停的写入就好了。

    ILI9341_WR_REG(0x36);	   //set the model of scanning
	ILI9341_WR_DATA8((1<<5)|(0<<6)|(1<<7)|(1<<3)); //左横屏
	
	//ILI9341_WR_DATA8((1<<5)|(1<<6));右横屏幕
	//ILI9341_WR_DATA8(0x08); 竖屏幕
	ILI9341_WR_REG(0x2B); 	//set the page address 横屏幕设置 Y轴到239
	ILI9341_WR_DATA8(0x00);
	ILI9341_WR_DATA8(0x00);
	ILI9341_WR_DATA8(0x00);
	ILI9341_WR_DATA8(0xDF);

	ILI9341_WR_REG(0x2A);    //set the column address X轴到319 改为255
	ILI9341_WR_DATA8(0x00);
	ILI9341_WR_DATA8(0x00);
	//ILI9341_WR_DATA8(0x01);
	//ILI9341_WR_DATA8(0x3F);
	ILI9341_WR_DATA8(0x00);
	ILI9341_WR_DATA8(0xFF);
	
	ILI9341_WR_REG(0x2c);//储存器写

这里,我们进行了左横屏,并且配置横纵坐标范围为256*240。
然后我们的写屏函数就可以化为最简单的写SPI

void ILI9341_DrawLine(u16 y,u16* data)
{
	tls_spi_write((uint8_t *)data,512);
}

那么有人会注意到了,前面用的Y轴应该是239,转化为十六进制应该是EF。可为什么是DF,那么就是因为这个游戏的首行地址,并不是从0开始,而一共只有0xEF行,所以为了能最简单的进行画图,不去设置行列地址,那么就直接配置所用的显示位置纵坐标为0xDF。否则,就会出现滚屏的问题。

测试帧率

然后我们配置了一个5秒的定时器,然后我们每画一帧,就记一次数据,5秒看一下绘制了多少帧。

extern unsigned int FrameCount;
static void demo_timer_irq2(u8 *arg)
{
	printf("%02d fp/5s\n",(FrameCount));
	FrameCount=0;
}
void  timer_demo(void)
{
	u8 timer_id2;
	struct tls_timer_cfg timer_cfg2;

	timer_cfg2.unit = TLS_TIMER_UNIT_MS;
	timer_cfg2.timeout = 5000;
	timer_cfg2.is_repeat = 1;
	timer_cfg2.callback = (tls_timer_irq_callback)demo_timer_irq2;
	timer_cfg2.arg = NULL;
	timer_id2 = tls_timer_create(&timer_cfg2);
	tls_timer_start(timer_id2);
}

绘制图像处计数

void InfoNES_LoadLine()
{
	if(PPU_Scanline==100)
	{
		FrameCount++;
	}
	ILI9341_DrawLine(PPU_Scanline,WorkLine);
}

最终测试了一下
单片机---HLK-W801移植Nes模拟器(三)_第2张图片
10fps左右的水平。

在注释掉绘图操作之后,模拟器计算帧的速度如下
单片机---HLK-W801移植Nes模拟器(三)_第3张图片
大约是28fps。所以可以看到绘图还是挺耗时的。

SPI的速率是20MHZ。那么每秒最大传输大约20帧。

每帧的计算大约0.035秒,传输大约0.05秒,加起来大约耗时0.085秒,所以每秒大约传输大约11.7帧,再除去其他操作,大约就是11帧/s。

看来还是需要用并口才能实现高的刷新率。

下载地址
《海凌科HLK-W801上面移植nes模拟器》

你可能感兴趣的:(单片机,C语言典型代码,w801,nes模拟器,infones)