完整电子显示板硬件+程序+实物照片,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
}
}
} 为什么不用LCD显示呢? 不对,项一下。学习中。 回WORK——FIND,这个实验板是做实验用的,真正提供到客户手里的是12寸或者更大的LED管,液晶没这么大的尺寸,而且成本也大。 self顶!!! jh JH???
WHAT MEANS? 我没看清还是咋地
为啥数码管的小数点没有亮,775%? 小数点故意没有点亮而已啊,需要点亮时输入小数就可以了。 串口接收是查询方式吗
改成中断方式吧 想改呢,可是不知道怎么改,ILYMY能够给点提示,感谢! self顶!!! 这个,很多的例程吧
基本思路就是在中断里把收到的数存起来,并做一些判断,然后用一个标志位通知主程序
主程序里不断的查询这个标志位,符合条件的时候作相应的处理 感谢ILYMY,我试试看,刚学AVR,很多地方不清楚。 谁要这个板子,打算送人了..... xuhengjun 恒创精机:
才学AVR能搞个这个东东也不错了! 你这个东西干什么用的啊!电路挺简单的,不错! sunli_suzhou
再读书的时候就特想学习单片机但是一直没有耐心学下去,现在工作的需要,最重要的是发现OURAVR这个好的平台,多交流交流就可以了,感谢OURAVR,感谢ARMOK,还要感谢活跃在论坛里的兄弟姐妹们, 楼主太牛啦,居然这么大个错别字“予定”应该为“预定”吧~~? 小日本经常写错别字的。 yerdak 大戈:
小日本经常写错别字的。
什么意思,有话想说就直接说,别藏着掖着的. 楼上
我的意思是指这个板子有可能在日资工厂里使用。
予定 应该是日语的写法,不知我的猜测是否正确。 有个疑问,通过PC串口发送数据的时候MCU只能接受10个字节,要接受更多的字节,大家有什么好的办法吗?
怎么没有人给楼主要个回答呢? 楼主~有事想请教~有什么方便的联系方式嘛哈哈。例如QQ? ZLG7289B多少钱一只?
考虑成本吗?我觉得太贵了。 不错。。。。挺好看的 m 串口用队列方式进行缓冲就可以了. 串口列队....
好高深啊。 用更大的数码管的话,72XX这个芯片能驱动器来吗? 【29楼】 armandusb
可以,大的管子不可直接驱动,要加放大(三极管,光藕) 哇,竟然有这好东东,我现在要显示108个管,不知道直接按照你的这样扩展行不行?对了,ZLG7289B多少钱一片? 可以直接扩展的,而且很简单哦,大概10块钱不到吧,不知道,直接找南京办事处要了十片。 mark 本来想用楼主的方式扩展的,但觉得成本还是太高,现在用595静态显示效果还不错,而且程序简单多了。呵呵 顶下强 有个疑问,通过PC串口发送数据的时候MCU只能接受10个字节,要接受更多的字节,大家有什么好的办法吗?
怎么没有人给楼主要个回答呢?
发送之前先握手。 发送XON XOFF。发送过程主机中收到XOFF停止发送止到再次收到XON
楼主,板子送给我吧;)我帮你改。 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差不多,但是便宜多了 请教:用7289驱动LED显示器时有闪烁,怎么解决??? 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)
附上原理图 我不用7289,所以没有闪烁,是用我们自己生产的数码管驱动IC的,驱动16个数码管的IC,价格3块以下,便宜吧,要样品的跟我联系.0755-86156585 注释下我上的图:
1,为什么加电阻?
答:因为一个驱动IC要驱动有红色/蓝色两种的数码管,为了使亮度保持一致所以在红色那边加了一些限流电阻,因为红色-蓝色两种LED的工作电压是不一样的
2,为什么要一些三极管?
答:是为了扩压的,因为驱动的数码管很大(一段里面有多个LED串联),大概高度有100mm左右,驱动IC电压不够,所以外扩.
欢迎技术交流:
QQ":308953176 串口传输为什么只能有10字节?
这个规则是自己程序定的,没啥明显限制啊 标记 回复【27楼】hanlin 韩林
-----------------------------------------------------------------------
我靠 你08年就会这东西了啊 我09年才知道 太难看了 手上正巧有二片,抽时间应用一下,谢绝楼主!
页:
[1]