我的解答
iic
iic.h
#ifndef __IIC_H__
#define __IIC_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);
void AT24C02_Write(unsigned char Address,Data);
unsigned char AT24C02_Read(unsigned char Address);
void PCF8591_Write(unsigned char Data);
void Delay(unsigned char x);
#endif
iic.c
#include "reg52.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;
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;
}
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;
}
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;
}
void AT24C02_Write(unsigned char Address,Data)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(Address);
IIC_WaitAck();
IIC_SendByte(Data);
IIC_WaitAck();
IIC_Stop();
}
void PCF8591_Write(unsigned char Data)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(Data);
IIC_WaitAck();
IIC_Stop();
}
unsigned char AT24C02_Read(unsigned char Address)
{
unsigned char Data;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(Address);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
Data=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return Data;
}
void Delay(unsigned char x)
{
unsigned char i, j;
while(x--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
main
main.h
#include <STC15F2K60S2.H>
#include "iic.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit A1=P1^0;
sbit B1=P1^1;
u16 time,wave_count,length;
void Start();
void Pros();
void delays();
void Wave_Rec();
sbit L1=P3^0;
sbit L2=P3^1;
sbit L3=P3^2;
sbit L4=P3^3;
sbit C1=P4^4;
sbit C2=P4^2;
sbit C3=P3^5;
sbit C4=P3^4;
u8 KN,key_count;
u8 GetState();
void Key_Loop();
u8 code ledguan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
u8 wei_xuan,disp[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
void Timer0Init(void);
void Timer1Init(void);
u8 Mode=0;
u8 last_length;
bit ifirst;
bit Mode0;
bit ceju=0;
u8 length_s[10];
u8 i;
u8 length_s_count;
bit an_5;
bit an_9;
bit shuaxin;
u8 sjbh;
u8 S0=20,S0_Set;
bit LED1,L7,L8;
bit shanshuo;
u8 L1_shanshuo_count;
u8 L1_count;
void main()
{
P2=0x80;P0=0xff;P2=0x00;
ET0=0;
for(i=0;i<10;i++)
length_s[i]=AT24C02_Read(i);
length_s_count=AT24C02_Read(10);
if(length_s_count)last_length=length_s[length_s_count-1];
ET0=1;
Timer0Init();Timer1Init();
disp[0]=ledguan[0];
disp[1]=0xff;
disp[2]=ledguan[last_length/100%10];
disp[3]=ledguan[last_length/10%10];
disp[4]=ledguan[last_length%10];
disp[5]=ledguan[length/100%10];
disp[6]=ledguan[length/10%10];
disp[7]=ledguan[length%10];
while(1)
{
if(KN)
{
if(KN==4)
{
L7=0;
L8=0;
an_5=0;
an_9=0;
Mode=0;
Mode0=0;
ceju=1;
KN=0;
}
if(KN==5)
{
L8=0;
an_9=0;
KN=0;
an_5=!an_5;
if(an_5)
{
L7=1;
Mode=1;
shuaxin=1;
}
else
{
L7=0;
Mode=0;
shuaxin=1;
}
}
if(KN==9)
{
S0_Set=S0;
an_5=0;
KN=0;
shuaxin=1;
an_9=!an_9;
if(an_9)
{
L8=1;
L7=0;
Mode=2;
}
else
{
L7=0;
L8=0;
S0=S0_Set;
AT24C02_Write(11,S0);
Delay(5);
Mode=0;
}
}
if(KN==8)
{
KN=0;
if(Mode==0)
{
Mode0=!Mode0;
if(Mode0)
{
disp[0]=ledguan[1];
disp[2]=ledguan[(last_length+length)/100%10];
disp[3]=ledguan[(last_length+length)/10%10];
disp[4]=ledguan[(last_length+length)%10];
}
else
{
disp[0]=ledguan[0];
disp[2]=ledguan[last_length/100%10];
disp[3]=ledguan[last_length/10%10];
disp[4]=ledguan[last_length%10];
}
}
if(Mode==1)
{
sjbh++;
sjbh%=10;
shuaxin=1;
}
if(Mode==2)
{
S0_Set+=10;
if(S0_Set==100)S0_Set=0;
shuaxin=1;
}
}
}
if(L1_count==200)
{
L1_count=0;
LED1=!LED1;
L1_shanshuo_count++;
if(L1_shanshuo_count==20)
{
L1_shanshuo_count=0;
shanshuo=0;
L1_count=0;
LED1=0;
}
}
if(!Mode)
{
if(ceju)
{
disp[0]=ledguan[0];
disp[1]=0xff;
disp[2]=ledguan[last_length/100%10];
disp[3]=ledguan[last_length/10%10];
disp[4]=ledguan[last_length%10];
disp[5]=ledguan[length/100%10];
disp[6]=ledguan[length/10%10];
disp[7]=ledguan[length%10];
if(wave_count==350)
{
ceju=0;
wave_count=0;
if(ifirst)last_length=length;
else ifirst=1;
Wave_Rec();
shanshuo=1;
if(length_s_count<10)
{
length_s[length_s_count]=length;
length_s_count++;
}
else
{
for(i=0;i<9;i++)
{
length_s[i]=length_s[i+1];
}
length_s[9]=length;
}
for(i=0;i<10;i++)
{
AT24C02_Write(i,length_s[i]);
Delay(5);
}
AT24C02_Write(10,length_s_count);
Delay(5);
disp[0]=ledguan[0];
disp[1]=0xff;
disp[2]=ledguan[last_length/100%10];
disp[3]=ledguan[last_length/10%10];
disp[4]=ledguan[last_length%10];
disp[5]=ledguan[length/100%10];
disp[6]=ledguan[length/10%10];
disp[7]=ledguan[length%10];
}
}
else if(shuaxin)
{
shuaxin=0;
disp[0]=ledguan[0];
disp[1]=0xff;
disp[2]=ledguan[last_length/100%10];
disp[3]=ledguan[last_length/10%10];
disp[4]=ledguan[last_length%10];
disp[5]=ledguan[length/100%10];
disp[6]=ledguan[length/10%10];
disp[7]=ledguan[length%10];
}
}
if(Mode==1)
{
if(shuaxin)
{
shuaxin=0;
disp[0]=ledguan[(sjbh+1)/10%10];
disp[1]=ledguan[(sjbh+1)%10];
disp[2]=0xff;
disp[3]=0xff;
disp[4]=0xff;
disp[5]=ledguan[length_s[sjbh]/100%10];
disp[6]=ledguan[length_s[sjbh]/10%10];
disp[7]=ledguan[length_s[sjbh]%10];
}
}
if(Mode==2)
{
if(shuaxin)
{
shuaxin=0;
disp[0]=0x8e;
disp[1]=0xff;
disp[2]=0xff;
disp[3]=0xff;
disp[4]=0xff;
disp[5]=0xff;
disp[6]=ledguan[S0_Set/10%10];
disp[7]=ledguan[S0_Set%10];
}
}
if(key_count==20)
{
key_count=0;
Key_Loop();
}
if(length<=S0)
PCF8591_Write(0);
else
PCF8591_Write((u8)((length-S0)*1.02));
}
}
void Start()
{
u8 m;
A1=0;
for(m=0;m<10;m++)
{
A1^=1;
delays();
}
}
void Pros()
{
if(TF1)
{
TF1=0;
length=99;
}
else
{
time=(TH1<<8)|TL1;
length=time*0.017;
length/=12;
}
TH1=0;
TL1=0;
}
void delays()
{
u8 i;
for(i=0;i<12;i++);
}
void Wave_Rec()
{
TR1=0;
Start();
TR1=1;
while(B1&&!TF1);
TR1=0;
Pros();
}
u8 GetState()
{
u8 State=0;
L1=1;L2=1;L3=0;L4=1;
if(C1==0)State=5;
if(C2==0)State=9;
L1=1;L2=1;L3=1;L4=0;
if(C1==0)State=4;
if(C2==0)State=8;
return State;
}
void Key_Loop()
{
static u8 Now,Last;
Last=Now;
Now=GetState();
if(!Now&&Last)
KN=Last;
}
void Timer0Init(void)
{
AUXR = 0xc0;
TMOD = 0x00;
TL0 = 0x20;
TH0 = 0xD1;
TF0 = 0;
TR0 = 1;
EA=1;
ET0=1;
}
void Timer1Init(void)
{
AUXR = 0xc0;
TMOD = 0x00;
TL1 = 0x00;
TH1 = 0x00;
TF1 = 0;
TR1 = 0;
}
void Timer0_R() interrupt 1
{
static u8 smg_count,led_count;
smg_count++;key_count++;led_count++;
if(!Mode)
{
if(shanshuo)
L1_count++;
}
if(led_count==20)
{
led_count=0;
P2=0x80;P0=~(((u8)L8<<7)|((u8)L7<<6)|(u8)(LED1))|0X3E;
}
if(ceju&&!Mode)wave_count++;
else wave_count=0;
if(smg_count==2)
{
smg_count=0;
P2=0xc0;P0=1<<wei_xuan;P2=0x00;
P2=0xe0;P0=0x00;P2=0x00;
P2=0xe0;P0=disp[wei_xuan++];P2=0x00;
wei_xuan%=8;
}
}