#includereg51.hsbitRS=P3^7;//寄存器选择位,将RS位定义为P2.0引脚sbitRW=P3^6;//读写选择位,将RW位定义为P2.1引脚sbitE=P2^7;//使能信号位,将E位定义为P2.2引脚sbitBF=P0^7;//忙碌标志位,将BF位定义为P0.7引脚#defineLcd_DataP0#includestring.h#includeintrins.h//包含_nop_()函数定义的头文件unsignedcharcodestring1[]={0x77,0x75,0x20,0x79,0x61,0x6E,0x67,0x20,0x79,0x61,0x6E,0x67,0x20,0x20,0x20,0x20};//第一行显示的字符voidLcd_delay1ms()//函数功能:延时1ms//注:不同单片机不同晶振需要对此函数进行修改{unsignedchari,j;for(i=0;i90;i++)for(j=0;j33;j++);}voidLcd_delay(unsignedintn)//函数功能:延时若干毫秒,入口参数:n{unsignedinti;for(i=0;in;i++)Lcd_delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。result=1,忙碌;result=0,不忙***************************************************/bitLcd_BusyTest(void){bitresult;RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1;//E=1,才允许读写_nop_();//空操作_nop_();_nop_();_nop_();//空操作四个机器周期,给硬件反应时间result=BF;//将忙碌标志电平赋给resultE=0;returnresult;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/voidLcd_WriteCom(unsignedchardictate){while(Lcd_BusyTest()==1);//如果忙就等待RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0;//E置低电平(写指令时就是让E从0到1发生正跳变,所以应先置0_nop_();_nop_();//空操作两个机器周期,给硬件反应时间Lcd_Data=dictate;//将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_();//空操作四个机器周期,给硬件反应时间E=1;//E置高电平_nop_();_nop_();_nop_();_nop_();//空操作四个机器周期,给硬件反应时间E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:指定字符显示的实际地址入口参数:x注:此函数已经加上了0x80,故只需写上实际地址就行***************************************************/voidLcd_WriteAddress(unsignedcharx){Lcd_WriteCom(x|0x80);//显示位置的确定方法规定为80H+地址码x}/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/voidLcd_WriteData(unsignedchary){while(Lcd_BusyTest()==1);RS=1;//RS为高电平,RW为低电平时,可以写入数据RW=0;E=0;//E置低电平(写指令时就是让E从0到1发生正跳变所以应先置0Lcd_Data=y;//将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_();//空操作四个机器周期,给硬件反应时间E=1;//E置高电平_nop_();_nop_();_nop_();_nop_();//空操作四个机器周期,给硬件反应时间E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/voidLcd_Int(void){Lcd_delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间Lcd_WriteCom(0x38);//显示模式设置:16×2显示,5×7点阵,8位数据接口Lcd_delay(5);//延时5msLcd_WriteCom(0x38);//9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38);//9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38);//9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38);//9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38);//9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38);//9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38);//9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38);//9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38);//9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38);//9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38);//9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x0C);//显示模式设置:显示开,有光标,光标闪烁Lcd_delay(5);Lcd_WriteCom(0x06);//显示模式设置:光标右移,字符不移Lcd_delay(5);Lcd_WriteCom(0x01);//清屏幕指令,将以前的显示内容清零Lcd_delay(5);}voidhanying_show(void){unsignedcharLcd_i;Lcd_WriteCom(0x01);//清显示:清屏幕指令Lcd_delay(2);Lcd_WriteAddress(0x00);//设置显示位置为最左侧Lcd_delay(2);Lcd_i=0;while(string1[Lcd_i]!='\0')//'\0'是数组结束标志需先将字符存入{Lcd_WriteData(string1[Lcd_i]);//显示字符Lcd_i++;Lcd_delay(4);}}voidmain(){Lcd_Int();//1602初始化while(1){hanying_show();}}