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

📄 lcm_t.c

📁 89C51的12864LCD电子钟。源程序~1
💻 C
📖 第 1 页 / 共 2 页
字号:
  
  //读取1302某地址上的数值转换成10进制赋给item 
  item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  if(KEY_2 == 0){
  	item++;//数加 1  
  }
  if(KEY_4 == 0){
  	item--;//数减 1 
  }
  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);//写保护,禁止写操作 
  updata ();	//刷新数据
  lcm_w_mm();//刷新 分 
}
/*****************************************************************************/
//设置1302的初始时间
void Init_1302(void){//(2007年1月1日00时00分00秒星期一)
	write_clock(0x8e,0x00);//允许写操作

	write_clock(0x8c,0x07);//年
	write_clock(0x8a,0x01);//星期
	write_clock(0x88,0x01);//月
	write_clock(0x86,0x01);//日
	write_clock(0x84,0x00);//小时
	write_clock(0x82,0x00);//分钟
	write_clock(0x80,0x00);//秒
	write_clock(0x90,0xa5);//充电	
	write_clock(0x8e,0x80);//禁止写操作
}
/*****************************************************************************/
//DS1302写数据(底层协议)
void write_clock(unsigned char ord, unsigned char dd){
	clock_clk=0;
	clock_Rst=0;
	clock_Rst=1;
	clock_out(ord);
	clock_out(dd);
	clock_Rst=0;
	clock_clk=1;
}
/*****************************************************************************/
//1302驱动程序(底层协议)
void clock_out(unsigned char dd){
	ACC=dd;
	clock_dat=a0; clock_clk=1; clock_clk=0;
	clock_dat=a1; clock_clk=1; clock_clk=0;
	clock_dat=a2; clock_clk=1; clock_clk=0;
	clock_dat=a3; clock_clk=1; clock_clk=0;
	clock_dat=a4; clock_clk=1; clock_clk=0;
	clock_dat=a5; clock_clk=1; clock_clk=0;
	clock_dat=a6; clock_clk=1; clock_clk=0;
	clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/
//DS1302写入字节(底层协议)
unsigned char clock_in(void){
	clock_dat=1;
	a0=clock_dat;
	clock_clk=1; clock_clk=0; a1=clock_dat;
	clock_clk=1; clock_clk=0; a2=clock_dat;
	clock_clk=1; clock_clk=0; a3=clock_dat;
	clock_clk=1; clock_clk=0; a4=clock_dat;
	clock_clk=1; clock_clk=0; a5=clock_dat;
	clock_clk=1; clock_clk=0; a6=clock_dat;
	clock_clk=1; clock_clk=0; a7=clock_dat;
	return(ACC);
}
/*****************************************************************************/
//DS1302读数据(底层协议)
unsigned char read_clock(unsigned char ord){
	unsigned char dd=0;
	clock_clk=0;
	clock_Rst=0;
	clock_Rst=1;
	clock_out(ord);
	dd=clock_in();
	clock_Rst=0;
	clock_clk=1;
	return(dd);
}
/*****************************************************************************/
//向LCM中填写 年 数据
void lcm_w_yy(void){
	//if(read_clock(0x8d) != yy){
		yy = read_clock(0x8d);
		lcm_w_test(0,0x83);
		lcm_w_word("20");
		lcm_w_test(0,0x84);
		lcm_w_test(1,(yy/16)+0x30);	
		lcm_w_test(1,yy%16+0x30);
}	//}
/*****************************************************************************/
//向LCM中填写 月 数据
void lcm_w_mo(void){
	//if(read_clock(0x89) != mo){
		mo = read_clock(0x89);
		lcm_w_test(0,0x90);
			if(mo/16 != 0){lcm_w_test(1,(mo/16)+0x30);}	//十位消隐
			else{lcm_w_test(1,0x20);}//同上			
		lcm_w_test(1,mo%16+0x30);
		lcm_w_test(0,0x91);
		lcm_w_word("月");
}	//}
/*****************************************************************************/
//星期处理并送入LCM的指定区域
void lcm_w_xq(void){
	unsigned char sel;

	//if(read_clock(0x8b) != xq){
	xq = read_clock(0x8b);
	sel = (read_clock(0x8b))%16; //字节低4位的BCD码放入sel
	lcm_w_test(0,0x97);//写入指定区域(97H 第二行第8个字)
	if(sel==7)  {lcm_w_word("日");}    //
  	if(sel==6)  {lcm_w_word("六");}    //
  	if(sel==5)  {lcm_w_word("五");}    //
  	if(sel==4)  {lcm_w_word("四");}    //
  	if(sel==3)  {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word("三"); 因为“三”的内码失效。
  	if(sel==2)  {lcm_w_word("二");}    //
  	if(sel==1)  {lcm_w_word("一");}    //星期一
	lcm_w_test(0,0x95);
	lcm_w_word("星期");
	//}
}
/*****************************************************************************/
//向LCM中填写 日 数据
void lcm_w_dd(void){
//	if(read_clock(0x87) != dd){
		dd = read_clock(0x87);
		lcm_w_test(0,0x92);
			if(dd/16 != 0){lcm_w_test(1,(dd/16)+0x30);}	//十位消隐
			else{lcm_w_test(1,0x20);}//同上	
		lcm_w_test(1,dd%16+0x30);
		lcm_w_test(0,0x93);
		lcm_w_word("日  ");
				
}	//}
/*****************************************************************************/
//向LCM中填写 小时 数据
void lcm_w_hh(void){
	if(read_clock(0x85) != hh){
		hh = read_clock(0x85);
			if (hh > 0x07 && hh < 0x22 && w == 0){
				beep = 0; led_r = 0;
				DelayM(100);
				beep = 1; led_r = 1;
			}
		}
		lcm_w_test(0,0x88);
		lcm_w_test(1,(hh/16)+0x30);
		lcm_w_test(1,hh%16+0x30);
				
}	//}
/*****************************************************************************/
//向LCM中填写 分钟 数据
void lcm_w_mm(void){
	if(read_clock(0x83) != mm){		
		mm = read_clock(0x83);
		if( w == 0){				
			days();	   //节日显示
			updata ();	//刷新数据
		}				
	}
	lcm_w_test(0,0x89);	
	lcm_w_test(1,0x3a);	  //":"
	lcm_w_test(1,(mm/16)+0x30);
	lcm_w_test(1,mm%16+0x30);
	lcm_w_test(1,0x2e);	 //"."	
}
/*****************************************************************************/
//刷新数据
void updata (void){
		lcm_w_hh();//刷新 小时 
		lcm_w_dd();//刷新 日
		lcm_w_xq();//更新星期值	
		lcm_w_mo();//刷新 月
		lcm_w_yy();//刷新 年
		
}
/*****************************************************************************/
//向LCM中填写 秒 数据
void lcm_w_ss(void){
	unsigned int i=0;
	unsigned char a=0,b=0,c=0;
	if(read_clock(0x81) != ss){	//判断是否需要更新
		ss = read_clock(0x81);	//更新数据
		lcm_w_test(0,0x8b);		//秒值在LCM上的写入位置
		lcm_w_test(1,(ss/16)+0x30);	//写十位		
		lcm_w_test(1,ss%16+0x30);	//写个位
		led_b = ~led_b;				//背光闪烁
		lcm_w_mm();//刷新 分		
	lcm_w_test(0,0x8d);		//温度在LCM上的写入位置		
	i=ReadTemperature();//读温度并送显
	a=i/100;
	lcm_w_test(1,a+0x30);	//显示温度十位
	b=i/10-a*10;
	lcm_w_test(1,b+0x30);	//个位
	lcm_w_test(1,0x2e);	 //"."
	c=i-a*100-b*10;
	lcm_w_test(1,c+0x30); //小位1位		
	lcm_w_word("℃");	//度C
}	}
/*****************************************************************************/
//---主程序---//

main() {
	
	unsigned char e=0;
	KEY_I = 0;KEY_1 = 1;KEY_2 = 1;KEY_3 = 1;KEY_4 = 1;//初始键盘
	yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新
		beep = 0;
		DelayM(900);
		beep = 1;
	lcm_init();//初始化液晶显示器
	lcm_clr();//清屏
	lcm_w_word("  12864LcdClock                  Hello !!       from DoYoung.net");//显示欢迎字
	//----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺
	DelayM(3000); //显示等留3秒
	//lcm_w_test(0,0x80);
	//lcm_w_word("[Dis]      [Set]");

while(1){
		if (w == 0){   //正常走时
		lcm_w_ss();//刷新 秒
		}
		else {		//启动调时


		}

		//------------------------------------------------------------------
		if (KEY_3 == 0) // 设置时间
      	{
       		DelayM(20);	   //去抖
			led_g3 = 0;led_r = 1;
			if(KEY_3 == 0 && w == 1)  //当是调时状态 本键用于调整下一项
			{
				e++;
				if (e >= 6 ){e = 0;}
				Set_time(e);//调整				
			}
			
			if(KEY_3 == 0 && w == 0)  //当是正常状态时就进入调时状态
			{
				led_b = 1;//
				lcm_clr();//清屏
				//yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新
				w=1;	  //进入调时				
				lcm_w_test(0,0x9e);
				lcm_w_word(" [-]");
				lcm_w_test(0,0x80);
				lcm_w_word("[Esc]");
				lcm_w_test(0,0x85);
				lcm_w_word("[Next]");
				lcm_w_test(0,0x98);
				lcm_w_word("[+]");
				Set_time(e);//调整
			}
       		while(KEY_3 == 0);//等待键松开 
			led_g3 = 1; led_r = 0;//红灯亮,表示调时  
      	}

		//------------------------------------------------------------------
		if (KEY_1 == 0) // 当在调时状态时就退出调时
      	{
       		DelayM(20);led_g1 = 0;led_r = 1;
       		if(KEY_1 == 0 && w == 1){				
				w = 0;	  //退出调时
				e = 0;		//“下一项”计数器清0								
			}

			if(KEY_1 == 0 && w == 0){				
				lcm_clr();//清屏
				lcm_w_test(0,0x80);
				lcm_w_word("  12864LcdClock V1.01 2006-11-26 Hello !!       from DoYoung.net");
				//----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺				
				while(KEY_1 == 0);//等待键松开  
			}
				lcm_clr();//清屏
				//lcm_w_word("[Dis]      [Set]");
				//yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新				
				days();	   //节日显示
				updata ();	//刷新数据
				lcm_w_mm();//刷新 分
				

       		while(KEY_1 == 0);//等待键松开  
			led_g1 = 1; 
      	}

		//------------------------------------------------------------------
		if (KEY_2 == 0 && w == 1){ // 加减调整{
       		DelayM(20);led_g2 = 0;led_r = 1;
       		if(KEY_2 == 0 && w == 1){				
				Set_time(e);//调整
			}
       		while(KEY_2 == 0);//等待键松开
			led_g2 = 1; led_r = 0;   
      	}

		//------------------------------------------------------------------
		if (KEY_4 == 0 && w == 1){ // 加减调整      	
       		DelayM(20);	led_g4 = 0;led_r = 1;
       		if(KEY_4 == 0 && w == 1){				
				Set_time(e);//调整
			}
       		while(KEY_4 == 0);//等待键松开
			led_g4 = 1; led_r = 0;   
      	}

	   //------------------------------------------------------------------
		 if(KEY_1 == 1 && KEY_2 == 0 && KEY_3 == 1 && KEY_4 == 0){	//时钟初始化{
			led_r = 0;
			DelayM(3000);
			led_r = 1;
			if(KEY_1 == 0 && KEY_2 == 0&& KEY_3 == 1&& KEY_4 == 0){
				Init_1302();
			   	lcm_w_test(0,0x80);
				lcm_clr();//清屏
				lcm_w_word("初始化成功!    2007-1-1 00:00.0");
				//----------|-------1-------|-------3-------|	
				while(1);
			}
		}			
}	}

/*****************************************************************************/
/*
//编程日志
2007-02-10 修改为正式发布版。
2007-01-26 用每分钟刷新数据,防止显示乱码。
2006-11-30 
2006-11-29 时钟主显示部分完成。
2006-11-28 时钟驱动程序植入完成。
2006-11-27 LCM驱动程序植入完成。
2006-11-26 硬件制作完成。

/*****************************************************************************/



⌨️ 快捷键说明

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