Hjoan 发表于 2007-7-22 15:11:34

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

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

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

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

点击此处打开armok01162977.PDF

http://cache.amobbs.com/bbs_upload782111/files_7/armok01162978.JPG



《PRO》

#include   "iom16v.h"

#include   "macros.h"

#define   set_ss()   PORTB |= 0b00000001

#define   set_ss1()PORTB |= 0b00010000

#define   set_ss2()PORTB |= 0b00001000

#defineset_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

#defineclr_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;



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=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);

    }

   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)*10+decode(retmp);

        data=decode(retmp)*10+decode(retmp);

        switch (retmp)

       {

          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

    }

   }

}

work_find 发表于 2007-7-22 15:21:57

为什么不用LCD显示呢?

wangyg 发表于 2007-7-22 16:25:13

不对,项一下。学习中。

Hjoan 发表于 2007-7-22 16:55:19

回WORK——FIND,这个实验板是做实验用的,真正提供到客户手里的是12寸或者更大的LED管,液晶没这么大的尺寸,而且成本也大。

Hjoan 发表于 2007-7-23 07:54:31

self顶!!!

wxfhw 发表于 2007-7-23 08:45:57

jh

Hjoan 发表于 2007-7-23 08:56:29

JH???



WHAT MEANS?

nsza 发表于 2007-7-23 09:44:27

我没看清还是咋地

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

Hjoan 发表于 2007-7-23 13:45:25

小数点故意没有点亮而已啊,需要点亮时输入小数就可以了。

ilymy 发表于 2007-7-23 13:58:21

串口接收是查询方式吗

改成中断方式吧

Hjoan 发表于 2007-7-23 14:38:12

想改呢,可是不知道怎么改,ILYMY能够给点提示,感谢!

Hjoan 发表于 2007-7-23 18:02:58

self顶!!!

ilymy 发表于 2007-7-24 12:03:28

这个,很多的例程吧

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

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

Hjoan 发表于 2007-7-25 19:08:17

感谢ILYMY,我试试看,刚学AVR,很多地方不清楚。

Hjoan 发表于 2007-11-5 19:48:21

谁要这个板子,打算送人了.....

sunli_suzhou 发表于 2007-11-6 11:16:44

xuhengjun 恒创精机:
    才学AVR能搞个这个东东也不错了!

LQH32316812 发表于 2007-11-6 11:51:48

你这个东西干什么用的啊!电路挺简单的,不错!

Hjoan 发表于 2007-11-6 21:40:50

sunli_suzhou

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

slamkk 发表于 2007-11-7 10:08:09

楼主太牛啦,居然这么大个错别字“予定”应该为“预定”吧~~?

yerdak 发表于 2007-11-8 09:59:58

小日本经常写错别字的。

Hjoan 发表于 2007-11-8 21:21:18

yerdak 大戈:
小日本经常写错别字的。

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

yerdak 发表于 2007-11-10 11:09:07

楼上

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

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

lilei0902 发表于 2007-11-14 16:01:32

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

pollycat 发表于 2008-6-10 11:54:21

楼主~有事想请教~有什么方便的联系方式嘛哈哈。例如QQ?

hanxinfh2 发表于 2008-6-10 13:13:22

ZLG7289B多少钱一只?
考虑成本吗?我觉得太贵了。

ba1731 发表于 2008-6-10 17:37:21

不错。。。。挺好看的

lionliu 发表于 2008-6-10 18:36:53

m

hanlin 发表于 2008-6-11 12:08:35

串口用队列方式进行缓冲就可以了.

starli 发表于 2008-6-11 15:08:51

串口列队....

好高深啊。

armandusb 发表于 2008-6-13 10:08:03

用更大的数码管的话,72XX这个芯片能驱动器来吗?

Hjoan 发表于 2008-6-13 13:17:14

【29楼】 armandusb


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

stevenlu 发表于 2008-6-13 13:51:08

哇,竟然有这好东东,我现在要显示108个管,不知道直接按照你的这样扩展行不行?对了,ZLG7289B多少钱一片?

Hjoan 发表于 2008-8-14 17:12:59

可以直接扩展的,而且很简单哦,大概10块钱不到吧,不知道,直接找南京办事处要了十片。

avr_appli 发表于 2008-8-15 07:59:46

mark

stevenlu 发表于 2008-8-15 08:49:55

本来想用楼主的方式扩展的,但觉得成本还是太高,现在用595静态显示效果还不错,而且程序简单多了。呵呵

Forever.c 发表于 2008-8-15 10:58:42

顶下强

new.ease 发表于 2008-8-15 11:09:20

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

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

楼主,板子送给我吧;)我帮你改。

microcheng 发表于 2008-8-15 13:18:09

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_379752.JPG
(原文件名:0808131644011.JPG)

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_379753.JPG
(原文件名:0808131644334.JPG)

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_379754.JPG
(原文件名:0808131644557.JPG)

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_379755.JPG
(原文件名:0808131644577.JPG)

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_379756.JPG
(原文件名:0808131644810.JPG)

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

dory 发表于 2008-8-15 13:26:51

请教:用7289驱动LED显示器时有闪烁,怎么解决???

microcheng 发表于 2008-8-15 13:30:02

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_379770.jpg
(原文件名:sub-display.jpg)

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_379771.jpg
(原文件名:maindisp.jpg)

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

附上原理图

microcheng 发表于 2008-8-15 13:33:28

我不用7289,所以没有闪烁,是用我们自己生产的数码管驱动IC的,驱动16个数码管的IC,价格3块以下,便宜吧,要样品的跟我联系.0755-86156585

microcheng 发表于 2008-8-15 13:38:49

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

欢迎技术交流:
QQ":308953176

feng_matrix 发表于 2008-8-15 13:39:03

串口传输为什么只能有10字节?
这个规则是自己程序定的,没啥明显限制啊

ju748 发表于 2009-11-23 23:40:42

标记

yanbin2112 发表于 2011-1-16 18:02:18

回复【27楼】hanlin 韩林
-----------------------------------------------------------------------
我靠 你08年就会这东西了啊 我09年才知道

zlj2008 发表于 2011-1-16 20:16:06

太难看了

ddcchh 发表于 2012-10-16 08:49:26

手上正巧有二片,抽时间应用一下,谢绝楼主!
页: [1]
查看完整版本: 完整电子显示板硬件+程序+实物照片,MEGA16+ZLG7289B驱动24个数码管,数据通过外部RS232