蓝桥杯单片机备战(六)共阳数码管的动态显示

本文介绍了单片机控制独立按键的原理,通过电路图和实物图阐述了按键与I/O口的关系。在按键按下时,对应I/O口变为低电平,通过检测电平变化实现按键状态判断。代码示例中,使用C语言实现了按键扫描函数,并通过138译码器控制LED灯,展示了按键按下时LED状态的反转,同时包含防抖动处理。

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

1.实现原理

先观察电路图和实物图

我们知道要想控制独立按键的话首先要先使J5跳帽连接到2和3

当按键被按下时,对应I/O口的电平信号应该是和GND一样,也就是0(低电平)我们可以通过检测I/O口的电平信号来知道按键是否被按下。

例:

当S4被按下时,P3.3被置为低电平,此时读取P3.3口的电平信号即可知道按键的状态


2.代码实现

#include "reg52.h"
sbit S7 = P3^0; //定义按键对应的I/O口
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

sbit L1 = P0^0; //定义LED灯对应的I/O口
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;

void Delay(unsigned char t)		//延时程序
{
	while(t--)
	{
		unsigned char i, j;
		i = 15;
		j = 90;
		do
		{
			while (--j);
		} while (--i);
	}
}


void HC138Init(unsigned char n) //138译码器选通函数
{
    switch(n)
    {
        case 4:
            P2 = (P2 & 0x1f) | 0x80;//让Y4输出低电平,此时Y4C为高电平
        break;
        case 5:
            P2 = (P2 & 0x1f) | 0xa0;//让Y5输出低电平,此时Y5C为高电平
        break;
        case 6:
            P2 = (P2 & 0x1f) | 0xc0;//让Y6输出低电平,此时Y6C为高电平
        break;
        case 7:
            P2 = (P2 & 0x1f) | 0xe0;//让Y7输出低电平,此时Y7C为高电平             
        break;                           
    }
}

void keyscan_alone() //独立键盘扫描函数
{
	if(S4 == 0) //当S4被按下时
	{
		Delay(20); //延时20ms防抖
		while(S4 == 0); //当手未松开时卡在循环里,当松手时向下执行
		Delay(20); //延迟20ms防抖
		L1 = ~L1;  //LED1状态取反
	}
	if(S5 == 0)  //道理同上
	{
		Delay(20);
		while(S5 == 0);
		Delay(20);
		L2 = ~L2;
	}
	if(S6 == 0)
	{
		Delay(20);
		while(S6 == 0);
		Delay(20);
		L3 = ~L3;
	}
	if(S7 == 0)
	{
		Delay(20);
		while(S7 == 0);
		Delay(20);
		L4 = ~L4;
	}
}

void main()
{
	HC138Init(4);  //先选通38译码器的4通道,不然无法控制LED灯
	while(1)
	{
		keyscan_alone();  //调用函数扫描
	}
}

本小节大家可能会觉得较为简单,但后续有时间会写一篇拓展应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值