level 1
就是你💕
楼主

#include <reg52.h>#include <intrins.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
sbit CS = P1^0;
sbit CLK = P1^1;
sbit DI = P1^2;
sbit DO = P1^2;
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
ucharResult_ADC0832=0; //转换结果变量
ucharDisplay_Buffer[2][16] ={
{"CurrentVoltage:"},
{"(CH)= 0.00V "}
};
//函数声明
ucharGet_Value_ADC0832();// 获取指定通道的A/D转换结果
voidRefesh_Disp_Buffer();// 刷新显示缓冲
voidLCD_Busy_Check(); //忙检查
voidLCD_Write_Command(uchar cmd);//向LCD写入命令
voidWrite_LCD_Data(uchar dat); //向LCD写入数据
voidInitialize_LCD1602(); //液晶初始化函数
voidLCD_Display(uchar str[]);//在LCD上显示字符串
void DelayMS(uintX);// 延时程序
uchar Read_State();// 读取LCD的状态
//--------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
uchar j;
Initialize_LCD1602();//液晶初始化函数
while(1)
{
for(j=0;j<2;j++)
{
Get_Value_ADC0832();//通道0.1,A/D转换
Refesh_Disp_Buffer(); //刷新显示缓冲
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上显示字符串
}
}
}
}
//---------------------------------------------------------------
// 获取指定通道的A/D转换结果
//-----------------------------------------------------------------
ucharGet_Value_ADC0832( )
{
uchar i,dat1=0,dat2=0;
// 起始控制位
CS=0; _nop_(); _nop_();
CLK=0;_nop_(); _nop_();
DI=1;_nop_(); _nop_();
CLK=1;_nop_(); _nop_();
//第一个下降沿之前,设置DI=1/0;
//选择单端/差分(SGL/DIF)模式中的单端输入模式
CLK=0;DI=1; _nop_(); _nop_();
CLK=1; _nop_(); _nop_();
//第二个下降沿之前,设置DI=0/1;选择CH0/CH1
CLK=0;DI=1; _nop_(); _nop_();
CLK=1;DI=0; _nop_(); _nop_();
//第三个下降沿之前,设置DI=1;
CLK=0;DI=1;_nop_();_nop_();
//第4-11个脉冲期间读数据(MSB->LSB)
for(i=0;i<8;i++)
{
CLK=1; _nop_(); _nop_();
CLK=0; _nop_(); _nop_();
dat1=dat1<<1|DO;
}
//第12-19个脉冲期间读数据(LSB->MSB)
for(i=0;i<8;i++)
{
dat2=dat2|((uchar)(DO)<<i);
CLK=1; _nop_(); _nop_();
CLK=0; _nop_();_nop_();
}
CS=1;
DI=1;
//CLK=1;
return Result_ADC0832=(dat1==dat2)?dat1:0;
}
//--------------------------------------------------------------------------
// 刷新显示缓冲
//-------------------------------------------------------------------------
void Refesh_Disp_Buffer()
{
uint t=Result_ADC0832*500.0/255; //
Display_Buffer[1][7] = t/100+'0'; //整数位
Display_Buffer[1][9] = t/10%10+'0'; //两个小数位
Display_Buffer[1][10] = t%10+'0';
}
//---------------------------------------------------
// 延时程序
//---------------------------------------------------
void DelayMS(uint X)
{
uchar i;
while(X--) for(i=0;i<120;i++);
}
//----------------------------------------------------
// 读取LCD的状态
//-------------------------------------------------
uchar Read_State()
{
uchar state;
RS = 0;
RW = 1;
E = 1;
DelayMS(1);
state=P0;
E = 0;
DelayMS(1);
return state;
}
//--------------------------------
//忙等待
//----------------------------------
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初始化
//-----------------------------------------------------------
voidInitialize_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(1); //清屏
}
//-----------在LCD上显示字符串-----------------*/
voidLCD_Display(uchar *str)
{
uchar k;
for(k=0;k<strlen(str);k++)
{
Write_LCD_Data(str[k]);
DelayMS(2);
}
}