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

📄 hulandengm16.c

📁 这是带四乘四按键的程序,带LCD显示,可以控制灯饰单色,七彩变化,调光的程序,用AVRM16写的程序
💻 C
📖 第 1 页 / 共 4 页
字号:
  if(((PIND&0X10)==0)||((PIND&0X08)==0)||((PIND&0X04)==0)||((PINB&0X01)==0)||((PINB&0X40)==0))
   {
    Delay(2);
  if(((PIND&0X10)==0)||((PIND&0X08)==0)||((PIND&0X04)==0)||((PINB&0X01)==0)||((PINB&0X40)==0))
	 {
	  if((PIND&0X08)==0)
		 {
          ankey=3;
		 }
	  if((PIND&0X10)==0)
	    {
          ankey=4;
		}
		 
	  if((PIND&0X04)==0)
	    {
          ankey=2;
		}
	  if((PINB&0X01)==0)
	    {
		  ankey=1;
		}
	  if((PINB&0X40)==0)
	    {
		  ankey=5;
		}
	   key_transact(ankey);
	  }
	 do 
	  {
	   disp_update();
	   zhongduan_set();
	  }
	 while(((PIND&0X04)==0)||((PIND&0X08)==0)||((PIND&0X10)==0)||((PINB&0X01)==0)||((PINB&0X40)==0));
	 
    }
 }


void send_data(unsigned char temp_data)
 {
  volatile unsigned char red_temp,green_temp,blue_temp,i;
  switch(color)
    {
	 case 1: red_temp=temp_data; green_temp=shield_data; blue_temp=shield_data;           break;
	 case 2: red_temp=shield_data; green_temp=temp_data; blue_temp=shield_data;           break;
	 case 3: red_temp=shield_data; green_temp=shield_data; blue_temp=temp_data;           break;
	 case 4: red_temp=temp_data; green_temp=temp_data; blue_temp=shield_data;             break;
	 case 5: red_temp=shield_data; green_temp=temp_data; blue_temp=temp_data;             break;
	 case 6: red_temp=temp_data; green_temp=shield_data; blue_temp=temp_data;             break;
	 case 7: red_temp=temp_data; green_temp=temp_data; blue_temp=temp_data;               break;
	}
  for(i=0;i<8;i++)
   {
    if((red_temp&0x01)==1)
	  {
	   SBI_R;
	  }
	else
	  {
	   CBI_R;
	  }
	  
	if((green_temp&0x01)==1)
	  {
	   SBI_G;
	  }
	else
	  {
	   CBI_G;
	  }
	  
	if((blue_temp&0x01)==1)
	  {
	   SBI_B;
	  }
	else
	  {
	   CBI_B;
	  }
	  
	SBI_SCK;
	red_temp>>=1;
	green_temp>>=1;
	CBI_SCK;
    blue_temp>>=1;

  }
}

void send_data_msb(unsigned char temp_data)
 {
  volatile unsigned char red_temp,green_temp,blue_temp,i;
  switch(color)
    {
	 case 1: red_temp=temp_data; green_temp=shield_data; blue_temp=shield_data;           break;
	 case 2: red_temp=shield_data; green_temp=temp_data; blue_temp=shield_data;           break;
	 case 3: red_temp=shield_data; green_temp=shield_data; blue_temp=temp_data;           break;
	 case 4: red_temp=temp_data; green_temp=temp_data; blue_temp=shield_data;             break;
	 case 5: red_temp=shield_data; green_temp=temp_data; blue_temp=temp_data;             break;
	 case 6: red_temp=temp_data; green_temp=shield_data; blue_temp=temp_data;             break;
	 case 7: red_temp=temp_data; green_temp=temp_data; blue_temp=temp_data;               break;
	}
  for(i=0;i<8;i++)
   {
    if((blue_temp&0x80)==0x80)
	  {
	   SBI_B;
	  }
	else
	  {
	   CBI_B;
	  }
	if((green_temp&0x80)==0x80)
	  {
	   SBI_G;
	  }
	else
	  {
	   CBI_G;
	  }
	 
    if((red_temp&0x80)==0x80)
	  {
	   SBI_R;
	  }
	else
	  {
	   CBI_R;
	  } 
	SBI_SCK;
	red_temp<<=1;
	green_temp<<=1;
	CBI_SCK;
    blue_temp<<=1;

  }
}

void send_pels(unsigned char temp)
 {
  unsigned char temp_data,i;
  switch(temp)
   {
    case 1:temp_data=0x3f; break;
	
	case 2:temp_data=0x5f; break;
	
	case 3:temp_data=0x9f; break;
	
	case 4:temp_data=0x7f; break;
	
	case 5:temp_data=0xdf; break;
	
	case 6:temp_data=0xbf; break;
	
	case 7:temp_data=0xff; break;
	
	case 8:temp_data=0x00; break;
   }
   
  for(i=0;i<3;i++)
   {
    if((temp_data&0x80)==0x80)
     {
      SBI_DATA;
     }
    else 
     {
      CBI_DATA;
     }
	SBI_SCK;
	temp_data<<=1;
	CBI_SCK;
   }
 }


void abc(unsigned char h)
 {
  switch(h)
   {
    case 0: CBI_CC;CBI_BB;CBI_AA;  break;   //0000
	
	case 1: CBI_CC;CBI_BB;SBI_AA;  break;   //0001

	case 2: CBI_CC;SBI_BB;CBI_AA;  break;   //0010
	
	case 3: CBI_CC;SBI_BB;SBI_AA;  break;   //0011
	
	case 4: SBI_CC;CBI_BB;CBI_AA;  break;   //0100
	
	case 5: SBI_CC;CBI_BB;SBI_AA;  break;   //0101
	
	case 6: SBI_CC;SBI_BB;CBI_AA;  break;   //0110
	
	case 7: SBI_CC;SBI_BB;SBI_AA;  break;   //0111
   }
 }


void Port_init(void)
 {
  DDRC=0xff;
  DDRA=0xff;
  DDRB&=~(1<<6);     //SW5 按键4,取消/返回  右键
  PORTB|=(1<<6);     //SW5 使能上拉电阻
  DDRD&=~(1<<4);     //SW4 按键4,快捷改变颜色
  PORTD|=(1<<4);     //SW4 使能上拉电阻
  DDRD&=~(1<<3);     //SW3 按键3,快捷改变模式
  PORTD|=(1<<3);     //SW3 使能上拉电阻
  DDRD&=~(1<<2);     //SW2 按键2,快捷改变型号
  PORTD|=(1<<2);     //SW2 使能上拉电阻
  DDRB&=~(1<<0);     //SW1 按键2,快捷改变型号
  PORTB|=(1<<0);     //SW1 使能上拉电阻
  DDRD|=(1<<7);      //R 
  DDRD|=(1<<6);      //B
  DDRD|=(1<<5);      //G
  DDRB|=(1<<7);      //sck
  DDRC|=(1<<0);      //lat
  DDRC|=(1<<1);      //oe
  DDRB|=(1<<3);      //a
  DDRB|=(1<<2);      //b
  DDRB|=(1<<1);      //c
  DDRB|=(1<<5);      /*d  (暂用)*/
 }
 

void send_frame(void)
 {
  unsigned char k,j;
  for(k=0;k<disp_number;k++)
	{
	  for(j=0;j<16;j++)
	    {
	      send_pels(color);
	    }
    }		 
  SBI_LAT;
  SBI_LAT;
  CBI_LAT;
 } 
 
 
void time0_init(void)    //定时器0初始化
 {
  TCNT0=225;
  TCCR0=4;
  TIMSK|=(1<<TOIE0);
 } 
 
void time1_init(void)   //定时器1初始化
 {
  TCNT1L=0Xbd;
  TCNT1H=0xf0;
  TCCR1A=0;
  TCCR1B=5;
  TIMSK|=(1<<TOIE1);
 }
 
void time2_init(void)   //定时器1初始化
 {
  TCNT2=155;
  TCCR2=2;
  TIMSK|=(1<<TOIE2);
 }
 
 
SIGNAL(SIG_OVERFLOW2)   //定时器2溢出中断.用于控制亮度
 {
  if(temp_bright>0)
   {
    CBI_OE;
	temp_bright--;
   }
  else
   {
    SBI_OE;
   }
  if(time2_count>0)
   {
    time2_count--;
   }
  else 
   {
    time2_count=10;
	temp_bright=brightness;
   }
  TCNT2=205;
  } 
 
 
 SIGNAL(SIG_OVERFLOW0)   //定时器0中断  用于显示
 {
  unsigned char k,j;
  TIMSK&=~(1<<TOIE1);
  sei();
  switch(type)
   {
    case 0:
            if(hang<7)
             {
              hang++;
             }
            else
             {
              hang=0;
             }
            for(k=0;k<4;k++)
               {
	            send_data(disp_ram[hang*4+k]);
	            send_data_msb(disp_ram[hang*4+32+k]);
               }
			SBI_OE;
			SBI_LAT;
            abc(hang);
            CBI_LAT;
            TCNT0=247;
			CBI_OE;
			break;
			
	case 1:
              send_data((disp_ram[36]&0xf0)|(disp_ram[32]>>4));
			  send_data((disp_ram[44]&0xf0)|(disp_ram[40]>>4));
			  
			  send_data((disp_ram[36]<<4)|(disp_ram[32]&0x0f));
			  send_data((disp_ram[44]<<4)|(disp_ram[40]&0x0f));
			  
			  send_data((disp_ram[37]&0xf0)|(disp_ram[33]>>4));
			  send_data((disp_ram[45]&0xf0)|(disp_ram[41]>>4));
			  
			  send_data((disp_ram[37]<<4)|(disp_ram[33]&0x0f));
			  send_data((disp_ram[45]<<4)|(disp_ram[41]&0x0f)); //4
			  
			  
			  send_data((disp_ram[52]&0xf0)|(disp_ram[48]>>4));
			  send_data((disp_ram[60]&0xf0)|(disp_ram[56]>>4));
			  
			  send_data((disp_ram[52]<<4)|(disp_ram[48]&0x0f));
			  send_data((disp_ram[60]<<4)|(disp_ram[56]&0x0f));
			  
			  send_data((disp_ram[53]&0xf0)|(disp_ram[49]>>4));
			  send_data((disp_ram[61]&0xf0)|(disp_ram[57]>>4));
			  
			  send_data((disp_ram[53]<<4)|(disp_ram[49]&0x0f));
			  send_data((disp_ram[61]<<4)|(disp_ram[57]&0x0f)); //3
			  
			  
			  
			  send_data((disp_ram[4]&0xf0)|(disp_ram[0]>>4));
			  send_data((disp_ram[12]&0xf0)|(disp_ram[8]>>4));
			  
			  send_data((disp_ram[4]<<4)|(disp_ram[0]&0x0f));
			  send_data((disp_ram[12]<<4)|(disp_ram[8]&0x0f));
			  
			  send_data((disp_ram[5]&0xf0)|(disp_ram[1]>>4));
			  send_data((disp_ram[13]&0xf0)|(disp_ram[9]>>4));
			  
			  send_data((disp_ram[5]<<4)|(disp_ram[1]&0x0f));
			  send_data((disp_ram[13]<<4)|(disp_ram[9]&0x0f)); //2
			  
			 
			 
			  send_data((disp_ram[20]&0xf0)|(disp_ram[16]>>4));
			  send_data((disp_ram[28]&0xf0)|(disp_ram[24]>>4));
			  
			  send_data((disp_ram[20]<<4)|(disp_ram[16]&0x0f));
			  send_data((disp_ram[28]<<4)|(disp_ram[24]&0x0f));
			  
			  send_data((disp_ram[21]&0xf0)|(disp_ram[17]>>4));
			  send_data((disp_ram[29]&0xf0)|(disp_ram[25]>>4));
			  
			  SBI_OE;
			  send_data((disp_ram[21]<<4)|(disp_ram[17]&0x0f));
			  send_data((disp_ram[29]<<4)|(disp_ram[25]&0x0f)); //1
			  lat();
			  TCNT0=230;
			  CBI_OE;
			  break;
			
	case 2:  TCNT0=230;
			 break;
			 
	case 3: if(hang<15)
             {
              hang++;
             }
            else
             {
              hang=0;
             }
			for(j=0;j<2;j++)
			 {
              for(k=4;k>0;k--)
               {
	            send_data(~(disp_ram[hang*4+k-1]));
               }
			 }
			SBI_OE;
            SBI_LAT;
            abc(hang);
            CBI_LAT;
            TCNT0=247;
			CBI_OE;
			break;
			 
    }
  TIMSK|=(1<<TOIE1);
 }
 
 
SIGNAL(SIG_OVERFLOW1)     //定时器1  用于扫描更新数据
 {
  unsigned char i,j;
  union data_union
   { 
    unsigned int word; 
    unsigned char byte[2]; 
   }data; 
  sei();
  data.word=65535-(speed*781);
  if(type==2)
   {
    switch(mode)
	 {
	  case 0: send_frame();
	           CBI_OE;
	           TCNT1L=data.byte[0];
               TCNT1H=data.byte[1];
	           break;
	  
	  case 1: gray_scale++;
	           data.word=65535-(speed*30);
	           TCNT1L=data.byte[0];
               TCNT1H=data.byte[1];
	           break;
			   
	  case 2:  send_pels(color);
	            CBI_OE;
	           if(send_pels_count>disp_number*16)
			     {
				  if(color>=color_amount)
	               {
	                color=1;
	               }
	              else
	               {
	                color++;
	               }
				  send_pels_count=0;
				  if(disp_set==0)    //设置时屏蔽更新数据 以防显示错乱
				   {
				     update_color();
				   }
				 }
			   else
				 {
				  send_pels_count++;
				 }
  	           lat();
			   data.word=65535-(speed*50);
			   TCNT1L=data.byte[0];
               TCNT1H=data.byte[1];
	           break;
     }
   }
  else
   {
     switch(mode)
    {
     case 0: for(i=0;i<64;i++)
	          {
			   disp_ram[i]=0xff;
			  }
			 TCNT1L=data.byte[0];
             TCNT1H=data.byte[1];
			 break;
	
	 case 1: if(scan<7)
	           {
			    scan++;
			   }
			 else
			   {
			    scan=0;
			   }
			 j=0x80>>scan;
			 for(i=0;i<64;i++)
			   {
			    disp_ram[i]=j;
			   }
			 for(i=0;i<4;i++)
			  {
			   disp_ram[scan*4+i]=0xff;
			   disp_ram[scan*4+32+i]=0xff;
			  }
			 TCNT1L=data.byte[0];
             TCNT1H=data.byte[1];
			 break;
			 
	 case 2: if(scan<7)
	          {
			   scan++;
			  }
			 else
			  {
			   scan=0;
			  }
			 for(j=0;j<4;j++)
			  {
			   for(i=0;i<16;i++)
			    {
			     disp_ram[i*4+j]=(pgm_read_byte(shaomiao+i)<<scan)|(pgm_read_byte(shaomiao+i)>>(8-scan));
			    }
			  }
			 TCNT1L=data.byte[0];
             TCNT1H=data.byte[1];
			 break;
			 
	 case 3: if(scan<7)
	          {
			   scan++;

⌨️ 快捷键说明

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