我用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
到底是哪里出现问题了? |