WXing 发表于 2009-8-26 10:30:46

16×32点阵,可以上下移动,左右移动该如何实现?

这两天弄了个16×32点阵,显示两个汉字,上下移动已经实现了。要左右移动就要把移位到四个595里的数据再循环移位?这也只是理论上的实现,真正做起来这个方法行不通。肯定有其他的方法,望知道的大虾能指点一下,先谢过了!
原理图:
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_474749.JPG
(原文件名:16×32.JPG)

点击此处下载 ourdev_474750.rar(文件大小:56K) (原文件名:16×32.rar)

okano 发表于 2009-8-26 11:58:56

其实楼主自己都清楚思路了,只要把数据先左右循环移位后再送入595就行了。

WXing 发表于 2009-8-26 12:05:43

数据循环移位,几个字节,而且移位的位数也在变化,编程比较复杂吧。

tuy0326 发表于 2009-8-26 12:23:41

做个大循环不就可以了

WXing 发表于 2009-8-26 12:33:53

3楼能具体点吗,谢了!

WXing 发表于 2009-8-26 21:28:23

已经解决了,谢了。

WXing 发表于 2009-9-21 16:14:46

共享一下,16*32点阵Proteus仿真,上下左右移动,只是MCU用的是51,左右移动有些闪,可以换成AVR,应该就不会了。
点击此处下载 ourdev_483426.rar(文件大小:60K) (原文件名:16×32.rar)

huangqiuming 发表于 2009-9-22 12:37:49

楼主发我个原理图,我也想学习学习!

WXing 发表于 2009-9-22 15:57:28

图和程序都在压缩包里了,Proteus仿真的图,没PCB图。

z6912311 发表于 2009-10-31 22:14:54

楼主,我对这个实验很感兴趣,能加下我的QQ吗??想跟你多了解下~~~~~~~~~~~~~~谢谢
QQ:356587259

z6912311 发表于 2009-11-1 18:22:16

大家好,楼主那个图我蛮喜欢的,只是没有汇编程序,只有C程序
呵呵,C程序不怎么看得懂,能教下我怎么改变它所显示的字吗??
谢了~~~!!!

z6912311 发表于 2009-11-1 21:18:49

楼主,留个QQ吧~!!!

WXing 发表于 2009-11-2 10:02:31

z6912311,汇编只是刚学的时候看下,真正编程没有用汇编的。改变显示的汉字,你取不同汉字的模送到595就可以了啊,具体在程序里就是,改变数组table的值。程序已经注释,如果看不懂,那就再补下基础吧。论坛里面这种仿真很多的,,汉字取模软件也有下的,可以自己看看。
/*************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
/*************************************************/
sbit hc595_ds=P2^0;//控制位定义
sbit hc595_shcp=P2^1;
sbit hc595_stcp=P2^2;
sbit hc595_oe=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
uchar flag_left,flag_right,flag_up,flag_down;//上下左右标志位
uchar dispram;
uchar table[]={0x10,0x20,0x10,0x21,0x10,0x21,0x10,0x21,0x10,0x23,0x32,0x25,0x52,0x25,0x52,0x29,
0x11,0x29,0x10,0x21,0x10,0x21,0x08,0x21,0x08,0x21,0x04,0x21,0x04,0x21,0x02,0x20,   //杭
                           0x08,0x01,0x08,0x02,0x08,0x02,0xDF,0x7F,0x08,0x00,0x0C,0x00,0x9C,0x0F,0xAC,0x08,
0x8A,0x08,0x8A,0x08,0x89,0x08,0x88,0x48,0x48,0x48,0x48,0x48,0x28,0x70,0x08,0x00};//州
/*************************************************/
void hc595_write_data(uchar data_ds);
void hc595_display();
void delay(uint n);
void key_scan();
void shift_L();
void shift_R();
/*************************************************/
void main()
{               
        uchar i,j,k,num_l,num_r,n=0;
        hc595_oe=0;
        while(1)
        {       
                for(i=0;i<16;i++)
                {
                        for(j=0;j<4;j++)
                        {
                                for(k=0;k<16;k++)
                                {        
                       
                                         key_scan();
                                        dispram=table;
                                        dispram=table;
                                        dispram=table;
                                        dispram=table;
                                           if(flag_left==1)
                                        {num_l=n;for(;num_l>0;num_l--)shift_L();} //左移,n为多少则移多少位
                                        if(flag_right==1)
                                        {num_r=n;for(;num_r>0;num_r--)shift_R();}//右移,n为多少则移多少位
                                        hc595_write_data(dispram);        
                                       hc595_write_data(dispram);       
                                       hc595_write_data(dispram);       
                                       hc595_write_data(dispram);
                                        if(flag_up==1) P1=(k-i)%16;//上下移动
                                        else if(flag_down==1) P1=(k+i)%16;
                                        else P1=k;       
                                           hc595_display();
                                       delay(120);
                                }
                        }       
                   n++;
                      if(n==32)n=0;//移了32位,则n清零,点阵左右是32点的。               
                }               
        }
}
/*************************************************/
void hc595_write_data(uchar data_ds)
{
      uchar n_bit;
      for(n_bit=0;n_bit<8;n_bit++)
      {
          hc595_shcp=0;
             hc595_ds=data_ds&(1<<n_bit);
             hc595_shcp=1;
      }
}
/*************************************************/
void hc595_display()
{
    hc595_stcp=0;
    delay(1);
    hc595_stcp=1;
}
/*************************************************/
void delay(uint n)
{
    while(n--);
}
/*************************************************/
void key_scan()//按键扫描,当某一键按下,则相应标志位置一,同时其他标志位置零
{
if(P2_4==0)delay(10);
if(P2_4==0){flag_left=1;flag_right=0;flag_up=0;flag_down=0;}
if(P2_5==0)delay(10);
if(P2_5==0){flag_right=1;flag_left=0,flag_up=0;flag_down=0;}
if(P2_6==0)delay(10);
if(P2_6==0){flag_up=1;flag_left=0,flag_right=0;flag_down=0;}
if(P2_7==0)delay(10);
if(P2_7==0){flag_down=1;flag_left=0;flag_right=0;flag_up=0;}
}
/*************************************************/
void shift_L()                  //左移函数,调用一次移一位
{
bit hbit;
uchar i;
hbit=dispram&0x80;
for(i=0;i<3;i++)
   {
    dispram=dispram<<1;
    dispram+=dispram>>7;
   }
   dispram=dispram<<1;
   if(hbit)dispram+=0x01;
}
/*************************************************/
void shift_R()                  //右移函数
{
bit lbit;
uchar i;
lbit=dispram&0x01;            
for(i=3;i>0;i--)
{
    dispram=dispram>>1;      
    dispram+=dispram<<7;
}
dispram=dispram>>1;
if(lbit)dispram+=0x80;
}
/*************************************************/
显示效果:
http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_498689.gif
(原文件名:杭州.gif)

z6912311 发表于 2009-11-2 13:52:49

先非常感谢楼主的回复~~~~~~~~~~~···
我用汉字取模软件改变数组table的值,然后仿真看见显示出来的字是乱的,不知道怎么回事~~~??能告诉我一下吗??
这个图我想做个实物,楼主做过吗???

谢谢~~~~~~~~~~~

WXing 发表于 2009-11-2 16:19:08

那应该是你的取模方式设的不对,仔细研究下吧。
做实物做过,154出来加个电阻,再加三极管放大,行驱动;595接个电阻,列驱动,就可以了,这种电路论坛里也很多的。

z6912311 发表于 2009-11-3 17:57:47

哦,这几天我看懂了数组table的值,懂得怎么改变所显示的字了,仿真的时候只能显示2个字,要显示多点字应该改哪里好呢??
对了,那个电阻要用多少欧的????三极管用什么型号的????NPN还是PNP????电源用多少伏的????

不好意思,问那么多问题~~~,希望能告诉我,非常感谢~~~!!

WXing 发表于 2009-11-3 20:25:18

16*32点阵,能同时显示的只有两个字了,当然移动的时候,你可以编程显示多个汉字。
至于三极管与电阻,我以前也发过一个帖子,你可以看看。
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3555660&bbs_page_no=1&search_mode=1&search_text=点阵&bbs_id=9999

z6912311 发表于 2009-11-4 18:18:16

要显示4个字还是编辑uchar table[]数组是吧???
谢谢楼主~~~~~~

好人~~~

WXing 发表于 2009-11-4 19:59:48

把字模送595显示就可以了,显示什么汉字原理都一样。
我也是从新手一步步走过来的,明白个中滋味,不过很多问题可以自己先思考下,这样才能触类旁通,彻底明白,学会一个解决问题的方法、能力,从而下次遇到新问题时能尽快找出答案。啰嗦了一下,呵呵。
这个东西能对大家入门有一点点帮助,也就满足了。希望你的点阵实物能成功。

z6912311 发表于 2009-11-7 12:08:18

恩,谢谢楼主,我尽力去完成,一起加油~~!!!

z6912311 发表于 2009-11-28 19:43:57

楼主,你好~~~!!!
那个仿真图能把电阻和三极管连上给我看下吗???
顺便问下,你有这个电路的PCB板,我想买来做实物~~~~
谢谢

bbs2009 发表于 2009-11-29 12:42:48

WXing 发表于 2009-11-29 13:06:37

楼上说的有道理,用51刷出几个字应该没问题的,学习。
实际应用中应该是利用SPI或是其他硬件发数据,不会软件发数据。

z6912311 发表于 2009-11-30 00:44:55

楼主,你好~~!!
上面那个图欲做实物的话,点阵是不是买任意的16*32的点阵都可以导程序进去显示啊~???
还是要买上图点阵排列方式的16*32点阵~~??

WXing 发表于 2009-11-30 12:49:39

Proteus里的8*8点阵,和实物8*8点阵,引脚完全不一样,实物8*8点阵引脚完全是乱的,不同型号引脚分布也不一样,你买了就知道了。原理是一样的,都是行列扫描。

z6912311 发表于 2009-11-30 14:34:38

楼主,你好~!!!
我已经开始做实物了,595和154接点阵应该哪个脚接哪个脚啊????
对了,楼主有PCB原理图吗??上面你给那个贴的PCB原理图打不开

WXing 发表于 2009-12-1 09:35:08

154行扫,595列扫,三极管、电阻看这里差不多了吧
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3555660&bbs_page_no=1&search_mode=1&search_text=点阵&bbs_id=9999
差不多了吧,呵呵。

hzpyj 发表于 2009-12-1 11:06:03

mark

ajoe 发表于 2009-12-8 15:08:58

记号

hero57901122 发表于 2009-12-8 21:26:48

楼主 能告诉我你是怎么取字模的 我就是取不到
dispram=table;
dispram=table;
dispram=table;
dispram=table;
和 hc595_shcp=0;
             hc595_ds=data_ds&(1<<n_bit);
             hc595_shcp=1;
2条我看不懂 可以解析一下吗 太谢谢了 我正在学习点阵的简单设计

WXing 发表于 2009-12-8 22:20:12

我是用现成的汉字取模软件取模的,强的话,可以自己编一个啊,呵呵。
那两行程序就是把数据移近595,数据在shcp的上升沿移入。

hero57901122 发表于 2009-12-8 22:49:20

这样啊 是把数据移动给595啊 太谢谢了 可以发给我取模的软件吗 邮箱为648433806@qq.com 我用的取模软件取出的字 不是倒着的 就是乱码 不能达到想要效果 也试着改了引脚标号 横向和纵向取模都不行 谢谢你了 可以加QQ吗 以后有关单片机问题可以请教 再次谢谢了

goodboyboy 发表于 2009-12-8 23:01:59

楼主,你那字模用什么取的呀,我怎么取不出来呢

coody 发表于 2009-12-8 23:43:12

16x32点的都闪?我用51驱动128*32点都不会闪,刚给了100个控制器客户。。。

WXing 发表于 2009-12-9 11:02:53

关于取模软件,本论坛就有很多
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1563761&bbs_page_no=1&search_mode=1&search_text=取模&bbs_id=9999
我也用的这个。取模要和你的程序结合起来,才能正确显示,这里面是绕了点,不过揣摩一下,理解一次就OK了,呵呵。
这个闪主要是595送数据的时候都是软件送的,用SPI之类的,速度快很多,而且单片机是89C52,用增强型的51速度应该可以大大提高。
楼上高手,学习,呵呵。

hero57901122 发表于 2009-12-9 16:15:25

终于弄懂了字的取模方式,现在我做完6个字的显示 发现遇到楼上说的闪烁的问题 字体一直闪烁 很不稳定 不知道是什么原因 是不是我连接的595数量太多 单片机驱动不起来 看起字来老是一闪一闪的 不知道楼上的高手是怎样使字体不闪烁 稳定输出的

wangqh1983 发表于 2009-12-28 13:11:06

http://www.eda365.net/attachment/200904/23/30642_1240494307ovkO.gif
关注一下~

110600735 发表于 2010-5-13 23:10:28

楼主,把FPGA控制LED点阵的程序发给我参考一下吧?急用,非常急,谢谢了,邮箱:421529991@qq.com或者加我QQ号:421529991

rqzzx 发表于 2010-9-12 21:01:29

回复【6楼】WXing
-----------------------------------------------------------------------

感谢楼主的分享

wenwen101843 发表于 2010-9-17 22:13:14

74h138   和74h595    16x16   点阵    能实现左右移动吗

wenwen101843 发表于 2010-9-17 22:13:42

程序要怎么写

wenwen101843 发表于 2010-9-17 22:15:44

dispram=table;这句是什么意思

liubin198745 发表于 2011-4-28 08:34:37

楼上给个6个字的显示的C程序啊

q710561804 发表于 2011-5-1 00:39:41

引用图片【楼主位】WXing
-----------------------------------------------------------------------
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_474749.JPG
(原文件名:16×32.JPG)

yang295 发表于 2011-5-29 09:03:21

呵呵 不错
学习了

itssee 发表于 2011-6-13 14:47:59

楼主还回来不呀!我将这个点阵做成实物了.但是闪得厉害呀,精简了与左移无关的所有行,还是一样的.不知道楼主经过这段时间是否有更好的方法上来吗?留个邮箱,回头再来瞧瞧itssee@gmail.com

WXing 发表于 2011-10-14 22:20:26

什么单片机啊,控制多大点阵?

wghaovv 发表于 2011-11-2 15:12:23

记号

cqy1028 发表于 2011-11-2 15:21:13

点阵显示,好东西mark

ljmdzyx 发表于 2011-11-2 17:34:40

MARK.

寻找 发表于 2012-3-27 00:27:49

楼主你好,最近现在看这方面的资料,您的这份资料对我很重要,可惜下载不了,您可以发到我的QQ291699539吗,不堪感激
页: [1]
查看完整版本: 16×32点阵,可以上下移动,左右移动该如何实现?