key2.c

来自「用单片机的C语言编的键盘递增递减的C程序的源代码(按一下键」· C语言 代码 · 共 488 行

C
488
字号
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define  _Nop()  _nop_()/*定义空指令*/

#define com8155 XBYTE[0xa100]//8155命令口
#define pa8155 XBYTE[0xa101]//8155pa口
#define pb8155 XBYTE[0xa102]//8155pb口
#define pc8155 XBYTE[0xa103]//8155pc口

sbit busy=P3^2;//中断



/*********************************************************************************
键盘扫描程序scan()
**********************************************************************************/

void delay()
{
 ;
}
/*******************************************************************/
//返回键值
/*******************************************************************/
uchar jianzhi(unsigned char l,unsigned char c)
{

 if(l==0x02)
 {switch(c){
  case 0x01: return(0x01);break;
  case 0x02: return(0x02);break;
  case 0x04: return(0x03);break;
  case 0x08: return(0x04);break;
  case 0x10: return(0x05);break;
  default:   break;
 }
 }
}
/*******************************************************************/
//扫描
/*******************************************************************/
uchar scan()  
{ 
 unsigned char row,scode;
 unsigned char keydata;
 row=0xff;
 com8155=0x02;
 pb8155=0x00;
 if(busy==0)
 {delay();/*延时去抖动*/
  if(busy==0)
  {scode=0xfe;//逐列扫描
   while((scode&0xff)!=0)
   {
    pb8155=scode;
    if(busy==0)
     {
      row=pc8155&0x30;//"0"代表键值所在位
      row=(row>>4)&0x03;
      keydata=jianzhi(row,~scode);
      return(keydata);
      break;
      }
     else
      scode=(scode<<1)|0x01;//列扫描码左移
    }
    
    delay();
   }
   }
}

/*********************************************************************************/
//定义递增和递减函数
//年递增
unsigned char Yearadd(unsigned char year)
{
	if(year&0x0f==0x09)
	{
		year=year&0xf0+0x10;
		}
	else
	{
		year=year+0x01;
		}
	return(year);
}
//年递减
unsigned char Yearsub(unsigned char year)
{
	if(year&0x0f==0x00)
	{
		if(year&0xf0==0x00)
		year=0x99;
		else
		year=year-0x10+0x09;
     }
     else
     {
     	year=year-0x01;
     	}
     return(year);
}
//月递增
unsigned char Monthadd(unsigned char month)
{
	if(month==0x12)
	{
		month=0x00;}
	else
	{
		if(month&0x0f==0x09)
		{
			month=0x10;}
		else
		{
			month=month+0x01;
			}
	}
return(month);
}
//月递减
unsigned char Monthsub(unsigned char month)
{
	if(month==0x01)
	{
		month=0x12;}
	else
	{
		if(month==0x10)
		{
			month=0x09;}
		else
		{
			month=month-0x01;}
			}
return(month);
}
//日递增
unsigned char Dayadd(unsigned char day)
{
	if(day==0x31)
	{
		day=0x01;}
	else
	{
		if(day&0x0f==0x09)
		{
			day=(day+0x10)&0xf0;}
		else
		{
			day=day+0x01;
			}
	}
return(day);
}

//日递减
unsigned char Daysub(unsigned char day)
{
	if(day==0x01)
	{
		day=0x31;}
	else
	{
		if(day&0x0f==0x00)
		{
			day=(day-0x10)+0x09;}
		else
		{
			day=day-0x01;}
			}
return(day);
}
//时递增
unsigned char Houradd(unsigned char hour)
{
	if(hour==0x23)
	{
		hour=0x00;}
	else
	{
		if(hour&0x0f==0x09)
		{
			hour=(hour+0x10)&0xf0;}
		else
		{
			hour=hour+0x01;
			}
	}
return(hour);
}
//时递减
unsigned char Hoursub(unsigned char hour)
{
	if(hour==0x00)
	{
		hour=0x23;}
	else
	{
		if(hour&0x0f==0x00)
		{
			hour=(hour-0x10)+0x09;}
		else
		{
			hour=hour-0x01;}
			}
return(hour);
}
//分递增
unsigned char Minuteadd(unsigned char minute)
{
	if(minute==0x59)
	{
		minute=0x00;}
	else
	{
		if(minute&0x0f==0x09)
		{
			minute=(minute+0x10)&0xf0;}
		else
		{
			minute=minute+0x01;
			}
	}
return(minute);
}
//分递减
unsigned char Minutesub(unsigned char minute)
{
	if(minute==0x00)
	{
		minute=0x59;}
	else
	{
		if(minute&0x0f==0x00)
		{
			minute=(minute-0x10)+0x09;}
		else
		{
			minute=minute-0x01;}
			}
return(minute);
} 
//星期递增
unsigned char Dateadd(unsigned char date)
{
	if(date==0x06)
	{
		date=0x00;}
	else
	{
	    date=date+0x01;
	 }
return(date);
}
//星期递减
unsigned char Datesub(unsigned char date)
{
	if(date==0x00)
	{
		date=0x06;}
	else
	{
	    date=date-0x01;
	 }
return(date);
}
/*********************************************************************************/
void key_function( void )
{unsigned char   year,month,day,hour,minute,second,date;//date星期
 unsigned char keydata;
 unsigned char index;//index为年月日时分秒的选择键值
 /*运用5个功能键,其作用分别为
   键1:进入时间写入功能,键值为0x00
   键2:年月日时分秒选择键,键值为0x01
   键3:递增,键值为0x02
   键4:递减,键值为0x03
   键5:确认键,退出时间设置功能,键值0x04*/
 keydata=scan();
 if(keydata==0x01)
/*下面为年月日时分秒的选择,index
   0x01:年;0x02:月;0x03:日;0x04:时;0x05:分;0x06:秒;0x07:星期*/
 {for(index==0x00;index<0x08;index++)
 	{keydata=scan();
     if(keydata==0x02)
        continue;
     else
        break;
     }
  switch(index)
  {
  	case 0x01:{                              //年
  		if(keydata==0x03)
  		   {year=Yearadd(year);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x03)
  		   		{year=Yearadd(year);
  		   	     continue;}
  		   	     else
  		   	     break;
	   	    }
   	       }
  		if(keydata==0x04)
  		   {year=Yearsub(year);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x04)
  		   		{year=Yearsub(year);
  		   	     continue;}
  		   	     else
  		   	     break;
  		   	 }
  		   	}
	   	       } 
	   	       break;
    case 0x02:{                              //月
  		if(keydata==0x03)
  		   {month=Monthadd(month);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x03)
  		   		{month=Monthadd(month);
  		   	     continue;}
  		   	     else
  		   	     break;
	   	    }
   	       }
  		if(keydata==0x04)
  		   {month=Monthsub(month);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x04)
  		   		{month=Monthsub(month);
  		   	     continue;}
  		   	     else
  		   	     break;
  		   	 }
  		   	}
	   	       }
	   	       break;
    case 0x03:{                              //日
  		if(keydata==0x03)
  		   {day=Dayadd(day);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x03)
  		   		{day=Dayadd(day);
  		   	     continue;}
  		   	     else
  		   	     break;
	   	    }
   	       }
  		if(keydata==0x04)
  		   {day=Daysub(day);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x04)
  		   		{day=Daysub(day);
  		   	     continue;}
  		   	     else
  		   	     break;
  		   	 }
  		   	}
	   	       }
	   	       break;
    case 0x04:{                              //时
  		if(keydata==0x03)
  		   {hour=Houradd(hour);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x03)
  		   		{hour=Houradd(hour);
  		   	     continue;}
  		   	     else
  		   	     break;
	   	    }
   	       }
  		if(keydata==0x04)
  		   {hour=Hoursub(hour);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x04)
  		   		{hour=Hoursub(hour);
  		   	     continue;}
  		   	     else
  		   	     break;
  		   	 }
  		   	}
	   	       }
	   	       break;
    case 0x05:{                              //分
  		if(keydata==0x03)
  		   {minute=Minuteadd(minute);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x03)
  		   		{minute=Minuteadd(minute);
  		   	     continue;}
  		   	     else
  		   	     break;
	   	    }
   	       }
  		if(keydata==0x04)
  		   {minute=Minutesub(minute);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x03)
  		   		{minute=Minutesub(minute);
  		   	     continue;}
  		   	     else
  		   	     break;
  		   	 }
  		   	}
	   	       }
	   	       break;
    case 0x06:{                              //秒
  		if(keydata==0x03)
  		   {second=Minuteadd(second);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x03)
  		   		{second=Minuteadd(second);
  		   	     continue;}
  		   	     else
  		   	     break;
	   	    }
   	       }
  		if(keydata==0x04)
  		   {second=Minutesub(second);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x03)
  		   		{second=Minutesub(second);
  		   	     continue;}
  		   	     else
  		   	     break;
  		   	 }
  		   	}
	   	       }
	   	       break;
    case 0x07:{                              //星期
  		if(keydata==0x03)
  		   {date=Dateadd(date);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x03)
  		   		{date=Dateadd(date);
  		   	     continue;}
  		   	     else
  		   	     break;
	   	    }
   	       }
  		if(keydata==0x04)
  		   {date=Datesub(date);
  		   	for(;;)
  		   	{keydata=scan();
  		   		if(keydata==0x03)
  		   		{date=Datesub(date);
  		   	     continue;}
  		   	     else
  		   	     break;
  		   	 }
  		   	}
	   	       }
	   	       break;
	 
    default: break;
  }
  }
  else
  { keydata=scan();
  	if(keydata==0x05)
  	{}
  	}

}

void main( void )
{
	key_function();
 } 

⌨️ 快捷键说明

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