关于ISP里的USB串口虚拟OLED的问题
最近有网友问ISP里的虚拟OLED的问题,由于之前没怎么玩过,于是打算正好也学习一下。通过查看《通讯接口说明》(以下简称《说明》)里关于OLED的功能介绍,了解了16种功能的用法。
但是在功能函数的说明上,遇到了一些问题:
一、函数引用问题
由于usb.h文件里,只提供了OLED12864的显示图片函数,所以在使用OLED128*64屏幕的时候,还比较顺利。
但是按照《说明》添加其它尺寸的屏幕的函数,比如显示图片的函数,说明里关于库函数的声明和调用部分,写的也都是 “OLEDxxxxxx_ShowPicture()”,
按照说明把声明添加进程序里
void OLED640480_ShowPicture( BYTE x, BYTE y, BYTE cx, BYTE cy, BYTE *dat );
编译的时候就会出现错误提示,找不到这个函数的实现代码。
是不是USB库里没有包含12864之外的函数?
================================================
二、功能15描述问题
问题出在“显示图片”功能(功能15)的环节。
既然没有函数可以用,那么就决定按照《说明》,给VOLED320240、VOLED480320、VOLED640480写一下显示图片的函数。结果都不能成功显示。
功能15的说明是:“在OLEDxxxxxx屏幕上显示图片”
由于OLED12864时,函数可以直接调用,所以误以为功能15的指令 C8H 就是《说明》里提到的显示图片的指令。
并且一度产生了另一个疑问:功能16(CFH)是把数据写进缓冲区,功能3(C1H)是把显存内容显示到屏幕上,那么不就跟功能15(C8H)重复了吗?
通过跟AI助手对每个功能进行分析,结果发现C8H指令并不是显示图片,而是写进显存里的指定区域(并不进行显示)。
ShowPicture函数的实现过程是:把数据写进缓冲区(指令CFH) → 把缓冲区的数据写进显存里设置的区域(指令C8H) → 把显存里的内容显示到屏幕(指令C1H)
按照这个顺序,最后终于写出了可以在另外三个屏幕上显示图片的函数。
所以这个描述非常误导对《说明》的理解,希望修正一下。
================================================
三、功能15坐标值溢出问题
同样还是功能15的问题。虽然图片显示函数成功运行了,但是又发现了一个十分重要的BUG。
《说明》里关于功能15的介绍里,显示图片的X坐标 和 图片的宽度 这两项,都是一个字节,这就导致了数值超出255之后就会溢出。
比如320*240的屏幕,x=255的时候可以正确显示,但是x=256的时候就会回到屏幕最左侧。
此处是为了查看方便,两张图片的坐标用的是(255, 9)和(256, 16),并不是功能上的“换行”。
对于480*320和640*480的说明里也是同样的问题,都会用到超过255的坐标值和尺寸。
只有128*64的屏幕不会存在这个问题。
由于功能4(点亮全屏)在四个屏幕上都可以实现全屏点亮,功能10~功能12(滚屏指令)也都可以按整个屏幕宽度进行滚动,
所以这个问题应该只是功能15的BUG。
希望能够修正,否则对三个尺寸的VOLED来说就太可惜了。{:baoquan:}
想了个偏门的方法,由于X坐标不能超过255,于是创建了一个宽度65像素的图片,然后在 x=255的位置显示,刚好可以显示在设置不到x坐标的256~319的区域{:ciya:} 把图片当成缓存数组,就可以操作摸不到的区域了
或者平均分成两个160×240像素的大小,宽度高度都不超过255,用两个数组操作整个屏幕
VOLED480*320 的区域宽度 CX = 480-255=225 <255,但是高度320就超出了,除非拆成四块。。。
但是640*480的就不那么好用了 =。=;;; 因为X、CX都受限了。。。
只能用到511×480像素的区域
页:
[1]