蓝桥杯 单片机 独立按键的基础操作

本文详细介绍了使用STC15F2K60S2单片机进行编程,涉及按键S7~S4的扫描、LED灯L1~L7的控制,以及HC573锁存器的选择和延时函数的应用。
摘要由CSDN通过智能技术生成
#include<stc15f2k60s2.h>

这是包含头文件的指令,引入了 STC15F2K60S2 单片机的相关定义和声明。

sbit buzzer = P0^6;

这里定义了 buzzer,它是 P0 口的第 6 位引脚,用于连接蜂鸣器。

sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

这里定义了四个开关引脚 S7S6S5S4,它们分别连接到 P3 口的第 0、1、2、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;

这里定义了七个LED引脚 L1L7,它们分别连接到 P0 口的第 0 到 6 位。

void SelectHC573(unsigned char channel)
{
    switch(channel)
    {
        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;
    }
}

这是一个函数,根据传入的 channel 参数,选择不同的 P2 口的配置。在你的代码中,这个函数用于选择 HC573 锁存器的输出通道。

void DelayK(unsigned char t)
{
    while(t--);
}

这是一个简单的延时函数,通过循环等待的方式实现延时。延时时间是由参数 t 决定的。

unsigned char stat_k = 0;  // 模式

这里定义了一个用于保存按键模式的变量 stat_k

void ScanKey_Alone()
{
    if(S7 == 0)
    {
        DelayK(100);
        if(S7 == 0)
        {
            if(stat_k == 0)
            {
                L1 = 0;
                stat_k = 1;
            }
            else if(stat_k == 1)
            {
                L1 = 1;
                stat_k = 0;
            }
        }
    }
    // 同样的逻辑重复了下面的 S6、S5、S4。
}

这是一个扫描按键的函数。它检测四个按键 S7S6S5S4 是否被按下,如果被按下则执行相应的操作。具体操作包括点亮或熄灭对应的LED,并改变模式 stat_k

void main()
{
    P2 = 0xA0;//这两行代码是为了关闭蜂鸣器
    buzzer = 0;
    
    SelectHC573(4);
    while(1)
    {
        L7 = 1;//这个代码是为了关闭L7,因为我在运行时,发现L7莫名其妙的亮,你可以把这行代码删除
        ScanKey_Alone();
    }
}

这是 main 函数,主要设置 P2buzzer,然后进入一个无限循环,其中 L7 保持点亮,然后不断扫描按键状态。

请注意:在 ScanKey_Alone 函数中,同样的逻辑被重复了四次。你可能希望使用循环和数组等方式来避免这种重复性。

以下是主函数:

#include<stc15f2k60s2.h>

sbit buzzer=P0^6;

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;

void SelectHC573(unsigned char channel)
{
	switch(channel)
	{
		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;
	}

}

void DelayK(unsigned char t)
{
	while(t--);
}

unsigned char stat_k=0;//模式

void ScanKey_Alone()
{
	if(S7==0)
	{
		DelayK(100);
		if(S7==0)
		{
			if(stat_k==0)
			{
				L1=0;
				stat_k=1;
			}
			else if(stat_k==1)
			{
				L1=1;
				stat_k=0;
			}
			while(S7==0);
		}
	}
	if(S6==0)
	{
		DelayK(100);
		if(S6==0)
		{
			if(stat_k==0)
			{
				L2=0;//点亮
				stat_k=2;
			}
			else if(stat_k==2)
			{
				L2=1;//熄灭
				stat_k=0;
			}
			while(S6==0);//因为S6和S7按键,关闭和打开有时要按多次,这样会导致看起来不太灵敏
		}
	}
	if(S5==0)//按下S5
	{
		DelayK(100);
		if(S5==0)
		{
			if(stat_k==1)//此时为S7按下的模式
			{
				L3=0;
				while(S5==0);//意味着如果一直按S5,那么L3一直为0,一直亮
				L3=1;
			}
			else if(stat_k==2)//此时为S6按下的模式
			{
				L5=0;
				while(S5==0);
				L5=1;
			}
		}
	}
	if(S4==0)
	{
		DelayK(100);
		if(S4==0)
		{
			if(stat_k==1)
			{
				L4=0;
				while(S4==0);
				L4=1;
			}
			else if(stat_k==2)
			{
				L6=0;
				while(S4==0);
				L6=1;
			}
		}
	}
}

void main()
{
	P2=0xA0;
	buzzer=0;
	
	SelectHC573(4);
	while(1)
	{
		L7=1;
		ScanKey_Alone();
	}
}

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值