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 + -
显示快捷键?