您的位置 首页 观点

单片机独立按键扫描程序

原理搞清楚了,那么下面我们就先编写一个独立按键的程序,把最基本的功能验证一下。

原理搞清楚了,那么下面咱们就先编写一个独立按键的程序,把最根本的功用验证一下。

#include

sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;

sbit LED9 = P0^7;

sbit LED8 = P0^6;

sbit LED7 = P0^5;

sbit LED6 = P0^4;

sbit KEY1 = P2^4;

sbit KEY2 = P2^5;

sbit KEY3 = P2^6;

sbit KEY4 = P2^7;

void main(){

ENLED = 0; //挑选独立 LED 进行显现

ADDR3 = 1;

ADDR2 = 1;

ADDR1 = 1;

ADDR0 = 0;

P2 = 0xF7; //P2.3 置0,即 KeyOut1 输出低电平

while (1){

//将按键扫描引脚的值传递到 LED 上

LED9 = KEY1; //按下时为0,对应的 LED 点亮

LED8 = KEY2;

LED7 = KEY3;

LED6 = KEY4;

}

}

本程序固定在 KeyOut1 上输出低电平,而 KeyOut2~4 坚持高电平,就适当所以把矩阵按键的榜首行,即 K1~K4 作为4个独立按键来处理,然后把这4个按键的状况直接送给 LED9~6 这4个 LED 小灯,那么当按键按下时,对应按键的输入引脚是0,对应小灯操控信号也是0,所以灯就亮了,这阐明上述关于按键检测的理论都是可完结的。

绝大多数情况下,按键是不会一向按住的,所以咱们一般检测按键的动作并不是检测一个固定的电平值,而是检测电平值的改变,即按键在按下和弹起这两种状况之间的改变,只需产生了这种改变就阐明现在按键产生动作了。

程序上,咱们能够把每次扫描到的按键状况都保存起来,当一次按键状况扫描进来的时分,与前一次的状况做比较,假如发现这两次按键状况不共同,就阐明按键产生动作了。当上一次的状况是未按下而现在是按下,此刻按键的动作便是“按下”;当上一次的状况是按下而现在是未按下,此刻按键的动作便是“弹起”。明显,每次按键动作都会包括一次“按下”和一次“弹起”,咱们能够任选其一来履行程序,或许两个都用,以履行不同的程序也是能够的。下面就用程序来完结这个功用,程序只取按键 K4 为例。

#include

sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;

sbit KEY1 = P2^4;

sbit KEY2 = P2^5;

sbit KEY3 = P2^6;

sbit KEY4 = P2^7;

unsigned char code LedChar[] = { //数码管显现字符转化表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};

void main(){

bit backup = 1; //界说一个位变量,保存前一次扫描的按键值

unsigned char cnt = 0; //界说一个计数变量,记载按键按下的次数

ENLED = 0; //挑选数码管 DS1 进行显现

ADDR3 = 1;

ADDR2 = 0;

ADDR1 = 0;

ADDR0 = 0;

P2 = 0xF7; //P2.3 置0,即 KeyOut1 输出低电平

P0 = LedChar[cnt]; //显现按键次数初值

while (1){

//当时值与前次值不相等阐明此刻按键有动作

if (KEY4 != backup){

//假如前次值为0,则阐明当时是由0变1,即按键弹起

if (backup == 0){

cnt++; //按键次数+1

//只用1个数码管显现,所以加到10就清零重新开始

if (cnt >= 10){

cnt = 0;

}

P0 = LedChar[cnt]; //计数值显现到数码管上

}

backup = KEY4; //更新备份为当时值,以备进行下次比较

}

}

}

先来介绍出现在程序中的一个新知识点,便是变量类型——bit,这个在规范 C 言语里面是没有的。51单片机有一种特别的变量类型便是 bit 型。比方 unsigned char 型是界说了一个无符号的8位的数据,它占用一个字节(Byte)的内存,而 bit 型是1位数据,只占用1个位(bit)的内存,用法和规范 C 中其他的根本数据类型是共同的。它的长处便是节约内存空间,8个 bit 型变量才适当于1个 char 型变量所占用的空间。尽管它只要0和1两个值,但也现已能够表明许多东西了,比方:按键的按下和弹起、LED 灯的亮和灭、三极管的导通与关断等等,联想一下现已学过的内容,它是不是能用最小的内存价值来完结许多作业呢?

在这个程序中,咱们以 K4 为例,按一次按键,就会产生“按下”和“弹起”两个动态的动作,咱们挑选在“弹起”时对数码管进行加1操作。理论是如此,咱们能够在板子上用 K4 按键做做试验试试,多按几回,是不是会产生这样一种现象:有的时分我分明只按了一下按键,但数字却加了不止1,而是2或许更多?可是咱们的程序并没有任何逻辑上的过错,这是怎么回事呢?所以咱们就得来说说按键颤动和消抖的问题了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/156382.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部