📄 lcd.h
字号:
#include "main.h"
#define LCD_Data P0
sbit LCD_RS =P1^3;
sbit LCD_WR =P1^4;
sbit LCD_E =P1^5;
sbit PSB =P1^6;
/*
返回值Status: 当前地址计数器的值.
*/
unsigned char LCDBusyWait() //等待LCD就绪
{
unsigned char Status;
LCD_RS=0;
LCD_WR=1;
LCD_Data=0xFF;
LCD_E=1;
Status=LCD_Data;
LCD_E=0;
while(Status & 0x80)
{
LCD_E=1;
Status=LCD_Data;
LCD_E=0;
}
LCD_WR=0;
return Status;
}
void WriteLCD_Data(unsigned char Data) //向LCD写入一个字节的数据
{
LCDBusyWait();
LCD_RS=1;
LCD_Data = Data;
LCD_E=1;
LCD_E=0;
}
void WriteLCD_Command(unsigned char Command) //向LCD写入一个字节的命令
{
LCDBusyWait();
LCD_RS=0;
LCD_Data=Command;
LCD_E=1;
LCD_E=0;
}
/**********************************改变地址,实现了逐行显示**************************/
unsigned char ChangeAddress(unsigned char StartAddress)
{
switch(StartAddress)
{
case 0x87:WriteLCD_Command(0x90);StartAddress=0x90;break;
case 0x8F:WriteLCD_Command(0x98);StartAddress=0x98;break;
case 0x97:WriteLCD_Command(0x88);StartAddress=0x88;break;
default:StartAddress+=1;
}
return StartAddress;
}
/*
WriteLCD 从LCD输出一个字符串:
StartAddress为起始地址;
Size为字符串大小;
Size==0 时由程序自己判断字符串结束标志,否则输出 Size 个字符,不够则填充空格;
Charactors为要求输出的字符串;
*/
void WriteLCD(unsigned char StartAddress,unsigned char Size,unsigned char Charactors[])
{
unsigned char *i=Charactors; //字符串的首地址
WriteLCD_Command(StartAddress);
if(Size) //Size不为0
{
bit Over=0;
while(i<(Charactors+Size)) //判断字符串结尾
{
if(Over)
{
WriteLCD_Data(' ');i++;
if(i>=(Charactors+Size)) break;
WriteLCD_Data(' ');i++;
}
else
{
switch(((*i)*256)+(*(i+1)))
{
}
}
StartAddress=ChangeAddress(StartAddress); //改变地址,实现了逐行显示
}
}
else //Size为0
{
while(*i) //判断字符串结尾,*i为0代表结束
{
WriteLCD_Data(*i);
i++;
WriteLCD_Data(*i);
i++;
StartAddress=ChangeAddress(StartAddress);
}
}
}
/*********************************功能:写入数字Number, Number为0-99的两位数字***********************/
void WriteLCD_Number(unsigned char Address,unsigned char Number)
{
if(Address) WriteLCD_Command(Address); //如果地址为0则自动接着原来的位置写. 否则按指定地址写
if((Number/10)!=0)
WriteLCD_Data((Number/10)+0x30); //取商,取出十位数字
WriteLCD_Data((Number%10)+0x30); //取余,取出个位数字
}
/**********************************功能:显示ASSIC码************************************/
void WriteLCD_CharNumber(unsigned char Address,unsigned char CharNumber)
{
if(Address)
WriteLCD_Command(Address); //如果地址为0则自动接着原来的位置写. 否则按指定地址写
WriteLCD_Data(CharNumber);
}
/*******************************功能:显示多位数据*****************************/
void WriteLCD_HalfCharNumber(unsigned char Address,unsigned long HalfCharNumber)
{
static unsigned char Buffer[8];
unsigned char j;
unsigned char i=0;
if(Address)
WriteLCD_Command(Address);
do
{
Buffer[i++]=HalfCharNumber%10; //对每一位进行存储
HalfCharNumber=HalfCharNumber/10;
}while(HalfCharNumber!=0);
for(j=i;j>0;j--)
WriteLCD_Number(0x00,Buffer[j-1]);
}
/*********************************功能:小数显示.精确到小数点后面四位*************************/
void WriteLCD_FloatNumber(unsigned char Address,unsigned int Float_Number)
{
static unsigned char Buffer[6];
unsigned char i=0;
if(Address)
WriteLCD_Command(Address);
do
{
Buffer[i++]=Float_Number%10; //对每一位进行逆序存储
Float_Number=Float_Number/10;
}while(Float_Number!=0);
if(5==i)
{
WriteLCD_Number(0x00,Buffer[i-1]); //显示整数
WriteLCD_CharNumber(0x00,0x2E); //小数点显示
for(i=i-1;i>0;i--)
{
WriteLCD_Number(0x00,Buffer[i-1]); //显示整数
}
}
else
{
WriteLCD_CharNumber(0x00,0x30); //显示零
WriteLCD_CharNumber(0x00,0x2E); //小数点显示
for(i=i;i>0;i--)
WriteLCD_Number(0x00,Buffer[i-1]); //显示整数
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -