1 按键相关知识
1.1 按键工作原理
(1)内部机械结构。
(2)电路连接与原理图中图标。
(3)按键电路接法、上拉电阻。上拉是为了让引脚默认是高电平,但是上拉的力量扛不住接地,所以按键没有按下时上拉的力量保证了IO引脚输入为1,而按下后绝对为0。
(4)按下和弹起的区。区别就是接不接地的问题,也就是引脚输入为1还是0的问题。
(5)按键这个设备对我们的意义:按键对于我们CPU来说是一个输入设备,输入的是人的操作。CPU通过监测按键连接的IO引脚的电平输入是1还是0就知道外部有没有人按下这个按键。相当于人通过按按键给CPU输入了一个信号,这个信号可以被CPU监测到从而指导CPU去做一定的工作。
1.2 CPU如何处理按键
(1)轮询式。所谓轮询式就是CPU不断的隔很小时间去查看有没有按键被按下,如果按下就处理按键,如果没按下就过一会再来查看。(按键什么时候被按下CPU是无法预知的)
(2)中断式。
1.3 按键电路接法分类
(1)独立按键。
(2)矩阵按键。
2 独立按键编程
2.1 原理图和接线分析
(1)8个独立按键接法一样:都是一端接GND,另一端接插座上。
(2)接线:插座接到P1端口,接完之后P1端口8个IO分别对应8个按键(P1.0对应K1、P1.1对应K2····P1.7对应K8)。
(3)为了用LED点亮或熄灭来指示按键是否按下,还要给LED接线。P0端口接LED。
2.2 先监测1个按键(用LED作为指示)
(1)使用轮询法来处理独立按键K1,单片机在循环中每隔很短的时间就检测K1对应的P1.0引脚的输入电平是1还是0.如果是1则表示按键没有按下,熄灭LED作为指示。延时等待下一次检验;如果是0表示按键已经按下了,点亮一颗LED作为指示。
2.3 扩展为监测8个独立按键
注意:
(1)如果要监测的按键数量少,可以用位监测。如果多则可以直接用端口字节变量来监测。
(2)独立按键多个按键之间是彼此独立的,所以允许多个按键同时按下而不会影响。(矩阵按键就只能一次按下一个按键,不能多个同时按下)
#include <reg51.h>
// 当前要处理的是K1,对应P1.0IO口,操控的LED是LED1,对应P0.0
sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key8 = P1^7;
sbit led1 = P0^0;
sbit led2 = P0^1;
sbit led8 = P0^7;
void delay(void)
{
unsigned char i, j;
for (i=0; i<100; i++)
for (j=0; j<100; j++);
}
void main(void)
{
while (1)
{
// C语言中把一个IO引脚定义成一个变量key1
// 然后给key1变量赋值就相当于是向这个IO引脚输出
// 直接使用(读)这个key1变量,就相当于从这个IO引脚输入
if (key1 == 1)
{
// 没有按键
led1 = 0; // led熄灭
}
else
{
// 有按键
led1 = 1; // led点亮
}
if (key2 == 1)
{
// 没有按键
led2 = 0; // led熄灭
}
else
{
// 有按键
led2 = 1; // led点亮
}
if (key8 == 1)
{
// 没有按键
led8 = 0; // led熄灭
}
else
{
// 有按键
led8 = 1; // led点亮
}
}
}
3 键值检测与显示
3.1 何为键值
(1)一般的产品中按键都有很多,对于整个程序来说一般都是把按键进行编码,给每个按键一个对应的编码值,就叫做按键的键值。
(2)在正式的比较庞大的程序中,按键的检测部分和处理部分都是隔开的。这两部分隔开有利于各自部分的程序编写,两部分之间用键值来连接。按键监测部分负责监测按键,一旦发生一个按键事件就产生一个键值,然后将键值传递给按键处理部分。
3.2 加入数码管显示键值
(1)整个程序包括2部分:1部分做按键监测并且发出键值,另一部分负责将接收到的键值显示在独立数码管上。
#include <reg51.h>
/*********************变量定义************************************/
sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key8 = P1^7;
// 独立数码管的段码表