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

📄 key_sws.h

📁 这个是用if语句来实现按键扫描功能的
💻 H
字号:
//用IF语句所写,调节时、分、秒、年、月、日、星期用k3键,调节闹钟的时、分、秒用k4键,已经调试OK
//闹钟的定时到时间时,蜂鸣器会响,此时可以按k1~k4任意键清除闹钟
//完成日期:2008-12-28日   19:20
//设计人:佘望胜
void keyscan()
{
	//---------------------------------------------按任意按键关闭闹钟函数-------------------------------------------//
	if(flag0==1) 
	{
		if(k1==0)  
			{
				delay_lcd1602(20);
				if(k1==0)
				{
				flag0=0;
				while(!k1);
				flag0=0;
				}
			}
		if(k2==0)   
			{
				delay_lcd1602(20);
				if(k2==0)
				{
				flag0=0;
				while(!k2);
				flag0=0;
				}
			}
		if(k3==0)  
			{
				delay_lcd1602(20);
				if(k3==0)
				{
				flag0=0;
				while(!k3);
				flag0=0;
				}
			}
		if(k4==0)  
			{
				delay_lcd1602(20);
				if(k4==0)
				{
				flag0=0;
				while(!k4);
				flag0=0;
				}
			}
	}
	//-----------------------------------------------年 月 日 星期 时 分 秒 循环切换开始---------------------------------//
	if(k3==0)  //------------------------------------------------k3键开始-------------------------------------------------------//
	{
		delay_lcd1602(20);
		if(k3==0)
		{
			num1++;
			write_command_1602(0x0f);  //光标闪烁,指示所调节的位置
			flag0=0;   //清除标志位
			flag1=1;    //设置标志位
			while(!k3)
			{
				if(num1==1)
					write_command_1602(0x80+0x40+6);    //第二行显示秒的位置      
				if(num1==2)
					write_command_1602(0x80+0x40+3);    //第二行显示分的位置
				if(num1==3)
					write_command_1602(0x80+0x40+0);    //第二行显示时的位置
				if(num1==4)
					write_command_1602(0x80+14);    //第一行显示星期的位置
				if(num1==5)
					write_command_1602(0x80+8);     //第一行显示日的位置
				if(num1==6)
					write_command_1602(0x80+5);     //第一行显示月的位置
				if(num1==7)
					write_command_1602(0x80+2);     //第一行显示年的位置
				if(num1==8)        //如果num1=8
					{
					num1=0;      //num1就清为0
					flag1=0;     //清除标志位
					write_command_1602(0x0c);  //显示光标关 
					ds887_write_date(9,year);    //设置的 年 写入887
					ds887_write_date(8,month);   //设置的 月 写入887
					ds887_write_date(7,date);    //设置的 日 写入887
					ds887_write_date(6,week);    //设置的 星期 写入887 
					ds887_write_date(4,hour);    //设置的 时 写入887
					ds887_write_date(2,minute);  //设置的 分 写入887
					ds887_write_date(0,second);  //设置的 秒 写入887
					}
			}

		}
	}//------------------------------------------------k3键结束-------------------------------------------------------//
	else //-----------------------------------------------闹钟 时 分 秒 循环切换开始-----------------------------------------------//
	{
		if(k4==0)  //------------------------------------------------k4键开始-------------------------------------------------------//
		{
			delay_lcd1602(20);
			if(k4==0)
			{
				num2++;
				write_command_1602(0x0f);  //光标闪烁,指示所调节的位置
				flag0=0;   //清除标志位
				flag2=1;    //设置标志位
				while(!k4)
				{
				if(num2==1)    //闹钟秒
					write_command_1602(0x80+0x40+14);    //第二行显示闹钟秒的位置 
				if(num2==2)   //闹钟分
					write_command_1602(0x80+0x40+11);    //第二行显示闹钟分的位置
				if(num2==3)  //闹钟时
					write_command_1602(0x80+0x40+8);    //第二行显示闹钟时的位置 
				if(num2==4)
					{
		            num2=0;
					flag2=0;     //清除标志位
					write_command_1602(0x0c);  //显示光标关 
					ds887_write_date(5,ahour);    //设置的 闹钟 时 写入887
					ds887_write_date(3,aminute);  //设置的 闹钟 分 写入887
					ds887_write_date(1,asecond);  //设置的 闹钟 秒 写入887 
					}
				}
			}
		}//------------------------------------------------k4键结束-------------------------------------------------------//
	}//-----------------------------------------------闹钟 时 分 秒 循环切换结束---------------------------------//
	//------------------------------------------------年 月 日 星期  时 分 秒调整函数开始-----------------------------------------//
	if(num1!=0)
		{
			//-------------------------------------------------------------num1 加函数开始-------------------------------------------------//
			if(k2==0)
			{
				delay_lcd1602(20);
				if(k2==0)    //按键加
				{
					while(!k2);
					if(num1==1)      //秒加
						{
						second++;
						if(second==60)
							second=0;
							write_1602add_two(6,second);      //设置后的数据要刷新1602屏,地址是屏的第二行位置6,数据是秒
							write_command_1602(0x80+0x40+6);  //设置要调节的地址,这一步必须放在此处 
						}
					if(num1==2)     //分加
						{
						minute++;
						if(minute==60)
							minute=0;
							write_1602add_two(3,minute);      //设置后的数据要刷新1602屏,地址是屏的第二行位置3,数据是分
							write_command_1602(0x80+0x40+3);  //设置要调节的地址,这一步必须放在此处 
						}
					if(num1==3)     //时加
						{
						hour++;
						if(hour==24)
							hour=0;
							write_1602add_two(0,hour);      //设置后的数据要刷新1602屏,地址是屏的第二行位置0,数据是时
							write_command_1602(0x80+0x40+0);  //设置要调节的地址,这一步必须放在此处 
						}
					if(num1==4)     //星期加
						{
						week++;
						if(week==8)
							week=1;
							write_1602add_one(14,week);      //设置后的数据要刷新1602屏,地址是屏的第一行位置14,数据是星期
							write_command_1602(0x80+14);  //设置要调节的地址,这一步必须放在此处 
						}
					if(num1==5)     //日加
						{
						date++;
						if(date==32)
							date=1;
							write_1602add_one(8,date);      //设置后的数据要刷新1602屏,地址是屏的第一行位置8,数据是日
							write_command_1602(0x80+8);  //设置要调节的地址,这一步必须放在此处 
						}
					if(num1==6)     //月加
						{
						month++;
						if(month==13)
							month=1;
							write_1602add_one(5,month);      //设置后的数据要刷新1602屏,地址是屏的第一行位置5,数据是月
							write_command_1602(0x80+5);  //设置要调节的地址,这一步必须放在此处 
						}
					if(num1==7)     //年加
						{
						year++;
						if(year==100)
							year=0;
							write_1602add_one(2,year);      //设置后的数据要刷新1602屏,地址是屏的第一行位置2,数据是年
							write_command_1602(0x80+2);  //设置要调节的地址,这一步必须放在此处 
						}


				}
			}//-------------------------------------------------------------num1 加函数结束-------------------------------------------------//
			if(k1==0)   //-------------------------------------------------------------num1 减函数开始-------------------------------------------------//
			{
				delay_lcd1602(20);
				if(k1==0)    //秒减
				{
					while(!k1);
					if(num1==1)    //秒减
					{
					second--;
					if(second==-1)
						second=59;
						write_1602add_two(6,second);      //设置后的数据要刷新1602屏
						write_command_1602(0x80+0x40+6);  //设置要调节的地址,这一步必须放在此处 
					}
					if(num1==2)     //分减
					{
					minute--;
					if(minute==-1)
						minute=59;
						write_1602add_two(3,minute);      //设置后的数据要刷新1602屏,地址是屏的第二行位置3,数据是分
						write_command_1602(0x80+0x40+3);  //设置要调节的地址,这一步必须放在此处 
					}
					if(num1==3)     //时减
					{
					hour--;
					if(hour==-1)
						hour=23;
						write_1602add_two(0,hour);      //设置后的数据要刷新1602屏,地址是屏的第二行位置0,数据是时
						write_command_1602(0x80+0x40+0);  //设置要调节的地址,这一步必须放在此处 
					}
					if(num1==4)     //星期减
					{
					week--;
					if(week==0)
						week=7;
						write_1602add_one(14,week);      //设置后的数据要刷新1602屏,地址是屏的第一行位置14,数据是星期
						write_command_1602(0x80+14);  //设置要调节的地址,这一步必须放在此处 
					}
					if(num1==5)     //日减
					{
					date--;
					if(date==0)
						date=31;
						write_1602add_one(8,date);      //设置后的数据要刷新1602屏,地址是屏的第一行位置8,数据是日
						write_command_1602(0x80+8);  //设置要调节的地址,这一步必须放在此处 
					}
					if(num1==6)     //月减
					{
					month--;
					if(month==0)
						month=12;
						write_1602add_one(5,month);      //设置后的数据要刷新1602屏,地址是屏的第一行位置5,数据是月
						write_command_1602(0x80+5);  //设置要调节的地址,这一步必须放在此处 
					}
					if(num1==7)     //年减
					{
					year--;
					if(year==-1)
						year=99;
						write_1602add_one(2,year);      //设置后的数据要刷新1602屏,地址是屏的第一行位置2,数据是年
						write_command_1602(0x80+2);  //设置要调节的地址,这一步必须放在此处 
					}
				} 
			}//---------------------------------------------------------num1 减函数结束------------------------------------------------//

		}//------------------------------------------------年 月 日 星期  时 分 秒调整函数结束-----------------------------------------//
		//-----------------------------num2 闹钟 时 分 秒加 开始---------------------------------------------//
	else if(num2!=0)     //-----------------------------------num2 开始-------------------------------------------------//
	{
		if(k2==0)        //-------------------------------------k2 加开始-----------------------------------------------//
		{
			delay_lcd1602(20);
			if(k2==0)
			{
				while(!k2);					
				if(num2==1)      //秒加
					{
					asecond++;
					if(asecond==60)
						asecond=0;
						write_1602add_two(14,asecond);      //设置后的数据要刷新1602屏,地址是屏的第二行位置14,数据是闹钟秒
						write_command_1602(0x80+0x40+14);  //设置要调节的地址,这一步必须放在此处 
					}
				if(num2==2)     //分加
					{
					aminute++;
					if(aminute==60)
						aminute=0;
						write_1602add_two(11,aminute);      //设置后的数据要刷新1602屏,地址是屏的第二行位置11,数据是闹钟分
						write_command_1602(0x80+0x40+11);  //设置要调节的地址,这一步必须放在此处 
					}
				if(num2==3)     //时加
					{
					ahour++;
					if(ahour==24)
						ahour=0;
						write_1602add_two(8,ahour);      //设置后的数据要刷新1602屏,地址是屏的第二行位置8,数据是时
						write_command_1602(0x80+0x40+8);  //设置要调节的地址,这一步必须放在此处 
					}
			}
		} //-----------------------------------k2 加结束-------------------------------------------------//
		if(k1==0)    //-------------------------------------k1 减开始-----------------------------------------------//
		{
			delay_lcd1602(20);
			if(k1==0)
			{
				while(!k1);					
					if(num2==1)      //秒加
					{
					asecond--;
					if(asecond==-1)
						asecond=59;
						write_1602add_two(14,asecond);      //设置后的数据要刷新1602屏,地址是屏的第二行位置14,数据是闹钟秒
						write_command_1602(0x80+0x40+14);  //设置要调节的地址,这一步必须放在此处 
					}
				if(num2==2)     //分加
					{
					aminute--;
					if(aminute==-1)
						aminute=59;
						write_1602add_two(11,aminute);      //设置后的数据要刷新1602屏,地址是屏的第二行位置11,数据是闹钟分
						write_command_1602(0x80+0x40+11);  //设置要调节的地址,这一步必须放在此处 
					}
				if(num2==3)     //时加
					{
					ahour--;
					if(ahour==-1)
						ahour=23;
						write_1602add_two(8,ahour);      //设置后的数据要刷新1602屏,地址是屏的第二行位置8,数据是时
						write_command_1602(0x80+0x40+8);  //设置要调节的地址,这一步必须放在此处 
					}
			}
		} //---------------------------------------k1 减结束----------------------------------------------------//
	}   //---------------------------------------num2 结束------------------------------------------------------------//

}  //===============================================按键扫描结束======================================================//

⌨️ 快捷键说明

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