climber 发表于 2007-11-15 16:54:37

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 发表于 2007-11-15 19:16:06

数据输出改动一下就可以了.

climber 发表于 2007-11-15 19:28:05

Notonly 能不能说下,怎样实现?能不能给我例程? 谢谢

utopia 发表于 2007-11-15 19:39:59

我以前发过一个http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=706211&bbs_page_no=1&search_mode=3&search_text=utopia&bbs_id=1000

climber 发表于 2007-11-15 20:09:43

谢谢utopia ,我先看看

Notonly 发表于 2007-11-15 20:16:54

我以前毕设时做的,早丢了.
我当时用的方法是一帧扫完后,扫下一帧时数据指针1,这样循环,直到显示完所有的内容.
当然每帧要有一定的延时,时间跟据你的要求来定.
就拿两个8*8的显示两个字母A B来个简单说明吧:
假设A和B的数据为12345678和abcdefgh 第一帧时分别把12345678abcdefgh发出,延时后从2开始发数据,就是依次把2345678abcdefgh+空 发出即可,下一帧时从3开始发,这样循环,显示出来的就是AB向左移动.

我也是新手,不知说的你能明白吗?这是我当时的方法,这里有好多高手,看看他们的方法,也许比我这个要好好多,呵呵^_^.

climber 发表于 2007-11-16 08:15:27

已经搞好了,只不过是在内存中开辟一个很大的BUF(20字*32byte) ,然后每次再整体左移1BIT这种办法行是行,问题是RAM吃紧呀,显示的字数一多,RAM则很快耗尽,还没有没更好的办法?

utopia 发表于 2007-11-16 13:05:28

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也不用多大。

Elex 发表于 2007-11-16 17:43:26

我也很想知道地铁列车里显示屏的那种斜体字是怎么显示出来的,因为点阵是垂直正交的。

climber 发表于 2007-11-16 17:50:17

再次谢谢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能存得下,也就能滚动显示。

    要做显示的朋友,不妨试下这种方案。

climber 发表于 2007-11-16 21:47:20

TO:Elex
至于显什么体,全是你的爱好,只是取的字库不一样罢了,这个很好实现的,把字体设成你想要的就好了。

(你发贴也真的是快,比我快几秒,哈)

tuy0326 发表于 2007-12-1 03:47:36

不错,但是想把所有的英文字母和数字标点符号放到内存里,这个表不知道有没有什么好的方法?

ghost2 发表于 2007-12-1 20:11:28

>我也很想知道地铁列车里显示屏的那种斜体字是怎么显示出来的,因为点阵是垂直正交的。
这个可能是扫描延迟引起的

mljda 发表于 2007-12-1 20:52:34

没图片。不知道。
斜体?还是拖影啊。

网站的字库软件里面选者斜体。或则画图形斜体字调用图形点整也行。

移动的最好方法是。在
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);
        }
}


-------任意长宽高输出---------------------

Elex 发表于 2007-12-3 14:33:46

由于字体点阵大小的限制,把斜体汉字做在字库里来显示会很难看的。
我估计斜体字是扫描延时所致,因为据我观察只有滚动的字才有斜体显示。

powerful 发表于 2007-12-3 15:17:59

斜体
的确是扫描延迟!

strongxg 发表于 2007-12-3 16:27:08

很久前做过.不只是扫描延迟.大多屏是16行扫.
走屏时,每走一列,要处理数据,有处理的时间.
原来的小屏就一51,速度不够,延迟大,视觉就看出来了.

dfzcx 发表于 2008-1-5 20:17:19

是延迟造成的,我做的没有这个现象

qiaofeng198011 发表于 2008-1-7 13:34:49

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;
}
这个程序的思路可以解释一下吗?

sheik 发表于 2008-1-7 16:28:17

http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_198534.JPG
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_198535.jpg

我也做过,硬件和你们差不多,M16做的,32x64 双色

qiaofeng198011 发表于 2008-1-7 17:23:06

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;
}
谁能帮我把这个程序的思路可以解释一下吗?

qiaofeng198011 发表于 2008-1-8 14:08:10

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是做什么的呀?

Forever 发表于 2008-1-8 14:41:03

不错,关注中

kgje 发表于 2008-1-31 17:40:46

我也在移植一个C51的流动显示程序,用M8的SPI做列驱动,做好后会贴上,请大家指正。

litchiate 发表于 2008-1-31 17:58:13

最经再看一个51的 用的154 +595 的1616 点阵,看懂了一半。右移看懂了,下移还没看了。。

kgje 发表于 2008-2-21 15:00:55

我的16*64LED点阵屏4字左流动程序及线路图,改自小邓提供的8字左流动程序,原来的程序可以调速但是我觉得流动时拖影现象较严重,改成了现在这个样子,速度偏快。

硬件是使用M8,LED点阵使用的是一点烛光的32*64屏,目前只用了一半。


点击此处下载ourdev_217356.rar(文件大小:10K)

polarbear 发表于 2008-2-23 08:37:55

我提供一个方法拉,屏长512也可以很流畅地移动:

如果你的屏是512点长
先用硬件的SPI口把512点的数据送到595上, 先不要锁存数据,
这时候数据存在595上面,刚好8个点对齐;
若果要左移1点的话,把SPI口配置成为IO口,在595的CLK上产生1个脉冲,那么512个点就会整体移1个点
若果要2个点,就用IO产生2个脉冲......

这中方法是用硬件还实现的,所以效果非常的好


这是行业秘密哦^_^

plc_avr 发表于 2008-2-23 08:50:48

26楼说的这种方法好!只能整屏移动,类似于1602左移,滚动任意长度字幕这种方法就不好用了。

yutianyiren 发表于 2008-3-5 11:03:29

能不能行和列都用595进行控制阿,你的595是怎样进行级联的阿,对于空脚你是怎样处理的阿?
能不能给出完整的原理图,在此谢谢!

cjbcjb 发表于 2008-3-5 15:54:55

都可能吧

hjzz 发表于 2008-3-5 16:36:16

飘过

cytrm 发表于 2008-3-5 17:42:05

关注中!!!

Yun0 发表于 2008-3-7 21:38:48

标记

sxzzl 发表于 2008-3-11 09:43:12

正想做这个东西

sun4979 发表于 2008-3-11 22:21:05

移动速度快,字是斜的;
移动速度中,字有拖影现象较严重;
移动速度慢时,一切正常;
怎样才能在不受速度影响前提下,移动的字不是斜的且无拖影现象。
附图:
点击此处下载ourdev_228515.rar(文件大小:5K)

zhaojianguo 发表于 2008-3-18 01:37:34

好漂亮,PCB用的几层板呀

Notonly 发表于 2008-3-18 09:58:14

学习了。

jeoge 发表于 2008-3-18 16:11:00

74hc595用來作LED屏單元板的級聯是很好的.如果想要右移,就是列顯示數據脈衝的前面插入幾個"0"脈衝就行了,如果是想要左移,就在列顯示數據脈衝后面插入幾個"0"脈衝,再鎖存,"0"脈衝的個數可以屏的一幀或二幀加一遞增.樓上有人說這是行業秘密,現在LED屏的資料滿天飛,已沒有什麼秘密可言了.但是也不能純用拿來主義.

pcwinner 发表于 2008-3-18 21:46:24

呵呵。。。标记

bjj9217 发表于 2008-3-19 09:54:55

学习!

jmpxwh 发表于 2008-3-20 18:39:18

左右移动时斜体 是不是因为刷新路为50Hz,每屏显示时间是20ms,而第一行一直显示(1/16)*20=1.25ms然后再将第二行显示1.25ms,16行下来就会斜了吧?

我也是猜测的,因为自自己做的点阵从来不斜……郁闷呢~有时间的时候试一下~

sun4979 发表于 2008-4-7 22:27:08

40楼的兄弟,能提供一下你做点阵从来不斜的程序思路吗?等待中。。。先谢过了。

litchiate 发表于 2008-4-8 13:26:21

而第一行一直显示(1/16)*20=1.25ms然后再将第二行显示1.25ms

这是说 一行就要扫 20遍了么? 扫完20遍扫后面行的??

l456789 发表于 2008-4-10 14:02:44

你们都是用的动态扫描么,我是用静态的,左移很好实现,其它移动方式就要麻些了.

penguin 发表于 2008-6-24 19:56:57

关注,留下脚印

firegl99 发表于 2008-7-18 12:36:49

留下脚印

macchange 发表于 2008-8-13 22:30:20

关注

liqu 发表于 2008-8-21 10:52:46

正要作此类产品,学习一下。

jamiedu 发表于 2008-8-21 12:25:00

mark

XUEPENGBIN 发表于 2008-8-21 20:51:20

好贴, 标记,顶一下~~~~~····

sdmcu51 发表于 2008-9-12 20:23:38

关注.

microyao 发表于 2008-9-12 20:31:02

行输出的延迟造成了字体倾斜。

sws222 发表于 2008-9-12 21:26:20

顶一下

tomy 发表于 2008-9-13 17:40:25

好想看那个硬件的背面,,呵呵~~~
很漂亮,,,

sen8senok 发表于 2009-3-15 18:05:58

支持!!!

1860 发表于 2009-3-16 21:04:43

新手,看了半天还是不懂,先标记吧

ycbx1569 发表于 2009-3-16 22:32:03

顶一下

guyuqiang 发表于 2009-3-24 15:02:06

标记!

a105 发表于 2009-4-1 19:31:32

mark

hyz_avr 发表于 2009-4-1 19:49:21

我做的没发现这个现象...
http://v.youku.com/v_show/id_XNzkxNjYzMTY=.html

luojh 发表于 2009-4-3 15:54:57

mark

jchqxl 发表于 2009-4-3 23:09:36

学习!

chenzhipeng 发表于 2009-4-9 16:11:05

学习

hiux 发表于 2009-4-10 20:54:10

59楼那个波浪很不错...

zhangy 发表于 2009-4-15 17:24:15

关注
mark

gl546319 发表于 2009-4-15 19:22:12

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;
}
谁能帮我把这个程序的思路可以解释一下吗?

gl546319 发表于 2009-4-19 10:04:03

还是自己解释吧,程序的思想是:将相邻的两字节左移某些位,然后取数。

Forever 发表于 2009-4-21 13:29:58

不错,顶了

dklcmc 发表于 2009-4-21 14:06:25

mark

winmcu 发表于 2009-4-21 14:35:34

mark

fox-lovey 发表于 2009-4-21 20:20:07

mark

lsj_sy 发表于 2009-4-21 21:43:36

我用一点烛光的屏制点阵屏,显示20个汉字,发现所显示的汉字稍稍有倾斜现象,如果把速度放慢汉字不会倾斜,但显示移动不是流畅的,是一点一点的跳移,不自然。请问朋友们,您们的点阵屏在显示左,右移动时有倾斜现象吗?我分析了产生倾斜的原因,在一张静止的纸上丛上向下划一笔,一定是正的,但如果纸向一旁均速运动,那么,在纸上一笔一定是斜的,
点击此处下载 ourdev_438565.rar(文件大小:380K) (原文件名:My eBooks.rar)

womenhome 发表于 2009-4-28 14:07:17

正在研究这个,MARK下

twfxjmz 发表于 2009-5-16 12:57:50

mark

tuy0326 发表于 2009-6-4 18:56:32

mark

xian_heping 发表于 2009-6-6 12:20:31

收藏了

fy024 发表于 2009-6-6 12:51:57

mark

lv998127 发表于 2009-6-6 14:09:21

有空研究下...

cjr82123 发表于 2009-6-6 14:49:35

mark

wanghengzhi 发表于 2009-7-11 14:25:43

标记!

ajoe 发表于 2009-9-2 09:25:35

google搜到这里了,很好

googse 发表于 2009-9-18 16:20:47

ARMOK

ndust 发表于 2009-9-30 17:20:08

jh

mumuyou 发表于 2009-9-30 17:22:00

凑个热闹,我也瞧瞧

fanroom 发表于 2009-10-22 16:23:20

其实主要是传送时间的问题。

99186329 发表于 2009-10-24 19:58:02

用HT1632C做,成本会更便宜,更方便,程序更简单,http://item.taobao.com/auction/item_detail.jhtml?item_id=871cfd3963b2bb1628649aff103e6f05&x_id=0db2

qinshi1208 发表于 2009-11-24 17:25:17

记到起

jinhu 发表于 2009-11-25 10:47:22

新手都做过,很常用!

809314596 发表于 2009-11-29 18:06:51

收藏了!!!!!!!!!

80162535 发表于 2010-1-27 14:35:45

mark

zheshiwo 发表于 2010-2-23 12:59:30

记号:
若果要左移1点的话,把SPI口配置成为IO口,在595的CLK上产生1个脉冲,那么512个点就会整体移1个点
若果要2个点,就用IO产生2个脉冲......

把SPI口配置成为IO口,如何做?谢谢。

ysu533 发表于 2010-8-23 17:32:05

mark

xtaens 发表于 2010-10-15 19:59:51

辛苦

liangwb 发表于 2010-11-25 14:36:28

呵呵,学习了

skywym 发表于 2011-1-8 18:40:28

mark

cyr_hongfeng 发表于 2011-1-8 20:43:04

等待更好的方法

kongan 发表于 2011-1-9 21:34:24

谢谢奉献

wtiechen1969 发表于 2011-1-10 19:33:33

收藏了,谢谢

ringan865 发表于 2011-1-11 19:55:24

mark

Shi_Tou 发表于 2011-2-22 08:50:25

回复【9楼】climber
-----------------------------------------------------------------------

开缓存是很好啊!你的这种方法也行的通,但是对于52只有100多一点的缓存就行不通了。
页: [1] 2
查看完整版本: 16*16 LED点阵(74HC595+三极管TIP127+74LS145+74HC245) 字幕左右移的编程思想?