基于小蜜蜂蓝桥杯单片机独立键盘的扩展操作

2.6 【基础 06】独立按键的扩展应用 新建工程,以 I/O 模式编写代码,在 CT107D 单片机综合训练平台上,实现以下功能:

1、将 CT107D 上 J5 处跳帽接到 2~3 引脚,使 S4、S5、S6 和 S7 成为 4 个独立按键。

2、S7 和 S6 为选择键,确定控制键控制那组 LED 指示灯;S5 和 S4 为控制键,按键按下 时点亮指定的 LED 指示灯,按键松开,LED 指示灯熄灭。

3、按下 S7 按键,点亮 L1 指示灯,S6 按键按下无效,不响应操作;此时 S5 控制 L3 指 示灯,S4 控制 L4 指示灯;再次按下 S7 按键,L1 指示灯熄灭,S6 按键按下有效。

4、按下 S6 按键,点亮 L2 指示灯,S7 按键按下无效,不响应操作;此时 S5 控制 L5 指 示灯,S4 控制 L6 指示灯;再次按下 S6 按键,L2 指示灯熄灭,S7 按键按下有效。

5、在 S7 和 S6 按键都不按下的情况下,即 L1 和 L2 指示灯均未点亮时,控制键不能操 作,S5 和 S4 按键按下无效。

6、系统上电后,关闭蜂鸣器,关闭继电器,关闭 8 个 LED 灯。

7、循环扫描按键状态,根据按键的按下情况,进行相应的处理。

【训练要点】:按键扫描的基本原理,去抖动处理的基本原理。 多按键的响应与复合处理。

#include<STC15F2K60S2.h>

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 S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;



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 Delay(unsigned int t)
{
	while(t--);
}


void Init()
{
	SelectHc573(5);
	P0=0x00;
	SelectHc573(4);
	P0=0xff;
}

unsigned char flag=0;

void ScanKeys()
{
	if(S7==0)
	{
		Delay(500);
		if(S7==0)
		{
		 if(flag==0)
		 {
			 L1=0;
			 flag=1;
		 }
		 else if(flag==1)
		 {
			 L1=1;
			 flag=0;
		 }
		}
		while(S7==0);
	}
		
	
	if(S6==0)
	{
		Delay(500);
		if(S6==0)
		{
		 if(flag==0)
		 {
			 L2=0;
			 flag=3;
		 }
		 else if(flag==3)
		 {
			 L2=1;
			 flag=0;
		 }
		}
		while(S6==0);
	}
	
	
	if(S5==0)
	{
		Delay(500);
		if(S5==0)
		{
			if(flag==1)
			{
				L3=0;
				while(S5==0);
				L3=1;
			}
			else if(flag==3)
			{
				L5=0;
				while(S5==0);
				L5=1;
			}
		}
		while(S5==0);
	}
	
	if(S4==0)
	{
		Delay(500);
		if(S4==0)
		{
			if(flag==1)
			{
				L4=0;
				while(S4==0);
				L4=1;
			}
			else if(flag==3)
			{
				L6=0;
				while(S4==0);
				L6=1;
			}
		}
	}
	
	
}






void main()
{
	Init();
	while(1)
	{
		SelectHc573(4);
		ScanKeys();
	}
}

【参考资源】: B 站视频教程【基础技能 06】独立按键的基本操作与扩展应用 B 站视频教程【按键控制 01】按键的工作原理与程序设计思路 B 站视频教程【按键控制 02】单按键控制灯光开关

限于个人水平,难于做到尽善尽美,且本专栏主要起练习笔记作用。如有前辈发现代码错误或可以优化的地方,还请不吝赐教,学生感激不尽。

<think>好的,我现在需要帮助用户查找关于小蜜蜂蓝桥杯单片机DS1302的资料或教程,包括实例和代码。首先,用户提到的“小蜜蜂”可能指的是B站上的某个昵称为“小蜜蜂”的UP主,或者是某个特定的教学资源昵称。根据引用3中的内容,用户提到在B站的小蜜蜂那里学习过,所以这可能是一个重要的资源来源。 接下来,我需要确认DS1302在蓝桥杯比赛中的重要性。根据引用2,DS1302时钟模块是蓝桥杯比赛的一个考点,需要掌握初始值设置和时间调节,尤其是时分秒的调整。因此,用户的需求是合理的,DS1302确实是备考重点之一。 现在,我需要从提供的引用中查找相关信息。引用3提到用户通过B站的小蜜蜂和其他资源学习,但没有直接提到DS1302的具体教程。因此,可能需要结合其他资源或通用方法进行回答。 用户需要教程、实例和代码,所以应该提供具体的步骤和示例代码。DS1302通常通过SPI或类似协议与单片机通信,需要初始化、读取和写入时间寄存器。代码部分需要符合蓝桥杯单片机开发板的硬件,可能涉及IO模拟时序。 考虑到蓝桥杯常用的开发板,如CT107D,DS1302的引脚连接可能需要查看原理图。通常,DS1302连接到单片机的P1口或其他IO口,具体引脚定义需要确认。 此外,引用3中提到用户有模板代码,可能包括DS1302的驱动函数,所以可以建议用户参考往届的省赛题或模板,因为这些通常会包含DS1302的使用示例。 还需要注意DS1302的驱动函数通常包括写字节、读字节、初始化、读取时间和设置时间等函数。示例代码应该展示如何初始化DS1302,设置时间,并读取显示。 最后,考虑到用户可能需要调试技巧,比如使用数码管显示时间,确保代码的正确性,以及如何处理可能出现的时序问题。同时,提醒用户注意BCD码的转换,因为DS1302的时间寄存器通常使用BCD格式。 总结步骤:确认资源来源,提供代码结构,解释关键函数,引用参考资料,并生成相关问题。</think>### 小蜜蜂蓝桥杯单片机DS1302教程与实例 #### 1. DS1302模块简介 DS1302是低功耗实时时钟芯片,可记录年、月、日、时、分、秒及星期数据。在蓝桥杯单片机开发板(如CT107D)中,通常通过**三线接口**(CE、SCLK、I/O)与单片机通信[^2]。 #### 2. 硬件连接 在蓝桥杯官方开发板中,DS1302的引脚连接如下(参考原理图): - **CE(RST)**:P1.3 - **SCLK**:P1.7 - **I/O**:P1.6 #### 3. 核心代码实现 ##### 3.1 底层驱动函数 ```c // DS1302写字节函数 void DS1302_WriteByte(unsigned char dat) { unsigned char i; for(i=0; i<8; i++) { DS1302_IO = dat & 0x01; DS1302_SCLK = 1; DS1302_SCLK = 0; dat >>= 1; } } // DS1302读字节函数 unsigned char DS1302_ReadByte() { unsigned char i, dat=0; for(i=0; i<8; i++) { dat >>= 1; if(DS1302_IO) dat |= 0x80; DS1302_SCLK = 1; DS1302_SCLK = 0; } return dat; } ``` ##### 3.2 设置时间(BCD码格式) ```c void DS1302_SetTime(unsigned char hour, unsigned char min, unsigned char sec) { DS1302_CE = 1; DS1302_WriteByte(0x8E); // 关闭写保护 DS1302_WriteByte(0x00); DS1302_CE = 0; DS1302_CE = 1; DS1302_WriteByte(0x80); // 写秒寄存器 DS1302_WriteByte((sec/10)<<4 | sec%10); DS1302_WriteByte((min/10)<<4 | min%10); DS1302_WriteByte((hour/10)<<4 | hour%10); DS1302_CE = 0; } ``` ##### 3.3 读取时间 ```c void DS1302_GetTime(unsigned char *time) { DS1302_CE = 1; DS1302_WriteByte(0x81); // 读秒寄存器 time[0] = DS1302_ReadByte(); time[1] = DS1302_ReadByte(); time[2] = DS1302_ReadByte(); DS1302_CE = 0; } ``` #### 4. 数码管显示示例 将时间显示到开发板数码管: ```c // BCD码转十进制 unsigned char BCD2DEC(unsigned char bcd) { return (bcd >> 4)*10 + (bcd & 0x0F); } void DisplayTime() { unsigned char time[3]; DS1302_GetTime(time); Display_SMG(BCD2DEC(time[2]), 4); // 小时 Display_SMG(BCD2DEC(time[1]), 5); // 分钟 Display_SMG(BCD2DEC(time[0]), 6); // 秒 } ``` #### 5. 调试技巧 - **初始化问题**:首次使用时需通过`DS1302_SetTime()`写入初始时间 - **数据异常**:检查BCD码转换逻辑是否正确 - **时序问题**:确保SCLK时钟边沿与数据变化对齐[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值