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

📄 zdbwnl.c

📁 万年历+温度+闹钟.dan单片机应用上的一些小代码。
💻 C
📖 第 1 页 / 共 3 页
字号:
        	Disp_Digit(4,48,space); //显示空格
	        Disp_Digit(4,56,space);    
       	}
    } 
  	else
    {
    	d=read_clock(0xc3);//读闹钟小时的数值
		e=d;
		d=d>>4;
		e=e&0x0f;
		Mcs=1;Scs=0;
		Disp_Digit(4,48,zero+d*16);
		Disp_Digit(4,56,zero+e*16);     
    } 

  	if(Minb==1)  //分钟闪烁标志位
    {
    	if(flag==1)
       	{    
      		d=read_clock(0xc5);//读闹钟分钟的数值
			e=d;
			d=d>>4;
			e=e&0x0f;
			Mcs=0;Scs=1;
			Disp_Digit(4,8,zero+d*16);
			Disp_Digit(4,16,zero+e*16);
       	}
     	else
       	{
			Mcs=0;Scs=1;
        	Disp_Digit(4,8,space); //显示空格
	        Disp_Digit(4,16,space);    
    	}
    } 
  	else
   	{ 
    	d=read_clock(0xc5);//读闹钟分钟的数值
		e=d;
		d=d>>4;
		e=e&0x0f;
		Mcs=0;Scs=1;
		Disp_Digit(4,8,zero+d*16);
		Disp_Digit(4,16,zero+e*16);
   	}

   	if(Secb==1)  //秒闪烁标志位
    {
    	if(flag==1)
       	{    
        	d=read_clock(0xc7);//读闹钟秒的数值
			e=d;
			d=d>>4;
			e=e&0x0f;
			Mcs=0;Scs=1;
			Disp_Digit(4,32,zero+d*16);
			Disp_Digit(4,40,zero+e*16);
       	}
     	else
       	{
			Mcs=0;Scs=1;
        	Disp_Digit(4,32,space); //显示空格
        	Disp_Digit(4,40,space);    
       	}
    } 
  	else
    { 
    	d=read_clock(0xc7);//读闹钟秒的数值
		e=d;
		d=d>>4;
		e=e&0x0f;
		Mcs=0;Scs=1;
		Disp_Digit(4,32,zero+d*16);
		Disp_Digit(4,40,zero+e*16);
    }
}

/******************************************************************************/
void id_case1_key(void)//id为1时的下一级选择
{
	if(Add_Key == 0) //增加
    {
    	Delay(100);
       	if(Add_Key == 0)
	   		Set_time(id,0);  //调用Set_time函数
			while(Add_Key ==0);
    }
   	if (Dec_Key==0)  //减少
    {
       	Delay(100);
       	if(Dec_Key == 0)
			Set_time(id,1);  
        	while(Dec_Key ==0);
      }
}

/******************************************************************************/
void Set_time(unsigned char sel, bit sel_1) //根据选择调整相应项目并写入DS1302
{
  signed char address,item;
  signed char max,mini;
  if(sel==7)  {address=0x80; max=0;mini=0;}     //秒
  if(sel==6)  {address=0x82; max=59;mini=0;}    //分钟
  if(sel==5)  {address=0x84; max=23;mini=0;}    //小时
  if(sel==3)  {address=0x86; max=31;mini=1;}    //日
  if(sel==2)  {address=0x88; max=12;mini=1;}    //月
  if(sel==1)  {address=0x8c; max=99; mini=0;}    //年
  if(sel==4)  {address=0x8a; max=7;mini=1;}    //星期
  
  //读取1302某地址上的数值转换成10进制赋给item 
  item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  if(sel_1==0) 
  	item++;  
  else
  	item--;
  if(item>max) item=mini;   
  if(item<mini) item=max;
           
  write_clock(0x8e,0x00);//允许写操作
  write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
  write_clock(0x8e,0x80);//写保护,禁止写操作  
}

/******************************************************************************/
void id_case2_key(void)//id为1时的下一级选择
{
	if(Add_Key == 0) //增加1
    {
    	Delay(100);
       	if(Add_Key == 0)
	   		Set_Bell(id2,0);  //调用Set_Bell函数
			while(Add_Key ==0);//等待键松开
    }
   	if(Dec_Key == 0)  //减少1
    {
       	Delay(100);
       	if(Dec_Key == 0)
			Set_Bell(id2,1);  //调用Set_Bell函数
        	while(Dec_Key ==0);//等待键松开
      }
}

/******************************************************************************/
void Set_Bell(unsigned char sel, bit sel_1)//根据选择调整相应项目并写入
{
  signed char address,item;
  signed char max,mini;
  if(sel==4)  {address=0xc6; max=59;mini=0;}    //秒
  if(sel==3)  {address=0xc4; max=59;mini=0;}    //分
  if(sel==2)  {address=0xc2; max=23; mini=0;}   //时
  if(sel==1)  									//标志位
  {
  	address=0xc8;//for read
	if(Add_Key ==0 || Dec_Key ==0)
	Bell_Swh=~Bell_Swh;
	write_clock(address,Bell_Swh);
  }    //开关

  item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  if(sel_1==0) 
  	item++;  
  else
  	item--;
  if(item>max) item=mini;   
  if(item<mini) item=max;

  write_clock(0x8e,0x00);//允许写操作
  write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
  write_clock(0x8e,0x80);//写保护,禁止写操作 
}

/******************************************************************************/
void Timer0_Init(void)//定时器0初始化
{
	TMOD=0x01;
	TH0=(65535-50000)/256;
	TL0=(65535-50000)%256;
	EA=1;
	ET0=1; 
	TR0=1;
}

/******************************************************************************/
void Timer0(void) interrupt 1 using 1//中断入口,冒号闪烁
{
	static unsigned char timecount = 0;

	TH0=(65535-50000)/256; //50ms定时
  	TL0=(65535-50000)%256;  
  	timecount++;
  	if(timecount > 9)//500MS
   	{
    	timecount = 0;    
    	flag = ~flag;          
    }
}

/******************************************************************************/
void Init_1302(void)//设置1302的初始时间
{
	write_clock(0x8e,0x00);//允许写操作
	write_clock(0x8c,0x05);//年
	write_clock(0x8a,0x06);//星期
	write_clock(0x88,0x01);//月
	write_clock(0x86,0x01);//日
	write_clock(0x84,0x12);//小时
	write_clock(0x82,0x00);//分钟
	write_clock(0x80,0x00);//秒
	write_clock(0x90,0xa5);//充电	
	write_clock(0x8e,0x80);//禁止写操作
}

/******************************************************************************/
void Lcd_Mark1(void)//在预定的位置上写入汉字
{
	Clr_Scr();//清屏
	frame();//显示边框
	Mcs=1;Scs=0;
	Disp_Chinese(5,8,shi);//显示室温,星期,年, . ,℃
	Disp_Chinese(5,24,wen);
	Disp_Chinese(3,8,xing);
	Disp_Chinese(3,24,qi);
	Disp_Chinese(1,40,nian);
	Disp_Digit(5,56,point);
	Mcs=0;Scs=1;
	Disp_Chinese(5,8,sheshidu);
	if(Bell_Swh == 1)//闹钟为开
	{	
		Mcs=0;Scs=1;
		Disp_Chinese(5,40,biaozhi);//显示闹钟图标
	}
}

/******************************************************************************/
void Lcd_Mark2(void)
{
	Clr_Scr();//清屏
	frame();//显示边框
	
	Mcs=1;Scs=0;//显示闹钟设定等几个汉字
	Disp_Chinese(2,16,nao);
	Disp_Chinese(2,32,zhong);
	Disp_Chinese(2,48,she);
	Mcs=0;Scs=1;
	Disp_Chinese(2,0,ding);
	Disp_Digit(4,0,maohao);//显示:
	Disp_Digit(4,24,maohao);	
}

/******************************************************************************/
void Beep(void)//BELL 蜂明器发声,整点报警
{
	Bell_Out = 0;
	Delay(6000);//50ms
	Bell_Out = 1;
	Delay(6000);//50ms
}
	
/*****************************************************************************/
void Bell_now(void)
{
	Bell_Out = 0;
	Delay(31250); //for 250ms
	Bell_Out = 1;
	Delay(6350); //50ms
	Bell_Out = 0;
	Delay(18750);//150ms
	Bell_Out = 1;
    Delay(50000);//400ms
}

/******************************************************************************/
void main(void) //主函数 
{
	//初始化状态
	Bell_Out = 1;//蜂明器关闭
	Bak_Light = 0;//开机背光开

	Timer0_Init();
	Init_lcd();//设置液晶显示器

	Clr_Scr();//清屏
	Disp_Img(logo);	//显示湘灵电子LOGO开机画面
	Delay12864(60000);//Delay 4s

	Bak_Light = 1;//关闭背光
	Bell_Swh = read_clock(0xc9);//读取开,关的状态
	Lcd_Mark1();

	while(1)//主循环
 	{	
		//设置时钟的初始值,显示05年1月1号星期六12:00:00
  		if(Rst_Key == 0)//按下系统复位键,S4
		{
			Delay(1000);//延时消抖
			if(Rst_Key == 0)
			{
				Init_1302();//初始化时钟
			}
		}

		if(OK_Key == 0 && Dec_Key ==0 )//进入闹钟设置界面
		{
			Delay12864(100);
			if(OK_Key == 0 && Dec_Key ==0 )
			{
				Lcd_Mark2();
				if(Bell_Swh == 0){Mcs=0;Scs=1;Disp_Chinese(2,32,guan);}//关
				else  {Mcs=0;Scs=1;Disp_Chinese(2,32,kai);}
				while(1)
				{	
					if (OK_Key == 0) // 设置和选择项目键
      				{	
						Delay(1000);
       					if(OK_Key == 0)
						{
							id2++;if(id2>5) id2=0;
						}
       					while(OK_Key == 0);//等待键松开   
 				    }
					switch( id2 )
					{
						case 0:Disp2();break;//正常显示
						case 1:Kgb = 1;id_case2_key();Disp2();break;//开关
						case 2:Kgb= 0;Hourb=1;id_case2_key();Disp2();break;//
						case 3:Hourb=0;Minb=1;id_case2_key();Disp2();break;
						case 4:Minb=0;Secb=1;id_case2_key();Disp2();break;
						case 5:Secb=0;id2 = 0;Lcd_Mark1();goto FF;break;//返回主界面
						default:break;
					}
				}//while(1)
			}//if
		}//if
/*****************************************/
		FF:   //返回主界面
/*****************************************/			
		if(flag == 0)
		{
			Mcs=0;Scs=1;
			Disp_Digit(3,8,maohao);// :闪烁	
			Disp_Digit(3,32,maohao);
		}
		else 
		{
			Mcs=0;Scs=1;
			Disp_Digit(3,8,space);//显示空格
			Disp_Digit(3,32,space);	
		}
		if (OK_Key == 0) // 设置和选择项目键
      	{
       		Delay(1000);
       		if(OK_Key == 0)
			{
				id++;if(id>7)id=0;	
			}
       		while(OK_Key == 0);//等待键松开    
      	}
     	switch( id )
      	{
       		case 0:sec = 0;	Disp( );break;//正常显示
         	case 1:year = 1;id_case1_key();Disp();break;//年	
			case 2:year=0;mon=1;id_case1_key();Disp();break;//月
            case 3:mon=0;day=1;id_case1_key();Disp();break;  //日 
         	case 4:day=0;weekk=1;id_case1_key();Disp();break;//星期     
         	case 5:weekk=0;hour=1;id_case1_key();Disp();break;  //小时
       		case 6:hour=0;min=1;id_case1_key();Disp();break; //分钟
       		case 7:min=0;sec=1;id_case1_key();Disp();break; //秒
         	default:break;	
      	}

		if(Bell_Swh == 1)//闹钟为开
		{
			H_Bell=read_clock(0xc3);//读取闹钟的时
			S_Bell=read_clock(0xc5);//读取闹钟的分
			
			H_1302=read_clock(0x85);//读小时
			S_1302=read_clock(0x83);//读分钟
	
			if(H_Bell == H_1302) 
		 	{
				if(S_Bell == S_1302)
				{
					Clr_Scr();//清屏
					frame();//显示边框
					Mcs=1;Scs=0;
					Disp_Chinese(3,16,nao);//闹钟显示时间到!
					Disp_Chinese(3,32,zhong);
					Disp_Chinese(3,48,shit);
					Mcs=0;Scs=1;
					Disp_Chinese(3,0,jian);
					Disp_Chinese(3,16,dao);
					Disp_Digit(3,40,fh);
			
					while(S_Bell == S_1302)//判断是否到闹钟设定时间
					{
						Bak_Light = 0;//闹钟时间到,打开LCD背光
						Bell_now();//闹钟响
						S_1302=read_clock(0x83);//读分钟

						if(OK_Key == 0 || Dec_Key ==0 || Add_Key == 0)
						{
							Bak_Light = 1;//关闭背光
							Bell_Swh  = 0;//关闭闹钟
							break; //终止闹钟按任意键退出!
						}
					}
					Lcd_Mark1();//返回万年历时钟界面
				}//if(S_Bell == S_1302)
			}//if(H_Bell == H_1302)
		}//if闹钟开
	}//while
}//main

⌨️ 快捷键说明

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