|
完整电子显示板硬件+程序+实物照片,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
}
}
} |
|