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