#include <stc15f2k60s2.h>
#include <iic.h>
#define uchar unsigned char
uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XBF,0XFF,0Xc1,0X8C,0XC8};
uchar discode[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar dis[9]={0,0,0,0,0,0,0,0,0};
uchar adread_flag;
uchar mode;
uchar key_flag,P2_flag;
int Vp=300;
int t;
int temp;
uchar Vpp;
uchar N;
void delayms(int ms);
void allinit();
void display();
void keyscan();
uchar adread();
void Timer0Init(void);
void workled();
void epromwrite(uchar temp);
uchar epromread();
void main()
{
allinit();
Timer0Init();
Vp=10*epromread();delayms(2);
while(1)
{
temp=1.97*adread();
if(mode==0)
{
if(temp>500) temp=500;
dis[1]=22;
dis[2]=21;dis[3]=21;dis[4]=21;dis[5]=21;
dis[6]=temp/100+10;
dis[7]=temp/10%10;
dis[8]=temp%10;
}
if(mode==1)
{
dis[1]=23;
dis[2]=21;dis[3]=21;dis[4]=21;dis[5]=21;
dis[6]=Vp/100+10;
dis[7]=Vp/10%10;
dis[8]=Vp%10;
}
if(mode==2)
{
dis[1]=24;
dis[2]=21;dis[3]=21;dis[4]=21;dis[5]=21;
dis[6]=N/100;
dis[7]=N/10%10;
dis[8]=N%10;
}
if((temp<Vp)&&(adread_flag==1))
{
N++;adread_flag=0;
}
if(temp>=Vp)
{
adread_flag=1;
}
keyscan();
display();
workled();
}
}
void delayms(int ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=125;j--;j>0);
}
void allinit()
{
P2=0X80;P0=0XFF;
P2=0XA0;P0=0X00;
P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
}
void display()
{
uchar i;
for(i=0;i<8;i++)
{
P2=0XC0;
P0=discode[i];
P2=0XE0;
P0=tab[dis[i+1]];
delayms(1);
P2=0XC0;P0=0XFF;
P2=0XE0;P0=0XFF;
}
}
void keyscan()
{
uchar temp;
P44=0;P42=1;P3=0X7F;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delayms(2);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3&0x0f;
switch(temp)
{
case 0x0e: key_flag++; break;
case 0x0d: key_flag++; break;
case 0x0b: key_flag++; break;
case 0x07: key_flag++; break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
}
}
P42=0;P44=1;P3=0XbF;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delayms(2);
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=P3&0x0f;
switch(temp)
{
case 0x0e: key_flag++; break;
case 0x0d: key_flag++; break;
case 0x0b:
{
key_flag=0;
if(mode==1)
{
if(Vp==0) Vp=550;
Vp=Vp-50;
Vpp=Vp/10;
epromwrite(Vpp);
}
}
break;
case 0x07:
{
key_flag=0;
if(mode==1)
{
if(Vp==500) Vp=-50;
Vp=Vp+50;
Vpp=Vp/10;
epromwrite(Vpp);
}
}
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
}
}
P44=1;P42=1;P3=0XdF;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delayms(2);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3&0x0f;
switch(temp)
{
case 0x0e: key_flag++; break;
case 0x0d: key_flag++; break;
case 0x0b:
{
key_flag=0;
if(mode==2)
{
N=0;
}
break;
}
case 0x07:
{
key_flag=0;
if(mode==0) mode=1;
else if(mode==1)
{
Vpp=Vp/10;
epromwrite(Vpp);delayms(1);
mode=2;
}
else if(mode==2) mode=0;
break;
}
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
}
}
P44=1;P42=1;P3=0XeF;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delayms(2);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3&0x0f;
switch(temp)
{
case 0x0e: key_flag++; break;
case 0x0d: key_flag++; break;
case 0x0b: key_flag++; break;
case 0x07: key_flag++; break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
}
}
}
uchar adread()
{
uchar temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
return temp;
}
void epromwrite(uchar temp)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(0x00);
IIC_WaitAck();
IIC_SendByte(temp);
IIC_WaitAck();
IIC_Stop();
}
uchar epromread()
{
uchar temp;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(0x00);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
temp=IIC_RecByte();
return temp;
}
void Timer0Init(void)
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0xA0;
TH0 = 0x15;
TF0 = 0;
TR0 = 1;
EA=1;ET0=1;
}
void workled()
{
if(N%2==0)
{
P2=0X80;P01=1;;
}
else
{
P2=0x80;P01=0;
}
if(key_flag>=3)
{
P2=0X80;P02=0;
}
else
{
P2=0X80;P02=1;
}
if(P2_flag==1)
{
P2=0x80;P00=0;t=0;
}
else
{
P2=0X80;P00=1;
}
}
void Time0() interrupt 1
{
if(temp<Vp)
{
t++;
if(t>=1000)
{
P2_flag=1;
}
}
else
{
P2_flag=0;
}
}