//仅供参考,调用到主函数需自己添加.h头文件,设置外部可调用。
//有不懂可以评论或私信
//学习自b站江科大自化协,LCD显示浮点数函数为原创
#include <REGX52.H>
sbit LCD_RS=P2^4;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^6;
#define LCD_DataPoint P0
void LCD_Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void LCD_WriteCommand(unsigned char Command)
{
LCD_RS=0;
LCD_RW=0;
LCD_DataPoint=Command;
LCD_E=1;
LCD_Delay(1);
LCD_E=0;
LCD_Delay(1);
}
void LCD_WriteData(unsigned char Data)
{
LCD_RS=1;
LCD_RW=0;
LCD_DataPoint=Data;
LCD_E=1;
LCD_Delay(1);
LCD_E=0;
LCD_Delay(1);
}
void LCD_Initial(void)
{
LCD_WriteCommand(0x38); //8point 2line 5*7
LCD_WriteCommand(0x0F); //share open
LCD_WriteCommand(0x06); //AC
LCD_WriteCommand(0x01); //refresh
LCD_WriteCommand(0x80|0x0F); //initial share
}
void LCD_Location(unsigned char Line,unsigned char Column)
{
if(Line==1)
{
LCD_WriteCommand(0x80|(Column-1));
}
else
{
LCD_WriteCommand(0x80|(Column-1)+0x40);
}
}
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{
LCD_Location(Line,Column);
LCD_WriteData(Char);
}
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
{
unsigned char i;
LCD_Location(Line,Column);
for(i=0;String[i]!='\0';i++)
{
LCD_WriteData(String[i]);
}
}
int LCD_Pow(int X,int Y)
{
unsigned char i;
int result=1;
for(i=0;i<Y;i++)
{
result*=X;
}
return result;
}
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i;
LCD_Location(Line,Column);
for(i=Length;i>0;i--)
{
LCD_WriteData(0x30+(Number/(LCD_Pow(10,(i-1))))%10);
}
}
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
unsigned char i;
unsigned int Number1;
LCD_Location(Line,Column);
if(Number==0)
{
Number1=Number;
}else if(Number>0)
{
Number1=Number;
}else if(Number<0)
{
LCD_WriteData('-');
Number1=-Number;
}
for(i=Length;i>0;i--)
{
LCD_WriteData(0x30+(Number1/(LCD_Pow(10,(i-1))))%10);
}
}
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i;
unsigned char temp;
LCD_ShowString(Line,Column,"0x");
for(i=Length;i>0;i--)
{
temp=(Number/(LCD_Pow(16,(i-1))))%16;
if(temp<10)
{
LCD_WriteData(0x30+temp);
}
else
{
LCD_WriteData(0x37+temp);
}
}
}
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i;
LCD_Location(Line,Column);
LCD_ShowString(Line,Column,"0b");
for(i=Length;i>0;i--)
{
LCD_WriteData(0x30+(Number/(LCD_Pow(2,(i-1))))%2);
}
}
void LCD_ShowFloat(unsigned char Line,unsigned char Column,double Number1,int Number,unsigned char Len1,unsigned char n)
{
LCD_ShowNum(Line,Column,Number,Len1);
LCD_ShowChar(Line,Column+Len1,'.');
Number1 = Number1-Number;
Number1*=LCD_Pow(10,n);
LCD_ShowNum(Line,Column+Len1+1,(int)Number1,n);
}