| 
 
| 我用89c52控制lcd1602,想出现如下效果: 
   没想到却出现如下现象 :
 
  不知道哪位高手能找出bug?
 
 我的程序如下:
 lcd1602.h部分
 ------------------------------------------
 #ifndef __LCD1602_H__
 #define __LCD1602_H__
 
 void init_lcd();//lcd1602初始化
 void display_string(unsigned char x,unsigned char y,unsigned char *str);//在y行的x位置开始显示字符串
 #endif
 
 lcd1602.c部分
 /*************************************************/
 /*本程序为LCD1602液晶控制与显示程序*/
 /*************************************************/
 
 #include<reg52.h>
 #include<intrins.h>
 #define uint unsigned int
 #define uchar unsigned char
 
 sbit RS=P2^0;
 sbit RW=P2^1;
 sbit EN=P2^2;
 
 /************************延时函数***********************/
 void delay_ms(uint ms)
 {
 uchar i;
 while(ms--)
 {
 for(i=0;i<120;i++);
 }
 }
 
 /************************忙检测*************************/
 uchar busy_check()
 {
 uchar lcd_status;
 RS=0;
 RW=1;
 EN=1;
 delay_ms(1);
 lcd_status=P0;
 EN=0;
 return lcd_status;
 }
 
 /*********************写LCD指令*************************/
 void write_lcd_command(uchar cmd)
 {
 while((busy_check()&0x80)==0x80);//忙等待
 RS=0;
 RW=0;
 EN=0;
 P0=cmd;
 EN=1;
 delay_ms(1);
 EN=0;
 }
 
 /*********************写LCD数据*************************/
 void write_lcd_data(uchar dat)
 {
 while((busy_check()&0x80)==0x80);//忙等待
 RS=1;
 RW=0;
 EN=0;
 P0=dat;
 EN=1;
 delay_ms(1);
 EN=0;
 }
 
 /*********************LCD初始化*************************/
 void init_lcd()
 {
 delay_ms(15);
 write_lcd_command(0x38);
 delay_ms(5);
 write_lcd_command(0x38);
 delay_ms(5);
 write_lcd_command(0x38);
 write_lcd_command(0x38);//设置16x2显示,5x7点阵,8位数据口
 write_lcd_command(0x08);//开显示,关光标
 write_lcd_command(0x01);//清屏
 write_lcd_command(0x06);//字符进入模式:屏不动,字符后移
 write_lcd_command(0x0c);//开显示,开光标
 }
 
 /*********************显示字符串*************************/
 void display_string(uchar x,uchar y,uchar *str)
 {
 uchar i=0;
 //设置显示起始位置
 if(y==0)
 write_lcd_command(0x80|x);
 if(y==1)
 write_lcd_command(0xc0|x);
 //输出字符串
 for(i=0;i<16;i++)
 {
 write_lcd_data(str);
 }
 }
 
 主程序如下:
 ************************************************
 #include<reg52.h>
 #include"lcd1602.h"
 
 void main()
 {
 init_lcd();
 display_string(0,0,"HELLO LCD1602");
 display_string(0,1,"349264710@qq.com");
 while(1);
 }
 -----------------------------------------------------------------------
 ·重点是这个函数
 void display_string(uchar x,uchar y,uchar *str)//在y行的x位置开始显示字符串
 {
 uchar i=0;
 //设置显示起始位置
 if(y==0)
 write_lcd_command(0x80|x);
 if(y==1)
 write_lcd_command(0xc0|x);
 //输出字符串
 for(i=0;i<16;i++)
 {
 write_lcd_data(str);
 }
 }
 当我调用的时候:
 display_string(0,0,"HELLO LCD1602");
 display_string(0,1,"349264710@qq.com");
 想出现这样的效果:
 HELLO LCD1602
 349264710@qq.com
 没想到却出现这样的效果:
 HELLO LCD1602 34
 349264710@qq.com
 到底是哪里出现问题了?
 | 
 |