#include <reg52.h>
#include <intrins.h>
sbit RS = P2^6;
sbit RW = P2^5;
sbit E = P2^7;
sbit BF = P0^7;
void delay(unsigned int n)
{
unsigned char i;
while (n--)
for (i = 0; i < 115; i++);
}
bit LCDBusyTest()
{
bit result;
RS = 0;
RW = 1;
E = 0;
_nop_(); // Tas
E = 1;
_nop_(); // Tddr
BF = 1;
result = BF;
E = 0;
return result;
}
unsigned char LCDReadData(void)
{
unsigned char dat;
while (LCDBusyTest());
RS = 1;
RW = 1;
E = 0;
_nop_(); // Tas
E = 1;
_nop_(); // Tddr
P0 = 0xff;
dat = P0;
E = 0;
return dat;
}
void LCDWriteCmd(unsigned char cmd)
{
while (LCDBusyTest());
RS = 0;
RW = 0;
E = 0;
_nop_(); // Tas
E = 1;
P0 = cmd;
_nop_(); // Tdsw
E = 0;
_nop_(); // Th
}
void LCDWriteData(unsigned char dat)
{
while (LCDBusyTest());
RS = 1;
RW = 0;
E = 0;
_nop_(); // Tas
E = 1;
P0 = dat;
_nop_(); // Tdsw
E = 0;
_nop_(); // Th
}
// 获取当前光标位置
void LCDGetPos(unsigned char *col, unsigned char *row)
{
unsigned char addr;
while (LCDBusyTest());
delay(1);
E = 1;
_nop_();
P0 = 0xff;
addr = P0 & 0x7f;
E = 0;
*col = addr % 0x40;
*row = addr / 0x40;
}
// 设置当前光标位置
void LCDSetPos(unsigned char col, unsigned char row)
{
LCDWriteCmd(0x80 + row * 0x40 + col);
}
// 读取字符串, 不自动换行
/*void LCDReadString(char *buf, int n)
{
while (n--)
*buf++ = LCDReadData();
*buf = '\0';
}*/
// 读取字符串, 自动换行
void LCDReadStringEx(char *buf, int n)
{
unsigned char col, row;
LCDGetPos(&col, &row);
while (n--)
{
if (col >= 0x10)
{
col = 0;
row = !row;
LCDSetPos(col, row);
}
*buf++ = LCDReadData();
col++;
}
*buf = '\0';
}
// 输出字符串, 不自动换行
void LCDWriteString(char *s)
{
while (*s)
LCDWriteData(*s++);
}
// 输出字符串, 自动换行
void LCDWriteStringEx(char *s)
{
unsigned char col, row;
LCDGetPos(&col, &row);
while (*s)
{
if (col >= 0x10)
{
col = 0;
row = !row;
LCDSetPos(col, row);
}
LCDWriteData(*s++);
col++;
}
}
void LCDClear(void)
{
LCDWriteCmd(0x01);
}
void LCDInit(void)
{
unsigned char i = 3;
delay(15);
while (i--)
{
LCDWriteCmd(0x38);
delay(5);
}
LCDWriteCmd(0x0c);
delay(5);
LCDClear();
}
int main(void)
{
char str[30] = "This is a string. ";
LCDInit();
LCDWriteStringEx(str);
delay(2000);
LCDWriteStringEx("It identifies a printer port.");
delay(2000);
// 读取屏幕上输出的内容并显示
LCDSetPos(10, 0);
LCDReadStringEx(str, 10);
LCDClear();
LCDWriteString(str);
while (1);
}