蓝桥杯单片机 | 特训案例【进阶04】24C02存储按键触发次数

【1】题目要求

新建工程,以I/O模式编写代码,在CT107D单片机综合训练平台上,实现以下功能:

1、将IIC总线的底层驱动代码文件正确移植到工程中。

2、将J523脚短接,把S4S5S6设置为独立按键

3、用24C02存储器0x000x010x02这个三个地址单元分别存储S4S5S6按下次数。
4、系统上电后,先从24C04存储器的0x00、0x01和0x02这三个地址单元读取数据,然后按照S4、S5和S6的顺序从左到右依次显示在数码管上,各个数字之间用“-”分隔。

5、S4、S5和S6按键每按下一次,就在对应读出的历史按下次数基础上进行加1累计,当累计值大于13时,复位清0

6、将按键按下的最新次数写入24C02的对应单元,并在数码管上刷新显示。

【小提示】:

IIC接口的基本原理,可见本博客:《【蓝桥杯单片机进阶强化-01】IIC总线接口技术基础》

24C02的基本原理,可见本博客:《【蓝桥杯单片机进阶强化-03】24C02存储器的基本原理与应用》

 【2】核心源码分析

/*==================蓝桥杯单片机特训==================
【进阶04】:24C02存储按键触发次数
**平  台:CT107D单片机综合实训平台
**模  式:IO模式
**底层驱动文件:2022年竞赛资源数据包提供的文件
**设  计:欧浩源(小蜜蜂老师,[email protected])
**时  间:2022-04-01
**更多详见:www.xmf393.com
====================================================*/

#include "reg52.h"
#include "iic.h"

//定义三个独立按键:S4 S5 S6
//注意:J5的23脚短接,要接到BTN这边
sbit S4 = P3^3;
sbit S5 = P3^2;
sbit S6 = P3^1;

//定义动态显示中单个数码管点亮时长
#define TSMG	500
//-------共阳数码管的段码编码表(无小数点)--------
//0 1 2 3 4 5 6 7 8 9 A B C D E F - .
unsigned char code SMG_NoDot[18]={0xc0,0xf9,
	  0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
    0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

//定义3个按键的计数变量
unsigned char dat1 = 0, dat2 = 0, dat3 = 0;


/*====锁存器设置和数码管显示的代码参考前面的案例====*/
//==================24C02单字节写入===================
void Write_24C02(unsigned char addr, unsigned char dat)
{
	IIC_Start();			//起始信号
	IIC_SendByte(0xa0);		//EEPROM的写设备地址
	IIC_WaitAck();			//等待从机应答
	IIC_SendByte(addr);		//内存单元地址
	IIC_WaitAck();			//等待从机应答
	IIC_SendByte(dat);		//内存写入数据
	IIC_WaitAck();			//等待从机应答
	IIC_Stop();				//停止信号
}
//==================24C02单字节读取===================
unsigned char Read_24C02(unsigned char addr)
{
	unsigned char tmp;
	//首先,进行一个伪写操作
	IIC_Start();			//起始信号
	IIC_SendByte(0xa0);		//EEPROM的写设备地址
	IIC_WaitAck();			//等待从机应答
	IIC_SendByte(addr);		//内存单元地址
	IIC_WaitAck();			//等待从机应答
	//然后,开始字节读操作
	IIC_Start();			//起始信号
	IIC_SendByte(0xa1);		//EEPROM的读设备地址
	IIC_WaitAck();			//等待从机应答
	tmp = IIC_RecByte();	//读取内存中的数据
	IIC_SendAck(1);			//产生非应答信号
	IIC_Stop();				//停止信号
	return tmp;
}
//==================独立按键扫描处理===================
void Scan_Keys()
{
	//按键S4的扫描处理
	if(S4 == 0)
	{
		DelaySMG(100);			    //去抖动
		if(S4 == 0)
		{
			dat1++;					//按键次数增加
			if(dat1 > 13)			//大于13恢复0
			{
				dat1 = 0;
			}
			Write_24C02(0x00, dat1);	//写入24C02
			while(S4 == 0)				//松手检测
			{
				DisplaySMG_24C02();		//保持数码管动态刷新
			}
		}
	}
	//按键S5的扫描处理
	if(S5 == 0)
	{
		DelaySMG(100);
		if(S5 == 0)
		{
			dat2++;
			if(dat2 > 13)
			{
				dat2 = 0;
			}
			Write_24C02(0x01, dat2);
			while(S5 == 0)
			{
				DisplaySMG_24C02();
			}
		}
	}
	//按键S6的扫描处理
	if(S6 == 0)
	{
		DelaySMG(100);
		if(S6 == 0)
		{
			dat3++;
			if(dat3 > 13)
			{
				dat3 = 0;
			}
			Write_24C02(0x02, dat3);
			while(S6 == 0)
			{
				DisplaySMG_24C02();
			}
		}
	}
}
//=====================系统初始化=====================
void Init_sys()
{
	//系统基础设备初始化
	Set_HC573(0, 0x00);				//关闭所有锁存器
	Set_HC573(5, 0x00);				//关闭蜂鸣器和继电器
	Set_HC573(4, 0xff);				//关闭全部LED灯
	DisplaySMG_All(0xff);			//关闭全部数码管
	//将三个按键的历史按下次数读出
	dat1 = Read_24C02(0x00);	
	dat2 = Read_24C02(0x01);	
	dat3 = Read_24C02(0x02);	
}
//=======================主函数=======================
void main()
{
	Init_sys();						//系统初始化
	while(1)
	{
		Scan_Keys();				//循环扫描按键
		DisplaySMG_24C02();			//动态刷新数码管
	}
}

【注】:更多关于蓝桥杯单片机备赛内容,详见《蓝桥杯单片机设计与开发》小蜜蜂特训手册,本站可下载,相关更多蓝桥杯的案例完整源码及学习备赛笔记,欢迎进入 “小蜜蜂笔记” 公众号。

猜你喜欢

转载自blog.csdn.net/ohy3686/article/details/123903149