打印

请教前辈,我的LCD屏怎么不显示,这样的程序可行吗?

[复制链接]
2075|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gmgmgm|  楼主 | 2008-12-29 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
gmgmgm|  楼主 | 2008-12-29 10:37 | 只看该作者

请教前辈,我的LCD屏怎么不显示,这样的程序可行吗?

这是程序,请稳中有降位大哥指点一下,有错误吗?

#include <reg52.h>
#include <absacc.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit SW1=P0^3;
sbit SW2=P2^3;
sbit RS=P2^5;
sbit E=P2^4;

void delay_us(int time);
void delay_ms(unsigned int time);
void LCD_com(unsigned char com);
void LCD_data(unsigned char number) ;
void LCD_clear(void);
void LCD_init(void) ;



//微秒级延时程序晶振8MHZ
void delay_us(int time)
{    
    do
        {
            time--;
        }    
        while (time>1);
}
      
//毫秒级延时程序晶振8MHZ 
void delay_ms(unsigned int time)
{
    while(time!=0)
        {        
            delay_us(1000);
            time--;
        }
}

//显示屏命令写入函数
void LCD_com(unsigned char com) 
  {
    
    RS=1; E=1;
    delay_us(10);
    P1 = com;
    delay_us(10);
    //RS=1;

   
    delay_ms(10);
    E=0;RS=0;
  }

//显示屏命令写入函数
void LCD_data(unsigned char number) 
{

    RS=1;

    P1 = number;
    E=1;
    delay_us(200);
    E=0;
}

//显示屏清空显示
void LCD_clear(void) 
{

    LCD_com(0x01);
    delay_ms(5);
}
//显示屏初始化函数
void LCD_init(void) 
{
    
                       //I/O口方向设置
//    DDRD |= (1 << PD3) | (1 << PD4) | (1 << PD6);
    LCD_com(0x38);                //显示模式设置
    delay_ms(10);

    LCD_com(0x38);
    delay_ms(10);

    LCD_com(0x38);
   delay_ms(10);

    LCD_com(0x38);
    delay_ms(10);

    LCD_com(0x38);                //显示关闭
    delay_ms(10);

    LCD_com(0x0e);                //显示清屏
    delay_ms(10);

    LCD_com(0x06);                //显示光标移动设置
     delay_ms(10);

    LCD_com(0x01);                //显示开及光标设置
    delay_ms(100);
}

使用特权

评论回复
板凳
xwj| | 2008-12-29 10:41 | 只看该作者

写要先准备数据和RS,再置高E

使用特权

评论回复
地板
gmgmgm|  楼主 | 2008-12-29 10:48 | 只看该作者

我这样的写入命令可以吗?

//显示屏命令写入函数
void LCD_data(unsigned char number) 
{

    RS=1;

    P1 = number;
    E=1;
    delay_us(200);
    E=0;
}

这里的P1=number;可行吗?是否要考虑P1.0~P1.7的先后顺序?

使用特权

评论回复
5
无锋| | 2008-12-29 20:59 | 只看该作者

RS有问题,你的写指令与数据都是RS=1

使用特权

评论回复
6
llx04| | 2009-1-5 23:23 | 只看该作者

我的写驱动1602的程序,能用的

#include<reg51.h>
#include<intrins.h>
#include<absacc.h>

#define BEEP XBYTE[0x8000]
#define uchar unsigned char
#define LCD_Data P1
#define Busy 0X80

sbit RS=P2^2;
sbit RW=P2^1;
sbit E=P2^0;



uchar ReadStatusLCM(void);
void delayus(uchar i){  //延时us级
 while(--i);
}

//5ms延时
void Delay5ms(void)
 {
  unsigned int TempCyc = 5552;
  while(TempCyc--);
 }

void busy()
{ LCD_Data=0XFF;
  RS=0;
  RW=1;
  E=1;
  while(LCD_Data&0X80){};
  E=0;
  }


void write_cmd(uchar cmd,uchar busyflag)

{  if(busyflag) busy();
   RS=0;
   RW=0;
   LCD_Data=cmd;
   E=1;
   E=1;
   E=0;
   }

void write_dat(uchar dat)

  busy();
  LCD_Data=dat;
  RS=1;
  RW=0;
  E=1;
  E=1;
  E=0;
  }

 void inti_LCD()
  {  write_cmd(0x01,1);
     write_cmd(0X3c,1);    //显示模式设置 16 X 2显示,8
    
     write_cmd(0X0c,1);
   }

   void displaystring(uchar y,uchar x,uchar *s)
   {  if(y==0) x=x|0X80;
      if(y==1) x=x|0X0C0;
      write_cmd(x,1);
      
      while(*s)
     { 
       write_dat(*s);
       s++;
      }
      }

void main(void)

{  displaystring(0x01,0x01,"LCD1602");
   while(1);
}

其中主程序让我改来改去,不知道有没有错!
那些子程序都是没问题,你拿去调用!

使用特权

评论回复
7
computer00| | 2009-1-5 23:31 | 只看该作者

俺的1602程序,也是能用的,嘿嘿...自己修改一下端口定义。

/*******************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途

LCD1602.h file

Created by Computer-lov
Date: 2005.12.12

Version V1.0
Copyright(C) Computer-lov 2005-2015
All rigths reserved

******************************************************/

/*---------------------------------------------------------------------
                         LCD1602.H文件 LCD1602的一些命令定义
  作者:Computer-lov     创建日期:2004.11.12    最后修改日期:2004.11.22
  版本:1.0
----------------------------------------------------------------------*/

#ifndef __LCD_H__
#define __LCD_H__

#define LCD_GO_HOME               0x02         //AC=0,光标、画面回HOME位

//输入方式设置
#define LCD_AC_AUTO_INCREMENT     0x06         //数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE      0x04         //数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE           0x05         //数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE        0x04         //数据读、写操作,画面不动

//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON            0x0C         //显示开
#define LCD_DISPLAY_OFF           0x08         //显示关
#define LCD_CURSOR_ON             0x0A         //光标显示
#define LCD_CURSOR_OFF            0x08         //光标不显示
#define LCD_CURSOR_BLINK_ON       0x09         //光标闪烁
#define LCD_CURSOR_BLINK_OFF      0x08         //光标不闪烁

//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE             0x18         //LCD显示左移一位
#define LCD_RIGHT_MOVE            0x1C         //LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE      0x10         //光标左移一位
#define LCD_CURSOR_RIGHT_MOVE     0x14         //光标右移一位

//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE   0x38         //两行显示
#define LCD_DISPLAY_SINGLE_LINE   0x30         //单行显示

void LCD_check_busy(void);
void LCD_cls(void);
void LCD_write_instruction(unsigned char);
void LCD_write_data(unsigned char);
void LCD_set_position(unsigned char);
void LCD_printc(unsigned char);
void LCD_prints(unsigned char *);
void LCD_initial(void);

#endif


/*******************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途

LCD1602.C file
1602LCD 驱动程序 
P0口作为数据输出口

Created by Computer-lov
Date: 2005.12.12

Version V1.1
Copyright(C) Computer-lov 2005-2015
All rigths reserved

******************************************************/

#include<at89x52.h>
#include"LCD1602.H"

//这些定义自己根据硬件连接修改
#define LCD_DATA P0        //lcd的数据

sbit LCD_BUSY=LCD_DATA^7;  //测试LCD忙时使用
sbit LCD_RW=P2^5;         //读写控制
sbit LCD_RS=P2^6;         //寄存器选择
sbit LCD_EN=P2^7;         //使能信号

void LCD_check_busy(void)   //检测LCD状态,看它是不是还在忙呢
{
 while(1)
  {
   LCD_EN=0;
   LCD_RS=0;
   LCD_RW=1;
   LCD_DATA=0xff;
   LCD_EN=1;
   if(!LCD_BUSY)break;
  }
 LCD_EN=0;
}

void LCD_cls(void)          //LCD清屏
{
 LCD_check_busy();
 LCD_RS=0;
 LCD_RW=0;
 LCD_EN=1;
 LCD_DATA=1;
 LCD_EN=0;
}

void LCD_write_instruction(unsigned char LCD_instruction)   //写指令到LCD
{
 LCD_check_busy();
 LCD_RS=0;
 LCD_RW=0;
 LCD_EN=1;
 LCD_DATA=LCD_instruction;
 LCD_EN=0;
}

void LCD_write_data(unsigned char LCD_data)      //输出一个字节数据到LCD
{
 LCD_check_busy();
 LCD_RS=1;
 LCD_RW=0;
 LCD_EN=1;
 LCD_DATA=LCD_data;
 LCD_EN=0;
}
 
void LCD_set_position(unsigned char x)            //LCD光标定位到x处
{
 LCD_write_instruction(0x80+x);
}


/*
void LCD_go_home(void)                         //LCD光标归位
{
 LCD_write_instruction(LCD_GO_HOME);
}
*/

void LCD_printc(unsigned char lcd_data)          //输出一个字符到LCD
{
 LCD_write_data(lcd_data);
}

void LCD_prints(unsigned char *lcd_string)       //输出一个字符串到LCD
{
 unsigned char i=0;
 while(lcd_string!=0x00)
  {
   LCD_write_data(lcd_string);
   i++;
  } 
}


void LCD_initial(void)                        //初始化LCD
{
 LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
 LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
 LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE);
 LCD_cls();
 LCD_set_position(0x00);
 LCD_cls();
}

使用特权

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

本版积分规则

135

主题

766

帖子

2

粉丝