搜索
bottom↓
回复: 46

完整电子显示板硬件+程序+实物照片,MEGA16+ZLG7289B驱动24个数码管,数据通过外部RS232

[复制链接]

出0入0汤圆

发表于 2007-7-22 15:11:34 | 显示全部楼层 |阅读模式
完整电子显示板硬件+程序+实物照片,MEGA16+ZLG7289B驱动24个数码管,数据通过外部RS232C输入。

大家看看,还有什么不足的地方。

有个疑问,通过PC串口发送数据的时候MCU只能接受10个字节,要接受更多的字节,大家有什么好的办法吗?

点击此处打开armok01162977.PDF





《PRO》

#include   "iom16v.h"

#include   "macros.h"

#define   set_ss()   PORTB |= 0b00000001

#define   set_ss1()  PORTB |= 0b00010000

#define   set_ss2()  PORTB |= 0b00001000

#define  set_sck()   PORTB |= 0b00000010

#define set_mosi()   PORTB |= 0b00000100

#define set_miso()   PORTB |= 0b00001000

#define   clr_ss()   PORTB &= 0b11111110

#define   clr_ss1()  PORTB &= 0b11101111

#define   clr_ss2()  PORTB &= 0b11110111

#define  clr_sck()   PORTB &= 0b11111101

#define clr_mosi()   PORTB &= 0b11111011

#define clr_miso()   PORTB &= 0b11110111

#define F_CPU 7372800

const unsigned char buffer[]="INITIZING THE SYSTEM,WAITING FOR 3 SENCONDS......";

unsigned char retmp[5];



void USART_Init( unsigned int baud)

{

unsigned int tmp;

tmp= F_CPU/baud/16-1;

UBRRH = (unsigned char)(tmp>>8);

UBRRL = (unsigned char)tmp;

UCSRB = (1<<RXEN)|(1<<TXEN);

UCSRC = (1<<URSEL)|(0<<USBS)|(1<<UCSZ0)|(1<<UCSZ1)|(0<<UCSZ2);

}



void USART_Transmit( unsigned char data )

{

while ( !( UCSRA & (1<<UDRE)) )

;

UDR = data;

}



unsigned char USART_Receive( void )

{

while ( !(UCSRA & (1<<RXC)) )

;

return UDR;

}



unsigned char USART_Receivestring( void )

{

unsigned char i=0;

retmp[0]=UDR;

  do

     {while(!(UCSRA & (1<<RXC)));

          i++;

          retmp=UDR;

          if (i==4)

          break;

         }

  while(1);

}  



void SPI_MasterInit(void)

{

   unsigned char temp;

   DDRB |= 0b00011111;

   //DDRB &= 0b11110111;

   //PORTB |= 0b00000000;

   PORTB |= 0b00011101;

}



void SPI_Write(unsigned char data)

{

   int i;

   set_ss();

   clr_ss();

   delay_ms(5);  

   clr_sck();

   clr_mosi();

   clr_miso();

   for(i=0;i<8;i++)

   {

      if(data & 0x80)set_mosi();

      else clr_mosi();

          set_sck();

      delay_us(8);

      clr_sck();  

      delay_us(8);

      data <<= 1;

   }

   delay_us(10);

   clr_sck();

   delay_us(10);

   clr_mosi();

   delay_us(20);

   set_ss();

   delay_us(10);

   set_miso();

}

void SPI_Write1(unsigned char data)

{

   int i;

   set_ss1();

   clr_ss1();

   delay_ms(5);  

   clr_sck();

   clr_mosi();

   for(i=0;i<8;i++)

   {

      if(data & 0x80) set_mosi();

      else clr_mosi();

          set_sck();

      delay_us(8);

      clr_sck();  

      delay_us(8);

      data <<= 1;

   }

   delay_us(10);

   clr_sck();

   delay_us(10);

   clr_mosi();

   delay_us(20);

   set_ss1();

   delay_us(10);

}

void SPI_Write2(unsigned char data)

{

   int i;

   set_ss2();

   clr_ss2();

   delay_ms(5);  

   clr_sck();

   clr_mosi();

   for(i=0;i<8;i++)

   {

      if(data & 0x80)set_mosi();

      else clr_mosi();

          set_sck();

      delay_us(8);

      clr_sck();  

      delay_us(8);

      data <<= 1;

   }

   delay_us(10);

   clr_sck();

   delay_us(10);

   clr_mosi();

   delay_us(20);

   set_ss2();

   delay_us(10);

}



void spireset()

{SPI_Write(0xa4);

SPI_Write1(0xa4);

SPI_Write2(0xa4);

}



void ledtest()

{SPI_Write(0xbf);

SPI_Write1(0xbf);

SPI_Write2(0xbf);

}



void SPI_Writechar(unsigned char cmd,unsigned char data)

{  

   unsigned char str;

   int i;

   set_ss();

   clr_ss();

   delay_ms(5);  

   clr_sck();

   clr_mosi();

   for(i=0;i<8;i++)

   {

      if(cmd & 0x80)set_mosi();

      else clr_mosi();

          set_sck();

      delay_us(8);

      clr_sck();  

      delay_us(8);

      cmd <<= 1;

   }

delay_us(25);

set_ss();

clr_ss();

clr_sck();

clr_mosi();

    for(i=0;i<8;i++)

   {

      if(data & 0x80)set_mosi();

      else clr_mosi();

          set_sck();

      delay_us(8);

      clr_sck();  

      delay_us(8);

      data <<= 1;

   }

   delay_us(25);

   clr_sck();

   delay_us(10);

   clr_mosi();

   delay_us(20);

   set_ss();

}



void SPI_Writechar1(unsigned char cmd,unsigned char data)

{  

   unsigned char str;

   int i;

   set_ss1();

   clr_ss1();

   delay_ms(5);  

   clr_sck();

   clr_mosi();

   for(i=0;i<8;i++)

   {

      if(cmd & 0x80)set_mosi();

      else clr_mosi();

          set_sck();

      delay_us(8);

      clr_sck();  

      delay_us(8);

      cmd <<= 1;

   }

delay_us(25);

set_ss1();

clr_ss1();

clr_sck();

clr_mosi();

    for(i=0;i<8;i++)

   {

      if(data & 0x80)set_mosi();

      else clr_mosi();

          set_sck();

      delay_us(8);

      clr_sck();  

      delay_us(8);

      data <<= 1;

   }

   delay_us(25);

   clr_sck();

   delay_us(10);

   clr_mosi();

   delay_us(20);

   set_ss1();

}

void SPI_Writechar2(unsigned char cmd,unsigned char data)

{  

   unsigned char str;

   int i;

   set_ss2();

   clr_ss2();

   delay_ms(5);  

   clr_sck();

   clr_mosi();

   for(i=0;i<8;i++)

   {

      if(cmd & 0x80)set_mosi();

      else clr_mosi();

          set_sck();

      delay_us(8);

      clr_sck();  

      delay_us(8);

      cmd <<= 1;

   }

delay_us(25);

set_ss2();

clr_ss2();

clr_sck();

clr_mosi();

    for(i=0;i<8;i++)

   {

      if(data & 0x80)set_mosi();

      else clr_mosi();

          set_sck();

      delay_us(8);

      clr_sck();  

      delay_us(8);

      data <<= 1;

   }

   delay_us(25);

   clr_sck();

   delay_us(10);

   clr_mosi();

   delay_us(20);

   set_ss2();

}



unsigned int SPI_Read()

{

   int i,recData;

   recData = 0;

   clr_ss();

   clr_sck();

   clr_mosi();

   clr_miso();

   delay_us(2);

   for(i=0;i<24;i++)

   {

      set_sck();

      NOP();NOP();NOP();NOP();NOP();

      delay_us(5);

      clr_sck();

      delay_us(4);

      if(PINB&0b00001000)recData |= 0x01;

      else recData &= 0xfffe;

      if(i<16)recData <<= 1;

   }

   delay_us(10);

   set_ss();

   return recData;

}







void delay_us(unsigned int n)

{

   unsigned int i;

   for(i=0;i<n;i++)

   {

      ;

   }

   return;

}



void delay_1ms(void)

{

   unsigned int i;      

   for(i=0;i<1142;i++)//(XTAL 8M*143-2)

   {

      ;

   }

}



void delay_ms(unsigned int n)

{

   unsigned int i;

   for(i=0;i<n;i++)

   {

      delay_1ms();

   }

}



void ledcheck()

{

unsigned char i=200,j=0;

spireset();

ledtest();

delay_ms(2000);

spireset();

for(j=0;j<1;j++)

{

for(i=200;i<=207;i++)

  {

   SPI_Writechar(i,0xc8);

   SPI_Writechar1(i,0xc8);

   SPI_Writechar2(i,0xc8);

   delay_ms(300);

  }

  delay_ms(1000);

  spireset();

}

}







unsigned char decode(unsigned char data)

{

  unsigned char i;

  i=0;

  switch (data)

  {

   case '0':i=0;break;

   case '1':i=1;break;

   case '2':i=2;break;

   case '3':i=3;break;

   case '4':i=4;break;

   case '5':i=5;break;

   case '6':i=6;break;

   case '7':i=7;break;

   case '8':i=8;break;

   case '9':i=9;break;

   case 'a':i=10;break;

   case 'b':i=11;break;

   case 'c':i=12;break;

   case 'd':i=13;break;

   case 'e':i=14;break;

   case 'f':i=15;break;

  }

   return i;

}



void main(void)

{

   unsigned char   cmd,data;

   unsigned char i = 0;

   unsigned char n=0;

   unsigned int tmp;



   CLI();

   delay_ms(1000);

   SPI_MasterInit();

   SEI();

   

   USART_Init(9600);

   for(i=0;n<49;n++)

    {

     USART_Transmit(buffer[n]);

    }

     USART_Transmit(0x0d);

     USART_Transmit(0x0a);



  ledcheck();

   

   while(1)

   {

    if(UCSRA&(1<<RXC))

    {

    USART_Receivestring();

        for (i=0;i<=4;i++)

         {

          USART_Transmit(retmp);

     }

        cmd =decode(retmp[1])*10+decode(retmp[2]);

        data=decode(retmp[3])*10+decode(retmp[4]);

        switch (retmp[0])

         {

          case '0':SPI_Writechar(cmd,data);break;

          case '1':SPI_Writechar1(cmd,data);break;

          case '2':SPI_Writechar2(cmd,data);break;

          case '3':spireset();ledtest();delay_ms(1000);spireset();break;

         }

        //SPI_Writechar1(0xe0,0x01); //xiao shu dian

        //SPI_Writechar2(0xe0,0x01); //xiao shu dian

        SPI_Writechar2(0x88,0xe0); //no enough number flash

    }

   }

}

出0入0汤圆

发表于 2007-7-22 15:21:57 | 显示全部楼层
为什么不用LCD显示呢?

出0入0汤圆

发表于 2007-7-22 16:25:13 | 显示全部楼层
不对,项一下。学习中。

出0入0汤圆

 楼主| 发表于 2007-7-22 16:55:19 | 显示全部楼层
回WORK——FIND,这个实验板是做实验用的,真正提供到客户手里的是12寸或者更大的LED管,液晶没这么大的尺寸,而且成本也大。

出0入0汤圆

 楼主| 发表于 2007-7-23 07:54:31 | 显示全部楼层
self顶!!!

出0入0汤圆

发表于 2007-7-23 08:45:57 | 显示全部楼层
jh

出0入0汤圆

 楼主| 发表于 2007-7-23 08:56:29 | 显示全部楼层
JH???



WHAT MEANS?

出0入42汤圆

发表于 2007-7-23 09:44:27 | 显示全部楼层
我没看清还是咋地

为啥数码管的小数点没有亮,775%?

出0入0汤圆

 楼主| 发表于 2007-7-23 13:45:25 | 显示全部楼层
小数点故意没有点亮而已啊,需要点亮时输入小数就可以了。

出0入0汤圆

发表于 2007-7-23 13:58:21 | 显示全部楼层
串口接收是查询方式吗

改成中断方式吧

出0入0汤圆

 楼主| 发表于 2007-7-23 14:38:12 | 显示全部楼层
想改呢,可是不知道怎么改,ILYMY能够给点提示,感谢!

出0入0汤圆

 楼主| 发表于 2007-7-23 18:02:58 | 显示全部楼层
self顶!!!

出0入0汤圆

发表于 2007-7-24 12:03:28 | 显示全部楼层
这个,很多的例程吧

基本思路就是在中断里把收到的数存起来,并做一些判断,然后用一个标志位通知主程序

主程序里不断的查询这个标志位,符合条件的时候作相应的处理

出0入0汤圆

 楼主| 发表于 2007-7-25 19:08:17 | 显示全部楼层
感谢ILYMY,我试试看,刚学AVR,很多地方不清楚。

出0入0汤圆

 楼主| 发表于 2007-11-5 19:48:21 | 显示全部楼层
谁要这个板子,打算送人了.....

出0入0汤圆

发表于 2007-11-6 11:16:44 | 显示全部楼层
xuhengjun 恒创精机:
    才学AVR能搞个这个东东也不错了!

出0入0汤圆

发表于 2007-11-6 11:51:48 | 显示全部楼层
你这个东西干什么用的啊!电路挺简单的,不错!

出0入0汤圆

 楼主| 发表于 2007-11-6 21:40:50 | 显示全部楼层
sunli_suzhou

再读书的时候就特想学习单片机但是一直没有耐心学下去,现在工作的需要,最重要的是发现OURAVR这个好的平台,多交流交流就可以了,感谢OURAVR,感谢ARMOK,还要感谢活跃在论坛里的兄弟姐妹们,

出0入0汤圆

发表于 2007-11-7 10:08:09 | 显示全部楼层
楼主太牛啦,居然这么大个错别字“予定”应该为“预定”吧~~?

出0入0汤圆

发表于 2007-11-8 09:59:58 | 显示全部楼层
小日本经常写错别字的。

出0入0汤圆

 楼主| 发表于 2007-11-8 21:21:18 | 显示全部楼层
yerdak 大戈:
小日本经常写错别字的。

什么意思,有话想说就直接说,别藏着掖着的.

出0入0汤圆

发表于 2007-11-10 11:09:07 | 显示全部楼层
楼上

我的意思是指这个板子有可能在日资工厂里使用。

予定 应该是日语的写法,不知我的猜测是否正确。

出0入0汤圆

发表于 2007-11-14 16:01:32 | 显示全部楼层
有个疑问,通过PC串口发送数据的时候MCU只能接受10个字节,要接受更多的字节,大家有什么好的办法吗?
怎么没有人给楼主要个回答呢?

出0入0汤圆

发表于 2008-6-10 11:54:21 | 显示全部楼层
楼主~有事想请教~有什么方便的联系方式嘛哈哈。例如QQ?

出0入0汤圆

发表于 2008-6-10 13:13:22 | 显示全部楼层
ZLG7289B多少钱一只?
考虑成本吗?我觉得太贵了。

出0入0汤圆

发表于 2008-6-10 17:37:21 | 显示全部楼层
不错。。。。挺好看的

出0入0汤圆

发表于 2008-6-10 18:36:53 | 显示全部楼层
m

出0入0汤圆

发表于 2008-6-11 12:08:35 | 显示全部楼层
串口用队列方式进行缓冲就可以了.

出0入0汤圆

发表于 2008-6-11 15:08:51 | 显示全部楼层
串口列队....

好高深啊。

出0入0汤圆

发表于 2008-6-13 10:08:03 | 显示全部楼层
用更大的数码管的话,72XX这个芯片能驱动器来吗?

出0入0汤圆

 楼主| 发表于 2008-6-13 13:17:14 | 显示全部楼层
【29楼】 armandusb


可以,大的管子不可直接驱动,要加放大(三极管,光藕)

出0入0汤圆

发表于 2008-6-13 13:51:08 | 显示全部楼层
哇,竟然有这好东东,我现在要显示108个管,不知道直接按照你的这样扩展行不行?对了,ZLG7289B多少钱一片?

出0入0汤圆

 楼主| 发表于 2008-8-14 17:12:59 | 显示全部楼层
可以直接扩展的,而且很简单哦,大概10块钱不到吧,不知道,直接找南京办事处要了十片。

出0入0汤圆

发表于 2008-8-15 07:59:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-8-15 08:49:55 | 显示全部楼层
本来想用楼主的方式扩展的,但觉得成本还是太高,现在用595静态显示效果还不错,而且程序简单多了。呵呵

出0入0汤圆

发表于 2008-8-15 10:58:42 | 显示全部楼层
顶下  强

出0入0汤圆

发表于 2008-8-15 11:09:20 | 显示全部楼层
有个疑问,通过PC串口发送数据的时候MCU只能接受10个字节,要接受更多的字节,大家有什么好的办法吗?
怎么没有人给楼主要个回答呢?

发送之前先握手。 发送XON XOFF。发送过程主机中收到XOFF停止发送止到再次收到XON

楼主,板子送给我吧;)我帮你改。
头像被屏蔽

出0入0汤圆

发表于 2008-8-15 13:18:09 | 显示全部楼层

(原文件名:0808131644011.JPG)


(原文件名:0808131644334.JPG)


(原文件名:0808131644557.JPG)


(原文件名:0808131644577.JPG)


(原文件名:0808131644810.JPG)

这是用我家IC做的显示板,跟楼主一样,也是跟PC-232通信的,所用IC跟ZLG差不多,但是便宜多了

出0入0汤圆

发表于 2008-8-15 13:26:51 | 显示全部楼层
请教:用7289驱动LED显示器时有闪烁,怎么解决???
头像被屏蔽

出0入0汤圆

发表于 2008-8-15 13:30:02 | 显示全部楼层

(原文件名:sub-display.jpg)


(原文件名:maindisp.jpg)

点击此处下载 ourdev_379772.pdf(文件大小:90K) (原文件名:maindisp.pdf)
点击此处下载 ourdev_379773.pdf(文件大小:47K) (原文件名:sub-display.pdf)

附上原理图
头像被屏蔽

出0入0汤圆

发表于 2008-8-15 13:33:28 | 显示全部楼层
我不用7289,所以没有闪烁,是用我们自己生产的数码管驱动IC的,驱动16个数码管的IC,价格3块以下,便宜吧,要样品的跟我联系.0755-86156585
头像被屏蔽

出0入0汤圆

发表于 2008-8-15 13:38:49 | 显示全部楼层
注释下我上的图:
1,为什么加电阻?
答:因为一个驱动IC要驱动有红色/蓝色两种的数码管,为了使亮度保持一致所以在红色那边加了一些限流电阻,因为红色-蓝色两种LED的工作电压是不一样的
2,为什么要一些三极管?
答:是为了扩压的,因为驱动的数码管很大(一段里面有多个LED串联),大概高度有100mm左右,驱动IC电压不够,所以外扩.

欢迎技术交流:
QQ":308953176

出0入0汤圆

发表于 2008-8-15 13:39:03 | 显示全部楼层
串口传输为什么只能有10字节?
这个规则是自己程序定的,没啥明显限制啊

出0入0汤圆

发表于 2009-11-23 23:40:42 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-1-16 18:02:18 | 显示全部楼层
回复【27楼】hanlin 韩林
-----------------------------------------------------------------------
我靠 你08年就会这东西了啊 我09年才知道

出0入0汤圆

发表于 2011-1-16 20:16:06 | 显示全部楼层
太难看了

出0入0汤圆

发表于 2012-10-16 08:49:26 | 显示全部楼层
手上正巧有二片,抽时间应用一下,谢绝楼主!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 05:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表