第一步已实现:
代码如下:
/*********************************************/
#include
#define uint unsigned int
#define uchar unsigned char
/********************************************/
uchar code DATE1[]="WELCOM TO BOE"; //LCD显示相关参数定义
uchar code DATE2[]="VIP TEST SYSTEM!";
uchar code DATE3[]="U=000.00V _P(W) ";
uchar code DATE4[]="I=00.000A _000.0";
uchar code DATE5[]={ //1602 LCD 0~9编码
0X30,0X31,0X32,0X33,0X34,
0X35,0X36,0X37,0X38,0X39};
sbit LCDRS=P2^4;
sbit LCDRW=P2^5;
sbit LCDEN=P2^6;
unsigned long U,I,PW,TTU,TTI,TTP;
double Tu,Ti,Tp;
uint a,b,c,d,e,f,g,h,k,m,n,o,q,r;
/**********************************************/
sbit sda=P2^0; //IIC端口定义
sbit scl=P2^1;
/**********************************************/
void delay(uint z) //延时1ms函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/////////////////////////////////////////////以下LCD显示
/**********************************************/
void write_com(uint com) //写指令函数
{
LCDRS=0; //选择对指令操作
P0=com;
LCDEN=1; //开使能
delay(5);
LCDEN=0;
}
/***********************************************/
void write_date(uint date) //写数据函数
{
LCDRS=1;
P0=date;
LCDEN=1;
delay(5);
LCDEN=0;
}
/***********************************************/
void clear() //清屏
{
write_com(0x01);
}
/***********************************************/
void initlcd() //初始化函数
{
clear();
P0=0;
LCDEN=0;
LCDRW=0; //始终选择写操作
clear();
write_com(0x38); //两行8位5*7点阵
write_com(0x06); //写操作后画面不动,AC自动增一
write_com(0x0c); //开显示,不显示光标
}
/***********************************************/
void logo() //开机logo
{
uchar i;
write_com(0x80+0X01);
for(i=0;i<13;i++)
{
write_date(DATE1[i]);
delay(20);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(DATE2[i]);
delay(20);
}
delay(2000);
/***********************************************/
clear(); //固定显示部分
write_com(0x80);
for(i=0;i<16;i++)
{
write_date(DATE3[i]);
delay(1);
}
write_com(0x80+0X40);
for(i=0;i<16;i++)
{
write_date(DATE4[i]);
delay(1);
}
}
/***********************************************/
void display(double x,double y)
{
Tu=x; //测量值和显示函数转换
Ti=y;
Tp=Tu*Ti;
TTU=Tu*100;
TTI=Ti*1000;
TTP=Tp*10;
/***********************************************/
U=TTU; //电压显示
a=U/10000;
b=U%10000/1000;
c=U%1000/100;
d=U%100/10;
e=U%10/1;
write_com(0x80+0x02);
write_date(DATE5[a]);
write_date(DATE5[b]);
write_date(DATE5[c]);
write_date('.');
write_date(DATE5[d]);
write_date(DATE5[e]);
/***********************************************/
I=TTI; //电流显示
f=I/10000;
g=I%10000/1000;
h=I%1000/100;
k=I%100/10;
m=I%10/1;
write_com(0x80+0x40+0x02);
write_date(DATE5[f]);
write_date(DATE5[g]);
write_date('.');
write_date(DATE5[h]);
write_date(DATE5[k]);
write_date(DATE5[m]);
/***********************************************/
PW=TTP; //功率显示
n=PW/1000;
o=PW%1000/100;
q=PW%100/10;
r=PW%10/1;
write_com(0x80+0x40+0x0b);
write_date(DATE5[n]);
write_date(DATE5[o]);
write_date(DATE5[q]);
write_date('.');
write_date(DATE5[r]);
}
//////////////////////////////////////////////////////////////////以下AD
/***********************************************/
void initad() //IIC初始化
{
scl=1;
delay(1);
sda=1;
delay(1);
}
/***********************************************/
void start() //IIC起始
{
sda=1;
delay(1);
scl=1;
delay(1);
sda=0;
delay(1);
}
/***********************************************/
void stop() //IIC终止
{
sda=0;
delay(1);
scl=1;
delay(1);
sda=1;
delay(1);
}
/***********************************************/
void respons() //从机应答
{
scl=1;
delay(1);
while(sda==1);
delay(1);
scl=0;
delay(1);
}
/***********************************************/
void write(uchar date) //写一个字节
{
uchar i,temp;
scl=0;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
sda=CY;
delay(1);
scl=1;
delay(1);
scl=0;
delay(1);
}
}
/***********************************************/
uchar read() //读一个字节
{
uchar i,k;
scl=0;
delay(1);
sda=1;
for(i=0;i<8;i++)
{
scl=1;
k=(k<<1)|sda;
delay(1);
scl=0;
delay(1);
}
return k;
}
/***********************************************/
void main()
{
double UT,IT;
uint uset;
double iset;
uset=120;
iset=1.5;
initlcd();
initad();
logo();
start();
write(0x90); //在1001000地址写
respons();
// write(0x40); //设置AD为四通道不自动增加通道模式 0100 0000
// write(0x44); //设置AD为四通道自动增加通道模式,AD3-U AD1-I 0100 0100
write(0x45); //设置AD为四通道自动增加通道模式,AD0-U AD2-I 0100 0101
// write(0x46); //设置AD为四通道自动增加通道模式,AD1-U AD3-I 0100 0110
// write(0x47); //设置AD为四通道自动增加通道模式,AD2-U AD0-I 0100 0111
respons();
/************************************************/
while(1)
{
start();
write(0x91);
respons();
UT=read();
stop();
UT=UT*uset/255;
start();
write(0x91);
respons();
IT=read();
stop();
IT=IT*iset/255;
display(UT,IT);
}
}