打印

lcd1602显示,诡异问题

[复制链接]
1475|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
349264710|  楼主 | 2010-9-15 13:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用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
到底是哪里出现问题了?

相关帖子

沙发
linjing| | 2010-9-22 09:31 | 只看该作者
void display_string(uchar x,uchar y,uchar *str)里面的循环不该用for计数的,
需要判断字符串结尾
奇怪没看到str指针自增的语句

使用特权

评论回复
板凳
349264710|  楼主 | 2010-9-22 14:19 | 只看该作者
按照你的提示,问题已经解决了,谢谢~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

77

帖子

3

粉丝