iic.c
#include<STC15F2K60S2.H>
#include "iic.h"
#include "intrins.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
somenop;
SDA = 0;
somenop;
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
somenop;
SDA = 1;
}
//等待应答
bit IIC_WaitAck(void)
{
SDA = 1;
somenop;
SCL = 1;
somenop;
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byt&0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
somenop;
SCL = 1;
byt <<= 1;
somenop;
SCL = 0;
}
}
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++)
{
SCL = 1;
somenop;
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
somenop;
}
return da;
}
unsigned char AD_read(unsigned char add)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_Stop();
return temp;
}
void AD_Write(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();}
iic.h
#ifndef _IIC_H
#define _IIC_H
//函数声明
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ack(bit ackbit);
void IIC_SendByte(unsigned char byt);
bit IIC_WaitAck(void);
unsigned char IIC_RecByte(void);
unsigned char AD_read(unsigned char add);
void AD_Write(unsigned char dat);
#endif
main.c
#include<STC15F2K60S2.H>
#include "iic.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF,//0-11
0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,//12-21
0x8e,0xc1};//22-23
uchar fla=0;
uint fan=0,t_flag=0,zheng_now=0,fan_now=0,zheng=0;
uint Time=0,freq=0,intr=0;
uchar yi,er,san,si,wu,liu,qi,ba;
bit S4,S5,S6,S7;
bit scan=0;
uchar AD_out=1,out=0;
uint num;
uint AD=0;
uchar scan1=0;
uchar led=1;
void Allinit(void);
void Delayms(int ms);
void Display1(uchar yi,uchar er);
void Display2(uchar san,uchar si);
void Display3(uchar wu,uchar liu);
void Display4(uchar qi,uchar ba);
void keyscan(void);
void DIG(void);
void Timer2Init(void);
void Timer0Init(void);
void main(void)
{
Allinit();
Timer2Init();
Timer0Init();
while(1)
{
if(intr==499)
{AD_read(0X03);
if(AD_out==2)
{AD_Write(out);}
else if(AD_out==1)
{AD_Write(102);}}
DIG();
if(led==1)
{
if(fla==1){P2=0X80;P0=0XFF;P00=1;P01=0;
P02=1;
if(freq<1000){P03=1;}
else if((freq>=1000)&&(freq<5000)){P03=0;}
else if((freq>=5000)&&(freq<10000)){P03=1;}
else if(freq>10000){P03=0;}
if(AD_out==1){P04=1;}
else if(AD_out==2){P04=0;}
P05=1;P06=1;P07=1;}
else if(fla==0)
{P2=0X80;P0=0XFF;P00=0;P01=1;
if(num<150){P02=1;}
else if((num>=150)&&(num<250)){P02=0;}
else if((num>=250)&&(num<350)){P02=1;}
else if(num>=350){P02=0;}
P03=1;
if(AD_out==1){P04=1;}
else if(AD_out==2){P04=0;}
P05=1;P06=1;P07=1;}
}
keyscan();
Display1(yi,er);
Display2(san,si);
Display3(wu,liu);
Display4(qi,ba);
}
}
void keyscan(void)
{
if(P30==0)
{
Delayms(5);
if(P30==0)
{
if(scan1==0){scan1=1;
P2=0XC0;//打开控制数码管位选的573
P0=0XFF;//选中所有数码管
P2=0XE0;//打开控制数码管段选的573
P0=0XFF;//关闭所有的数码管
}
else if(scan1==1){scan1=0;}
}
while(!P30);
}
else if(P31==0)
{
Delayms(5);
if(P31==0)
{
if(led==1){led=0;P2=0X80;P0=0XFF;}
else if(led==0){led=1;}
}
while(!P31);
}
else if(P32==0)
{
Delayms(5);
if(P32==0)
{
if(AD_out==1){AD_out=2;}
else if(AD_out==2){AD_out=1;}
}
while(!P32);
}
else if(P33==0)
{
Delayms(5);
if(P33==0)
{
if(fla==0){fla=1;}
else if(fla==1){fla=0;}
}
while(!P33);
}
}
void DIG(void)
{if(fla==0)
{num=AD_read(0X03)*(1.96079);
yi=23;er=11;san=11;si=11;wu=11;liu=num/100+12;qi=num%100/10;ba=num%10;}
else if(fla==1)
{if(freq>=10000){yi=22;er=11;san=11;si=freq/10000;wu=freq%10000/1000;liu=freq%1000/100;qi=freq%100/10;ba=freq%10;}
else if(freq>=1000){yi=22;er=11;san=11;si=11;wu=freq%10000/1000;liu=freq%1000/100;qi=freq%100/10;ba=freq%10;}
else if(freq>=100){yi=22;er=11;san=11;si=11;wu=11;liu=freq%1000/100;qi=freq%100/10;ba=freq%10;}
else if(freq>=10){yi=22;er=11;san=11;si=11;wu=11;liu=11;qi=freq%100/10;ba=freq%10;}}}
void Timer0Init(void)
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xC4; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
}
void tm0() interrupt 1
{if(P34==0)
{
fan++;
if(t_flag==0)
{
t_flag=1;
zheng_now=zheng;
zheng=0;
}
}
else if(P34==1)
{
zheng++;
if(t_flag==1)
{
t_flag=0;
fan_now=fan;
fan=0;
}
}
}
void Timer2Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x20; //设置定时初值
T2H = 0xD1; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x04; //开定时器2中断
EA=1;
}
void t2int() interrupt 12
{
intr++;
if(intr==969)
{
TR0 = 1;ET0 = 1 ;
}
else if(intr==999)
{
intr=0;
TR0 = 0;ET0 = 0 ;
Time=(fan_now+zheng_now)*5;
freq=1000000/Time;
}}
void Display1(uchar yi,uchar er)
{if(scan1==0)
{
P2=0XC0;
P0=0X01;
P2=0XE0;
P0=tab[yi];
Delayms(1);
P2=0XC0;
P0=0X02;
P2=0XE0;
P0=tab[er];
Delayms(1);
}}
void Display2(uchar san,uchar si)
{if(scan1==0)
{
P2=0XC0;
P0=0X04;
P2=0XE0;
P0=tab[san];
Delayms(1);
P2=0XC0;
P0=0X08;
P2=0XE0;
P0=tab[si];
Delayms(1);
}
}
void Display3(uchar wu,uchar liu)
{if(scan1==0)
{
P2=0XC0;
P0=0X10;
P2=0XE0;
P0=tab[wu];
Delayms(1);
P2=0XC0;
P0=0X20;
P2=0XE0;
P0=tab[liu];
Delayms(1);
}
}
void Display4(uchar qi,uchar ba)
{if(scan1==0)
{
P2=0XC0;
P0=0X40;
P2=0XE0;
P0=tab[qi];
Delayms(1);
P2=0XC0;
P0=0X80;
P2=0XE0;
P0=tab[ba];
Delayms(1);
}
}
void Allinit(void)
{
P2=0XA0;//打开控制蜂鸣器的573
P0=0X00;//关闭蜂鸣器继电器
P2=0XC0;//打开控制数码管位选的573
P0=0XFF;//选中所有数码管
P2=0XE0;//打开控制数码管段选的573
P0=0XFF;//关闭所有的数码管
P2=0X80;//打开控制LED的573
P0=0XFF;//关闭所有的LED
}
void Delayms(int ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j--);
}
记录.....功能全部可以实现,或许不是最优化的解法