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

📄 key.c

📁 用NXP公司P89LPC9401单片机开发液晶显示,包括开发资料,各功能驱动程序.
💻 C
字号:
//****************************************************************
//FILE:	key.c
//功能:	按键识别和按键处理	
//****************************************************************
#include <REG931.H>
#include"main.h"
#include"pcf8576d.h"
#include"time.h"
#include"ctime.h"
#include"spi.h"
//****************************************************************
uchar	KeyNum;							//按键ID
bit		KeyFlag;						//按键有效标志
uchar 	ModifyP;						//修改状态指示()0-2
uchar	Mode;							//系统模式
//****************************************************************
void  KeyPressed()  interrupt 7			//按键中断服务函数
{
	uint 	delay;						//延时变量
	KeyFlag	=1;							//置位按键有效标志
	for(delay=10000;delay>0;delay--);	//延时去抖动
	if(!MODEKEY)						//如果是模式按键
	{				
		KeyNum=1;						//按键ID设为1
		if(Mode<8)	
			Mode++;						//模式<8模式加1
		else	
			Mode=1;						//否则模式设置为1
		while(!MODEKEY);				//等待按键释放
	}
	else if(!MODIFY)					//如果是MODIFY按键
	{
		KeyNum=2;						//把按键盘ID设为2						
		while(!MODIFY);					//等待按键释放			
	}
	else if(!ADD)						//如果是ADD按键
	{
		KeyNum=3;						//把按键ID设为3
		while(!ADD);					//等待按键释放
	}
	else if(!DEC)						//如果是ADDH按键
	{
		KeyNum=4;						//把按键ID设为4	
		while(!DEC);					//等待按键释放
	}
	else if(!ENTER)						//如果是确认按键
	{
		KeyNum=5;						//将按键ID设为5
		while(!ENTER);					//等待按键释放
	}
	else	KeyFlag=0;					//无效按键,清楚按键标志
	for(delay=10000;delay>0;delay--);	//延时去抖动
	KBCON=0x00;							//清楚按键中断标志
}
//****************************************************************
void  ModeKeyP()						//模式键服务程序
{
		SendDatTo595(0xff<<Mode);		//指示当前模式
		if(Mode==2)						//如果是星期模式
			GetWeek();					//需要进行公历到星期的换算
		if(Mode==5)						//如果是农历模式
			ConvertDate();				//需要将进行农历换算
		PCF8576Mode(1);					//显示当前模式内容
		ModifyP=0;						//清零修改状态
}
//****************************************************************
void  AddorDecKeyP()					//加或减按键服务程序
{
	bit	modifytype;
	if(ModifyP!=0)						//如果当前修改状态有效
	{									//则进行数据调整
		if(KeyNum==3)					//如果是ADD按键
			modifytype=1;				//置修改类型为1(加)
		else							//否则置为0(减)
			modifytype=0;				
		if(Mode==1)		 				//如果是时间模式
		{
			if(ModifyP==1)				//修改状态为1(状态只有0,1,2)
				ModifyHour(modifytype);	//则对小时进行修改
			else						//为2则对分钟进行修改	
				ModifyMinute(modifytype);
		}
		else if(Mode==3)				//如果是日期模式
 		{	
			if(ModifyP==1)				//修改状态为1
				ModifyMonth(modifytype);//则对月进行修改
			else							
				ModifyDay(modifytype);	//否则对日进行修改
		}
		else if(Mode==4)				//如果是年模式
		{
			ModifyYear(modifytype);		//则对年进行修改
		}
		else if(Mode==7)				//如果是闹钟模式
		{
			if(ModifyP==1)				//状态为1,则对闹钟小时修改
				ModifyAlarmHour(modifytype);
			else						//否则对闹钟分钟进行修改
				ModifyAlarmMinute(modifytype);
		}
	}

}
//****************************************************************
void  ModifyKeyP()						//修改按键服务函数
{
	if(Mode==1||Mode==3||Mode==4||Mode==7)//判断是否是可修改模式
	{
		if(Mode==4)						//如果是年模式,状态设置为2
			ModifyP=2;					//只允许修改低位(0-99)
		else 							//如果是其它可修改模式		
		{								
			if(ModifyP<2)				//使状态在1和2之间切换
				ModifyP++;				//置为2
			else
				ModifyP--;				//置为1
		 }
	}
}
//****************************************************************
void  KeyProcess()						//按键处理函数
{
	if(KeyNum==1)						//如果是模式按键
		ModeKeyP();						//调用模式键服务程序		
	else if(KeyNum==2)					//如果是修改按键
		ModifyKeyP();					//调用修改按键服务
	else if(KeyNum==3||KeyNum==4)		//如果是加减键
		AddorDecKeyP();					//调用加减服务
	else if(KeyNum==5)					//如果是确认键
		ModifyP=0;						//清楚修改状态
}
//*****************************END********************************		


⌨️ 快捷键说明

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