📄 lcd.c
字号:
#include<reg52.h>
#include"lcd.h"
void Lcd_Delay(unsigned int times)
{
unsigned int i,j;
for(i=0;i<times;i++)
for(j=0;j<40;j++);
}
void Lcd_SendCom(unsigned char ComByte)
{
unsigned char i,j;
LCD_CS=1;_nop_;
for(i=0;i<5;i++)
{
LCD_SCL=0;_nop_;
LCD_SDA=1;_nop_;
LCD_SCL=1;_nop_;
}
for(i=0;i<3;i++)
{
LCD_SCL=0;_nop_;
LCD_SDA=0;_nop_;
LCD_SCL=1;_nop_;
}
for(j=0;j<2;j++)
{
for(i=0;i<4;i++)
{
LCD_SCL=0;_nop_;
if(ComByte&0x80)
{ LCD_SDA=1;_nop_;}
else
{ LCD_SDA=0;_nop_;}
LCD_SCL=1;_nop_;
ComByte=ComByte<<1;
}
for(i=0;i<4;i++)
{
LCD_SCL=0;_nop_;
LCD_SDA=0;_nop_;
LCD_SCL=1;_nop_;
}
}
LCD_SCL=0;_nop_;
LCD_CS=0;_nop_;
Lcd_Delay(1);
}
void Lcd_SendDat(unsigned char DatByte)
{
unsigned char i,j;
LCD_CS=1;_nop_;
for(i=0;i<5;i++)
{
LCD_SCL=0;_nop_;
LCD_SDA=1;_nop_;
LCD_SCL=1;_nop_;
}
LCD_SCL=0;_nop_;
LCD_SDA=0;_nop_;
LCD_SCL=1;_nop_;
LCD_SCL=0;_nop_;
LCD_SDA=1;_nop_;
LCD_SCL=1;_nop_;
LCD_SCL=0;_nop_;
LCD_SDA=0;_nop_;
LCD_SCL=1;_nop_;
for(j=0;j<2;j++)
{
for(i=0;i<4;i++)
{
LCD_SCL=0;_nop_;
if(DatByte&0x80)
{ LCD_SDA=1;_nop_;}
else
{ LCD_SDA=0;_nop_;}
LCD_SCL=1;_nop_;
DatByte=DatByte<<1;
}
for(i=0;i<4;i++)
{
LCD_SCL=0;_nop_;
LCD_SDA=0;_nop_;
LCD_SCL=1;_nop_;
}
}
LCD_SCL=0;_nop_;
LCD_CS=0;_nop_;
Lcd_Delay(1);
}
void Lcd_Initial(void)
{
// Lcd_Delay(20);
Lcd_SendCom(0x30); //基本指令集
Lcd_Delay(1); //t10
Lcd_SendCom(0x30); //8bit数据流
Lcd_Delay(1); //t5
Lcd_SendCom(0x0c); //开显示,无光标,不反白。
Lcd_Delay(1); //t10
Lcd_SendCom(0x01); //清显示,并设置地址指针为0。
Lcd_Delay(1); //500
Lcd_SendCom(0x06); //设定游标方向及显示位移
Lcd_Delay(1); //10
Lcd_ClrImg();
Lcd_Delay(1); //10
}
//////////////////////////////////////////////////////////////////////////////
// 功能:显示字符串,有自动换行功能。
//
/////////////////////////////////////////////////////////////////////////////
bit Lcd_DisStr(unsigned char x,unsigned char y,unsigned char *DisString) reentrant
{
unsigned char i;
unsigned char flag;
if(x>8)return 0;
if(y>1)return 0;
Lcd_SendCom(0x01); //清显示,并设置地址指针为0。
Lcd_Delay(5);
if(y==0)
Lcd_SendCom(0x80+x);
else
Lcd_SendCom(0x90+x);
Lcd_Delay(10); //t50//////////////////////////////add
x=x<<1;
i=0;
flag=0;
while(*DisString>0)
{
++i;
if((y==0)&&((x+i)>18)&&(flag==0))
{
flag=1;
Lcd_SendCom(0x90);
// Lcd_Delay(1); //t50
}
Lcd_SendDat(*DisString);
DisString++;
// Lcd_Delay(1); //t50
}
}
void Lcd_Img(unsigned char code *img)
{
unsigned int j=0;
unsigned char x,y;
for(y=0;y<32;y++)
for(x=0;x<9;x++)
{
Lcd_SendCom(0x36);
// Lcd_Delay(1);
Lcd_SendCom(y+0x80);
// Lcd_Delay(1);
Lcd_SendCom(x+0x80);
// Lcd_Delay(1);
Lcd_SendCom(0x30);
// Lcd_Delay(1);
Lcd_SendDat(img[j++]);
// Lcd_Delay(1);
Lcd_SendDat(img[j++]);
// Lcd_Delay(1);
}
}
void Lcd_ClrImg(void)
{
unsigned char x,y;
for(y=0;y<32;y++)
for(x=0;x<9;x++)
{
Lcd_SendCom(0x36);//Lcd_Delay(5);
Lcd_SendCom(y+0x80);//Lcd_Delay(5);
Lcd_SendCom(x+0x80);//Lcd_Delay(5);
Lcd_SendCom(0x30);//Lcd_Delay(5);
Lcd_SendDat(0x00);//Lcd_Delay(5);
Lcd_SendDat(0x00);//Lcd_Delay(5);
}
}
//十六进制数据转换为ASCII码表,数组索引为所要转换的十六进制数,数组值即为数组索引所对应的ASCII码。
code unsigned char NumToAscii[16]=
{
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x66
};
//LCD的显示存储区。
xdata unsigned char DisBuf[37]=
{
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',0
};
xdata unsigned char LocationOfBuf=0;
xdata unsigned char EndOfBuf;
unsigned char CharToStr(unsigned char character,unsigned char *strDatas)
{
unsigned char tempByte1;
unsigned char tempByte2;
tempByte1=character/100;
tempByte2=character%100;
strDatas[0]=tempByte1;
tempByte1=tempByte2/10;
tempByte2=tempByte2%10;
strDatas[1]=tempByte1;
strDatas[2]=tempByte2;
tempByte2=3;
/* tempByte1=0;
while((strDatas[tempByte1]==0)&&(tempByte1<3))
{
tempByte2--;
tempByte1++;
}
if(tempByte2==0)
tempByte2=1;
for(tempByte1=0;tempByte1<tempByte2;tempByte1++)
strDatas[tempByte1]=strDatas[tempByte1+3-tempByte2];
*/
return(tempByte2);
}
unsigned char IntToStr(unsigned int intValue,unsigned char *strDatas)
{
unsigned char tempByte1;
unsigned int tempByte2;
tempByte1=intValue/10000;
tempByte2=intValue%10000;
strDatas[0]=tempByte1;
tempByte1=tempByte2/1000;
tempByte2=tempByte2%1000;
strDatas[1]=tempByte1;
tempByte1=tempByte2/100;
tempByte2=tempByte2%100;
strDatas[2]=tempByte1;
tempByte1=tempByte2/10;
tempByte2=tempByte2%10;
strDatas[3]=tempByte1;
strDatas[4]=tempByte2;
tempByte2=5;
/* tempByte1=0;
while((strDatas[tempByte1]==0)&&(tempByte1<5))
{
tempByte2--;
tempByte1++;
}
if(tempByte2==0)
tempByte2=1;
for(tempByte1=0;tempByte1<tempByte2;tempByte1++)
strDatas[tempByte1]=strDatas[tempByte1+5-tempByte2];
*/
return(tempByte2);
}
void ResetDispLay(void)
//调用此函数后,再调用变量显示类函数,则显示器刷新。
{
unsigned char i;
LocationOfBuf=0;
for(i=0;i<36;i++)
DisBuf[i]=' ';
}
bit PrintUnchar(unsigned char *string,unsigned char character)
/*
功能:显示一个unsigned char变量.
参数:string--提示字符串(如:“变量=“)
character--所要显示的unsigned char 变量。
返回:0--失败;1--成功。
注意:显示区为循环显示,超出显示区的内容会从头复盖原有内容。
*/
{
/* unsigned char HighHarf,LowHarf;
while(*string>0)
{
DisBuf[LocationOfBuf]=*string;
string++;
if((++LocationOfBuf)>35)
LocationOfBuf=0;
}
HighHarf=(character&0xf0)>>4;
LowHarf =character&0x0f;
DisBuf[LocationOfBuf]=NumToAscii[HighHarf];
if((++LocationOfBuf)>35)
LocationOfBuf=0;
DisBuf[LocationOfBuf]=NumToAscii[LowHarf];
if((++LocationOfBuf)>35)
LocationOfBuf=0;
DisBuf[EndOfBuf]=' ';
DisBuf[LocationOfBuf]='/';
EndOfBuf=LocationOfBuf;
if((++LocationOfBuf)>35)
LocationOfBuf=0;
if(!Lcd_DisStr(0,0,DisBuf))
return 0;
return 1;*/
/////////////////////////////////////////////////////////////
unsigned char tempChar,i;
unsigned char charArray[3];
tempChar=CharToStr(character,charArray);
while(*string>0)
{
DisBuf[LocationOfBuf]=*string;
string++;
if((++LocationOfBuf)>35)
LocationOfBuf=0;
}
for(i=0;i<tempChar;i++)
{
DisBuf[LocationOfBuf]=NumToAscii[charArray[i]];
if((++LocationOfBuf)>35)
LocationOfBuf=0;
}
DisBuf[EndOfBuf]=' ';
DisBuf[LocationOfBuf]='/';
EndOfBuf=LocationOfBuf;
if((++LocationOfBuf)>35)
LocationOfBuf=0;
if(!Lcd_DisStr(0,0,DisBuf))
return 0;
return 1;
}
bit PrintUnint(unsigned char *string,unsigned int intValue)
/*
功能:显示一个unsigned int变量.
参数:string--提示字符串(如:“变量=“)
intValue--所要显示的unsigned int 变量。
返回:0--失败;1--成功。
注意:显示区为循环显示,超出显示区的内容会从头复盖原有内容。
*/
{/*
unsigned char HighHarf,LowHarf;
unsigned char HighByte,LowByte;
while(*string>0)
{
DisBuf[LocationOfBuf]=*string;
string++;
if((++LocationOfBuf)>35)
LocationOfBuf=0;
}
LowByte=(unsigned char)intValue;
HighByte=(unsigned char)(intValue>>8);
HighHarf=(HighByte&0xf0)>>4;
LowHarf =HighByte&0x0f;
DisBuf[LocationOfBuf]=NumToAscii[HighHarf];
if((++LocationOfBuf)>35)
LocationOfBuf=0;
DisBuf[LocationOfBuf]=NumToAscii[LowHarf];
if((++LocationOfBuf)>35)
LocationOfBuf=0;
HighHarf=(LowByte&0xf0)>>4;
LowHarf =LowByte&0x0f;
DisBuf[LocationOfBuf]=NumToAscii[HighHarf];
if((++LocationOfBuf)>35)
LocationOfBuf=0;
DisBuf[LocationOfBuf]=NumToAscii[LowHarf];
if((++LocationOfBuf)>35)
LocationOfBuf=0;
DisBuf[EndOfBuf]=' ';
DisBuf[LocationOfBuf]='/';
EndOfBuf=LocationOfBuf;
if((++LocationOfBuf)>35)
LocationOfBuf=0;
if(!Lcd_DisStr(0,0,DisBuf))
return 0;
return 1;*/
///////////////////////////////////////////////////////////////////////
unsigned char tempChar,i;
unsigned char charArray[5];
tempChar=IntToStr(intValue,charArray);
while(*string>0)
{
DisBuf[LocationOfBuf]=*string;
string++;
if((++LocationOfBuf)>35)
LocationOfBuf=0;
}
for(i=0;i<tempChar;i++)
{
DisBuf[LocationOfBuf]=NumToAscii[charArray[i]];
if((++LocationOfBuf)>35)
LocationOfBuf=0;
}
DisBuf[EndOfBuf]=' ';
DisBuf[LocationOfBuf]='/';
EndOfBuf=LocationOfBuf;
if((++LocationOfBuf)>35)
LocationOfBuf=0;
if(!Lcd_DisStr(0,0,DisBuf))
return 0;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -