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

📄 lcd1602.c

📁 基于51单片机的万年历
💻 C
📖 第 1 页 / 共 2 页
字号:
		      write_1302(0x8e,0x80);
		   	break;
	case 2:  write_1602com(er+6);//按2次fen位置显示光标
			
		     //write_1602com(0x0f);
			break;
	case 3: write_1602com(er+3);//按动3次,shi
		     //write_1602com(0x0f);
			break;
	case 4: write_1602com(yh+0x0e);//按动4次,week
		     //write_1602com(0x0f);
			break;
	case 5: write_1602com(yh+0x0a);//按动5次,ri
		     //write_1602com(0x0f);
			break;
	case 6: write_1602com(yh+0x07);//按动6次,yue
		     //write_1602com(0x0f);
			break;
	case 7: write_1602com(yh+0x04);//按动7次,nian
		     //write_1602com(0x0f);
			break;
	case 8:
			write_1602com(0x0c);//按动到第8次,设置光标不闪烁
			TR0=1;//打开定时器
         temp=(miao)/10*16+(miao)%10;
		   write_1302(0x8e,0x00);
		   write_1302(0x80,0x00|temp);//miao数据写入DS1302
		   write_1302(0x8e,0x80);
            break;															
			
	}
	
	

	}

	}
//------------------------------加键key2----------------------------		
	if(key1n!=0)//当key1按下以下。再按以下键才有效(按键次数不等于零)
	{

	if(key2==0)  //上调键
	{
	delay(10);
	if(key2==0)
	{
    buzzer=0;//蜂鸣器短响一次
    delay(20);
    buzzer=1;
	while(!key2);
	switch(key1n)
	{
	case 1:miao++;//设置键按动1次,调秒
			if(miao==60)
				miao=0;//秒超过59,再加1,就归零
			write_sfm(0x08,miao);//令LCD在正确位置显示"加"设定好的秒数
			temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00); //允许写,禁止写保护 
		   	write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
		   	write_1302(0x8e,0x80); //打开写保护
			write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,光标自动右移,所以要指定返回
			//write_1602com(0x0b);
			break;
	case 2:fen++;
			if(fen==60)
				fen=0;
			write_sfm(0x05,fen);//令LCD在正确位置显示"加"设定好的分数据
			temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00);//允许写,禁止写保护 
		   	write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码
		   	write_1302(0x8e,0x80);//打开写保护
			write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
			break;
	case 3:shi++;
			if(shi==24)
				shi=0;
			write_sfm(2,shi);//令LCD在正确的位置显示"加"设定好的小时数据
			temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00);//允许写,禁止写保护 
		   	write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
		   	write_1302(0x8e,0x80);//打开写保护
			write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
			break;
	case 4:week++;
			if(week==8)
				week=1;
            write_1602com(yh+0x0C);//指定'加'后的周数据显示位置
				write_week(week);//指定周数据显示内容
            temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00);//允许写,禁止写保护 
		   	write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码
		   	write_1302(0x8e,0x80);//打开写保护
			   write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
			break;
	case 5:ri++;
			if(ri==32)
				ri=1;
			write_nyr(9,ri);//令LCD在正确的位置显示"加"设定好的日期数据
			temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00);//允许写,禁止写保护
		   	write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码
		   	write_1302(0x8e,0x80);//打开写保护
			write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
			break;
	case 6:yue++;
			if(yue==13)
				yue=1;
			write_nyr(6,yue);//令LCD在正确的位置显示"加"设定好的月份数据
			temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00);//允许写,禁止写保护
		   	write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码
		   	write_1302(0x8e,0x80);//打开写保护
			write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
			break;
	case 7:nian++;
		 if(nian==100)
			nian=0;
			write_nyr(3,nian);//令LCD在正确的位置显示"加"设定好的年份数据
            temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00);//允许写,禁止写保护
		   	write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码
		   	write_1302(0x8e,0x80);//打开写保护
			write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
			break;
			

	}

	}

	}
	//------------------减键key3,各句功能参照'加键'注释---------------
	if(key3==0)
	{
	delay(10);//调延时,消抖动
	if(key3==0)
	{
    buzzer=0;//蜂鸣器短响一次
    delay(20);
    buzzer=1;
	while(!key3);
	switch(key1n)
	{
		case 1:miao--;
				if(miao==-1)
					miao=59;//秒数据减到-1时自动变成59
			write_sfm(0x08,miao);//在LCD的正确位置显示改变后新的秒数
            temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00); //允许写,禁止写保护 
		   	write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
		   	write_1302(0x8e,0x80); //打开写保护
			write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
			//write_1602com(0x0b);
			break;
		case 2:fen--;
				if(fen==-1)
					fen=59;
			write_sfm(5,fen);
			temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00);//允许写,禁止写保护 
		   	write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码
		   	write_1302(0x8e,0x80);//打开写保护
			write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
			break;

		case 3:shi--;
			   if(shi==-1)
					shi=23;
			write_sfm(2,shi);
			temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00);//允许写,禁止写保护 
		   	write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
		   	write_1302(0x8e,0x80);//打开写保护
			write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
			break;
		case 4:week--;
				if(week==0)
					week=7;
			 
            write_1602com(yh+0x0C);//指定'加'后的周数据显示位置
				write_week(week);//指定周数据显示内容
			   temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00);//允许写,禁止写保护 
		   	write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码
		   	write_1302(0x8e,0x80);//打开写保护
			   write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
			break;
		case 5:ri--;
				if(ri==0)
					ri=31;
			write_nyr(9,ri);
			temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00);//允许写,禁止写保护
		   	write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码
		   	write_1302(0x8e,0x80);//打开写保护
			write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
			break;
		case 6:yue--;
				if(yue==0)
					yue=12;
			write_nyr(6,yue);
			temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00);//允许写,禁止写保护
		   	write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码
		   	write_1302(0x8e,0x80);//打开写保护
			write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
			break;	
		case 7:nian--;
		 if(nian==-1)
			nian=99;
			write_nyr(3,nian);
         temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
		   	write_1302(0x8e,0x00);//允许写,禁止写保护
		   	write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码
		   	write_1302(0x8e,0x80);//打开写保护
			write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
			break;
			
				
	}

	}

	}

	}


}

//-------------------------------
void init() //定时器、计数器设置函数
{
	TMOD=0x11; //指定定时/计数器的工作方式为3
	TH0=0;  //定时器T0的高四位=0
	TL0=0;  //定时器T0的低四位=0
	EA=1;  //系统允许有开放的中断
	ET0=1; //允许T0中断
	TR0=1; //开启中断,启动定时器

}



//*******************主函数**************************
//***************************************************
void main()
{
	lcd_init();      //调用液晶屏初始化子函数
	ds1302_init();   //调用DS1302时钟的初始化子函数
	init();          //调用定时计数器的设置子函数
	led=0;           //打开LCD的背光电源
    buzzer=0;//蜂鸣器长响一次
    delay(80);
    buzzer=1;
	while(1)  //无限循环下面的语句:
	{
			
    keyscan();      //调用键盘扫描子函数
	
    }
}


void timer0() interrupt 1  //取得并显示日历和时间
{
	
   //Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中
   flag=ReadTemperature();//将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示

  //读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样):


   miao = BCD_Decimal(read_1302(0x81));
	fen = BCD_Decimal(read_1302(0x83));
	shi  = BCD_Decimal(read_1302(0x85));
	ri  = BCD_Decimal(read_1302(0x87));
	yue = BCD_Decimal(read_1302(0x89));
	nian=BCD_Decimal(read_1302(0x8d));
	week=BCD_Decimal(read_1302(0x8b));

	//显示温度、秒、时、分数据:
   
   write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示
   write_sfm(8,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数)
	write_sfm(5,fen);//分,从第二行第5个字符后开始显示
	write_sfm(2,shi);//小时,从第二行第2个字符后开始显示
	
	//显示日、月、年数据:
	write_nyr(9,ri);//日期,从第二行第9个字符后开始显示
   write_nyr(6,yue);//月份,从第二行第6个字符后开始显示
	write_nyr(3,nian);//年,从第二行第3个字符后开始显示
	write_week(week);

}


⌨️ 快捷键说明

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