#include <reg52.h>
#include <iic.h>
sbit s4=P3^3;
sbit s5=P3^2;
sbit s6=P3^1;
sbit s7=P3^0;
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit L5=P0^4;
unsigned char code smg_nodot[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code smg_dot[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned int dat_f;//频率数据
unsigned int dat_uu;//采取电阻数据
float dat_uuu;//电压转换数据
unsigned int dat_u;//电压数据
unsigned int count_f;
unsigned char count;
unsigned char flag_s4=0;
bit flag_s5=0;
bit led_s6=0;
bit smg_s7=0;
void led();
void delaysmg(unsigned int t)
{
while(t--);
}
void displaysmg_byte(unsigned char pos,unsigned char value)
{
P2=0XE0;P0=0XFF;
P2=0XC0;P0=0X01<<pos;
P2=0XE0;P0=value;
}
void init_Time()
{
TH0=0XFF;
TL0=0XFF;
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;//定时50ms
TMOD=0X16;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
void service_t0() interrupt 1
{
count_f++;
}
void service_t1() interrupt 3
{
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;//定时50ms
count++;
if(count==20)//定时1s
{
dat_f=count_f;
count=0;
count_f=0;
}
}
void display_f()//频率显示界面
{
if(dat_f>9999)
{
displaysmg_byte(3,smg_nodot[dat_f/10000]);
delaysmg(100);
}
if(dat_f>999)
{
displaysmg_byte(4,smg_nodot[(dat_f/1000)%10]);
delaysmg(100);
}
if(dat_f>99)
{
displaysmg_byte(5,smg_nodot[(dat_f/100)%10]);
delaysmg(100);
}
if(dat_f>9)
{
displaysmg_byte(6,smg_nodot[(dat_f/10)%10]);
delaysmg(100);
}
displaysmg_byte(7,smg_nodot[dat_f%10]);
delaysmg(100);
displaysmg_byte(0,0x8e);
delaysmg(100);
displaysmg_byte(1,0xff);
delaysmg(100);
displaysmg_byte(2,0xff);
delaysmg(100);
}
void display_U()//电压显示界面
{
displaysmg_byte(5,smg_dot[dat_u/100]);
delaysmg(100);
displaysmg_byte(6,smg_nodot[(dat_u/10)%10]);
delaysmg(100);
displaysmg_byte(7,smg_nodot[dat_u%10]);
delaysmg(100);
displaysmg_byte(0,0xc1);
delaysmg(100);
displaysmg_byte(1,0xff);
delaysmg(100);
displaysmg_byte(2,0xff);
delaysmg(100);
displaysmg_byte(3,0xff);
delaysmg(100);
displaysmg_byte(4,0xff);
delaysmg(100);
}
void read_Rb2()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat_uu=IIC_RecByte();
IIC_WaitAck();
IIC_SendAck(1);
IIC_Stop();
dat_uuu=dat_uu*(5.0/255);
dat_u=dat_uuu*100;
}
void display()
{
if(smg_s7==0)//数码管显示功能启用
{
switch(flag_s4)
{
case 0:
display_f();break;
case 1:
if(flag_s5==1)//电压随电位器Rb2变化模式
{
read_Rb2();
display_U();
}
else if(flag_s5==0)//电压固定为2.0v模式
{
dat_u=200;
display_U();
}
}
}
else if(smg_s7==1)//数码管显示功能启用
{
P2=0XC0;P0=0XFF;
P2=0XE0;P0=0XFF;
led();
}
}
void key()
{
if(s4==0)//s4,界面切换按键
{
delaysmg(100);
if(s4==0)
{
while(s4==0)
{
display();
}
flag_s4++;
}
if(flag_s4==2)
{
flag_s4=0;
}
}
if(s5==0) //s5,电压输出模式切换按键
{
delaysmg(100);
if(s5==0)
{
while(s5==0)
{
display();
}
flag_s5=~flag_s5;
}
}
if(s6==0)//s6,led功能控制按键
{
delaysmg(100);
if(s6==0)
{
while(s6==0)
{
display();
}
led_s6=~led_s6;
}
}
if(s7==0)//s7,数码管显示功能按键
{
delaysmg(100);
if(s7==0)
{
while(s7==0)
{
display();
}
smg_s7=~smg_s7;
}
}
}
void led()//led模块
{
P2=0X80;
if(led_s6==0)//启用led功能模式
{
read_Rb2();
if(flag_s4==1) L1&=0;
if(flag_s4==0) L2&=0;
if(dat_u<150) L3&=1;
if(dat_u>=150&&dat_u<250) L3&=0;
if(dat_u>=250&&dat_u<350) L3&=1;
if(dat_u>=350) L3&=0;
if(dat_f<1000) L4&=1;
if(dat_f>=1000&&dat_f<5000) L4&=0;
if(dat_f>=5000&&dat_f<10000) L4&=1;
if(dat_f>=10000) L4&=0;
if(flag_s5==0) L5&=1;
if(flag_s5==1) L5&=0;
}
else if(led_s6==1)//关闭led功能模式
{
P0=0xff;
}
}
void main()
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
init_Time();
while(1)
{
key();
led();
display();
}
}