51单片机独立按键实验

任务二 独立按键实验

任务描述

上节课我们学习了如何配置I/O口模式寄存器为输出模式,以及如何控制I/O输出高低电平;在单片机的学习中,不光只有输出,还有输入,本任务将通过独立按键实验来学习如何使用STC15单片机I/O口输入模式。讲解STC15单片机I/O如何配置为输入模式,以及如何读取I/O输入的电平状态。

学习目标

1.理解独立按键原理图,2、学会规范化编写代码. 3、源文件使用

任务实施
器材准备

​ 1、windows电脑 2、安装完成的Keil软件、STC专用下载软件 3、STC15开发套件

步骤一迁移模板工程

led.h源文件

#ifndef __LED_H					//头文件的预处理
#define __LED_H	 			  
#include ".\sys\sys.h"  //包含sys.h头文件


#define Led_Pins P0     //定义Led_Pins宏

void ExpLEDInit(void);	//声明函数 ExpLEDInit()
void ExpLEDSet(uint8_t ledbit);//声明函数 ExpLEDSet()
		 				    
#endif     							//结束条件编译指令

led.c源文件

#include ".\led\led.h"      //包含led.h头文件

/*********************************************************************
 @Function  : 开发板LED IO初始化
 @Parameter : N/A 
 @Return    : N/A
**********************************************************************/
void ExpLEDInit(void)
{
 /*P0.1-P0.7设置为推挽输出*/
 P0M0	= 0xFF;
 P0M1 =	0x00;
}

/*********************************************************************
 @Function  : 开发板LED控制
 @Parameter : ledbit :LED状态 
 @Return    : N/A
**********************************************************************/
void ExpLEDSet(uint8_t ledbit)
{
	Led_Pins = ledbit;	
}

key.h头文件*

#ifndef __KEY_H
#define __KEY_H	 
#include ".\sys\sys.h"  

#define DK1 P32 //DK1->P3.2
#define DK2 P33 //DK2->P3.3
#define DK3 P34 //DK3->P3.4
#define DK4 P35 //DK4->P3.5

#define NO_PRES   (0) //没有按键按下
#define DK1_PRES 	(1)	//DK1按下
#define DK2_PRES	(2)	//DK2按下
#define DK3_PRES 	(3)	//DK3按下
#define DK4_PRES	(4)	//DK4按下

void ExpKeyInit(void);
uint8_t ExpKeyScan(uint8_t mode);

key.c源文件

#include ".\key\key.h"        //包含key.h头文件
#include ".\delay\delay.h"

/*********************************************************************
 @Function  : 开发板按键 IO初始化
 @Parameter : N/A 
 @Return    : N/A
**********************************************************************/
void ExpKeyInit(void) //IO初始化
{ 
 /*P3.2-P3.5设置为双向输入*/
 P3M0 &= ~((1<<2)|(1<<3)|(1<<4)|(1<<5));
 P3M1	&= ~((1<<2)|(1<<3)|(1<<4)|(1<<5)); 
}

/*********************************************************************
 @Function  : 按键扫描
 @Parameter : mode : 连按模式
									 0:不支持连按
									 1:支持连按
 @Return    : 键值
 @Read      : 注意此函数有响应优先级,DK1>DK2>DK3>DK4 !!
**********************************************************************/
uint8_t ExpKeyScan(uint8_t mode)
{	 
  static u8 key_up=1;//按键按松开标志
	if(mode)key_up=1;  //支持连按		  
	if(key_up&&(DK1==0||DK2==0||DK3==0||DK4==0))//判断四个按键是否有按下
	{
		delay_nms(10);//去抖动 
		key_up=0;
		if(DK1==0)return DK1_PRES;
		else if(DK2==0)return DK2_PRES;
		else if(DK3==0)return DK3_PRES;
		else if(DK4==0)return DK4_PRES;
	}else if(DK1==1&&DK2==1&&DK3==1&&DK4==1)key_up=1; 	    
 	return NO_PRES;// 无按键按下
}
知识链接

独立按键原理图分析:
在这里插入图片描述

思考练习

1.在STC15单片机中,独立按键按下的状态通常是什么电平?

A、高电平

B、低电平

C、上升沿

D、下降沿

2.在STC15单片机中,如何检测独立按键的按下?

A、轮询检测

B、中断检测

C、串口检测

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值