题目要求(题目来自欧浩源小蜜蜂老师,小蜜蜂YYDS!)![](https://img-blog.csdnimg.cn/f2b4c5467ba74f5dbf7dda0a1140e957.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWXVfSGFuODg=,size_20,color_FFFFFF,t_70,g_se,x_16)
main.c
#include "main.h"
#include "7788.h"
#include "iic.h"
uint val,ls_val;
uchar level=0,led=0xff,temp,ls_level;
void main()
{
sys_Init();
while(1)
{
read_vol();
display_1();
level_led();
key_scan();
}
}
void key_scan()
{
if(S4==0)
{
delay(1000);
if(S4==0)
{
write_e2p(0x01,level);
delay(1000);
write_e2p(0x02,temp);
while(S4==0)
{
display_1();
}
}
}
if(S5==0)
{
delay(1000);
if(S5==0)
{
while(S5==0)
{
Y4; P0=0XFF; Y0;
display_2();
// display_1();
}
}
}
}
void display_2()
{
ls_level=read_e2p(0x01);
ls_val=read_e2p(0x02)*500.0/255;;
seg_one(0,17);
seg_one(1,ls_level%10);
seg_one(2,17);
seg_one(5,ls_val/100%10+32);
seg_one(6,ls_val/10%10);
seg_one(7,ls_val%10);
}
void level_led()
{
if(val>400)
{
level=1;
Y4; led=0xfe; P0=led; Y0;
}
else if(val>300)
{
level=2;
Y4; led=0xfc; P0=led; Y0;
}
else if(val>200)
{
level=3;
Y4; led=0xf0; P0=led; Y0;
}
else if(val>100)
{
level=4;
Y4; led=0xc0; P0=led; Y0;
}
else
{
level=5;
Y4; led=0x00; P0=led; Y0;
}
}
void read_vol()
{
temp=read_adc(0x01);
val=temp*500.0/255;
}
void display_1()
{
seg_one(0,17);
seg_one(1,level%10);
seg_one(2,17);
seg_one(5,val/100%10+32);
seg_one(6,val/10%10);
seg_one(7,val%10);
}
void sys_Init()
{
Y4; P0=0XFF; Y0;
Y5; P0=0X00; Y0;
Y6; P0=0X00; Y0;
}
void delay(uint t)
{
while(t--);
}
main.h
#ifndef _MAIN_H_
#define _MAIN_H_
#include "STC15F2K60S2.H"
#define uchar unsigned char
#define uint unsigned int
#define Y0 P2=(P2&0x1f)|0x00;
#define Y1 P2=(P2&0x1f)|0x20;
#define Y2 P2=(P2&0x1f)|0x40;
#define Y3 P2=(P2&0x1f)|0x60;
#define Y4 P2=(P2&0x1f)|0x80;
#define Y5 P2=(P2&0x1f)|0xa0;
#define Y6 P2=(P2&0x1f)|0xc0;
#define Y7 P2=(P2&0x1f)|0xe0;
sbit S4=P3^3;
sbit S5=P3^2;
void sys_Init();
void delay(uint t);
void display_1();
void read_vol();
void level_led();
void key_scan();
void display_2();
#endif
iic.c
#include "iic.h"
#include "intrins.h"
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//发送应答
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit; // 0:应答,1:非应答
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//等待应答
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
unsigned char read_adc(uchar channel)
{
uchar temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(channel);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_WaitAck();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
uchar read_e2p(uchar add)
{
uchar temp;
IIC_Start();
IIC_SendByte(0xA0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xA1);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_WaitAck();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
void write_e2p(uchar add,dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
iic.h
#ifndef _IIC_H
#define _IIC_H
#include "main.h"
void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
unsigned char read_adc(uchar channel);
uchar read_e2p(uchar add);
void write_e2p(uchar add,dat);
#endif