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

📄 keypad.c

📁 51单片机驱动的LED点阵万年历显示
💻 C
字号:
#include<reg52.h>
#include<rtx51tny.h>
#include"inc/define.h"
#include"inc/keypad.h"
#include"inc/ds1302.h"
#include"inc/8_8led.h"
#include"inc/font.h"


sbit key_up=P1^0;
sbit key_down=P1^1;
sbit key_enter=P1^2;
sbit key_esc=P1^3;

extern vu8 code * idata time_tab;
extern vu8 code * idata week_tab;
extern vu8 code * idata tempert;


extern vu8 idata for_showh[6];
extern vu8 idata for_showl[6];
extern struct Pad ph[6],pl[6];

extern u8 timerTime[7][2];

extern bit show_menu;
extern u8 * pmenu;

u8 idata m_level=0;
u8 idata levl1_p=0;
u8 idata levl2_p=0;

u8 valid=0;		//防止不恰当进入才的操作,即仅有从Enter键进入才是合法的
u8 chge_time=0;
u8 idata chgeh[6];
u8 idata chgel[6];


void keyDown(void )	_task_ 2
{
	u8 i;
	u8 chge_num=0;
	u8 idata newTime[7][2];	
	while(1)
	{
		os_wait(K_SIG,0,0);
		
		if(!key_enter)
		{
			if(m_level==0)
			{
				m_level++;

				valid=1;
				show_menu=1;
			}
			else if(m_level==1)
			{				
				m_level++;

				if(levl1_p==0)
				{
					pmenu=m_font[0] + levl2_p*4*32;
				}
				else if(levl1_p==1)		//设置时间
				{
				 	for(i=0;i<6;i++)
					{
						chgeh[i]=for_showh[i];
						chgel[i]=for_showl[i];
					}
					if(ph[0].pn==1)
					{
						ph[0].pad[0] |=0x99;
						ph[0].pad[1] |=0x99;		//选中第一个字符
					}
					else if(ph[0].pn==2)
					{
						ph[0].pad[1] |=0x99;
						ph[0].pad[2] |=0x99;
					}

					chge_time=1;	
				}
				else if(levl1_p==2)		//定时
				{
				 	for(i=0;i<6;i++)
					{
					 	chgeh[i]=for_showh[i];
						chgel[i]=for_showl[i];
					}
					if(ph[0].pn==1)
					{
						ph[0].pad[0] |=0x99;
						ph[0].pad[1] |=0x99;		//选中第一个字符
					}
					else if(ph[0].pn==2)
					{
						ph[0].pad[1] |=0x99;
						ph[0].pad[2] |=0x99;
					}

					chge_time=1;
				}
			}
			else if(m_level==2)
			{
			//	m_level++; 		//至今菜单最深为二

				if(levl1_p==0)
				{
					if(levl2_p==0)
					{
						time_tab=time_tab_cgst[0];
						week_tab=week_tab_cgst[0];
						tempert=tempert_cgst[0];
					}
					else if(levl2_p==1)
					{
					 	time_tab=time_tab_jcst[0];
						week_tab=week_tab_jcst[0];
						tempert=tempert_jcst[0];
					}
					//退出菜单,显示时间
					show_menu=0;
					pmenu=menu[0] + levl1_p*(4*32);
					m_level=0;	//清除本次菜单操作的痕迹
					os_clear_signal(4);
					valid=0;	
				}
				else if(levl1_p==1)
				{	
					if(chge_num==11)
					{
						newTime[6][1]=chgeh[0];		//设置年
						newTime[6][0]=chgeh[1];
						newTime[4][1]=chgeh[2];		//设置月
						newTime[4][0]=chgeh[3];
						newTime[3][1]=chgeh[4];		//设置日
						newTime[3][0]=chgeh[5];
						newTime[2][1]=chgel[0];		//设置年
						newTime[2][0]=chgel[1];
						newTime[1][1]=chgel[2];		//设置分
						newTime[1][0]=chgel[3];
						newTime[0][1]=chgel[4];		//设置秒
						newTime[0][0]=chgel[5];
						
					   	pl[5].pad[0] &=0x66;
						pl[5].pad[1] &=0x66;
						setTime(newTime);
						m_level--;
						chge_num=0;
						chge_time=0;
					}
					else
					{
					 	chge_num++;
						if(chge_num<6)
						{
							if(ph[chge_num].pn==1)
							{
								ph[chge_num - 1].pad[1] &=0x66;
								ph[chge_num - 1].pad[2] &=0x66;
								ph[chge_num].pad[0] |=0x99;
								ph[chge_num].pad[1] |=0x99;		
							}
							else if(ph[chge_num].pn==2)
							{
								ph[chge_num - 1].pad[0] &=0x66;
								ph[chge_num - 1].pad[1] &=0x66;
								ph[chge_num].pad[1] |=0x99;
								ph[chge_num].pad[2] |=0x99;
							}
						}
						else
						{
						 	if(pl[chge_num -6].pn==1)
							{
								pl[chge_num -6-1].pad[1] &=0x66;
								pl[chge_num -6-1].pad[2] &=0x66;
								pl[chge_num-6].pad[0] |=0x99;
								pl[chge_num-6].pad[1] |=0x99;		
							}
							else if(pl[chge_num -6].pn==2)
							{
								pl[chge_num -6-1].pad[0] &=0x66;
								pl[chge_num -6-1].pad[1] &=0x66;
								pl[chge_num -6].pad[1] |=0x99;
								pl[chge_num -6].pad[2] |=0x99;
							}
						}
					}	
				}
				else if(levl1_p == 2)
				{
					if(chge_num==11)
					{
						timerTime[6][1]=chgeh[0];		//设置年
						timerTime[6][0]=chgeh[1];
						timerTime[4][1]=chgeh[2];		//设置月
						timerTime[4][0]=chgeh[3];
						timerTime[3][1]=chgeh[4];		//设置日
						timerTime[3][0]=chgeh[5];
						timerTime[2][1]=chgel[0];		//设置年
						timerTime[2][0]=chgel[1];
						timerTime[1][1]=chgel[2];		//设置分
						timerTime[1][0]=chgel[3];
						timerTime[0][1]=chgel[4];		//设置秒
						timerTime[0][0]=chgel[5];
						
					   	pl[5].pad[0] &=0x66;
						pl[5].pad[1] &=0x66;
						
						m_level--;
						chge_num=0;
						chge_time=0;
					}
					else
					{
					 	chge_num++;
						if(chge_num<6)
						{
							if(ph[chge_num].pn==1)
							{
								ph[chge_num - 1].pad[1] &=0x66;
								ph[chge_num - 1].pad[2] &=0x66;
								ph[chge_num].pad[0] |=0x99;
								ph[chge_num].pad[1] |=0x99;		
							}
							else if(ph[chge_num].pn==2)
							{
								ph[chge_num - 1].pad[0] &=0x66;
								ph[chge_num - 1].pad[1] &=0x66;
								ph[chge_num].pad[1] |=0x99;
								ph[chge_num].pad[2] |=0x99;
							}
						}
						else
						{
						 	if(pl[chge_num -6].pn==1)
							{
								pl[chge_num -6-1].pad[1] &=0x66;
								pl[chge_num -6-1].pad[2] &=0x66;
								pl[chge_num-6].pad[0] |=0x99;
								pl[chge_num-6].pad[1] |=0x99;		
							}
							else if(pl[chge_num -6].pn==2)
							{
								pl[chge_num -6-1].pad[0] &=0x66;
								pl[chge_num -6-1].pad[1] &=0x66;
								pl[chge_num -6].pad[1] |=0x99;
								pl[chge_num -6].pad[2] |=0x99;
							}
						}
					}
				}
			}
		}
		else if(!key_esc)
		{
			if(valid)
			{
				m_level--;
				if(m_level==1)
				{
					for(i=0;i<6;i++)	//不管菜单操作是否进行过时间调整或定时
					{					//把可能的对时间格式的潜在影响消除掉
						ph[i].pad[0] &=0x66;
						ph[i].pad[1] &=0x66;
						ph[i].pad[2] &=0x66;
						pl[i].pad[0] &=0x66;
						pl[i].pad[1] &=0x66;
						pl[i].pad[2] &=0x66;
					}

					if(levl1_p == 0)
					{
						pmenu=menu[0] + levl1_p*(4*32);
					}
					else if(levl1_p == 1 ||levl1_p == 2)
					{
						chge_num = 0;
						chge_time = 0;
					}
				}
				else if(m_level==0)
				{
					show_menu=0;
					m_level=0;	//清除本次菜单操作的痕迹
					os_clear_signal(4);
					valid=0;
				}
			}
		}
		else if(!key_up)
		{
			if(valid)
			{
				if(m_level==1)
				{	
					if(pmenu != menu[0])
					{
						pmenu -= 4*32;
						levl1_p--;
					}			 
				}
				else if(m_level==2)
				{
					if(levl1_p==0)
					{
					 	if(pmenu != m_font[0])
						{
							pmenu -= 4*32;
							levl2_p--;
						}
					}
					else if(levl1_p==1)
					{
						if(chge_num<6)
						{
						 	chgeh[chge_num] ++;
						}
						else
						{
						 	chgel[chge_num -6] ++;
						}	
					}
					else if(levl1_p==2)
					{
						if(chge_num<6)
						{
						 	chgeh[chge_num] ++;
						}
						else
						{
						 	chgel[chge_num -6] ++;
						}		
					}
				}
			}	 
		}
		else if(!key_down)
		{
			if(valid)
			{
				if(m_level==1)
				{
					if(pmenu != menu[2])
					{
						pmenu+=4*32;
						levl1_p++;
					}	
				}
				else if(m_level==2)
				{
					if(levl1_p==0)
					{
						if(pmenu != m_font[1])
						{
							pmenu += 4*32;
							levl2_p++;
						}
					}
					else if(levl1_p==1)
					{
						if(chge_num<6)
						{
						 	chgeh[chge_num] --;
						}
						else
						{
						 	chgel[chge_num -6] --;
						}	
					}
					else if(levl1_p==2)
					{
					  	if(chge_num<6)
						{
						 	chgeh[chge_num] --;
						}
						else
						{
						 	chgel[chge_num -6] --;
						}	
					}
				}
			}			   
		}		
	}
}


void keyServ(void ) interrupt 0 
{	
	 isr_send_signal(2);	 
}

⌨️ 快捷键说明

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