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

📄 key_scan.c

📁 一个基于51单片机的定时报警设计电路及程序
💻 C
字号:
#include<reg52.h>
#include<ds1307.h>

#define KEY_IDEL 0x00
#define KEY_DELAY 0x01
#define WAIT_KEY_OPEN 0x02
#define DISP_TIME  0x03
#define SET_TIME   0x04
#define SET_ALARM_TIME 0x05
#define DISP_ALARM_TIME 0x06

#define KEY_STATE 0xff
#define KEY_DELAY_TIME 10

sbit BEEP=P1^2;

unsigned char time_base;
unsigned char led_buf[6];
unsigned char disflag[6]={0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char KeyDelaytime;
unsigned char key;
unsigned char Key_v;
unsigned char Key45_v;
unsigned char Keystate;
unsigned char n,flag;
unsigned char Sec, Min, Hrs;
unsigned char Machine_State;
unsigned char led_control;
unsigned char alarm_disp_contol;
unsigned char alarm_conter;
unsigned char alarm_time[9][2];

void key_pro(unsigned char Key_v)
{
	unsigned char min_low,min_high,hrs_low,hrs_high,i;
//	unsigned char min_lowtemp,min_hightemp,hrs_lowtemp,hrs_hightemp;
	switch(Key_v&0xff)
	{
		case 0xfe ://功能键
			switch(Machine_State)
			{
				case DISP_TIME:
					led_control=1;
					Machine_State=SET_TIME;
					for(i=0;i<6;i++)
					{
						led_buf[i]=zimo[0];
					}
					led_buf[4]=zimo[1];
				break;
				case SET_TIME:	
					led_control=1;
					Machine_State=SET_ALARM_TIME;
					for(i=0;i<6;i++)
					{
						led_buf[i]=zimo[0];
					}
					led_buf[4]=zimo[2];
				break;
				case SET_ALARM_TIME:
					Machine_State=DISP_ALARM_TIME;
					for(i=0;i<6;i++)
					{
						led_buf[i]=zimo[0];
					}
					led_buf[4]=zimo[3];
				break;
				case DISP_ALARM_TIME:
					Machine_State=DISP_TIME;
				break;
			 }
		   break;
		case 0xfd ://确认键
			switch(Machine_State)
			{
				case DISP_TIME:
					BEEP=0;
				case SET_TIME:
					switch(led_control)
					{
						case 2:
							min_low=Key45_v;
						break;
						case 3:
							min_high=Key45_v;
						break;
						case 4:
							hrs_low=Key45_v;
						break;
						case 5:
							hrs_high=Key45_v;
						break;
					}
					Key45_v=0;
					led_control++;
					if(led_control==6)
					{
						Sec=0x00;
						Min=(min_high<<4)|min_low;
						Hrs=(hrs_high<<4)|hrs_low;
						Init_Rtc(Sec,Min,Hrs);
						Machine_State=DISP_TIME;
						led_control=0;
					}
				break;
				case SET_ALARM_TIME:
					switch(led_control)
					{
						case 2:
							min_low=Key45_v;
						break;
						case 3:
							min_high=Key45_v;
						break;
						case 4:
							hrs_low=Key45_v;
						break;
						case 5:
							hrs_high=Key45_v;
						break;
					}
					Key45_v=0;
					led_control++;
					if(led_control==6)
					{
						alarm_time[alarm_conter][0]=(min_high<<4)|min_low;
						alarm_time[alarm_conter][1]=(hrs_high<<4)|hrs_low;
						alarm_conter++;
						led_control=0;
						if(alarm_conter==9)
						{
							alarm_conter=0;
						}
						Machine_State=DISP_TIME;
					}
				break;
				case DISP_ALARM_TIME:
					alarm_disp_contol++;
					if(alarm_disp_contol==alarm_conter)
					{
						Machine_State=DISP_TIME;
						alarm_disp_contol=0;
					}
				break;
			}
		   break;
		case 0xfb ://调节亮度键
			key++;
			if(key==8)key=0;
			break;
		case 0xf7 ://增加键
			Key45_v++;
			if(Key45_v==10)Key45_v=0;
			break;
		case 0xef ://减少键
			Key45_v--;
			if(Key45_v==-1)Key45_v=9;
			break;
	 }
}

void scan_key()
{
	switch(Keystate)
	{
		case KEY_IDEL :
			Key_v=P3;
			if(Key_v!=KEY_STATE)
			{
				Keystate=KEY_DELAY;
				KeyDelaytime=0;
			P3=0xff;
			}
		break;
		case KEY_DELAY :
			if(KeyDelaytime>=KEY_DELAY_TIME)
			{
				P3=0xff;
				Key_v=P3;
				if(Key_v!=KEY_STATE)
				{
					key_pro(Key_v);
					Keystate=WAIT_KEY_OPEN;
				}
				else
				{
					Keystate=KEY_IDEL;
				}
			}
		break;
		case WAIT_KEY_OPEN :
			P3=0xff;
			Key_v=P3;
			if(Key_v==KEY_STATE)Keystate=KEY_IDEL;
		break;
   }
}


			
int main()
{
//	unsigned char min_low,min_high,hrs_low,hrs_high;
	unsigned char min_lowtemp,min_hightemp,hrs_lowtemp,hrs_hightemp;
	P0 = 0xff;
	P2 = 0xff;
	TMOD = 0x01;
	TH0 = 0xfe;
	TL0 = 0x0c;
	IE = 0x82;
	flag=0;
	key=0;
	alarm_disp_contol=0;
	BEEP=0;
	Key45_v=0;
	led_control=0;
	alarm_conter=0;
	Keystate=KEY_IDEL;
	Machine_State=DISP_TIME;
	TR0=1;
	while(1)
	{
		scan_key();
	
		switch(Machine_State)
		{
			case DISP_TIME :
				disp_time();
				for(i=0;i<alarm_conter;i++)
				{
					if(Min==alarm_time[i][0]&&Hrs==alarm_time[i][1])
					{
						BEEP=1;
					}
					else
					{
						BEEP=0;
					}
				 }
			break;
			case SET_TIME:
				led_buf[led_control]=zimo[Key45_v];
			break;
			case SET_ALARM_TIME:
				led_buf[led_control]=zimo[Key45_v];
		   	break;
			case DISP_ALARM_TIME:
				led_buf[4]=zimo[alarm_disp_contol+1];
				min_hightemp=(alarm_time[alarm_disp_contol][0]&0xf0)>>4;
				min_lowtemp=alarm_time[alarm_disp_contol][0]&0x0f;
				hrs_hightemp=(alarm_time[alarm_disp_contol][1]&0xf0)>>4;
				hrs_lowtemp=alarm_time[alarm_disp_contol][1]&0x0f;
				led_buf[3]=zimo[hrs_hightemp];
				led_buf[2]=zimo[hrs_lowtemp];
				led_buf[1]=zimo[min_hightemp];
				led_buf[0]=zimo[min_lowtemp];
		   break;
		}
	}
}

void timer0(void) interrupt 1
{
	TH0=0xfe;
	TL0=0x0c;
	KeyDelaytime++;
	time_base++;
	if(flag<key+1)
	{
		P0=led_buf[n];
		P2=disflag[n];
	 }
	else
	{
		P2=0x00;
		P0=0;
	 }
	 flag++;
	 if(flag==8)
	 {
		n++;
		if(n==6)
		{
			n=0;
		}
		flag=0;
	}
}

⌨️ 快捷键说明

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