题目来源:(28条消息) 蓝桥杯单片机 | 特训案例【进阶04】24C02存储按键触发次数_小蜜蜂老师的博客-CSDN博客
1、将J5的23脚短接,把S4、S5和S6设置为独立按键。
2、用24C02存储器的0x00、0x01和0x02这个三个地址单元分别存储S4、S5和S6的按下次数。
3、系统上电后,先从24C04存储器的0x00、0x01和0x02这三个地址单元读取数据,然后按照S4、S5和S6的顺序从左到右依次显示在数码管上,各个数字之间用“-”分隔。
4、S4、S5和S6按键每按下一次,就在对应读出的历史按下次数基础上进行加1累计,当累计值大于13时,复位清0。
5、将按键按下的最新次数写入24C02的对应单元,并在数码管上刷新显示。
#include <reg52.h>
#include <iic.h>
unsigned char count_s4=0;
unsigned char count_s5=0;
unsigned char count_s6=0;
sbit s4=P3^3;
sbit s5=P3^2;
sbit s6=P3^1;
unsigned char code smg_nodot[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code smg_dot[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
void delaysmg(unsigned int t)
{
while(t--);
}
void displaysmg_byte(unsigned char pos,unsigned char value)
{
P2=0XE0;P0=0XFF;
P2=0XC0;P0=0X01<<pos;
P2=0XE0;P0=value;
}
void display()
{
displaysmg_byte(0,smg_nodot[count_s4/10]);
delaysmg(100);
displaysmg_byte(1,smg_nodot[count_s4%10]);
delaysmg(100);
displaysmg_byte(2,0xbf);
delaysmg(100);
displaysmg_byte(3,smg_nodot[count_s5/10]);
delaysmg(100);
displaysmg_byte(4,smg_nodot[count_s5%10]);
delaysmg(100);
displaysmg_byte(5,0xbf);
delaysmg(100);
displaysmg_byte(6,smg_nodot[count_s6/10]);
delaysmg(100);
displaysmg_byte(7,smg_nodot[count_s6%10]);
delaysmg(100);
}
void write_24c02(unsigned char add,unsigned char dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
unsigned char read_24c02(unsigned char add)
{
unsigned char dat1;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
dat1=IIC_RecByte();
IIC_WaitAck();
IIC_SendAck(1);
IIC_Stop();
return dat1;
}
void key()
{
if(s4==0)
{
delaysmg(100);
if(s4==0)
{
while(s4==0)
{
display();
}
count_s4++;
write_24c02(0x00, count_s4);
if(count_s4>13) count_s4=0;
}
}
if(s5==0)
{
delaysmg(100);
if(s5==0)
{
while(s5==0)
{
display();
}
count_s5++;
write_24c02(0x01, count_s5);
if(count_s5>13) count_s5=0;
}
}
if(s6==0)
{
delaysmg(100);
if(s6==0)
{
while(s6==0)
{
display();
}
count_s6++;
write_24c02(0x02, count_s6);
if(count_s6>13) count_s6=0;
}
}
}
void main()
{
count_s4= read_24c02(0x00);
count_s5= read_24c02(0x01);
count_s6= read_24c02(0x02);
while(1)
{
key();
display();
}
}