#include"reg52.h"
#include"iic.h"
unsigned char code SMG_int[18]=
{0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,
0xc0,0x86,0x8e,0xbf,0x7f};
//数字“ 0. ”到数字“ 9. ”
unsigned char code SMG_float[10]=
{0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10};
void InitHC573(unsigned char n) //通道选择
{
switch(n)
{
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;
}
}
void Delay(unsigned int t) //延迟函数
{
while(t--);
}
void SMG_off(unsigned char dat) //关闭全部数码管 (消隐)
{
InitHC573(6);
P0=0xff;
InitHC573(7);
P0=dat;
}
void Init_SMG(unsigned char dat,unsigned char pos) //数码管显示:内容 位选
{
InitHC573(7);
P0=0xff;
InitHC573(6);
P0=0x01<<pos;
InitHC573(7);
P0=dat;
}
//===============pcf8591_AIN3===============
unsigned int dat_v=0;
void Read_pcf8591()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03); //AIN3:0x03 3通道
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat_v=1.961*IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
}
void SMG_AIN3_1() //数码管显示AIN3采集的电压
{
Init_SMG(0xc1,0);Delay(500);
Init_SMG(0xff,1);Delay(500);
Init_SMG(0xff,2);Delay(500);
Init_SMG(0xff,3);Delay(500);
Init_SMG(0xff,4);Delay(500);
Init_SMG(SMG_float[dat_v/100],5);Delay(500);
Init_SMG(SMG_int[(dat_v/10)%10],6);Delay(500);
Init_SMG(SMG_int[dat_v%10],7);Delay(500);
SMG_off(0xff);
}
//================dat_n=====================
int dat_n=300;
void SMG_2() //参数设置界面
{
Init_SMG(0x8c,0);Delay(500);
Init_SMG(0xff,1);Delay(500);
Init_SMG(0xff,2);Delay(500);
Init_SMG(0xff,3);Delay(500);
Init_SMG(0xff,4);Delay(500);
Init_SMG(SMG_float[dat_n/100],5);Delay(500);
Init_SMG(SMG_int[(dat_n/10)%10],6);Delay(500);
Init_SMG(SMG_int[0],7);Delay(500);
SMG_off(0xff);
}
//===============计数======================
unsigned char n=0;
void SMG_3() //j计数界面
{
Init_SMG(0x92,0);Delay(500);
Init_SMG(0xff,1);Delay(500);
Init_SMG(0xff,2);Delay(500);
Init_SMG(0xff,3);Delay(500);
Init_SMG(0xff,4);Delay(500);
Init_SMG(0xff,5);Delay(500);
Init_SMG(SMG_int[n/10],6);Delay(500);
Init_SMG(SMG_int[n%10],7);Delay(500);
SMG_off(0xff);
}
//=========按键功能============================
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
unsigned char stat_s4=1;
unsigned char stat_s5=0;
unsigned char stat_s6=0;
void Scannkey()
{
if(S4==0)
{
Delay(100);
if(S4==0)
{
stat_s4++;
if(stat_s4==4) stat_s4=1;
while(S4==0) //
{
SMG_AIN3_1();
SMG_2();
SMG_3();
}
}
}
if(S5==0)
{
Delay(100);
if(S5==0)
{
stat_s5=1;
while(S5==0)
{
SMG_2();
}
}
}
if(S6==0)
{
Delay(100);
if(S6==0)
{
stat_s6=1;
while(S6==0)
{
SMG_2();
}
}
}
}
//======================模式选择=======================
void In_1_2_3()
{
if(stat_s4==1) //电压数据界面
{
Read_pcf8591();
SMG_AIN3_1();
}
if(stat_s4==2) //参数设置界面
{
SMG_2();
if(stat_s5==1) //减0.5V
{
dat_n=dat_n-50;
if(dat_n<0) dat_n=500;
}
if(stat_s6==1) //加0.5V
{
dat_n=dat_n+50;
if(dat_n>500) dat_n=0;
}
stat_s5=0;
stat_s6=0;
}
if(stat_s4==3) //计数显示界面
{
SMG_3();
}
}
//==================定时器0========================
unsigned char count_t=0;
unsigned char t_s=0;
void Time0()
{
TMOD=0x01;
TH0=(65535-50000+1)/256;
TL0=(65535-50000+1)%256;
ET0=1;
EA=1;
}
void Serive() interrupt 1
{
TH0=(65535-50000+1)/256;
TL0=(65535-50000+1)%256;
count_t++;
if(count_t==20) // 定时1s
{
n++;
count_t=0;
if(n>99) n=0;
}
}
void LED()
{
if(dat_v<dat_n)
{
TR0=1; //启动定时器
if(n>2) //L1亮
{
InitHC573(4);
P0=0xfe;
InitHC573(0);
}
if(n>4) //L1、L2亮
{
InitHC573(4);
P0=0xfc;
InitHC573(0);
}
if(n>6) //L1、L2、L3亮 同时L8亮1s,熄灭1s
{
if(n%2==0)
{
InitHC573(4);
P0=0xf8&0x7f; //L8亮
InitHC573(0);
}
if(n%2!=0)
{
InitHC573(4);
P0=0xf8; //L8熄灭
InitHC573(0);
}
}
}
if(dat_v>dat_n)
{
TR0=0; //关闭定时器
n=0; //计数清零
InitHC573(4); //关闭指示灯
P0=0xff;
InitHC573(0);
}
}
void Init() //初始化
{
InitHC573(5);
P0=0x00;
InitHC573(4);
P0=0xff;
}
void main()
{
Init();
Time0();
while(1)
{
LED();
In_1_2_3();
Scannkey();
}
}