这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » STC51单片机实例之07独立按键的使用

共3条 1/1 1 跳转至

STC51单片机实例之07独立按键的使用

高工
2014-03-20 00:12:29     打赏
/********************************************************************
* 文件名  : 独立按键.c
* 描述    :  该程序实现独立按键的判断,按了相应的独立按键后,在LED上进行表现。
	
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

sbit KEY1 = P3^2;    
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;

sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2; 
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
	uint i,j;
	for(i=0; i<del; i++)
	for(j=0; j<1827; j++)   
	;
}

/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,并在LED上显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void KEY()
{
	if(KEY1==0 || KEY2==0 || KEY3==0)	
	{
		Delay(2);   		//20毫秒软件防抖
		if(KEY1 == 0)
		{ 
			LED1 = 0;
			LED2 = 1;
			LED3 = 1;
		}
		if(KEY2 == 0)
		{			
			LED1 = 1;
			LED2 = 0;
			LED3 = 1;
		}
		if(KEY3 == 0)
		{			
			LED1 = 1;
			LED2 = 1;
			LED3 = 0; 
		}
		Delay(50);			//延时0.5秒再进行下次按键的检测
	}	
}
/********************************************************************
* 名称 : Main()
* 功能 : 实现按键控制LED的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	while(1)
	{
		 KEY();
	}
}

 

/********************************************************************
* 文件名  : 数码管字符显示.c
* 描述    :  按下按键,数码管上显示的数字加1。

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit KEY = P3^2;
uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
	uint i,j;
	for(i=0; i<del; i++)
	for(j=0; j<1827; j++)    
	;
}
/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	uchar i = 0;
	P2 = 7;
	while(1)
	{
		P0 = table[i%16];		   //这里i%16是防止table中的数据在0--15,不会溢出
		if(KEY == 0)
		{
			i++;
			Delay(30);			   //延时0.3秒,防止按一次按键,程序自加多次的情况
		}
	}
}

 

/********************************************************************
* 文件名  : 独立按键.c
* 描述    :  数码管上最开始显示“88”。
 			 按S1,数码管上的值减1.
			 按S2,数码管上的值加1.

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

sbit KEY1 = P3^2;    
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;

uint i=88;

//数码管的段码编码
uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//下一行的数组可以显示数值外,还可以显示数码管的点
uchar table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
	uint x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uchar temp)
{
	uchar j;
	for(j=0;j<temp;j++)
	{
		P0 = table[(i/10)%10];
		P2 = 6; 
		Delay_1ms(5);
		P0 = table[i%10];
		P2 = 7; 
		Delay_1ms(5);
	}
}

/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,并在LED上显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar KEY(void)
{
	if(KEY1==0 || KEY2==0 || KEY3==0)	
	{
		Delay(2);   		//20毫秒软件防抖
		if(KEY1 == 0)
		{ 
			Delay(10);
			return 1;
		}
		if(KEY2 == 0)
		{			
			Delay(10);
			return 2;
		}
		if(KEY3 == 0)
		{			
			Delay(10);
			return 3; 
		}
		Delay(10);		
	}
	return 0;	
}
/********************************************************************
* 名称 : Main()
* 功能 : 实现按键控制LED的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	uchar temp;	
	while(1)
	{
		temp = KEY();
		if(temp == 1)
		{
			i--;
		}
		if(temp == 3)
		{
			i++;
		}			 
	    P0 = 0;
		P2 = 6; 
		P0 = table[(i/10)%10];
		Delay_1ms(3);
	    P0 = 0;
		P2 = 7; 
		P0 = table[i%10];
		Delay_1ms(3);
	}
}

 

/********************************************************************
* 文件名  : 独立按键.c
* 描述    :  这个代码相对于初学者比较麻烦一些。
			 在数码管上显示全是0.
			 当按下S18,这个时候是选择某一位数码管,数码管会稍微亮一些。
			 当按下S19或S17, 这时被选择的那位数码管可以进行加减控制。

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

sbit KEY1 = P3^2;    
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;

//数码管的段码编码
uchar table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar SLED[8]={0};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
	uint x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 16ms * del	,
		 在延时函数中加入了数码管的操作,
         这样按下按键后延时,数码管不会闪烁。
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uchar temp)
{
	uchar i,j;
	for(j=0;j<temp;j++)
	{
		for(i=0;i<8;i++)
		{
			P0 = 0;
			P2 = i;
			P0 = table[SLED[i]]; 
			Delay_1ms(2);
		}
	}
}

/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,并在LED上显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar KEY(void)
{
	if(KEY1==0 || KEY2==0 || KEY3==0)	
	{
		Delay(2);   		//20毫秒软件防抖
		if(KEY1 == 0)
		{ 
			Delay(10);
			return 1;
		}
		if(KEY2 == 0)
		{			
			Delay(10);
			return 2;
		}
		if(KEY3 == 0)
		{			
			Delay(10);
			return 3; 
		}
		Delay(10);
		return 0;
	}
	return 0;	
}
/********************************************************************
* 名称 : Main()
* 功能 : 实现按键控制LED的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	uchar temp,i=0,j=0,cs=0;
	while(1)
	{
		temp = KEY();
		if(temp == 1)
		{
			if(SLED[cs] != 0)
			{
				SLED[cs] = SLED[cs] - 1;		//被选数码管的值减1
			}
		}
		if(temp == 2)	
		{
			if(cs != 7)
			{
				cs++;		 					//被选数码管右移一位
			}
			else
			{
				cs = 0;
			}			
		}
		if(temp == 3)
		{
			if(SLED[cs] != 9)
			{
				SLED[cs] = SLED[cs] + 1;	  	//被选数码管的值加1
			}
		}
		for(i=0;i<8;i++)
		{
	    	if(i != cs)
			{
				P0 = 0;
				P2 = i; 
				P0 = table[SLED[i]];
				Delay_1ms(1);
			}									 
			else								 //如果是被选择的那个数码管,进入下面控制
			{
				P0 = 0;
				P2 = i; 
				P0 = table[SLED[i]];
				Delay_1ms(10);					 //延时时间长一点,这时,数码管更亮
			}
		}	
	}
}

 

/********************************************************************
* 文件名  : 数码管字符显示.c
* 描述    :  按下S19按键,数码管上显示的数字加1。

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit KEY = P3^2;
/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	uchar i = 0;
	P2 = 0xfe;
	while(1)
	{
		if(KEY == 1)
		{
			P0 = 0x76;  //"H";		 
		}
		if(KEY == 0)
		{
			P0 = 0x38;  //"L"	
		}
	}
}

 

/********************************************************************
* 文件名  : 独立按键.c
* 描述    :  首先,在点阵的中间显示一个点。
             当您按独立按键的下方或者左右的时候,点阵会随之移动。
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit KEY1 = P3^2;    //点左移
sbit KEY2 = P3^3;    //点下移
sbit KEY3 = P3^4;	 //点右移

unsigned char tabP0[]={0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00};
unsigned char tabP2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
	uint x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,并在LED上显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar KEY(void)
{
	if(KEY1==0 || KEY2==0 || KEY3==0)	
	{
		Delay_1ms(20);   		//20毫秒软件防抖
		if(KEY1 == 0)
		{ 
			Delay_1ms(100);			//延时0.5秒再进行下次按键的检测
			return 1; 
		}
		if(KEY2 == 0)
		{			
			Delay_1ms(100);			//延时0.5秒再进行下次按键的检测
			return 2;
		}
		if(KEY3 == 0)
		{			
			Delay_1ms(100);			//延时0.5秒再进行下次按键的检测
			return 3;  
		}
		return 0;
	}
	return 0;	
}
/********************************************************************
* 名称 : Main()
* 功能 : 实现按键控制LED的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	uchar i,j,tempP0;
	while(1)
	{
		 for(i=0; i<8; i++)
		 {
		 	if(tabP0[i] != 0)
			{
				tempP0 = i;				  				  //这里的目的是找出现在的点在哪行
			}
		 }
		 
		 switch(KEY())
		 {
		 	case 1:					
				if(tempP0 != 7)							   //没有到边
				{	
					tabP0[tempP0+1]=tabP0[tempP0];		   //把数据传给数组的另一位
					tabP0[tempP0]=0x00;					   //本身的这位清零
				} 	
				break;
			case 2:
				j=tabP0[tempP0]; 							//把j的值左移一位
				j = _crol_(j,1);						  
				tabP0[tempP0]=j;				
				break;
			case 3:	
				if(tempP0 != 0)					 			//没有到边
				{
					tabP0[tempP0-1]=tabP0[tempP0];			//把数据传给数组的另一位
					tabP0[tempP0]=0x00;						//本身的这位清零
				}	
				break;		
			default:
				break;

		 }
		 for(i=0;i<8;i++)
		 {
			P0=0;
			P2=tabP2[i];
			P0=tabP0[i];
			Delay_1ms(2);
		 }	
	}
}

 

/********************************************************************
* 文件名  : 点阵显示.c
* 描述    :  按下相应的独立按键,会在数码管上显示相应的左右中
             按S19显示左
			 按S18显示中
			 按S17显示右
***********************************************************************/
#include <reg52.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit KEY1 = P3^2;    
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;

unsigned char code tabP2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
//中 的编
unsigned char code tabP0ZHONG[]={0x00,0x3C,0x24,0x24,0xFF,0x24,0x24,0x3C};
//“左”的
unsigned char code tabP0Z[]={0x00,0x94,0x94,0xF4,0x9F,0x94,0x24,0x44};
//“右”的
unsigned char code tabP0Y[]={0x00,0xF4,0x94,0x94,0x9F,0xF4,0x24,0x44};


/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uchar i)//1ms延时
{
	uchar x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}
/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,并在LED上显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar KEY(void)
{
	if(KEY1==0 || KEY2==0 || KEY3==0)	
	{
		Delay_1ms(20);   		//20毫秒软件防抖
		if(KEY1 == 0)
		{ 
			Delay_1ms(100);			//延时0.1秒再进行下次按键的检测
			return 1; 
		}
		if(KEY2 == 0)
		{			
			Delay_1ms(100);			//延时0.1秒再进行下次按键的检测
			return 2;
		}
		if(KEY3 == 0)
		{			
			Delay_1ms(100);			//延时0.1秒再进行下次按键的检测
			return 3;  
		}
		return 0;
	}
	return 0;	
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
	int i,temp,flag;
	while(1)
	{
		temp = KEY();
		if(temp != 0)				   //这里判断是否按键按下,按下后,才改变要显示的值
		{
			flag = temp;			   //存标志
		}
		for(i=0;i<8;i++)
		{
			P0=0;
			P2=tabP2[i];
			if(flag == 1)
			{  	
				P0=tabP0Z[i];		   //显示“左”
			}
			if(flag == 2)
			{
				P0=tabP0ZHONG[i];	   //显示 中
			}
			if(flag == 3)
			{
				P0=tabP0Y[i];		   //显示“右”
			}
			Delay_1ms(2);
		}		
	}
}

 

/********************************************************************
* 文件名  : 独立按键.c
* 描述    :  该程序实现独立按键的判断,按了相应的独立按键后,
             会在数码管上显示最先被按下的值,只有按复位按键或者重新开电才消失。

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

sbit KEY1 = P3^2;    
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;

//数码管的段码编码
uchar table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
	uint x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}


/********************************************************************
* 名称 : Delay()
* 功能 : 实现按键功能,并在LED上显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar KEY(void)
{
	if(KEY1==0 || KEY2==0 || KEY3==0)	
	{
		Delay_1ms(20);   		//20毫秒软件防抖
		if(KEY1 == 0)
		{ 
			Delay_1ms(200);
			return 1;
		}
		if(KEY2 == 0)
		{			
			Delay_1ms(200);
			return 2;
		}
		if(KEY3 == 0)
		{			
			Delay_1ms(200);
			return 3; 
		}
		Delay_1ms(200);
	}
	return 0;	
}
/********************************************************************
* 名称 : Main()
* 功能 : 实现按键控制LED的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	uchar temp,i=0,j=0,cs=0;
	while(1)
	{
		temp = KEY();					 //判断是否有按键按下
		if(temp != 0)
		{
			break;						 //如果按下,那么退出循环
		}
	}
	P0 = table[temp];				     //显示是哪个按键按下了
	P2 = 7; 
	while(1);							 //程序停止
}

 

/********************************************************************
* 文件名  :  步进电机.c
* 描述    :  按键的长短键操作。
             按了按键后,数码管的值加减1。
			 如果长按住,会发现数码管快速加减。
			 			 

***********************************************************************/
#include <reg52.h> 
#define uchar unsigned char
#define uint  unsigned int

sbit KEY1 = P3^2;	//数码管的值加1	  "S19" 
sbit KEY2 = P3^4;   //数码管的值减1	  "S17"

uint angle = 100;

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
	uchar x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : Delay_LED()
* 功能 : 延时代码,延时3毫秒,在延时中加入了数码管的显示,防止按键时抖动
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay_LED(uchar del)
{
	uchar i;
	for(i=0;i<del;i++)
	{
		P0 = 0x00;
		P2 = 7;
		P0 = table[angle%10];
		Delay(1); 
		
		P0 = 0x00;		
		P2 = 6;
		P0 = table[angle/10%10];
		Delay(1); 
				
		P0 = 0x00;
		P2 = 5;
		P0 = table[angle/100%10];
		Delay(1);
	}	
}

void KEY(void)
{
	if((KEY2 == 0) && (angle > 0))		//按P3.4,数码管的值减1
	{
		Delay(15);
		if((KEY2 == 0) && (angle > 0))
		{
			angle--;
		}
		Delay_LED(100);
		if((KEY2 == 0) && (angle > 0))
		{
			Delay_LED(100);
			angle--;
			if((KEY2 == 0) && (angle > 0))
			{
				Delay_LED(80);
				angle--;
				while(1)						  	//进入循环,里面进行长键检测
				{
					if((KEY2 == 0) && (angle > 0))
					{
						angle--;
						Delay_LED(20);	
					}
					else
					{
						break;
					}
				}
			}
		}
	}
	if(KEY1 == 0)		//按P3.4,数码管的值加1
	{
		Delay_LED(15);
		if(KEY1 == 0)
		{
			angle++;
		}
		Delay_LED(100);
		if(KEY1 == 0)
		{
			Delay_LED(100);
			angle++;
			if(KEY1 == 0)
			{
				Delay_LED(80);
				angle++;
				while(1)					  //进入循环,里面进行长键检测
				{
					if(KEY1 == 0)
					{
						angle++;
						Delay_LED(20);	
					}
					else
					{
						break;
					}
				}
			}
		}
	}
}

main()
{
	while(1)
	{
		KEY();
		Delay_LED(1);
	}	
}

 

 

 


助工
2014-04-29 15:25:42     打赏
2楼
有没有人用汇编写啊?

高工
2014-04-29 15:44:35     打赏
3楼
我帮你找找看

共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]