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

📄 bi2.c

📁 驱动320240
💻 C
📖 第 1 页 / 共 2 页
字号:
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
void LCD_write_ch(unsigned char X,unsigned char Y,unsigned char z,unsigned int s)
  {unsigned char k;
  unsigned char p[6]="0";
  unsigned char i=0;
     //写地址
	  LCD_set_xy( X, Y );
for(i=0;i<z;i++)
{
	  p[i]=s%10;
	  s=s/10;
		
	      }
		i--;
		/*
		while(!(p[i]))
		{ 
		  if(i==0)
		  {LCD_write_char( 0, 0b00110000 );i--;}
		  else
		  {i--;LCD_write_char( 0, 0b10000000 );}		

		}
*/
		 for(;i<255;i--)
		 {	
    LCD_write_char( 0, p[i]+0b00110000 );
  }}

  



void LCD_init(void)       //液晶初始化
{
 delay_nms(15);
 LCD_write_char(0x28,0);  //4位显示
 LCD_write_char(0x0c,0);  //显示开
 LCD_write_char(0x01,0);  //清屏
}
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
  {
    LCD_set_xy( X, Y ); //写地址
    
    while (*s)  // 写显示字符
      {
        LCD_write_char( 0, *s );
	s ++;
      }
  }
  void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
  {
    unsigned char address;
    if (y == 0) address = 0x80 + x;
    else 
       address = 0xc0 + x;
    LCD_write_char( address, 0 );
  }
void LCD_en_write(void)  //液晶使能
{
  LCD_EN_PORT|=LCD_EN;
  delay_nus(1);
  LCD_EN_PORT&=~LCD_EN;
}
void LCD_write_char(unsigned command,unsigned data) // 写数据
{
 unsigned command_temp,data_temp;
 command_temp=command;
 data_temp=data;
 delay_nus(16);
 if(command==0)
 {
  LCD_RS_PORT|=LCD_RS;  //RS=1
  LCD_DATA_PORT&=0XF0;
  LCD_DATA_PORT|=(data_temp>>4)&0x0F;  //写高四位
  LCD_en_write();
  //data_temp=data_temp<<4;  
  LCD_DATA_PORT&=0XF0;
  LCD_DATA_PORT|=data_temp&0x0F;   //写低四位
  LCD_en_write();
 }
 else
 {
  LCD_RS_PORT&=~LCD_RS;   //RS=0
  LCD_DATA_PORT&=0XF0;
  LCD_DATA_PORT|=(command_temp>>4)&0x0F; //写高四位
  LCD_en_write();
 // command_temp=command_temp<<4;
  LCD_DATA_PORT&=0xF0;
  LCD_DATA_PORT|=command_temp&0x0F;  //写低四位
  LCD_en_write();
  }
}
/***************************************
           T2初始化,中断
****************************************/




void time_change(void)
{
if(time[0][0]<60)
  return;
  else
  {time[0][0]-=60;
  if(time[0][1]<59)
  time[0][1]++;
  else
  {
    time[0][1]=0;
	if(time[0][2]<23)
	time[0][2]++;
	else
	time[0][2]=0;
	}
    }

}

void t2_init()
{
ASSR=(1<<AS2);
TCNT2=0XE0;
TCCR2=(7<<CS20);
TIMSK|=(1<<TOIE2);									 
}
#pragma interrupt_handler t2_iov:5
void t2_iov(void)
{
TCNT2=0XE0;
time[0][0]++;
time_change();
}



void disp_temp(unsigned char x,unsigned char y,unsigned char q)
{
if(q==1)
{LCD_write_string(0,1,"alarm clock: ");
	if(alarmfalg==1)
	{LCD_write_string(13,1,"on ");}
	else
	{LCD_write_string(13,1,"off");}
}
LCD_write_string(0,y,"time:");

LCD_write_ch(6,y,2,time[change/10][2]);
LCD_write_string(8,y,":");
LCD_write_ch(9,y,2,time[change/10][1]);
LCD_write_string(11,y,":");
LCD_write_ch(12,y,2,time[change/10][0]);

}


char get_key()
{
unsigned char temp,tempn0;
temp=PINA&0XF0;
switch (temp)
{
case 0xe0:tempn0=1;break;
case 0xd0:tempn0=2;break;
case 0xb0:tempn0=3;break;
case 0x70:tempn0=4;break;

}
return tempn0;
}

void sys_init()
{
DDRA=0X0F;
PORTA=0XFF;
DDRC=0XFF;
PORTC=0XFF;
LCD_DATA_DDR=0XFF;
DDRB=0B10110000;
SEI();
}

void disp_change()
{
if((change/10)!=0)
{
 LCD_write_string(0,0,"alarm  ");
LCD_write_ch(7,0,1,change/10);
}
else
{ LCD_write_string(0,0,"set time");
}
switch(change%10)
{
case 0: LCD_write_string(9,0,"second");break;
case 1: LCD_write_string(9,0,"mintue");break;
case 2: LCD_write_string(9,0,"hour  ");break;
}

}

void changetime()
{
if(change%10==0)
{time[change/10][0]=0;}
else if(change%10==1)
{if(time[change/10][1]==255)
   {time[change/10][1]=59;}
 else if(time[change/10][1]==60)
   {time[change/10][1]=0;}
}

else if(change%10==2)
{if(time[change/10][2]==255)
   {time[change/10][2]=23;}
 else if(time[change/10][2]==24)
   {time[change/10][2]=0;}
}


}

void write_eep()
{
unsigned char i;
change=10;
for(;;)
{
        if((change%10)==2)
 	  	{if(change!=52)
		 {change=change+9;}
		 else
		 {change=0;mo=0;break;}
		}
		else
		{change++;}
EEPROMwrite(change,time[change/10][change%10]); 
}
		
		
}
void write_1302()
{unsigned char temp[8];
  Burst_SPI(0xbe,3,&time[0][0],&time[0][0]);

}

void settime()
{unsigned char j;
disp_temp(0,1,0);
disp_change();
switch(get_key())
 {
 case 1:if((change%10)==2)
 	  	{if(change!=52)
		 {change=change+9;}
		 else
		 {change=0;write_eep();}
		}
		else
		{change++;}
		delay(300);
		
        break;
 case 2: LCD_write_char(0x01,0);write_eep();break;
 case 3:time[change/10][change%10]++;changetime();delay(200);write_1302();break;
 case 4:time[change/10][change%10]--;changetime();delay(200);write_1302();break;

 }

}

char com()
{
unsigned char i,temp=0;
for(i=1;i<6;i++)
{
if(time[0][1]==time[i][1])
{if(time[0][2]==time[i][2])
 {temp=1;}
}
}
return temp;
}

void read_eep()
{
change=10;
for(;;)
{
        if((change%10)==2)
 	  	{if(change!=52)
		 {change=change+9;}
		 else
		 {change=0;mo=0;break;}
		}
		else
		{change++;}
		time[change/10][change%10]=EEPROMread(change); 

}


}
	


void main()
{
unsigned int i;
sys_init();
   for(i=0;i<10;i++)
	 {
		 LCD_init();

      
         LCD_write_string(0,0,"set the distance");
         LCD_write_string(10,1,"cm");
	    }
	//write_eep();
//t2_init();
i=EEPROMread(11);
if(i==255)
{write_eep();}
init_SPI();
 date=Single_SPI(0x80,0);
read_eep();
  timer2_init();
 	

 	  MCUCR = 0x00; 
 	  TIMSK|=(1<<TOIE2);	//允许定时器2溢出中断

	  SEI();

	
	  
	  TCCR2 = 0x00;
         LCD_write_string(0,0,"time:");
         LCD_write_string(0,1,"alarm clock: ");

 
		 
		 Burst_SPI(0xbe,8,&time[0][0],&temp_1302[0]);
		 for(;;)
		 {Burst_SPI(0xbf,8,&date_init[0],&temp_1302[0]);
		 switch(mo)
		 {
		 case 0:change=0;
		 	  	disp_temp(0,0,1);
		 	    if(get_key()==1)
				 {mo=1; LCD_write_char(0x01,0);  
				 LCD_write_string(0,0,"set time second"); 
				 disp_temp(0,1,0);
				 disp_temp(0,1,0);
 				 LCD_write_string(0,0,"set time second");
				 change=0;
				 delay(300);}
				 if(get_key()==4)
				 {alarmfalg=0;}
				 
				 if(get_key()==3)
				{alarmfalg=1;}
				if((com()==1)&&(alarmfalg==1))
				
				{music();}
				 
				 
				 
				break;
         case 1:settime();break;
		 case 2:
		 	/*  LCD_write_string(0,0,"  alarm clock:         ");
		 	  if(alarmfalg==1)
			  {LCD_write_string(0,1,"       on            ");}
			  else
			  {LCD_write_string(0,1,"       off        ");}
			  switch(get_key())
 			  {
 			  case 1: 
 			  case 2: LCD_write_char(0x01,0);mo=0;break;
 			  case 3:alarmfalg=1;delay(200);break;
 			  case 4:alarmfalg=0;delay(200);break;

 		}*/
			  
			  break;

		 
		 
		 
		 
		 }
		 }
}

⌨️ 快捷键说明

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