/*=========================================================================== 44780) 16x2 字符液晶屏驱动演示程序总线方式 ============================================================================= 连接线图: LCM-------51 LCM-------51 LCM--------51 DB0-----P0.0 DB4-----P0.4 RW-------P2.0 DB1-----P0.1 DB5-----P0.5 RC-------P2.1 DB2-----P0.2 DB6-----P0.6 E--------P2.7 =>74ls00+wr+rd DB3-----P0.3 DB7-----P0.7 VLCD接1K2电阻到GND [注]:AT89C51的晶振频率为12MHz ============================================================================*/ //#pragma src // 产生汇编文件 #include #include //========= 变量类型标识的宏定义,大家都喜欢这么做 ============== #define Uchar unsigned char #define Uint unsigned int // ================= LCM1602A端口地址定义 ======================= char xdata Lcd1602CmdPort _at_ 0x7cff; //E=1 RS=0 RW=0 char xdata Lcd1602WdataPort _at_ 0x7eff; //E =1 RS=1 RW=0 char xdata Lcd1602StatusPort _at_ 0x7dff; //CS=1 RS=0 RW=1 #define Busy 0x80 // 忙判别位 code char exampl[]="For an example. - By xiaoqi\n"; void Delay400Ms(void); void Delay5Ms(void); void LcdWriteData( char dataW ); void LcdWriteCommand( Uchar CMD,Uchar AttribC ); void LcdReset( void ); void Display( Uchar dd ); void DispOneChar(Uchar x,Uchar y,Uchar Wdata); void ePutstr(Uchar x,Uchar y, Uchar code *ptr); //================ 随便写几句测试主程序 ================ void main(void) { Uchar temp; Delay400Ms(); // 启动时必须的延时,等待lcm进入工作状态 LcdReset(); // 这也是必需的....初始化 temp = 32; ePutstr(0,0,exampl); // 上面一行显示一个预定字符串 Delay400Ms(); // 保留显示内容 Delay400Ms(); Delay400Ms(); Delay400Ms(); Delay400Ms(); Delay400Ms(); Delay400Ms(); Delay400Ms(); while(1) { temp &= 0x7f; // 只显示ASCII字符 if (temp<32)temp=32; // 屏蔽控制字符,不予显示 Display( temp++ ); Delay400Ms(); } } /*======================================================= 显示字符串 =======================================================*/ void ePutstr(Uchar x,Uchar y, Uchar code *ptr) { Uchar i,l=0; while (ptr[l] >31){l++;}; for (i=0;i