| 
              #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);
 }
 
 |