📄 lcd.c
字号:
#include <reg51.h>
#include <intrins.h>
#include <8255A.h>
#include <LCD.h>
#define Busy 0x80
#define SetRS() SetCBit(0,1)
#define ClrRS() SetCBit(0,0)
#define SetRW() SetCBit(1,1)
#define ClrRW() SetCBit(1,0)
#define SetE() SetCBit(2,1)
#define ClrE() SetCBit(2,0)
/*
static void SetRS();
static void ClrRS();
static void SetRW();
static void ClrRW();
static void SetE();
static void ClrE();
*/
//static void LcdWriteData(char);
//static void LcdWriteCommand(Uchar, Uchar);
//static void WaitForEnable();
//static void Delay5Ms();
//static void Delay400Ms();
void WaitForEnable()
{
//PortA = 0xff;
SelectForm0(1, 0, 0, 0);
ClrRS();
SetRW();
_nop_();
SetE();
_nop_();
_nop_();
while( PortA & Busy );
SelectForm0(0, 0, 0, 0);
ClrE();
}
void LcdWriteCommand(Uchar CMD, Uchar AttribC )
{
if (AttribC) WaitForEnable();
ClrRS();
ClrRW();
_nop_();
PortA = CMD;
_nop_();
SetE();
_nop_();
_nop_();
ClrE();
}
/*=======================================================
当前位置写字符子程序: E =1 RS=1 RW=0
=======================================================*/
void LcdWriteData( char dataW )
{
WaitForEnable();
SetRS();
ClrRW();
_nop_();
PortA = dataW;
_nop_();
SetE();
_nop_();
_nop_();
ClrE(); // 操作允许脉冲信号
}
void LocateXY( char posx,char posy)
{
Uchar temp;
temp = posx & 0xf;
posy &= 0x1;
if ( posy ) temp |= 0x40;
temp |= 0x80;
LcdWriteCommand(temp,0);
}
void Delay5Ms(void)
{
Uint i = 5552;
while(i--);
}
//长延时
void Delay400Ms(void)
{
Uchar i = 5;
Uint j;
while(i--)
{
j=7269;
while(j--);
}
}
void DisplayOneChar(Uchar x,Uchar y,Uchar Wdata)
{
LocateXY( x, y ); // 定位显示地址
LcdWriteData( Wdata ); // 写字符
Delay5Ms();
}
void DisplayXString(Uchar x, Uchar y, Uchar* pStr)
{
int i, tempy=y;
for(i=0;*(pStr+i)!=0;i++)
{
if(x+i>15) tempy=y+1;
LocateXY(x+i, tempy);
LcdWriteData( *(pStr+i) ); // 写字符
}
}
void DisplayString(Uchar x, Uchar y, Uchar* pStr, Uint len)
{
Uint i, tempy=y;
for(i=0;i<len;i++)
{
if(x+i>15) tempy=y+1;
LocateXY(x+i, tempy);
LcdWriteData( *(pStr+i) ); // 写字符
}
}
/*=======================================================
初始化程序, 必须按照产品资料介绍的初始化过程进行
=======================================================*/
void LcdReset( void )
{
Init8255A();
LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
Delay5Ms();
LcdWriteCommand( 0x38, 0); // 共三次
Delay5Ms();
LcdWriteCommand( 0x38, 0);
Delay5Ms();
LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
// LcdWriteCommand( 0x08, 1); // 显示关闭
LcdWriteCommand( CLR_SCREEN, 1); // 显示清屏
LcdWriteCommand( CURSOR_MOVE, 1); // 显示光标移动设置
LcdWriteCommand( CURSOR_OFF, 1); // 显示开及光标设置
}
void LcdRightShift()
{
LcdWriteCommand( 0x1c, 1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -