打印

求救~~~关于1602的问题

[复制链接]
2324|15
手机看帖
扫描二维码
随时随地手机跟帖
沙发
forthlab| | 2008-1-21 18:51 | 只看该作者

仔细看看说明书,这个芯片好像不困难的。

使用特权

评论回复
板凳
jack.king| | 2008-1-21 20:09 | 只看该作者

让你看个实际的程序吧!

使用特权

评论回复
地板
jack.king| | 2008-1-21 20:10 | 只看该作者

让你看个实际的程序吧!

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

#define uchar unsigned char

typedef bit BOOL  ; 

sbit rs = P2^6 ; 
sbit rw = P3^6 ;
sbit ep = P2^7 ;


void delay(uchar) ;
void lcd_wcmd(uchar) ;
BOOL lcd_bz() ;
void lcd_pos(uchar) ;
void lcd_wdat(uchar) ;
void display(uchar,uchar *) ;

code uchar  dis1[] = {" good studay"};
code uchar  dis2[] = {"day day up"} ;



void longdelay(uchar s)  //长延时
{
     while(s--)
     {
          delay(60) ;
     }
}

void delay(uchar ms)
{       // 延时子程序
     uchar i ;
     while(ms--)
     {
          for(i = 0 ; i<250;i++) ;
     }
}

BOOL lcd_bz()
{       // 测试LCD忙碌状态
     BOOL result ;
     rs = 0 ;
     rw = 1 ;
     ep = 1 ;
     result = (BOOL)(P0 & 0x80) ;
     ep = 0 ;
     return result ; 
}

void lcd_wcmd(uchar cmd)
{       // 写入指令数据到LCD
     while(lcd_bz()) ;
    rs = 0 ;
    rw = 0 ;
    ep = 0 ;
    P0 = cmd ;
    ep = 1 ;
    ep = 0 ;  
}

void lcd_pos(uchar pos)
{       //设定显示位置
     lcd_wcmd(pos | 0x80) ;
}

void lcd_wdat(uchar dat) 
{       //写入字符显示数据到LCD
     while(lcd_bz()) ;
      rs = 1 ;
      rw = 0 ;
      ep = 0 ;
      P0 = dat ;
      ep = 1 ;
      ep = 0 ; 
}

void lcd_init()
{       //LCD初始化设定
     lcd_wcmd(0x38) ;   //function set
     delay(1) ;
     lcd_wcmd(0x38) ;   //function set
     delay(1) ;
     lcd_wcmd(0x08) ;   //display on/off
     delay(1) ;
     lcd_wcmd(0x01) ;   //清除LCD的显示内容
     delay(1) ;
     lcd_wcmd(0x06) ;   //entry mode set
     delay(1) ;
     lcd_wcmd(0x0c) ;   //entry mode set
     delay(1) ;
}

/*---------------
函数名称:display()
功能 :在LCD上显示数组的数据
说明 :先写显示地址,后写显示数据
调用 :lcd_wcmd(), lcd_pos()
入口参数:pos 写入的位置,q指向要写入的数据所在的数组
返回值 :无
----------------*/
void display(uchar pos, uchar *q)

     uchar i ;
     //lcd_wcmd(0x01) ; //clear 
     delay(10) ;
     lcd_pos(pos) ;
     for(i=0 ;i<16;i++)
     {
          lcd_wdat(*q) ;
          q++ ;
          longdelay(2) ;
     } 
}

main()
{
     lcd_init() ;    // 初始化LCD   
     delay(10) ;
     display(0x00,dis1) ;
     display(0x40,dis2) ;
     display(0x14,dis1) ;
     display(0x54,dis2) ;
     lcd_wcmd(0x07) ;   //entry mode set
     delay(1) ;
     while(1)
     { 
          display(0x00,dis1) ;
          /*
          display(0x40,dis2) ;
          display(0x14,dis1) ;
          display(0x54,dis2) ;
          */
     }
}

使用特权

评论回复
5
dai_weis| | 2008-1-21 20:51 | 只看该作者

你的初始化过程中延时时间太短

而且必须看手册中关于时间间隔的参数,我用的1602要求不低于5ms的时间

使用特权

评论回复
6
我爱喝水| | 2008-1-21 22:50 | 只看该作者

看对比度电位器对不对

这个问题容易忽略

使用特权

评论回复
7
zusen| | 2008-1-22 09:18 | 只看该作者

上电后延时数百毫秒才对LCD操作

使用特权

评论回复
8
wenson7788|  楼主 | 2008-1-22 13:10 | 只看该作者

谢谢了~~我试试看

使用特权

评论回复
9
ayb_ice| | 2008-1-22 14:53 | 只看该作者

看对比度电位器对不对

使用特权

评论回复
10
wenson7788|  楼主 | 2008-1-22 15:29 | 只看该作者

我检查出问题了,但不知道怎么解决

我重新用程序检测后发现,是忙信号的问题。
就是在检测忙信号的时候,发现一直都是忙的,所以指令都无法写进去,导致无法显示。
请问这个问题怎么解决啊,是板的问题还是程序问题?板是我自己焊的实验板来的!谢谢各位了~麻烦帮帮小弟啊!!

使用特权

评论回复
11
txh353012| | 2008-1-22 21:36 | 只看该作者

把你的程序发上来看看.

看下硬件线有没有少接啊.
硬件的线有没有接对啊.数据线不接上拉电阻啊.
如果是自己焊的扳子,那问题就多了.
然后在看程序.这种1602的程序太简单了的.网络上大把.

使用特权

评论回复
12
wenson7788|  楼主 | 2008-1-22 22:58 | 只看该作者

源程序,但是检测忙信号一直通不过

#include <stdio.h>
#include <regstc.h>
#include <absacc.h>
#include <math.h>
#include <intrins.h>
#include <LCD.h>



#define uchar unsigned char 
#define uint  unsigned int
#define DELAY_VALUE 100
uchar buffer[17];



void LCD_CHECK(void);
void LCD_CLS(void);
void LCD_WRITE_INSTRUCTION(uchar LCD_instruction ) ;
void LCD_WRITE_DATA(uchar LCD_data) ;
void LCD_SET_POSITION(uchar position)  ;
void LCD_BACK(void); 
void LCD_PRINTC(uchar LCD_DATA) ;
void LCD_PRINTS(uchar *lcd_string);
void LCD_INITIAL(void);  

void delay(uchar ms)
{       // 延时子程序
     uchar i ;
     while(ms--)
     {
          for(i = 0 ; i<250;i++) ;
     }
}    

void longdelay(uchar s)  //长延时
{
     while(s--)
     {
          delay(60) ;
     }
}

void LCD_CHECK(void)     //检测忙信号
{
    
        uint busy;
        LCD_DATA=0xff;
        LCD_RS=0;
        LCD_RW=1;
        LCD_E=1;
        delay(10);
        for(;;)
        {
        busy=LCD_DATA&0x80;
        if(busy==0)
        break;
        }
        LCD_E=0;

}

void LCD_CLS(void)           //LCD清屏
{
    LCD_CHECK();
    LCD_RS=0;
    LCD_RW=0;
    LCD_E=0;
    LCD_DATA=0x01;
    delay(10);
        LCD_E=1;
    delay(10);
    LCD_E=0;


}                             

void LCD_WRITE_INSTRUCTION(uchar LCD_instruction )      // 写入指令
{
    LCD_CHECK();
    LCD_RS=0;
    LCD_RW=0;
    LCD_DATA=LCD_instruction;
    LCD_E=1;
    delay(10);
    LCD_E=0;

}

void LCD_WRITE_DATA(uchar LCD_data)                 //写入数据
{
    LCD_CHECK();
    
    LCD_RS=1;
    LCD_RW=0;
    LCD_E=0;

    LCD_DATA=LCD_data;
    delay(10);
    LCD_E=1;

    LCD_E=0;
}

void LCD_SET_POSITION(uchar position)                //定位
{
    LCD_WRITE_INSTRUCTION(0x80+position);
}

void LCD_BACK(void)              // 光标归位
{
    LCD_WRITE_INSTRUCTION(LCD_GO_HOME);
}

void LCD_PRINTC(uchar LCD_DATA)                     //显示一个字符
{
    LCD_WRITE_DATA(LCD_DATA);
}

void LCD_PRINTS(uchar *lcd_string)            //??显示一串字符
{
    uchar i;
    while(lcd_string!=0x00)
    {
        LCD_WRITE_DATA(lcd_string);
        i++;
     }
}

void LCD_INITIAL(void)                           //LCD初始化
{
    LCD_WRITE_INSTRUCTION(LCD_AC_AUTO_INCREMENT);
    delay(10);
    LCD_WRITE_INSTRUCTION(LCD_MOVE_DISENABLE);
    delay(10);
    LCD_WRITE_INSTRUCTION(LCD_DISPLAY_ON);
    delay(10);
    LCD_WRITE_INSTRUCTION(LCD_CURSOR_OFF);
    delay(10);
    LCD_WRITE_INSTRUCTION(LCD_DISPLAY_DOUBLE_LINE);
    delay(10);
    LCD_CLS();
    delay(10);
    
}

main()
{   LCD_INITIAL();
    while(1)
    {
      
    }
}

使用特权

评论回复
13
txh353012| | 2008-1-23 23:11 | 只看该作者

这样子的

  for(;;)
        {
        busy=LCD_DATA&0x80;
        if(busy==0)
        break;
        }

你写错了.LCD_DATA 你要定义在数据口啊.你就定义成了变量,他的数据怎么会变化呢?
可以这样子写
void write_data(char t)
{do
 {RS=0;RW=1;E=1;//--------------------judge busy
  take=P1;
  E=0;}
 while(take&0x80);
  RS=1;RW=0;E=1;//--------------------write data
  P1=t;
  delay(10);
  E=0;
}

 看到没有 take=P1 检测忙信号是检测数据口的信号.你的LCD_DATA却是个变量,
他的数据怎么会变呢?

使用特权

评论回复
14
wenson7788|  楼主 | 2008-1-28 12:02 | 只看该作者

可以工作了,但是初始化后没有显示

请问怎么 解决啊??

使用特权

评论回复
15
txh353012| | 2008-2-3 06:09 | 只看该作者

还是把程序发上来看看

还是把程序发上来看看

使用特权

评论回复
16
stycx| | 2008-2-4 11:30 | 只看该作者

直接延时就可以,不用判断忙信号

还有,发接线图和运行程序时的照片上来比较好判断

使用特权

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

本版积分规则

3

主题

11

帖子

0

粉丝