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