前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >接口与通信-独立按键

接口与通信-独立按键

原创
作者头像
会洗碗的CV工程师
发布2024-02-18 21:25:54
2470
发布2024-02-18 21:25:54
举报
文章被收录于专栏:LongJava学习资料LongJava学习资料

实验目的与要求

在数码管显示按键输入对应的数字

二、实验环境

硬件环境:实验盒;软件环境:keil

三、实验原理

独立按键一共8个,有对应的插槽可以连接在单片机的任意IO口。去抖动的方式,我们采用软件延时的方法。过程如下:

1. 先设置IO口为高电平(一般上电默认就为高)

2. 读取IO口电平确认是否有按键按下

3. 如有IO电平为低电平后,延时几个ms

4. 再读取该IO电平,如果任然为低电平,说明对应按键按下

5. 执行相应按键的程序

四、实验内容

实验步骤:先用数据线接上电脑和实验盒子,然后在软件中添加对应的源程序编译后的pro.hex文件,断电添加,然后运行一瞬间打开电源。

接线图:

实验程序:

代码语言:c
复制
//--包含你要使用的头文件--//
#include <reg51.h>  //此文件中定义了51的一些特殊功能寄存器
#include <intrins.h>
//--定义要使用的IO口--//
#define ?GPIO_KEY P1 ?//独立键盘用P1口
#define ?GPIO_LED P0 ?//led使用P0口
//--定义全局函数--//
void Delay10ms(unsigned int c); ??//延时10ms
unsigned char Key_Scan();
/*******************************************************************************
* 函 数 名 ????????: main
* 函数功能   : 主函数
* 输 ???入 ????????: 无
* 输 ???出 ????????: 无
*******************************************************************************/
void main(void)
{
 unsigned char ledValue, keyNum;
 ledValue = 0x00;
 while (1)
 { 
  keyNum = Key_Scan(); ?//扫描键盘
  if (keyNum != 0)  //有按键按下
  {
   ledValue = keyNum;
  }
  GPIO_LED = ledValue;//点亮LED灯
 }    
}
/*******************************************************************************
* 函 数 名 ????????: Key_Scan()
* 函数功能   : 扫描键盘
* 输 ???入 ????????: 无
* 输 ???出 ????????: 读取到的键值
*******************************************************************************/
unsigned char Key_Scan()
{
 unsigned char keyValue = 0 , i; //保存键值
 //--检测按键1--//
 if (GPIO_KEY != 0xFF)  //检测按键K1是否按下
 {
  Delay10ms(1); //消除抖动
  if (GPIO_KEY != 0xFF) //再次检测按键是否按下
  {
   keyValue = GPIO_KEY;
   i = 0;
   while ((i<50) && (GPIO_KEY != 0xFF))  //检测按键是否松开
   {
    Delay10ms(1);
    i++;
   }
  }
 }
 return keyValue; ??//将读取到键值的值返回
}
/*******************************************************************************
* 函 数 名 ????????: Delay10ms
* 函数功能   : 延时函数,延时10ms
* 输 ???入 ????????: 无
* 输 ???出 ????????: 无
*******************************************************************************/
void Delay10ms(unsigned int c) ??//误差 0us
{
 unsigned char a, b;
 //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
 for (;c>0;c--)
 {
  for (b=38;b>0;b--)
  {
   for (a=130;a>0;a--);
  }
 } ??????
}

实验结果:

五、实验分析

通过本次实验学会如何将按键输入的数字转化为对应的LED灯

六、思考题

按键左右移LED灯

接线图如上;

实验程序:

代码语言:c
复制
include <reg51.h> ???//此文件中定义了51的一些特殊功能寄存器
#include <intrins.h>
//--定义要使用的IO口--//
sbit  ?K1 = P1^0; //对应按钮K1
sbit ?K2 = P1^1; //对应按钮K2
#define ?GPIO_LED P0 //led使用P0口
//--定义全局函数--//
void Delay10ms(unsigned int c); ??//延时10ms
unsigned char Key_Scan();
/*******************************************************************************
* 函 数 名 ????????: main
* 函数功能  ???: 主函数
* 输 ???入 ????????: 无
* 输 ???出 ????????: 无
*******************************************************************************/
void main(void)
{
 unsigned char ledValue, keyNum;
 ledValue = 0x01;
 while (1)
 { 
  keyNum = Key_Scan(); ?//扫描键盘
  if (keyNum == 1) //如果键值返回1
  {
   ledValue = _crol_(ledValue, 1); //左循环
  }
  else if (keyNum == 2)
  {
   ledValue = _cror_(ledValue, 1); //右循环
  }
  GPIO_LED = ledValue;//点亮LED灯
 }    
}
/*******************************************************************************
* 函 数 名 ????????: Key_Scan()
* 函数功能  ???: 扫描键盘
* 输 ???入 ????????: 无
* 输 ???出 ????????: 读取到的键值
*******************************************************************************/
unsigned char Key_Scan()
{
 unsigned char keyValue = 0 , i; //保存键值
 //--检测按键1--//
 if (K1==0)  //检测按键K1是否按下
 {
  Delay10ms(1); //消除抖动
  if (K1==0) //再次检测按键是否按下
  {
   keyValue = 1;
   i = 0;
   while ((i<50) && (K1==0)) ?//检测按键是否松开
   {
    Delay10ms(1);
    i++;
   }
  }
 }
 //--检测按键2--//
 if (K2==0)  //检测按键K1是否按下
 {
  Delay10ms(1); //消除抖动
  if (K2==0) //再次检测按键是否按下
  {
   keyValue = 2;
   i = 0;
   while ((i<50) && (K2==0)) ?//检测按键是否松开
   {
    Delay10ms(1);
    i++;
   }
  }
 }
 return keyValue; ??//将读取到键值的值返回
}
/*******************************************************************************
* 函 数 名 ????????: Delay10ms
* 函数功能  ???: 延时函数,延时10ms
* 输 ???入 ????????: 无
* 输 ???出 ????????: 无
*******************************************************************************/
void Delay10ms(unsigned int c) ??//误差 0us
{
????unsigned char a, b;
 //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
????for (;c>0;c--)
 {
  for (b=38;b>0;b--)
  {
   for (a=130;a>0;a--);
  }
 } ??????
}

实验结果:

按键选择花样显示:

源程序:

代码语言:c
复制
#include <reg51.h>	   //此文件中定义了51的一些特殊功能寄存器
#include <intrins.h>

//--定义要使用的IO口--//
#define  GPIO_KEY P1  //独立键盘用P1口
#define  GPIO_LED P0  //led使用P0口

//--定义全局函数--//
void Delay10ms(unsigned int c);   //延时10ms
unsigned char Key_Scan();
void LED1();
void LED2();
void LED3();
void LED4();
void LED5();
void LED6();
void LED7();
void LED8();

/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
	unsigned char keyNum;

	while (1)
	{	
		keyNum = Key_Scan();  //扫描键盘

		switch (keyNum)
		{
			case(0xFE) :	  //返回按键K1的数据
				LED1();
				break;
			case(0xFD) :	  //返回按键K2的数据
				LED2();
				break;
			case(0xFB) :	  //返回按键K3的数据
				LED3();
				break;
			case(0xF7) :	  //返回按键K4的数据
				LED4();
				break;
			case(0xEF) :	  //返回按键K5的数据
				LED5();
				break;
			case(0xDF) :	  //返回按键K6的数据
				LED6();
				break;
			case(0xBF) :	  //返回按键K7的数据
				LED7();
				break;
			case(0x7F) :	  //返回按键K8的数据
				LED8();
				break;
			default:
				break;
		}
	}				
}

/*******************************************************************************
* 函 数 名         : Key_Scan()
* 函数功能		   : 扫描键盘
* 输    入         : 无
* 输    出         : 读取到的键值
*******************************************************************************/

unsigned char Key_Scan()
{
	unsigned char keyValue = 0 , i; //保存键值

	//--检测按键1--//
	if (GPIO_KEY != 0xFF)		//检测按键K1是否按下
	{
		Delay10ms(1);	//消除抖动

		if (GPIO_KEY != 0xFF)	//再次检测按键是否按下
		{
			keyValue = GPIO_KEY;
			i = 0;
			while ((i<50) && (GPIO_KEY != 0xFF))	 //检测按键是否松开
			{
				Delay10ms(1);
				i++;
			}
		}
	}

	return keyValue;   //将读取到键值的值返回
}

/*******************************************************************************
* 函 数 名         : Delay10ms
* 函数功能		   : 延时函数,延时10ms
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Delay10ms(unsigned int c)   //误差 0us
{
    unsigned char a, b;

	//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
    for (;c>0;c--)
	{
		for (b=38;b>0;b--)
		{
			for (a=130;a>0;a--);
		}
           
	}       
}

/*******************************************************************************
* 函 数 名         : LED1
* 函数功能		   : LED左移闪烁两次
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void LED1()
{
	unsigned char i;

	GPIO_LED = 0x01;
	for (i=0; i<16; i++)
	{
		GPIO_LED = _crol_(GPIO_LED, 1);
		Delay10ms(5);
	}
}

/*******************************************************************************
* 函 数 名         : LED2
* 函数功能		   : LED右移闪烁两次
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void LED2()
{
	unsigned char i;

	GPIO_LED = 0x80;
	for (i=0; i<16; i++)
	{
		GPIO_LED = _cror_(GPIO_LED, 1);
		Delay10ms(5);
	}
}

/*******************************************************************************
* 函 数 名         : LED3
* 函数功能		   : LED交替闪烁
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void LED3()
{

	GPIO_LED = 0xaa;
	Delay10ms(5);

	GPIO_LED = 0x55;
	Delay10ms(5);

	GPIO_LED = 0xaa;
	Delay10ms(5);

	GPIO_LED = 0x55;
	Delay10ms(5);
}

/*******************************************************************************
* 函 数 名         : LED4
* 函数功能		   : LED交替闪烁
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void LED4()
{
	GPIO_LED = 0x55;
	Delay10ms(5);

	GPIO_LED = 0xaa;
	Delay10ms(5);

	GPIO_LED = 0x55;
	Delay10ms(5);

	GPIO_LED = 0xaa;
	Delay10ms(5);
}

/*******************************************************************************
* 函 数 名         : LED5
* 函数功能		   : LED交替闪烁
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void LED5()
{
	GPIO_LED = 0xCC;
	Delay10ms(5);

	GPIO_LED = 0x33;
	Delay10ms(5);

	GPIO_LED = 0xCC;
	Delay10ms(5);

	GPIO_LED = 0x33;
	Delay10ms(5);
}

/*******************************************************************************
* 函 数 名         : LED6
* 函数功能		   : LED交替闪烁
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void LED6()
{
	GPIO_LED = 0x33;
	Delay10ms(5);

	GPIO_LED = 0xCC;
	Delay10ms(5);

	GPIO_LED = 0x33;
	Delay10ms(5);

	GPIO_LED = 0xCC;
	Delay10ms(5);
}

/*******************************************************************************
* 函 数 名         : LED7
* 函数功能		   : LED1到LED6来一遍
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void LED7()
{
	LED1();
	LED2();
	LED3();
	LED4();
	LED5();
	LED6();
}

/*******************************************************************************
* 函 数 名         : LED8
* 函数功能		   : 全灭
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void LED8()
{
	GPIO_LED = 0x00;
}

实验结果:

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com