⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 256[1].c

📁 LPD6803驱动LED变化AVR编写C语言的256级灰度程序,
💻 C
字号:
 #include <iom8v.h>
 #include <macros.h>
 #define BYTE unsigned char
 #define DATA 0x20
 #define SCLK 0x40
 #define MAXSIZE 192
 #define REFRESH 0x55
//#pragma interrupt_handler UART_RX_interrupt:12

 unsigned int SendDataCount,Fcount;
 BYTE Dhead;
 BYTE buf_data[384];
 BYTE buf_data1[384];
//BYTE buf_data2[MAXSIZE];
BYTE datarev=0,display,getaddr,datalen,*dp,buf_offset,checkmark=0;
BYTE m_DataSP,changebuf=0;
BYTE Gbuffer,Sendsign,*DataSP,ope;
void UART_interrupt(void);
void jump(BYTE ,BYTE ,BYTE );
 void port_init(void)
 {
  PORTB = 0xff;
  DDRB  = 0xFF;
 PORTC = 0x7F; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0xFF;	
}


//TIMER0 initialisation - prescale:8
// WGM: Normal
// desired value: 54687.5Hz
// actual value: 54687.500Hz (0.0%)
void timer0_init(void)
{
 TCCR0 = 0x00; //stop
 TCNT0 = 0xef; //set count
//TCCR0 = 0x02; //start timer
}

//SPI initialisation
// clock rate: 2000000hz
void spi_init(void)
{
 SPCR = 0x51; //setup SPI
 SPSR = 0x00; //setup SPI
}

void spidisplay(BYTE *disp)
{int i,dlen;
BYTE j[5];
dlen=MAXSIZE*4/3;

SPDR=0x00;
while(!(SPSR&0x80));

   j[0]=j[1];
	j[1]=j[2];
	j[2]=j[0];
	j[0]=j[1];
	j[1]=j[2];
	j[0]=j[1];
	j[1]=j[2];
	j[2]=j[0];
	j[0]=j[1];
	j[1]=j[2];
	
	SPDR=0X00;
while(!(SPSR&0x80));
for(i=0;i<dlen;i++)
	{
	j[0]=*disp++;
	j[1]=*disp++;
	j[2]=*disp++;
	//=*(disp+3);
	
	
	j[3]=0x80|(j[0]&0xf0)>>1|((j[0]&0x0f)>>2);
	
	//UDR=j[3];
	SPDR=j[3];
    while(!(SPSR&0x80));
	j[3]=((j[0]&0x0f)<<6)|((j[1]&0xf0)>>3);
	
	SPDR=j[3];
	while(!(SPSR&0x80));
	j[3]=0x80|((j[1]&0x0f)<<3)|((j[2]&0xf0)>>6);
	
	SPDR=j[3];
	while(!(SPSR&0x80));
	j[3]=((j[2]&0xF0)<<2)|((j[2]&0x0f)<<1);
	
	SPDR=j[3];
	while(!(SPSR&0x80));
	//disp=disp+3;
	}
for(i=0;i<128;i++)
	{
	j[0]=j[1];
	j[1]=j[2];
	j[2]=j[0];
	j[0]=j[1];
	j[1]=j[2];
	
	SPDR=0x00;
	while(!(SPSR&0x80));
	
	}
}


//get addr
BYTE getaddrin(viod)
{  BYTE i;
 DDRC  = 0x3F;
 PORTC = 0xFF;
 DDRC  = 0x00;
 i=PINC;
 if(i==0x1f)return(i);
 i=i&0x0f;
 i=(i<<4)+(15-i);
 
 //i=i|0xf0;
 return(i);	
}


 void Gdisplay(BYTE *disp)
{BYTE mask,i;
int j,cou;
cou=MAXSIZE*4/3;

for(j=0;j<32;j++)
{  PORTD &= ~DATA;
   PORTD &= ~SCLK;
   PORTD |= SCLK;
}
for(j=0;j<cou;j++)
{
  mask=0x80;
   PORTD |= DATA;
	
   PORTD &= ~SCLK;
	
   PORTD |= SCLK;

  for(i=0;i<4;i++)
    {  
     if(((*disp)&mask)==0)
       PORTD &= ~DATA;
     else
       PORTD |=DATA;
     PORTD &= ~SCLK;
     PORTD |= SCLK;
      mask=mask>>1;
	  }
  PORTD &= ~DATA;
  PORTD &= ~SCLK;
  PORTD |= SCLK;
  for(i=0;i<4;i++)
  {
     if(((*disp)&mask)==0)
       PORTD &= ~DATA;
     else
      PORTD |=DATA;
      PORTD &= ~SCLK;
      PORTD |= SCLK;
       mask=mask>>1;
	  }
   PORTD &= ~DATA;
   PORTD &= ~SCLK;
   PORTD |= SCLK;
   disp++;
 mask=0x80;
  for(i=0;i<4;i++)
    {
     if(((*disp)&mask)==0)
       PORTD &= ~DATA;
     else
     PORTD |=DATA;	
     PORTD &= ~SCLK;
     PORTD |= SCLK;
     mask=mask>>1;
	  }
  PORTD &= ~DATA;
  PORTD &= ~SCLK;	
  PORTD |= SCLK;
  _NOP();
  PORTD |= DATA;
   PORTD &= ~SCLK;
   PORTD |= SCLK;
	
  for(i=0;i<4;i++)
  {
     if(((*disp)&mask)==0)
     PORTD &= ~DATA;
     else
      PORTD |=DATA;
      PORTD &= ~SCLK;
      PORTD |= SCLK;
        mask=mask>>1;
	  }
   PORTD &= ~DATA;
   PORTD &= ~SCLK;
   PORTD |= SCLK;
  mask=0x80;
	
  disp++;
	
  for(i=0;i<4;i++)
    {
     if(((*disp)&mask)==0)
     PORTD &= ~DATA;
     else
     PORTD |=DATA;
     PORTD &= ~SCLK;
     PORTD |= SCLK;
     mask=mask>>1;
	  }
  PORTD &= ~DATA;
  PORTD &= ~SCLK;
  PORTD |= SCLK;
	
  for(i=0;i<4;i++)
  {
     if(((*disp)&mask)==0)
       PORTD &= ~DATA;
     else
       PORTD |=DATA;
      PORTD &= ~SCLK;
      PORTD |= SCLK;
     mask=mask>>1;}
   PORTD &= ~DATA;
   PORTD &= ~SCLK;
   PORTD |= SCLK;
  
  disp++;
  }
  
for(j=0;j<384;j++)
	
{  PORTD |= DATA;
   PORTD &= ~SCLK;
   PORTD |= SCLK;
}
//*disp
//*disp
}


//call this routine to initialise all peripherals
 void init_devices(void)
{
 //stop errant interrupts until set up
 CLI();//disable all interrupts
 port_init();

  timer0_init();
 spi_init();
 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x01; //timer interrupt sources
 SEI();//re-enable interrupts

 //all peripherals are now initialised
}

void delay(void)
{unsigned long i;
	
 for(i=0;i<500;i++);
	
}
void delayl()
{unsigned long i;
	
 for(i=0;i<120000;i++);
	
}
void Dstart()
 {SendDataCount=256;      //scan BYTE count
  DataSP=buf_data;     //BYTEs ints point
  Dhead=2;                //0xffff 
  display=1;              //start display
  //TCCR0 = 0x02;
}

         
//
 void main(void)
{int i,j;	
 BYTE *buf,*buf1,cb;
 init_devices();


  UDR = 0x55;
  SendDataCount=256;
  DataSP=buf_data;
  Dhead=2;
  TCCR0 = 0x02;
  while(1)
 {
 begin:
 for(j=0;j<246;j++)
 {if(changebuf)
    buf=buf_data1;
 else
	buf=buf_data;//
 for(i=0;i<128;i++)
	
 {*buf++=j;
 *buf++=0;
 *buf++=0;
 }
  while(checkmark<10);
  checkmark=0;
  changebuf=~changebuf;

  } 
  
 changebuf=~changebuf;


 
 for(j=0;j<247;j++)
 {if(changebuf)
    buf=buf_data1;
 else
	buf=buf_data;//
 for(i=0;i<128;i++)
	
 {*buf++=246;
 *buf++=j;
 *buf++=0;
 }
  while(checkmark<10);
  checkmark=0;
  changebuf=~changebuf;
  } //timer0 dev8 start
  
   for(j=0;j<247;j++)
 {if(changebuf)
    buf=buf_data1;
 else
	buf=buf_data;//
 for(i=0;i<128;i++)
	
 {*buf++=246-j;
 *buf++=246;
 *buf++=0;
 }
  while(checkmark<10);
  checkmark=0;
  changebuf=~changebuf;
  } 
  
   for(j=0;j<247;j++)
 {if(changebuf)
    buf=buf_data1;
 else
	buf=buf_data;//
 for(i=0;i<128;i++)
	
 {*buf++=0;
 *buf++=246;
 *buf++=j;
 }
  while(checkmark<10);
  checkmark=0;
  changebuf=~changebuf;
  } 
  
  
    for(j=0;j<247;j++)
 {if(changebuf)
    buf=buf_data1;
 else
	buf=buf_data;//
 for(i=0;i<128;i++)
	
 {*buf++=0;
 *buf++=246-j;
 *buf++=246;
 }
  while(checkmark<10);
  checkmark=0;
  changebuf=~changebuf;
  } 
  
      for(j=0;j<247;j++)
 {if(changebuf)
    buf=buf_data1;
 else
	buf=buf_data;//
 for(i=0;i<128;i++)
	
 {*buf++=0;
 *buf++=0;
 *buf++=246-j;
 }
  while(checkmark<10);
  checkmark=0;
  changebuf=~changebuf;
  } 
goto begin; 

}
}






 //uart has received a character in UDR
}


#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{ 
 TCNT0 = 0xee; //reload counter value
 SPDR=Gbuffer; 
 //Sendsign=1;
 
 //if(SPSR&0x80)UDR = 0x55;


 if(Dhead)
{Gbuffer=0x00;
ope=0;
Dhead--;
 return;} 

 if(SendDataCount--)
 {
 switch(ope++)
 { case 0:if(display<(*DataSP&0x07))
		 m_DataSP=(*DataSP)+8;
		 else
		 m_DataSP=*DataSP; 
		 Gbuffer=0x80|(m_DataSP&0xf8)>>1;
         
          DataSP++;
		  if(display<(*DataSP&0x07))
		   m_DataSP=(*DataSP)+8; 
		   else
		  m_DataSP=*DataSP;
         Gbuffer=Gbuffer|((m_DataSP&0xc0)>>6);
		  
		 
		 break;
   case 1:Gbuffer=(m_DataSP&0x38)<<2;
          DataSP++;
		  if(display<(*DataSP&0x07))
		   m_DataSP=(*DataSP)+8; 
		     else
		   m_DataSP=*DataSP;
		  Gbuffer=Gbuffer|((m_DataSP&0xf8)>>3);
		   
		  DataSP++;
		  ope=0;
		  break;
		  
   default:break;
 }
 
 }
 
else
 {
 if(display<2)
  display=7;
 else
  display=display-2;
// else
// display=display-1;
 
 SendDataCount=256;
 Dhead=1;
 Gbuffer=0x00;

 if(changebuf)
  DataSP=buf_data1;
 else
 DataSP=buf_data;
 checkmark++;
 }
 
 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -