|
楼主 |
发表于 2010-6-1 23:19:38
|
显示全部楼层
回复【1楼】 zhaojun_xf
-----------------------------------------------------------------------
生成一次灰度,假如是32级的,那么第一次定时时间是1<<3个定时器时钟,把每一行的数据的最低位(第3位)打入74hc595并锁存输出后,设置定时器2(32分频)的比较匹配值为(1<<3),然后开启定时器,再开启oe使能74hc595点亮LED,然后接着CPU就马上可以送下一位的数据,定时器2的OCR中断服务中再关闭oe.第二次是1<<4个定时器时钟,送第4位的数据,第三次为(1<<5)个定时器时钟,送第5位,以此类推直到最高位第7位送完显示。这样完成一行的一轮灰度.其实有个问题是定时器进入中断需要一段时间,所以可能最低位的定时时间有点偏差,但是实际影响没有非常严重.要说明的一点是,程序锁存输出出一位数据前需要等待确认上一位的定时时间是否已经结束,即标志timer_get是否设置。
一行每位的灰度送完后接着就进入下一行的灰度生成。16行扫描完后就完成了一帧图像的显示。
回复【11楼】litchiate 草真多
-----------------------------------------------------------------------------------------
因为LED屏现在已经不在我的手上,所以没办法做这个测试。如果你有屏的话可以自己稍微修改下测试。没做gamma校正的话确实是差别可能会小一点。
程序可以显示256级灰度,设置每次调用deep为1即可。但是这个时候已经闪得非常厉害了。CPU送一位的时间大约是200us(视数据而变),200us*8*16=25ms,实际上还要更换每行的行数据缓存,所以显示一轮的话就需要30ms左右了,已经闪得厉害了。
如果屏幕是单色的或者是64*32的应该可以稳定显示256级。试过64*32双色256级显示,很稳定。
为了达到最大亮度,最高位的定时时间应该约等于送出一整行的每位数据的平均时间.CPU送一位的时间大约是200us(视实际数据而变),如果进行256级显示,则定时器应该分频数是200us/(1<<7)/晶振周期=38分频,取实际可以设置的定时器分频数为32分频。
再次说明下,没有gamma校正。
照片中比较暗的那条横线为拍照原因,实际看不出横线.
19场原理要求送数速度非常非常快,用单片机恐怕实现不了像这样面积的19场,要用到CPLD或者FPGA了. |
|