#include <reg51.h>
#include <intrins.h>
#include <string.h>
#include<stdio.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
sbit ADDO = P1^1;//DOUT
sbit ADSK = P1^2;//SCK
sbit RS = P2^7;
sbit RW = P2^6;
sbit E = P2^5;
long Count=0; //转换结果变量
//float t=0;
float n=0;
//float y=0;
long x=0;
float vin;
long weghit;
uchar Display_Buffer[2][16] ={
{" "},
{"(CV)= 0000.00g "}
};
//函数声明
unsigned long ReadCount();// 获取指定通道的A/D转换结果void Refesh_Disp_Buffer();// 刷新显示缓冲
//---------------------------------------------------
// 延时程序
//---------------------------------------------------
/*void DelayMS(uint X)
{
//uchar i;
while(X--);
// for(i=0;i<30;i++);
} */
void DelayMS(unsigned int t)
{
while(--t);
}
/*void DelayMS(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
*/
//--------------------------------
//忙等待
//----------------------------------
void LCD_Busy_Check()
{
while(Read_State()& 0x80!=0x80);
DelayMS(1);
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/ //-------------------------------------------------- //向LCD写入命令
//----------------------------------------------- void LCD_Write_Command(uchar cmd) {
LCD_Busy_Check();
RS = 0;
RW = 0;
E = 0;
P0 = cmd;
E = 1;
DelayMS(1);
E = 0;
}
//------------------------------------------------- //向LCD写入数据
//--------------------------------------
void Write_LCD_Data(uchar dat)
{
LCD_Busy_Check();
RS = 1;
RW = 0;
E = 0;
P0 = dat;
E = 1;
DelayMS(1);
E = 0;
}
//---------------------------------------------------
//LCD初始化
//-----------------------------------------------------------
void Initialize_LCD1602()
{
LCD_Write_Command(0x38);DelayMS(1);//功能设置,数据长度为8位,双行显示,5×7点阵字体
LCD_Write_Command(0x0C);DelayMS(1);// 显示开,关光标
LCD_Write_Command(0x06);DelayMS(1);//字符进入模式:屏幕不动,字符后移
LCD_Write_Command(0x01);DelayMS(100); //清屏
}
//-----------在LCD上显示字符串-----------------*/
void LCD_Display(uchar *str)
{
uchar k;
for(k=0;k<strlen(str);k++)
{
Write_LCD_Data(str[k]);
DelayMS(2);
}
}
//--------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
uchar j;
//uchar m;
Initialize_LCD1602();//液晶初始化函数
while(1)
{
for(j=0;j<2;j++)
{
if(j==0)
{
LCD_Write_Command(0x80);//写LCD命令,设置从第0行位置开始显示
LCD_Display(Display_Buffer[j]);//在LCD上显示字符串
}
else
{
LCD_Write_Command(0xC0);//写LCD命令,设置从第1行位置开始显示LCD_Display(Display_Buffer[j]);//在LCD上显示字符串
Refesh_Disp_Buffer(); //刷新显示缓冲
}
}
}
}
unsigned long ReadCount(void)
{
unsigned char i;
ADDO=1;
ADSK=0;
Count=0;
while(ADDO);
for (i=0;i<24;i++)
{
ADSK=1;
Count=Count<<1;
ADSK=0;
if(ADDO)
Count++;
}
ADSK=1;
Count=Count^0x800000;
ADSK=0;
return(Count);
}
//--------------------------------------------------------------------------
// 刷新显示缓冲
//-------------------------------------------------------------------------
void Refesh_Disp_Buffer()
{ uchar m;
for(m=0;m<45;m++)
{
ReadCount();//A/D转换
n=n+Count;
}
n=n/45;
if(n<0)
{
vin=2*(0x1000000-n)*5.0/128/0x1000000;
weghit=((vin*10000000)-399966);
}
else
{vin=2*n*5.0/128/0x1000000;
weghit=(399965-(vin*10000000))*5;}
x= weghit-15500;
if(x<100)
{x=0;}
Display_Buffer[1][6] = x/100000+'0';
Display_Buffer[1][7] = x/10000%10+'0'; //整数位
Display_Buffer[1][8] = x/1000%10+'0'; //两个小数位Display_Buffer[1][9] = x/100%10+'0';
Display_Buffer[1][11] = x/10%10+'0';
Display_Buffer[1][12] = x%10+'0';
}。