基于NIOS-II的示波器:PART2 界面动态显示功能
2017-03-19 21:59
204 查看
本文所有的硬件基础以及工程参考来自魏坤示波仪,重新实现驱动并重构工程。
每一帧直接重绘显示界面,再显示下一帧图形
用背景色覆盖上一帧图形,再显示被毁坏的坐标,最后显示下一帧图形
第一种解决方案代码比较简单,但是实际测试刷新缓慢(以肉眼可测的速度刷新),故选择第二种方案。
其中有几点需要注意的部分:
两个点直接需要连接起来,可以按照显示芯片写的顺序,依次填充y轴,来达到连线。
规划将波形数据保存在DISP数组中,再绘制的同时写入CLR数组中,供下一轮清理波形使用。
清波形函数如下:
显示波形代码如下
类似的可以写出
而其他的数据显示利用
分析一个有以下几种可能
函数调用导致速度过慢
中间抽象层中有部分可以通过更少的时钟周期完成(利用像素的局部性)
将函数展开,以及部分不需要重新传输坐标的部分优化后解决了刷新的问题:
version 0.2 界面动态显示功能
界面显示功能原理
显示波形有如下两个方案:每一帧直接重绘显示界面,再显示下一帧图形
用背景色覆盖上一帧图形,再显示被毁坏的坐标,最后显示下一帧图形
第一种解决方案代码比较简单,但是实际测试刷新缓慢(以肉眼可测的速度刷新),故选择第二种方案。
其中有几点需要注意的部分:
两个点直接需要连接起来,可以按照显示芯片写的顺序,依次填充y轴,来达到连线。
规划将波形数据保存在DISP数组中,再绘制的同时写入CLR数组中,供下一轮清理波形使用。
清波形函数如下:
/* * 函数名:CLR_WAVE_CH1 * 功能:清除CH1波形 * 日期:2017-02-16 */ void CLR_WAVE_CH1() { unsigned int i, k; for (i = 0; i < 400; i++) { //确认CLR中有波形数据(在有效区域内) if (CLR_DATA_CH1[i] > 60 && CLR_DATA_CH1[i] < 300) { //清除这个点 set_addr(i + 11, CLR_DATA_CH1[i]); send_data(WAVE_BACK_COLOR); set_addr(i + 11, CLR_DATA_CH1[i] + 1); send_data(WAVE_BACK_COLOR); set_addr(i + 11, CLR_DATA_CH1[i] - 1); send_data(WAVE_BACK_COLOR); //下面清除连接两个点的线 if (i < 399) { if (CLR_DATA_CH1[i] < CLR_DATA_CH1[i + 1]) { set_addr(i + 11, CLR_DATA_CH1[i]); IOWR_ALTERA_AVALON_PIO_DATA(LCD_RS_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(LCD_DATA_BASE, WAVE_BACK_COLOR); for (k = CLR_DATA_CH1[i]; k < CLR_DATA_CH1[i + 1]; k++) { IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE, 0); IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE, 1); } } else { set_addr(i + 11, CLR_DATA_CH1[i + 1]); IOWR_ALTERA_AVALON_PIO_DATA(LCD_RS_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(LCD_DATA_BASE, WAVE_BACK_COLOR); IOWR_ALTERA_AVALON_PIO_DATA(LCD_RS_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(LCD_DATA_BASE, WAVE_BACK_COLOR); for (k = CLR_DATA_CH1[i + 1]; k < CLR_DATA_CH1[i]; k++) { IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE, 0); IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE, 1); } } } } } //显示坐标 display_area(); }
显示波形代码如下
void DISP_WAVE_CH1() { unsigned int i, k; //清除CH1波形 CLR_WAVE_CH1(); for (i = 0; i < 400; i++) { //显示当前点 CLR_DATA_CH1[i] = DISP_DATA_CH1[i]; set_addr(i + 11, DISP_DATA_CH1[i]); send_data(WAVE_COLOR_CH1); // set_addr(i+11,DISP_DATA_CH1[i]+ 1); set_y(DISP_DATA_CH1[i] + 1); send_data(WAVE_COLOR_CH1); set_addr(i + 11, DISP_DATA_CH1[i] - 1); set_y(DISP_DATA_CH1[i] - 1); // send_data(WAVE_COLOR_CH1); //画连线 if (i < 399) { if (DISP_DATA_CH1[i] < DISP_DATA_CH1[i + 1]) { set_y(DISP_DATA_CH1[i]); // set_addr(i+11,DISP_DATA_CH1[i]); send_data(WAVE_COLOR_CH1); for (k = DISP_DATA_CH1[i]; k < DISP_DATA_CH1[i + 1]; k++) { IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE, 0); IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE, 1); // set_addr(i+11,k); // send_data(WAVE_COLOR_CH1); } } else { set_y(DISP_DATA_CH1[i + 1]); send_data(WAVE_COLOR_CH1); for (k = DISP_DATA_CH1[i + 1]; k < DISP_DATA_CH1[i]; k++) { IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE, 0); IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE, 1); // set_addr(i+11,k); // send_data(WAVE_COLOR_CH1); } } } } }
类似的可以写出
CH2的波形显示函数以及触发线等显示函数。
而其他的数据显示利用
0.1版本的显示驱动即可轻松实现。
version 0.2.1 显示功能优化
在动态测试的过程中,发现这样通过调用打包中间层函数的方法,速度跟不上来,会出现频繁闪动的问题。分析一个有以下几种可能
函数调用导致速度过慢
中间抽象层中有部分可以通过更少的时钟周期完成(利用像素的局部性)
将函数展开,以及部分不需要重新传输坐标的部分优化后解决了刷新的问题:
void CLR_WAVE_CH1() { unsigned int i, k; for (i = 0; i < 400; i++){ LCD_ILI9481_CMD(0x002b); IOWR_ALTERA_AVALON_PIO_DATA(LCD_RS_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE, 0); IOWR_ALTERA_AVALON_PIO_DATA(LCD_DATA_BASE, (i + 11) >> 8); IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE, 0); IOWR_ALTERA_AVALON_PIO_DATA(LCD_DATA_BASE, (i + 11) & 0x00ff); //... 其余类似 } }
Version 0.2版本演示
相关文章推荐
- 基于NIOS-II的示波器:PART1 按键&显示屏驱动&界面
- 基于NIOS-II的示波器:PART3 初步功能实现
- 使用QT搭建点云显示框架系列五·基于QT的QML图像选点、动态绘制十字丝功能 ,以及纹理映射
- 如何通过动态生成Html灵活实现DataGrid分类统计的界面显示功能
- 如何通过动态生成Html灵活实现DataGrid分类统计的界面显示功能 activeandbadboy [原作]
- 在浏览器端动态实现下载功能,界面上会显示下载的文件名
- 基于jQuery实现动态搜索显示功能
- 基于NIOS-II的示波器:PART4 系统调试&测试
- [原创][连载].基于SOPC的简易数码相框 - Nios II SBTE部分(软件部分) - 从SD卡内读取图片文件,然后显示在TFT-LCD上
- 如何通过动态生成Html灵活实现DataGrid分类统计的界面显示功能
- 如何通过动态生成Html灵活实现DataGrid分类统计的界面显示功能
- 基于ASP和COM组件的动态图表显示
- WinForm中使用XtraGrid控件,实现在界面中动态修改列显示,列名列宽等
- 也谈将界面代码和功能代码分离(基于DELPHI/VCL)
- [原创][连载].基于SOPC的简易数码相框 - Nios II SBTE部分(软件部分) - SD卡(SPI模式)驱动
- 基于Nios软核CPU的uC/OS-II和LwIP移植
- 基于嵌入式Linux的图形界面显示系统的设计(framebuffer)(DRIFT转)
- [原创][连载].基于SOPC的简易数码相框 – Nios II SBTE部分(软件部分) - 配置工作
- 基于jQuery的 随机头像显示功能
- myOpenChord 界面数据后台线程获取,动态显示实现