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

【1】题目要求 新建工程,以I/O模式编写代码,在CT107D单片机综合训练平台上,实现以下功能:
1、将IIC总线的底层驱动代码文件正确移植到工程中。
2、将J5的23脚短接,把S4、S5和S6设置为独立按键。
3、用24C02存储器的0x00、0x01和0x02这个三个地址单元分别存储S4、S5和S6的按下次数。
4、系统上电后,先从24C04存储器的0x00、0x01和0x02这三个地址单元读取数据,然后按照S4、S5和S6的顺序从左到右依次显示在数码管上,各个数字之间用“-”分隔。
5、S4、S5和S6按键每按下一次,就在对应读出的历史按下次数基础上进行加1累计,当累计值大于13时,复位清0。
6、将按键按下的最新次数写入24C02的对应单元,并在数码管上刷新显示。
蓝桥杯单片机|蓝桥杯单片机 | 特训案例【进阶04】24C02存储按键触发次数
文章图片

【小提示】:
IIC接口的基本原理,可见本博客:《【蓝桥杯单片机进阶强化-01】IIC总线接口技术基础》。
24C02的基本原理,可见本博客:《【蓝桥杯单片机进阶强化-03】24C02存储器的基本原理与应用》
【2】核心源码分析

/*==================蓝桥杯单片机特训================== 【进阶04】:24C02存储按键触发次数 **平台:CT107D单片机综合实训平台 **模式:IO模式 **底层驱动文件:2022年竞赛资源数据包提供的文件 **设计:欧浩源(小蜜蜂老师,ohy3686@qq.com) **时间: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(); //动态刷新数码管 } }

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

    推荐阅读