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

📄 inc_dec.c

📁 基于8051单片机的矩阵键盘程序,实现键盘值的扫描
💻 C
字号:
//*******************************************************
//proteus仿真论坛:http://proteus.5d6d.com
//*******************************************************
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P3^0;
sbit clk=P3^1;
sbit com1=P2^0;
sbit com2=P2^1;
sbit inc=P1^0;
sbit dec=P1^7;

uchar yansi,key,send,ge,si,num,keynum;
bit	keybz;

uchar code table[]={
0x03,0x9f,0x25,0x0d,0x99,
0x49,0x41,0x1f,0x01,0x09};

void delay(uchar yansi)
{
	uchar x,y;
	for(x=yansi;x>0;x--)
			for(y=110;y>0;y--);
}



void sendbyte(send)					//模拟发送程序
{    
        uchar c,aa; 
        	aa=send;
   			for(c=0;c<8;c++)
		        {
				  	clk=0;
					aa=aa>>1;
					sda=CY;
					clk=1;
		        }
}

void display(uchar si,uchar ge)
{
	if(si!=0)
	{
	send=table[si];
	sendbyte(send);
	com1=1;
	delay(10);
	com1=0;
	}
		
	send=table[ge];
	sendbyte(send);
	com2=1;
	delay(10);
	com2=0;
	

}

void init()
{
	ge=0;
	si=0;
	P1=0xff;
	P2=0;
	key=100;
}
void keyscan()			//具有连加功能的的按键扫描程序
{
/***************以下是加键处理******************************************************************/
	if(inc==0)							//判断INC键是否按下?
		{
			display(si,ge);					//延时去抖动
			if(inc==0)					//如果真接下就去执行键盘程序
			{
				if(keybz==0)				//判断是否是第一次按下?
						{
							num++;		//值加一
							if(num==100)	//判断是否加到100	
								{num=0;}//加到100清0
							keybz=1;	//第一次进来置标志位
							key--;		//按键次数计数器
							keynum=5;	//快加按键次数计数器
							si=num/10;	//BCD码转为十进制值
							ge=num%10;
							return;		//不用检测松手直接返回
									
						}
					else				//如果是第二次按下则执行下面的语句
					{
						if(key==0)		//判断按键次数到100次了吗?		
							{
							if(keynum==0)	//检测按下时间是否超过加5次的时间
								{
									key=10;		//如果按键持续时间超过加5次的时间则以后每10次执行加工厂操作
									num++;
									if(num==99)
										{
											num=0;
										}
									si=num/10;
									ge=num%10;
									return;
								}
							  else		//没有到5次时间则执行下面的语句
								  keynum--;	//快加计数器减一
								  key=100;
								  num++;
							  if(num==99)
								  {
								  num=0;
								  }
							  si=num/10;
							  ge=num%10;
							  return;
								  
							}
						else			//没有到100次下次再来判断.
							key--;
							return;
					
					}

										
			}

			if(inc!=0)							//松手后所有的计数器清并置默认值
				{
					keynum=5;
				        key=30;
					keybz=0;
					return;						//返回
				}		    
		}
/*************************以下是减一键处理程序,执行效果同加一程序*******************************************************************/	
	if(dec==0)
		{
			display(si,ge);
			if(dec==0)
			{
				if(keybz==0)
					{
						num--;
						if(num==-1)
							{num=99;}
						keybz=1;
						key--;
						keynum=5;
						si=num/10;
						ge=num%10;
						return;
								
					}
				else
					{
						if(key==0)
							{
							if(keynum==0)
								{
								key=10;
								num--;
								if(num==0)
									{
										num=99;
									}
								si=num/10;
								ge=num%10;
								return;
								}
							  else
							  keynum--;
							  key=100;
							  num--;
							  if(num==0)
								  {
								  num=99;
								  }
							  si=num/10;
							  ge=num%10;
							  return;
								  
							}
						else
							key--;
							return;
					
					}

										
			}

				    
		}
	if(dec!=0)
		{
			keynum=5;
		        key=30;
			keybz=0;
			return;
		}
}
void main()
{
	init();
	while(1)
				{
					display(si,ge);
					keyscan();	
					
	
				}
	
}
				

⌨️ 快捷键说明

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