#include"reg52.h"
#include"iic.h"
sbit S4=P3^3;
sbit S5=P3^2;
unsigned char code SMG_duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
unsigned int adc_value=0;
float adc_volt=0;
unsigned int smg_volt=0;
unsigned char stat_led=0xff;
unsigned char level=0;
void HC138(unsigned char m)
{
switch(m)
{
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;
case 0:P2=(P2&0x1f)|0x00;break;
}
P2=(P2&0x1f)|0x00;
}
void SMG_bit(unsigned char pos,unsigned char dat)
{
P0=(0x01<<pos);
HC138(6);
P0=dat;
HC138(7);
}
void SMG_off()
{
P0=0xff;
HC138(6);
P0=0xff;
HC138(7);
}
void SMG_delay(unsigned char y)
{
while(y--);
}
void SMG_display()
{
SMG_bit(0,0xbf);
SMG_delay(200);
SMG_bit(0,0xff);
SMG_delay(200);
SMG_bit(1,level);
SMG_delay(200);
SMG_bit(1,0xff);
SMG_delay(200);
SMG_bit(2,0xbf);
SMG_delay(200);
SMG_bit(2,0xff);
SMG_delay(200);
SMG_bit(5,SMG_duanma[smg_volt/100]);
SMG_delay(200);
SMG_bit(5,0xff);
SMG_delay(200);
SMG_bit(6,SMG_duanma[(smg_volt/10)%10]);
SMG_delay(200);
SMG_bit(6,0xff);
SMG_delay(200);
SMG_bit(7,SMG_duanma[smg_volt%10]);
SMG_delay(200);
SMG_bit(7,0xff);
SMG_delay(200);
SMG_off();
SMG_delay(200);
}
void write24C02(unsigned char addr,unsigned char dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
unsigned char read24C02(unsigned char addr)
{
unsigned char tmp;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
tmp=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return tmp;
}
void ReadPCF8951()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x01);
IIC_WaitAck();
IIC_Stop();
SMG_display();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
adc_value=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
adc_volt=adc_value*(5.0/255);
smg_volt=adc_volt*100;
SMG_display();
}
void LED()
{
ReadPCF8951();
if(adc_volt>4.5)
{
stat_led=0xff;
level=0;
}
else if(adc_volt>4.0)
{
stat_led=0xfc;
level=1;
}
else if(adc_volt>3.5)
{
stat_led=0xfc;
level=2;
}
else if(adc_volt>3.0)
{
stat_led=0xf8;
level=3;
}
else if(adc_volt>2.5)
{
stat_led=0xf0;
level=4;
}
else if(adc_volt>2.0)
{
stat_led=0xe0;
level=5;
}
else if(adc_volt>1.5)
{
stat_led=0xc0;
level=6;
}
else if(adc_volt>1.0)
{
stat_led=0x80;
level=7;
}
else if(adc_volt>0.5)
{
stat_led=0x00;
level=8;
}
P0=stat_led;
HC138(4);
}
void save_to_24C02()
{
write24C02(0x01,level);
SMG_display();
write24C02(0x02,adc_value);
SMG_display();
}
void read_from_24C02()
{
level=read24C02(0x01);
adc_value=read24C02(0x02);
adc_volt=adc_value*(5.0/255);
smg_volt=adc_volt*100;
}
void key_delay(unsigned char p)
{
while(p--);
}
void keyboard()
{
if(S4==0)
{
key_delay(200);
if(S4==0)
{
while(S4==0)
{
LED();
}
save_to_24C02();
}
}
if(S5==0)
{
key_delay(200);
if(S5==0)
{
while(S5==0)
{
LED();
}
read_from_24C02();
P0=0xff;
HC138(4);
}
}
}
void Initsystem()
{
P0=0xff;
HC138(4);
P0=0x00;
HC138(5);
SMG_off();
}
void main()
{
Initsystem();
while(1)
{
keyboard();
LED();
}
}
小蜜蜂老师【PCF8591和AT24C02综合】
最新推荐文章于 2024-02-04 12:10:59 发布