1.按键介绍
因此在操作按键的时候,要注意消抖。
2.电路图及电路分析
检测独立按键,J5要连到BTN模式,按键按下,接地连成通路,对应的P30,P31,P32,P33口为0。
3.实验程序
①:按键控制实验程序
实验目的:掌握IO口操作,掌握sbit的使用,掌握单片机常见外围驱动电路的设计方法。
实验现象:按S7关闭所有LED,按s6打开所有LED,按s5打开蜂鸣器,按s4关闭蜂鸣器。
实验代码:
#include <STC15F2K60S2.H>
/*位声明独立按键接口*/
sbit S7 = P3 ^ 0;
sbit S6 = P3 ^ 1;
sbit S5 = P3 ^ 2;
sbit S4 = P3 ^ 3;
sbit buzz = P0 ^ 6;
void cls_buzz(void)
{
P2 = (P2 & 0x1F | 0xA0);
P0 = 0x00;
P2 &= 0x1F;
}
void main(void)
{
cls_buzz();
while(1)
{
if(S7 == 0)
{
P2 = ((P2 & 0x1f) | 0x80);
P0 = 0xff; //关闭LED
P2 &= 0x1f;
}
if(S6 == 0)
{
P2 = ((P2 & 0x1f) | 0x80);
P0 = 0x00; //打开LED
P2 &= 0x1f;
}
if(S5 == 0)
{
P2 = ((P2 & 0x1f) | 0xA0);
P0 = 0x00;
buzz = 1; //打开蜂鸣器
P2 &= 0x1f;
}
if(S4 == 0)
{
P2 = ((P2 & 0x1f) | 0xA0);
P0 = 0x00;
buzz = 0; //关闭蜂鸣器
P2 &= 0x1f;
}
}
}
实际现象:
②:独立按键控制LED位移
实验目的:掌握按键扫描和软件延时消抖的基本原理
实验现象:按下s7二进制加一,按下s6二进制减一,按下s5二进制加2,按下s4二进制减2.
实验代码:
#include "reg52.h"
#include "absacc.h"
unsigned char temp1;
unsigned char read_key(void); //读取按键值函数
void key_proc(unsigned char key); //实现对应按键的对应功能的函数
void cls_buzz()
{
P2 = (P2 & 0x1F | 0xA0);
P0 = 0x00;
P2 &= 0x1F;
}
void cls_led()
{
P2 = (P2 & 0x1F | 0x80);
P0 = 0xFF;
P2 &= 0x1F;
}
//延时函数: 10ms@11.0592MHz
void delay(void)
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
}
while (--i);
}
void main(void)
{
unsigned char temp;
cls_buzz();
cls_led();
while(1)
{
temp = read_key();
if(temp != 0xff)
{
delay(); //按键消抖
temp = read_key();
if(temp != 0xff)
{
//进入按键处理函数
key_proc(temp);
while(P3 != 0xff); //检测松手
}
}
}
}
//按键扫描函数
unsigned char read_key(void)
{
unsigned char temp;
unsigned char key_value = 0xff;
temp = P3 & 0x0f;
switch(temp)
{
case 0x0e:
key_value = 1; //S7
break;
case 0x0d:
key_value = 2; //S6
break;
case 0x0b:
key_value = 3; //S5
break;
case 0x07:
key_value = 4; //S4
break;
}
return key_value;
}
//按键处理函数
void key_proc(unsigned char key)
{
switch(key)
{
case 1:
P2 = (P2 & 0x1f | 0x80);
temp1++;
P0 = temp1;
P2 &= 0x1f;
break;
case 2:
P2 = (P2 & 0x1f | 0x80);
temp1--;
P0 = temp1;
P2 &= 0x1f;
break;
case 3:
P2 = (P2 & 0x1f | 0x80);
temp1 = temp1 + 2;
P0 = temp1;
P2 &= 0x1f;
break;
case 4:
P2 = (P2 & 0x1f | 0x80);
temp1 = temp1 - 2;
P0 = temp1;
P2 &= 0x1f;
break;
}
}
实际现象: