📄 lcd.c
字号:
#include <P89V51.H>
//#include<reg51.H>
#include <absacc.h>
#include <IO.h>
#include <STRING.H>
#define Uint unsigned int
#define Uchar unsigned char
Uchar ReadDataLCM(void);
Uchar ReadStatusLCM(void);
void WriteDataLCM(Uchar WDLCM);
void WriteCommandLCM(Uchar WCLCM,BuysC);
void LCMInit(void);
void DisplayOneChar(Uchar X, Uchar Y,Uchar DData);
void DisplayListChar(Uchar X, Uchar Y,Uchar code *DData);
void DisplayInt(Uchar X,Uchar Y,Uint f);
void DelayMs(Uint x) ;
void DisplayFloat( Uchar X,Uchar Y,float f,Uchar g);
Uchar Flag=0;
Uchar Displaydot=0; // 判正数后的小数点是否已被显示
//Uchar NegativeDisplaydot=0; // 判负数后的小数点是否已被显示
/***********************************************************************
Delay some msec
************************************************************************/
void DelayMs(Uint x)
{
unsigned char del=0;
do
{
//del=0;
for(del=0;del<125;del++); /* 8us x 125 = 1ms */
}
while((x--)!=0);
}
/***********************************************************************
WriteData
************************************************************************/
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 1;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
DelayMs(5);
LCM_E = 1;
}
/***********************************************************************
WriteCommand
************************************************************************/
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC)
ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 1;
LCM_E = 0;
DelayMs(5);
LCM_E = 1;
}
/***********************************************************************
ReadData
************************************************************************/
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}
/***********************************************************************
ReadStatus
************************************************************************/
unsigned char ReadStatusLCM(void)
{
LCM_Data=0xFF;
LCM_RS=0;
LCM_RW=1;
LCM_E=0;
LCM_E=0;
LCM_E=1;
while (LCM_Data & Busy); //检测忙信号
return(LCM_Data);
}
/***********************************************************************
Init
************************************************************************/
void LCMInit(void)
{
LCM_Data = 0;
WriteCommandLCM(0x30,0);
DelayMs(15);
WriteCommandLCM(0x30,0);
DelayMs(15);
WriteCommandLCM(0x30,0);
DelayMs(15);
WriteCommandLCM(0x30,1);
WriteCommandLCM(0x0C,1);
//WriteCommandLCM(0x08,1);
WriteCommandLCM(0x01,1);
WriteCommandLCM(0x00,1);
}
/***********************************************************************
DisplayOneChar in a place
************************************************************************/
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
if((X!=0)||(Y!=0))
{
Y &= 0x03;
X &= 0x07;
switch(Y)
{
case 0: {X |= 0x80;} break;
case 1: {X |= 0x90;} break;
case 2: {X |= 0x88;} break;
case 3: {X |= 0x98;} break;
}
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
else
WriteDataLCM(DData);
}
/***********************************************************************
DisplayInt
************************************************************************/
void DisplayInt(Uchar X,Uchar Y,Uint f)
{
Uint idata lcdcopy[16];
Uint idata lcdbuffer[16];
Uint i=0;
Uint k=0;
if (f==0)
{
DisplayOneChar(X,Y,0x30);
}
else
{
while(f!=0)
{
lcdbuffer[k++]=f%10;
f=f/10;
}
for(i=0;i<k;i++)
{
lcdcopy[i]=lcdbuffer[k-1-i];
}
DisplayOneChar(X,Y,lcdcopy[0]+0X30);
for (i=1;i<k;i++)
{
DisplayOneChar(0,0,lcdcopy[i]+0X30);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -