打印

求助:LCD1602显示问题

[复制链接]
2509|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dw19861020|  楼主 | 2008-10-30 21:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是我写的一个1602显示第一行第一个字母“A”的程序和电路图,一直出不来,希望各位热心人花一点点时间指导一下。先谢谢了!


//************************************************************//
#include <REGX51.H>
#define uchar unsigned char 
#define uint  unsigned int  
uchar com;               //LCD指令寄存器
uchar dat;               //LCD数据寄存器
sbit  RS=P2^1;
sbit  RW=P2^2;
sbit  E=P2^3;
sbit  L7=P0^7;

//****************延时程序******************//
void delay(uchar n)
{  
  uint i,j;
  for(i=0;i<n;i++)
  for(j=0;j<200;j++);
}

//**************写指令代码子程序************//
void write_com(uchar com)
{
  //首先读忙
  
  RS=0;              //设置读忙控制方式
  RW=1;
  do
  {
    P0=0xff;
    E=0;
    delay(2);
    E=1;
  }
  while(L7==1);          //循环判断lcd是否忙?
  RS=0;
  RW=0;
  P0=com;
  E=0;
  delay(2);
  E=1;
}

//***************写数据子程序****************//
void write_dat(uchar dat)
{
  //首先读忙
  
  RS=0;              //设置读忙控制方式
  RW=1;
  do
  {
    P0=0xff;
    E=0;
    delay(2);
    E=1;
  }
  while(L7==1);          //循环判断lcd是否忙?
  RS=1;           
  RW=0;                
  P0=dat;         
  E=0;
  delay(2);
  E=1;
}

//**********************主程序**********************//
void main()

  //首先lcd初始化
  delay(10);
  com=0x38;        //设定lcd为16x2显示,5x7点阵,8位数据接口
  write_com(com);
  com=0x01;        //清显示
  write_com(com);
  com=0x08;        //开显示,有光标,光标闪烁
  write_com(com);
  com=0x06;        //光标右移
  write_com(com);
  com=0x80;        //第一行第一个字符地址
  write_com(com);
  dat=0x41;           //显示“A”
  write_dat(dat);
  while(1);
}

相关帖子

沙发
dw19861020|  楼主 | 2008-10-30 22:53 | 只看该作者

怎么没有人留言呢?

使用特权

评论回复
板凳
aihe| | 2008-10-31 11:56 | 只看该作者

既然用Proteus,就参考Proteus自带的例程

使用特权

评论回复
地板
dw19861020|  楼主 | 2008-10-31 17:07 | 只看该作者

不明白?

使用特权

评论回复
5
qingsha| | 2008-10-31 21:09 | 只看该作者

好像不能仿真P0的IO口

好像这个不能仿真把P0当IO口用。

使用特权

评论回复
6
dw19861020|  楼主 | 2008-10-31 21:26 | 只看该作者

可以啊,我以前做课设的时候就用过这个图啊。

昨天调试的时候感觉主程序里执行不下去,把读忙部分屏蔽掉后可以,但就是不显示。很郁闷哦!

使用特权

评论回复
7
无锋| | 2008-11-1 09:51 | 只看该作者

把延时写长一点看看。

使用特权

评论回复
8
dw19861020|  楼主 | 2008-11-1 14:47 | 只看该作者

不行的

使用特权

评论回复
9
qingsha| | 2008-11-1 23:10 | 只看该作者

E应该是下降沿

这个E应该是下降沿有效,我看你的怎么是上升沿!

使用特权

评论回复
10
qingsha| | 2008-11-1 23:17 | 只看该作者

初始化有问题

要开显示,开光标,光标闪烁应该发送0x0f.

使用特权

评论回复
11
dw19861020|  楼主 | 2008-11-2 21:09 | 只看该作者

恩,解决了,谢谢上面的各位了!

使用特权

评论回复
12
ahai0306| | 2008-11-3 16:14 | 只看该作者

开发板程序之一(1602液晶C程序含注释)!

开发板程序之一(1602液晶C程序含注释)! 
发表于 2008-3-14 18:25:22 
/*
***************************************************************************
*     (C) Copyright 2007,单片机初学者园地
*                          All Rights reserved.
*项目名称:    51单片机学习开发系统           
*本文件名称:LCD1602.c   
* 完成作者 : 单片机初学者 QQ:50501160   ahai0306@sina.com
* 当前版本 : V1.0        
* 完成日期 : 2007年4月3日
* 描    述 :  
*                此程序实现,完成液晶的驱动程序,可以显示任意的ASCII字符
*             
*  我的博客:http://blog.**/ahai0306/
*  开发板介绍:http://blog.**/ahai0306/84416/message.aspx
*  淘宝网店铺地址:http://shop35284066.taobao.com/
*  我的论坛:http://dianzi.5d6d.com/?fromuser=mcu_51           
****************************************************************************
*/
#include  <reg52.h>     //调用头文件(单片机内部的寄存器定义)

/******本段为硬件I/O口定义********/
sbit  KEY0   = P0 ^ 0;  //KEY和发光管复用,请将跳线插到KEY端
sbit  KEY1   = P0 ^ 1;
sbit  KEY2   = P0 ^ 2;
sbit  KEY3   = P0 ^ 3;
sbit  DIG0   = P0 ^ 4;  //数码管位0
sbit  DIG1   = P0 ^ 5;  //数码管位1

sbit  BUZZ   = P3 ^ 3;  //蜂鸣器
sbit  LCD_RW = P3 ^ 6;  
sbit  LCD_RS = P3 ^ 7;  
sbit  LCD_E  = P3 ^ 4;

#define  LED_SEG    P1  //数码管
#define  LCD_DATA   P2   //LCD DATA
#define  LCD_BUSY   0x80  // 用于检测LCD的BUSY标识(本程序中用的延时,未检测)
//LCD显示内容,定义到代码段
 unsigned  char code LcdBuf1[]= {"welcom!"};
unsigned  char code LcdBuf2[]= {"MCU-STUDY-BOARD"};

//函数声明
void  lcd_init(void);
void  display_string(unsigned  char x,unsigned  char y,unsigned  char *s);
void  disp_selec(unsigned  char bit_selec,unsigned  char  seg);


 /**************************************************
** 函数名称: dellay
** 入口参数:h(unsigned int型)
** 出口参数:无
** 功能描述: 短暂延时,使用11.0592晶体,约0.01MS
****************************************************/
void dellay(unsigned int  h)
{
  while(h--);    //0.01MS
}


/************主程序**************/
main()

    lcd_init();
 display_string(3,0,LcdBuf1);  //显示第一行,从第3个位置开始
 display_string(0,1,LcdBuf2);  //显示第二行,从第0个位置开始
 
   while(1);     //单片机待机


/**************************************************
** 函数名称: WriteDataLcd
** 入口参数:wdata(unsigned  char型)
** 出口参数:无
** 功能描述: 写数据到LCD
****************************************************/
void  WriteDataLcd(unsigned  char wdata)
{
   LCD_DATA=wdata;
   LCD_RS=1;
   LCD_RW=0;
   LCD_E=0;
   dellay(100);     //短暂延时,代替检测忙状态

   LCD_E=1;
}
/**************************************************
** 函数名称: WriteCommandLcd
** 入口参数:wdata(unsigned  char型)
** 出口参数:无
** 功能描述: 写命令到LCD
****************************************************/
void  WriteCommandLcd(unsigned  char wdata)
{
   LCD_DATA=wdata;
   LCD_RS=0;
   LCD_RW=0;
   LCD_E=0;
   dellay(100);      //短暂延时,代替检测忙状态
   LCD_E=1;
}

//LCD初始化
void  lcd_init(void)
{
     LCD_DATA=0;
     WriteCommandLcd(0x38);
     dellay(1000);
     WriteCommandLcd(0x38); //显示模式设置
    WriteCommandLcd(0x08); //关闭显示
    WriteCommandLcd(0x01); //显示清屏
    WriteCommandLcd(0x06); //显示光标移动设置
    WriteCommandLcd(0x0c); //显示开及光标移动设置
}
/**************************************************
** 函数名称: display_xy
** 入口参数:x(unsigned  char型),y(unsigned  char型)
** 出口参数:无
** 功能描述: 设置光标位置, x是列号,y是行号
****************************************************/
void  display_xy(unsigned  char x,unsigned  char y)

    if(y==1)
   x+=0x40;
  x+=0x80;
  WriteCommandLcd(x);
}
/********************************************************************
** 函数名称: display_char
** 入口参数:x(unsigned  char型),y(unsigned  char型),dat(unsigned  char型)
** 出口参数:无
** 功能描述: 在具体位置显示单个字符,x是列号,y是行号
*********************************************************************/
void  display_char(unsigned  char x,unsigned  char y,unsigned  char dat)
{
  display_xy(x,y);
  WriteDataLcd(dat);
}

/*********************************************************************
** 函数名称: display_string
** 入口参数:x(unsigned  char型),y(unsigned  char型),s(指针型)
** 出口参数:无
** 功能描述: 在具体位置显示字符串,以/0结束,x是列号,y是行号
**********************************************************************/
void  display_string(unsigned  char x,unsigned  char y,unsigned  char *s)
{
  display_xy(x,y);
  while(*s)
  {
   WriteDataLcd(*s);
   s++;
  }
}


相关链接:http://blog.**/ahai0306/

使用特权

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

本版积分规则

8

主题

91

帖子

0

粉丝