程序代码:
main.c
#include <REG52.H>
#include "IIC.h"
sfr P4=0xc0;
sbit L1=P3^0;
sbit L2=P3^1;
sbit L3=P3^2;
sbit L4=P3^3;
sbit R1=P4^4;
sbit R2=P4^2;
sbit R3=P3^5;
sbit R4=P3^4;
void HC573(unsigned char channel,unsigned char value);
void Nixie(unsigned char column,unsigned char value);
void Delay(unsigned int x);
void System_initial();
void Display_All();
unsigned char code Array[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
unsigned char code Array_pot[]={0x40,0x79,0X24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned int voltage=0;//电压
float T_voltage=0;//电压计算
unsigned char voltage_para=30;//电压参数
unsigned char Mode=0;
unsigned char Cnt=0;//计数参数
unsigned char Cnt_falg=0;//计数判断标志位
unsigned char LED1_Flag=0;//LED1标志位
unsigned char LED1=0;//控制LED1开关
unsigned char LED_Stat=0xff;//LED总控制位
unsigned int Count=0;//计数
unsigned char Invaild=0;//记录无效按键
//写入24c02
void Wriet_24C02(unsigned char Address,unsigned char Data)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(Address);
I2CWaitAck();
I2CSendByte(Data);
I2CWaitAck();
I2CStop();
}
//读取24c02
unsigned char Read_24C02(unsigned char Address)
{
unsigned char temp;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(Address);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
temp=I2CReceiveByte();
I2CWaitAck();
return temp;
}
//电压读取
void Read_PCF8591()
{
unsigned char temp;
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x43);
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
temp=I2CReceiveByte();
I2CWaitAck();
I2CStop();
T_voltage=temp*(5.0/255);
voltage=T_voltage*100;
}
//电压显示
void Display_voltage()
{
Nixie(1,0xc1);
Nixie(2,0xff);
Nixie(3,0xff);
Nixie(4,0xff);
Nixie(5,0xff);
Nixie(6,Array_pot[voltage/100%10]);
Nixie(7,Array[voltage/10%10]);
Nixie(8,Array[voltage%10]);
}
//电压参数显示
void Display_voltage_para()
{
Nixie(1,0x8c);
Nixie(2,0xff);
Nixie(3,0xff);
Nixie(4,0xff);
Nixie(5,0xff);
Nixie(6,Array_pot[voltage_para/10%10]);
Nixie(7,Array[voltage_para%10]);
Nixie(8,Array[0]);
}
//计数页面
void Display_count()
{
Nixie(1,0xc8);
Nixie(2,0xff);
Nixie(3,0xff);
Nixie(4,0xff);
Nixie(5,0xff);
Nixie(6,Array[Cnt/100%10]);
Nixie(7,Array[Cnt/10%10]);
Nixie(8,Array[Cnt%10]);
}
//计数增加判断
void Count_ctrl()
{
if(voltage>((int)(voltage_para)*10))
{
Cnt_falg=1;
}
if((Cnt_falg==1)&&(voltage<((int)(voltage_para)*10)))
{
Cnt++;
Cnt_falg=0;
}
}
//按键扫描
void Key_Scan()
{
L4=0;
L1=L2=L3=1;
R1=R2=R3=R4=1;
if(R3==0)
{
if(Mode==0)Mode=1;
else if(Mode==1){Mode=2;Wriet_24C02(0x00,voltage_para);Delay(10);}
else if(Mode==2)Mode=0;
Invaild=0;
while(R3==0){Display_All();}
}
else if(R4==0)
{
if(Mode==1)
{
if(voltage_para==50)
{
voltage_para=0;
}
voltage_para+=5;
Invaild=0;
}
else
{
Invaild++;
}
while(R4==0){Display_All();}
}
L3=0;
L1=L2=L4=1;
R1=R2=R3=R4=1;
if(R3==0)
{
if(Mode==2){Cnt=0;Invaild=0;}
else Invaild++;
while(R3==0){Display_All();}
}
else if(R4==0)
{
if(Mode==1)
{
if(voltage_para==0)
{
voltage_para=50;
}
voltage_para-=5;
Invaild=0;
}
else
{
Invaild++;
}
while(R4==0){Display_All();}
}
}
//总显示函数
void Display_All()
{
if(Mode==0)
{
Display_voltage();
}
else if(Mode==1)
{
Display_voltage_para();
}
else if(Mode==2)
{
Display_count();
}
}
//灯光控制
void LED_RUN()
{
if(voltage<((int)(voltage_para)*10))
{
LED1_Flag=1;
TR0=1;
}
else if((voltage>((int)(voltage_para)*10)))
{
LED1=0;
LED1_Flag=0;
TR0=0;
Count=0;
}
if(LED1==1)
{
LED_Stat=P0&0xfe;
HC573(4,LED_Stat);
}
else if(LED1==0)
{
LED_Stat=P0|0x01;
HC573(4,LED_Stat);
}
if(Cnt%2==1)
{
LED_Stat=P0&0xFd;
HC573(4,LED_Stat);
}
else
{
LED_Stat=P0|0x02;
HC573(4,LED_Stat);
}
if(Invaild>=3)
{
LED_Stat=P0&0xfb;
HC573(4,LED_Stat);
}
else
{
LED_Stat=P0|0x04;
HC573(4,LED_Stat);
}
}
void Time0_Init()
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TF0=0;
ET0=1;
EA=1;
}
void main()
{
System_initial();
while(1)
{
Key_Scan();
Read_PCF8591();
Display_All();
Count_ctrl();
LED_RUN();
}
}
void Time0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
Count++;
if(Count>100)
{
if(LED1_Flag==1)
{
LED1=1;
}
else
{
LED1=0;
}
Count=0;
TR0=0;
}
}
void System_initial()
{
HC573(5,0x00);
HC573(4,0xff);
voltage_para=Read_24C02(0x00);
Time0_Init();
}
void HC573(unsigned char channel,unsigned char value)
{
P2=(0x1f&P2)|0x00;
P0=value;
switch(channel)
{
case 4:P2=(0x1f&P2)|0x80;break;
case 5:P2=(0x1f&P2)|0xa0;break;
case 6:P2=(0x1f&P2)|0xc0;break;
case 7:P2=(0x1f&P2)|0xe0;break;
case 0:P2=(0x1f&P2)|0x00;break;
}
P2=(0x1f&P2)|0x00;
}
void Delay(unsigned int x)
{
unsigned char i,j;
while(x--)
{
i=11;
j=190;
do
{
while(--j);
}while(--i);
}
}
void Nixie(unsigned char column,unsigned char value)
{
HC573(6,0x01<<(column-1));
HC573(7,value);
Delay(1);
HC573(6,0x01<<(column-1));
HC573(7,0xff);
}
iic.h
#include "reg52.h"
#include "intrins.h"
sbit sda=P2^1;
sbit scl=P2^0;
#define DELAY_TIME 5
//
static void I2C_Delay(unsigned char n)
{
do
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
while(n--);
}
//
void I2CStart(void)
{
sda = 1;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 0;
I2C_Delay(DELAY_TIME);
scl = 0;
}
//
void I2CStop(void)
{
sda = 0;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 1;
I2C_Delay(DELAY_TIME);
}
//
void I2CSendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++){
scl = 0;
I2C_Delay(DELAY_TIME);
if(byt & 0x80){
sda = 1;
}
else{
sda = 0;
}
I2C_Delay(DELAY_TIME);
scl = 1;
byt <<= 1;
I2C_Delay(DELAY_TIME);
}
scl = 0;
}
//
unsigned char I2CReceiveByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++){
scl = 1;
I2C_Delay(DELAY_TIME);
da <<= 1;
if(sda)
da |= 0x01;
scl = 0;
I2C_Delay(DELAY_TIME);
}
return da;
}
//
unsigned char I2CWaitAck(void)
{
unsigned char ackbit;
scl = 1;
I2C_Delay(DELAY_TIME);
ackbit = sda;
scl = 0;
I2C_Delay(DELAY_TIME);
return ackbit;
}
iic.h
#ifndef __IIC_H_
#define __IIC_H_
void I2CStart(void);
void I2CStop(void);
void I2CSendByte(unsigned char byt);
unsigned char I2CReceiveByte(void);
unsigned char I2CWaitAck(void);
#endif