任务二 独立按键实验
任务描述
上节课我们学习了如何配置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、串口检测