📄 lcd.c
字号:
#include "reg51.h"
#include "type.h"
#define LcdData P0
void LCDWCN(uchar tmp);
void WAITIDLE(void);
void LCDWC (uchar tmp123);
void LCDWD (uchar vData);
void LCDPOS (void);
void LCDWRITE(uchar wrData);
void LcdFill(char fData,char X,char Y);
sbit RSPIN = P2^6; //SMC1602A的RS
sbit RWPIN = P2^5; //SMC1602A的RW
sbit EPIN = P2^7; //SMC1602A的E
unsigned char XPOS;
unsigned char YPOS;
void LCDWCN(uchar tmp) //送控制字子程序(不检测忙信号)
{
RSPIN=0;
RWPIN=0;
LcdData=tmp;
EPIN=1;
EPIN=1; //NOP
EPIN=0;
}
void WAITIDLE(void)
{
uchar tmpw;
LcdData=0xff;
RSPIN=0;
RWPIN=1;
EPIN=1;
do
{
tmpw=LcdData;
tmpw=tmpw & 0x80;
}while(tmpw==0x80);
EPIN=0;
}
void LCDWC (uchar tmp123)
{
WAITIDLE();
RSPIN=0;
RWPIN=0;
LcdData=tmp123;
EPIN=1;
EPIN=1;
EPIN=0;
}
void LCDWD (uchar vData)
{
WAITIDLE();
RSPIN=1;
RWPIN=0;
LcdData=vData;
EPIN=1;
EPIN=1;
EPIN=0;
}
void LCDPOS ()
{
XPOS=XPOS & 0x0F; //X位置范围(0到15)
YPOS=YPOS & 0x01; //Y位置范围(0到1)
if (YPOS==0)
{
}
else
{
XPOS=XPOS+0x40;
}
XPOS=XPOS | 0x80;
LCDWC(XPOS);
}
void LCDWRITE(uchar wrData)
{
LCDPOS(); //定位显示地址
LCDWD(wrData); //写字符
}
/*
void LcdFillAll(uchar vTemp[])
{
unsigned char i,j;
YPOS=0;
for (i=0;i<2;i++)
{
XPOS=0;
for (j=0;j<16;j++)
{
LCDWRITE(vTemp[i*0x10+j]);
XPOS++;
}
YPOS++;
}
}
*/
void LcdFillWill(char vTemp[],char length)
{
unsigned char i;
YPOS=0;
if (length>16)
{
for (i=0;i<16;i++)
{
LcdFill(vTemp[i],i,0);
}
for (i=0;i<length-16;i++)
{
LcdFill(vTemp[i+16],i,1);
}
}
else
{
for (i=0;i<length;i++)
{
LcdFill(vTemp[i],i,0);
}
}
}
void LcdFillXY(uchar vTemp[],uchar length,uchar x,uchar y)
{
unsigned char i;
for (i=0;i<length;i++)
{
LcdFill(vTemp[i],x,y);
x++;
}
}
void LcdFill(uchar fData,uchar X,uchar Y)
{
XPOS=X;
YPOS=Y;
LCDWRITE(fData);
}
void LcdClear(void)
{
uchar i;
for (i=0;i<16;i++)
{
LcdFill(' ',i,0);
}
for (i=0;i<16;i++)
{
LcdFill(' ',i,1);
}
}
void LcdClearDown(void)
{
uchar i;
for (i=0;i<16;i++)
{
LcdFill(' ',i,1);
}
}
void delay5ms(void)
{
int i,j;
for (i=0;i<25;i++)
{for (j=0;j<100;j++);}
}
void LcdReset(void)
{
EPIN=0;
delay5ms(); //延时15MS
delay5ms();
delay5ms();
//显示模式设置(不检测忙信号)
LCDWCN(0x38); //;共三次
delay5ms();
LCDWCN(0x38);
delay5ms();
LCDWCN(0x38);
delay5ms();
LCDWC(0x38); //显示模式设置(以后均检测忙信号)
LCDWC(0x08); //显示关闭
LCDWC(0x01); //显示清屏
LCDWC(0x06); //显示光标移动设置
LCDWC(0x0c); //显示开及光标设置
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -