16*16 LED点阵(74HC595+三极管TIP127+74LS145+74HC245) 字幕左右移的编程思想?
16*16 LED点阵(74HC595+三极管TIP127+74LS145+74HC245) 字幕左右移的编程思想?(16*64位屏)三极管是用做行选 ,共16行即16个三极管,595级联后,做列数据输出,现在碰到一个问题是:整屏显示一点问题没有--过程如下:先发送(16*64位屏)8个字节的数据,对应每个8*8LED列段,再片选行(0-16),即可显示整屏,如果我想让每个字左移或右移怎么办?有没有好一点的编程方法?
原理图我没有画,下面是我在网上找到的原理图,硬件原理是一样的,做参考用:
点击此处打开ourdev_180989.pdf(文件大小:70K)
注:左移指一个汉字,每次都左移一个BIT,而不是一个字节
谢谢! 数据输出改动一下就可以了. Notonly 能不能说下,怎样实现?能不能给我例程? 谢谢 我以前发过一个http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=706211&bbs_page_no=1&search_mode=3&search_text=utopia&bbs_id=1000 谢谢utopia ,我先看看 我以前毕设时做的,早丢了.
我当时用的方法是一帧扫完后,扫下一帧时数据指针1,这样循环,直到显示完所有的内容.
当然每帧要有一定的延时,时间跟据你的要求来定.
就拿两个8*8的显示两个字母A B来个简单说明吧:
假设A和B的数据为12345678和abcdefgh 第一帧时分别把12345678abcdefgh发出,延时后从2开始发数据,就是依次把2345678abcdefgh+空 发出即可,下一帧时从3开始发,这样循环,显示出来的就是AB向左移动.
我也是新手,不知说的你能明白吗?这是我当时的方法,这里有好多高手,看看他们的方法,也许比我这个要好好多,呵呵^_^. 已经搞好了,只不过是在内存中开辟一个很大的BUF(20字*32byte) ,然后每次再整体左移1BIT这种办法行是行,问题是RAM吃紧呀,显示的字数一多,RAM则很快耗尽,还没有没更好的办法? uchar two_onebyte(uchar h1,uchar h2)
{
uchar temp,tempcol;
if(col<8) tempcol=col;
else tempcol=col-8;
temp=(h1>>tempcol)|(h2<<(8-tempcol));
return temp;这个以前在无线电刊出的,应该是比较好的方案吧。和要显示字数的多少没多大关系,BUF也不用多大。 我也很想知道地铁列车里显示屏的那种斜体字是怎么显示出来的,因为点阵是垂直正交的。 再次谢谢utopia 你的方案是一个比较好的办法。
在网上了半天,也没有搜出比较好的方案(当然除了OURAVR之外),别的网站下载都要注册,好不容易注册了,还要有积分,他NND,只有靠自已了。参考OURAVR上的贴子大部分讲的是开双BUF,这样比较浪费,且不经济,对于小RAM来说就惨了,上午我又想出用另外一种办法,说出来,欢迎各位高手指点。。。。。(再小声说下:不要光看,不发表意见呀!贵在交流)
思路是这样的,先在RAM中开辟一个空间,这个空间的大小=(屏的相素+32BYTE),列如我的屏是16*16*4位(汉字) 屏的相素=1024bit
再加256bit ,然后在主程序中只扫描屏的相素数就可以了(1024bit=4个汉字),后面的256bit主要用作BIT移位,这样,每移动8位,就把ROM中的内容COPY到RAM开辟的内间的后512BIT里面,指针再指向下一组数据,重复以上就可以平滑的移动字体了,也没有倾斜现象。
以上这种方案与utopia 差不多,他说的RAM数更少,我的这种方法,只要在内存中开辟160byte就可以了(也就是显示4个汉字),相对于ATMEGA16 1K的RAM来说,完全够用,且这种方法,理伦上显示的字数能非常的多,只要你的ROM能存得下,也就能滚动显示。
要做显示的朋友,不妨试下这种方案。 TO:Elex
至于显什么体,全是你的爱好,只是取的字库不一样罢了,这个很好实现的,把字体设成你想要的就好了。
(你发贴也真的是快,比我快几秒,哈) 不错,但是想把所有的英文字母和数字标点符号放到内存里,这个表不知道有没有什么好的方法? >我也很想知道地铁列车里显示屏的那种斜体字是怎么显示出来的,因为点阵是垂直正交的。
这个可能是扫描延迟引起的 没图片。不知道。
斜体?还是拖影啊。
网站的字库软件里面选者斜体。或则画图形斜体字调用图形点整也行。
移动的最好方法是。在
cont char str[]={0,0,1,2,3.0.0};
cont char a[]={0};//0
{};//1
{};//2
{};//3
屏幕宽 width
1 读取str取现在的字符ID:HZid,HZidTmp。
2 读取字符flash地址HZaddr=a[]+HZid*32 ;
偏移地址HZip=HZaddr;
3 读取字节显示HZaddr++;输出到屏
if(HZaddr>(a[]+HZidtmp*32 ))//完成一个汉字
『HZidtmp++.HZaddr=a[]+HZidtmp*32 ;』
width++{if(width>16)完成显示HZip++;』
if(hzip》HZaddr+32)『HZid++; 返回 1 』//偏移出一个字符。则整整显示完一个字符。
HZaddr=HZip;HZidtmp=HZid
返回3 }
-------------程序为准------------------------------------
/*欢迎光临!*//* 字符句前后要加空白区域缓冲 */
const prog_char Str0[]={10,5,4,0,1,2,3,4,5,6,6};
const prog_char Hzk[]={
//No:0 欢 使用频度=1
{},
//No:1 迎 使用频度=1
{},
//No:2 光 使用频度=1
{},
//No:3 临 使用频度=1
{},
//No:4 ♀
{},
//No:5 ♂
//No:6
{};
void printHZ_move(const int addrID0,const int addrHZ0,unsigned char wh,const unsigned char Tc, unsigned char f)
{ unsigned int i;//const prog_char *addrtmp,*addrHZ;
unsigned int addrHZ;//实际显示字符的变量
unsigned char strNUM,addrIP,strID;
unsigned int addrtmp;//刷新屏汉字移动的tmp变量
unsigned char strIDtmp,addrIPtmp;
unsigned char j,width,m,uc,ac,top,tp,fl;//tp=0;//,wh=wh0;//wh*16字高+tp顶<MaxY
ac=1;addrIP=1;uc=f;m=0;//底色,字符色,字符列偏移m,字符ID偏移 addrip=1act=ac=uc+1;f预留选择花样模式
if(wh>(MaxY/16))wh=MaxY/16;tp=(MaxY-wh*16)/2; /*if(tp>(MaxY-16*wh))tp=MaxY-16*wh;根据屏点修正宽度和顶点值,由于录入时保证,现为居中*/
strNUM=pgm_read_byte(addrID0);//字符ID +0 ,第一个为字符个数
f=MaxX&0x01;//ScreenUp 0 ScreenDown 1,与宏关联
fl=MaxY-(wh<<4)-tp;//wh*16
/* 移动输出字符 (列移动)全屏扫描输出*/
strID=pgm_read_byte(addrID0+addrIP);//读取字符号
strIDtmp=strID;//另存每行输出起始字符号.移动效果实现
addrHZ=addrHZ0+strIDtmp*32;//字符号读取字符首地址strIDtmp*32
addrIPtmp=addrIP;//另存每行字符ID
for(i=0;i<strNUM*16;i++)//每次输出一列笔划,16*16字符库,所以字符串列长度 字符数strNUM*16
{ //m=32,完成一个字符长度的偏移输出,addrIP,addrHZ,strID 各自自加
if(m>=32){m=0; addrIP++;strID=pgm_read_byte(addrID0+addrIP);//读取字符号
addrHZ=addrHZ0+strID*32;//read ptr HZ
}
addrIPtmp=addrIP;//读取行首字符偏移ID,作用str0中读取字符库偏移地址
addrtmp=addrHZ+m;//输出字符列偏移地址=字符首地址+偏移,移动效果
//每完成一次MaxX全屏输出,m+=2,递进列输出,
strIDtmp=strID;//读取行首字符ID
for(j=0;j<MaxX;)//全屏输出,每列输出后加一(字宽控制,列重复输出)
{
『输出程序』
【宽度控制
【自己的显示控制高度】
j++;//列运算。
】
addrtmp+=2;//字符列地址+1,每列2byte,
if(addrtmp<(addrHZ0+strIDtmp*32+32)){//一个汉字字库空间32byte每列2byte
}else{addrIPtmp++;strIDtmp=pgm_read_byte(addrID0+addrIPtmp);//完成一个字符显示,读取字符号
addrtmp=addrHZ0+strIDtmp*32;//strID=strIDtmp;//addrtmp=addrHZ;//+m;
ac++;
if(ac>7){ac=1;}
}
if(addrIPtmp>strNUM){break;}//字符ID偏移大于字符数,超出范围,即完成输出字符
}/* 全屏幕输出控制 */
m+=2;//字体偏移
load_enable;
load_unable;
intDelayMS(Tc*10);
}
}
-------任意长宽高输出--------------------- 由于字体点阵大小的限制,把斜体汉字做在字库里来显示会很难看的。
我估计斜体字是扫描延时所致,因为据我观察只有滚动的字才有斜体显示。 斜体
的确是扫描延迟! 很久前做过.不只是扫描延迟.大多屏是16行扫.
走屏时,每走一列,要处理数据,有处理的时间.
原来的小屏就一51,速度不够,延迟大,视觉就看出来了. 是延迟造成的,我做的没有这个现象 utopia:
uchar two_onebyte(uchar h1,uchar h2)
{
uchar temp,tempcol;
if(col<8) tempcol=col;
else tempcol=col-8;
temp=(h1>>tempcol)|(h2<<(8-tempcol));
return temp;
}
这个程序的思路可以解释一下吗? http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_198534.JPG
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_198535.jpg
我也做过,硬件和你们差不多,M16做的,32x64 双色 uchar two_onebyte(uchar h1,uchar h2)
{
uchar temp,tempcol;
if(col<8) tempcol=col;
else tempcol=col-8;
temp=(h1>>tempcol)|(h2<<(8-tempcol));
return temp;
}
谁能帮我把这个程序的思路可以解释一下吗? TO:"mljda 一起长大"你的程序我看的不是很明白,能帮忙解释一下吗?
for(i=0;i<strNUM*16;i++)//每次输出一列笔划,16*16字符库,所以字符串列长度 字符数strNUM*16
{ //m=32,完成一个字符长度的偏移输出,addrIP,addrHZ,strID 各自自加
if(m>=32){m=0; addrIP++;strID=pgm_read_byte(addrID0+addrIP);//读取字符号
addrHZ=addrHZ0+strID*32;//read ptr HZ
}
addrIPtmp=addrIP;//读取行首字符偏移ID,作用str0中读取字符库偏移地址
addrtmp=addrHZ+m;//输出字符列偏移地址=字符首地址+偏移,移动效果
//每完成一次MaxX全屏输出,m+=2,递进列输出,
strIDtmp=strID;//读取行首字符ID
for(j=0;j<MaxX;)//全屏输出,每列输出后加一(字宽控制,列重复输出)
{
『输出程序』
【宽度控制
【自己的显示控制高度】
j++;//列运算。
】
addrtmp+=2;//字符列地址+1,每列2byte,
if(addrtmp<(addrHZ0+strIDtmp*32+32)){//一个汉字字库空间32byte每列2byte
}else{addrIPtmp++;strIDtmp=pgm_read_byte(addrID0+addrIPtmp);//完成一个字符显示,读取字符号
addrtmp=addrHZ0+strIDtmp*32;//strID=strIDtmp;//addrtmp=addrHZ;//+m;
ac++;
if(ac>7){ac=1;}
}
if(addrIPtmp>strNUM){break;}//字符ID偏移大于字符数,超出范围,即完成输出字符
}/* 全屏幕输出控制 */
m+=2;//字体偏移
load_enable;
load_unable;
intDelayMS(Tc*10);
}
还有f和f1是做什么的呀? 不错,关注中 我也在移植一个C51的流动显示程序,用M8的SPI做列驱动,做好后会贴上,请大家指正。 最经再看一个51的 用的154 +595 的1616 点阵,看懂了一半。右移看懂了,下移还没看了。。 我的16*64LED点阵屏4字左流动程序及线路图,改自小邓提供的8字左流动程序,原来的程序可以调速但是我觉得流动时拖影现象较严重,改成了现在这个样子,速度偏快。
硬件是使用M8,LED点阵使用的是一点烛光的32*64屏,目前只用了一半。
点击此处下载ourdev_217356.rar(文件大小:10K) 我提供一个方法拉,屏长512也可以很流畅地移动:
如果你的屏是512点长
先用硬件的SPI口把512点的数据送到595上, 先不要锁存数据,
这时候数据存在595上面,刚好8个点对齐;
若果要左移1点的话,把SPI口配置成为IO口,在595的CLK上产生1个脉冲,那么512个点就会整体移1个点
若果要2个点,就用IO产生2个脉冲......
这中方法是用硬件还实现的,所以效果非常的好
这是行业秘密哦^_^ 26楼说的这种方法好!只能整屏移动,类似于1602左移,滚动任意长度字幕这种方法就不好用了。 能不能行和列都用595进行控制阿,你的595是怎样进行级联的阿,对于空脚你是怎样处理的阿?
能不能给出完整的原理图,在此谢谢! 都可能吧 飘过 关注中!!! 标记 正想做这个东西 移动速度快,字是斜的;
移动速度中,字有拖影现象较严重;
移动速度慢时,一切正常;
怎样才能在不受速度影响前提下,移动的字不是斜的且无拖影现象。
附图:
点击此处下载ourdev_228515.rar(文件大小:5K) 好漂亮,PCB用的几层板呀 学习了。 74hc595用來作LED屏單元板的級聯是很好的.如果想要右移,就是列顯示數據脈衝的前面插入幾個"0"脈衝就行了,如果是想要左移,就在列顯示數據脈衝后面插入幾個"0"脈衝,再鎖存,"0"脈衝的個數可以屏的一幀或二幀加一遞增.樓上有人說這是行業秘密,現在LED屏的資料滿天飛,已沒有什麼秘密可言了.但是也不能純用拿來主義. 呵呵。。。标记 学习! 左右移动时斜体 是不是因为刷新路为50Hz,每屏显示时间是20ms,而第一行一直显示(1/16)*20=1.25ms然后再将第二行显示1.25ms,16行下来就会斜了吧?
我也是猜测的,因为自自己做的点阵从来不斜……郁闷呢~有时间的时候试一下~ 40楼的兄弟,能提供一下你做点阵从来不斜的程序思路吗?等待中。。。先谢过了。 而第一行一直显示(1/16)*20=1.25ms然后再将第二行显示1.25ms
这是说 一行就要扫 20遍了么? 扫完20遍扫后面行的?? 你们都是用的动态扫描么,我是用静态的,左移很好实现,其它移动方式就要麻些了. 关注,留下脚印 留下脚印 关注 正要作此类产品,学习一下。 mark 好贴, 标记,顶一下~~~~~···· 关注. 行输出的延迟造成了字体倾斜。 顶一下 好想看那个硬件的背面,,呵呵~~~
很漂亮,,, 支持!!! 新手,看了半天还是不懂,先标记吧 顶一下 标记! mark 我做的没发现这个现象...
http://v.youku.com/v_show/id_XNzkxNjYzMTY=.html mark 学习! 学习 59楼那个波浪很不错... 关注
mark uchar two_onebyte(uchar h1,uchar h2)
{
uchar temp,tempcol;
if(col<8) tempcol=col;
else tempcol=col-8;
temp=(h1>>tempcol)|(h2<<(8-tempcol));
return temp;
}
谁能帮我把这个程序的思路可以解释一下吗? 还是自己解释吧,程序的思想是:将相邻的两字节左移某些位,然后取数。 不错,顶了 mark mark mark 我用一点烛光的屏制点阵屏,显示20个汉字,发现所显示的汉字稍稍有倾斜现象,如果把速度放慢汉字不会倾斜,但显示移动不是流畅的,是一点一点的跳移,不自然。请问朋友们,您们的点阵屏在显示左,右移动时有倾斜现象吗?我分析了产生倾斜的原因,在一张静止的纸上丛上向下划一笔,一定是正的,但如果纸向一旁均速运动,那么,在纸上一笔一定是斜的,
点击此处下载 ourdev_438565.rar(文件大小:380K) (原文件名:My eBooks.rar) 正在研究这个,MARK下 mark mark 收藏了 mark 有空研究下... mark 标记! google搜到这里了,很好 ARMOK jh 凑个热闹,我也瞧瞧 其实主要是传送时间的问题。 用HT1632C做,成本会更便宜,更方便,程序更简单,http://item.taobao.com/auction/item_detail.jhtml?item_id=871cfd3963b2bb1628649aff103e6f05&x_id=0db2 记到起 新手都做过,很常用! 收藏了!!!!!!!!! mark 记号:
若果要左移1点的话,把SPI口配置成为IO口,在595的CLK上产生1个脉冲,那么512个点就会整体移1个点
若果要2个点,就用IO产生2个脉冲......
把SPI口配置成为IO口,如何做?谢谢。 mark 辛苦 呵呵,学习了 mark 等待更好的方法 谢谢奉献 收藏了,谢谢 mark 回复【9楼】climber
-----------------------------------------------------------------------
开缓存是很好啊!你的这种方法也行的通,但是对于52只有100多一点的缓存就行不通了。
页:
[1]
2