【蓝桥杯-单片机学习笔记(五)】独立按键控制LED灯

本文是蓝桥杯单片机学习笔记的第五篇,主要介绍了如何在CT107D单片机训练平台上,使用独立按键S7、S6、S5和S4控制LED灯。按键S7、S6用于选择LED组,S5、S4控制对应LED亮灭。内容涉及按键抖动消除和硬件电路分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、要求

在CT107D单片机训平台上,实现独立按键对发光二极管的控制。其中,按键S7和S6为选择键,确定控制键控制哪组LED指示灯。按键S5和S4为控制键,按下该按键点亮指定的LED灯,松开后熄灭。具体控制如下:

(1)按下S7点亮L1指示灯,L1点亮后,S6不响应操作。此时,S5控制L3,S4控制L4。再次按下S7,L1指示灯熄灭,S6可响应操作。

(2)按下S6点亮L2指示灯,L2点亮后,S7不响应操作。此时,S5控制L5,S4控制L6。再次按下S6,L2指示灯熄灭,S7可响应操作。

简而言之就是,S7和S6未按下时,即L1和L2未点亮时,S4和S5不响应操作,也就是未做LED灯区域选择时,控制键不能操作。

二、按键

按键分为单个独立按键和行列式矩阵键盘。按键是一种机械结构,手动按键的过程中难免会产生抖动。所以我们在进行编程的时候必须进行消除抖动的设计,以免系统出现误判。消除抖动的方法就是利用延时程序,让系统稍等一段时间,然后再重新判断接收按键的数据。

三、硬件电路分析

本次实验中是使用独立按键实现对LED灯的控制,所以在单片机开发板上,要将J5位置的2、3引脚用跳线帽连接起来。由硬件连接可以看出,独立按键S7、S6、S5、S4直接连接在单片机的P3.0~P3.3脚上。当按键按下时,单片机引脚与地直接相连,此时单片机引脚状态变为低电平;松开按键,单片机引脚状态变为高电平。(此处说的单片机引脚是指与按键相连的单片机引脚)

本次实验中还使用到了LED灯,LED灯的具体硬件电路分析可以参考:

【蓝桥杯—单片机学习笔记(一)】LED指示灯的基本控制_Backlight__的博客-优快云博客

四、程序

#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char

sbit s7 = P3^0;
sbit s6 = P3^1;
sbit s5 = P3^2;
sbit s4 = P3^3;

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;
sbit L5 = P0^4;
sbit L6 = P0^5;
sbit L7 = P0^6;
sbit L8 = P0^7;

void delay_ms(uchar xms)		//@11.0592MHz
{
	uchar i,j;
    while(xms)
    {    
        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
            while (--j);
        } while (--i);
        xms--;
    }
}

void channel_select(uchar n)    //74HC138选择输出通道
{
    switch(n)
    {
        case 4 : 
            P2 = (P2 & 0x1f) | 0x80;
        break;
        case 5 :
            P2 = (P2 & 0x1f) | 0xa0;
        break;
        case 6 : 
            P2 = (P2 & 0x1f) | 0xc0;
        break;
        case 7 :
            P2 = (P2 & 0x1f) | 0xe0;
        break;
    }
}
uchar key_flag = 0; //key_flag = 0时表示s6、s7都未按下
void key_scanf()
{
    channel_select(4);
    if(s7 == 0)
    {
        delay_ms(50);
        if(s7 == 0)
        {    
            if(key_flag == 0)   //此时表示s6没有按下
            {
                L1 = 0; //L1点亮
                key_flag = 1;   //key_flag = 1表示s7按下
            }
            else if(key_flag == 1) //表示s7已经按下
            {
                L1 = 1; //将L1关闭
                key_flag = 0;   //同时将标志位清零
            }
            while(s7 == 0); //使按键按下L1稳定点亮
        }
    }
    if(s6 == 0)
    {
        delay_ms(50);
        if(s6 == 0)
        {
            if(key_flag == 0)
            {
                L2 = 0;
                key_flag = 2;   //key_flag = 2表示s6按下
            }
            else if(key_flag == 2)
            {
                L2 = 1;
                key_flag = 0;
            }
            while(s6 == 0);
        }
    }
    if(s5 == 0)
    {
        delay_ms(50);
        if(s5 == 0)
        {
            if(key_flag == 1)
            {
                L3 = 0;
                while(s5 == 0); //s5一直按下则L3一直亮 
                L3 = 1;
            }
            else if(key_flag == 2)
            {
                L5 = 0;
                while(s5 == 0);
                L5 = 1;
            }
            while(s5 == 0);
        }
    }
    if(s4 == 0)
    {
        delay_ms(50);
        if(s4 == 0)
        {
            if(key_flag == 1)
            {
                L4 = 0;
                while(s4 == 0);  //s4一直按下则L4一直亮
                L4 = 1;
            }
            else if(key_flag == 2)
            {
                L6 = 0;
                while(s4 == 0);
                L6 = 1;
            }
            while(s4 == 0);
        }
    }
}


void main()
{
    while(1)
    {
        key_scanf();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机学习之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值