打印

1602LCD(st7066驱动问题)

[复制链接]
3409|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
新好男孩|  楼主 | 2007-9-5 16:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1602LCD屏点不亮.请求大家支援一下.谢谢!

// 主程序
#include "main.h"

#include"Port.h"
#include"LcdModule.h"


main()
{

    LceInit();
    
    while (1)
    {

    }
}

// LCD点阵源码(C文件和头文件)

/*--------------------------------------------------------------------*-

    LcdModule.C (V1.00)

     
-*---------------------------------------------------------------------*/
/*
 * Copyright (c) 2006,wsl
 * All rights reserved
 * 
 * 文件名称: LcdModule.C
 * 功能描述: Lcd点阵16x2(st7066u)驱动
 * 其它说明: 
 * 
 * 当前版本: V1.0                * 取代版本:
 * 作     者: wsl             * 修     改:  
 * 版本信息: 2007-9-4         * 修改信息: :
 */
//***********************************************************************
#include"main.h"
#include"Port.h"
#include"LcdModule.h"


// 函数列表
static void LedDelay37us(void);
static void LedDelay2ms(void);
// 写数据/命令
static void LCD_Write(eM_LcdSendCommand style, eM_LcdBusyFlag busy, const unsigned char input);
// 待写入自定义字型RAM字符数组的首地址和字模数组长度
static void Write_CG_RAM(unsigned char *pData, unsigned char Length);    

/*-----------------------------------------------------------------------*-
 * 函数名称: LedDelay37us()
 * 参    数: xx
 * 返    回: xx
 * 函数功能: 软件延时37us
 * 
 * 说    明: Fosc = 22.1184M
 *
 * 当前版本: V1.0                * 取代版本:
 * 作     者: wsl             * 修     改:  
 * 版本信息: 2007-9-4             * 修改信息: 
-*-----------------------------------------------------------------------*/
void LedDelay37us(void)
{
    unsigned char i;
    for (i=0; i<21; i++);
}

/*-----------------------------------------------------------------------*-
 * 函数名称: LedDelay2ms()
 * 参    数: xx
 * 返    回: xx
 * 函数功能: 软件延时2ms
 * 
 * 说    明: Fosc = 22.1184M
 *
 * 当前版本: V1.0                * 取代版本:
 * 作     者: wsl             * 修     改:  
 * 版本信息: 2007-9-4            * 修改信息: 
-*-----------------------------------------------------------------------*/
void LedDelay2ms(void)
{
    unsigned char x, y;
    for (x=0; x<12; x++)
    {
        for (y=0; y<100; y++);
    }
}

#ifdef Is_8bit_Interface_Mode

// 是8位MCU模式
/*-----------------------------------------------------------------------*-
 * 函数名称: LcdReadBusy()
 * 参    数: 
 * 返    回:
 * 函数功能: 读忙BF值,忙标志
 * 
 * 说     明: 读BF及AC值
 *
 * 当前版本: V1.0                * 取代版本:
 * 作    者: wsl              * 修     改:  
 * 版本信息: 2007-09-4           * 修改信息: 
-*-----------------------------------------------------------------------*/
void LcdReadBusy(void)
{    
    // 用于超时,防止LCD模块损坏系统死在此处
    unsigned int i = 0;    
    unsigned char ReadBusy;
    // 选择指令寄存器
    LcdRs = 0; 
    // 选择读模式
    LcdRw = 1;         
    // 允许读/写LCD
    LcdEn = 1;      _nop_();  
    // 检测忙信号,忙则等待
    while( ((ReadBusy = DBPort) & 0x80) && (i != 0) )
    {
        i++;
    }
    // 禁止读/写
    LcdEn = 0;
}


/*-----------------------------------------------------------------------*-
 * 函数名称: LCD_Write()
 * 参    数: style            数据/指令选择控制(0:写命令 1:写数据)
 *           busy             是否判忙(0:不判; 1:判忙)
 *           input            style=0时用命令,style=0时用数据,    
 * 返    回:
 * 函数功能: 向LCD写入命令或数据 
 * 
 * 说     明: 
 *
 * 当前版本: V1.0                * 取代版本:
 * 作     者: wsl             * 修     改:  
 * 版本信息: 2006-09-14         * 修改信息: 
-*-----------------------------------------------------------------------*/
void LCD_Write(eM_LcdSendCommand style, eM_LcdBusyFlag busy, const unsigned char input)
{
    if (busy)    // 是否判忙
    {
        LcdReadBusy();
    }

    LcdRs = style;    // 选择寄存器
    LcdRw = 0;         // 写模式
    
    // 写入Lcd
    LcdEn = 1;         // 启动数据读写
    DBPort = input;    
    _nop_();    _nop_();    //注意顺序
    LcdEn = 0;            
}
#else


#endif


/*-----------------------------------------------------------------------*-
 * 函数名称: LcdInit()
 * 参    数: 
 * 返    回:
 * 函数功能: Lcd初始化,设置显示模式及光标.
 *             
 * 说     明: 
 *
 * 当前版本: V1.0             * 取代版本:
 * 作     者: wsl          * 修     改:  
 * 版本信息: 2007-9-4         * 修改信息: 
-*-----------------------------------------------------------------------*/
void LceInit(void)
{    
    unsigned char i;
    // 上电延时
    for (i=0; i<30; i++)
    {
        LedDelay2ms();
    }

    for (i=0; i<30; i++)
    {    // 3次设置显示模式,不检测忙信号
        LCD_Write(LCD_COMMAND, LCD_NO_BUSY, 0x38);
        LedDelay37us();
    }

    LedDelay37us();        
    LCD_Write(LCD_COMMAND, LCD_BUSY, 0x0f);         
    LedDelay37us();
    LCD_Write(LCD_COMMAND, LCD_BUSY, 0x01);         
    LedDelay2ms();
    LCD_Write(LCD_COMMAND, LCD_BUSY, 0x06);         
    LedDelay37us();     
}

/*-------------------------------------------------------*-

    LcdModule.H (V1.0)

-*-------------------------------------------------------*/

/*
 * Copyright (c) 2006,
 * All rights reserved
 * 
 * 文件名称: LcdModule.H
 * 文件标识: 
 * 摘     要: 
 */ 

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

#ifndef    _LcdModule_H_
#define    _LcdModule_H_

//------------------条件编译------------------------------
#define Is_8bit_Interface_Mode
//#define DisplayListChar


//--------------------------------------------------------
// 向LCD写入命令/数据
typedef enum{
                LCD_COMMAND = 0,    // Command
                LCD_DATA = 1        // Data                            
            }eM_LcdSendCommand;

//--------------------------------------------------------
// LCD判忙
typedef enum{
                LCD_NO_BUSY    = 0,
                LCD_BUSY = 1        
            }eM_LcdBusyFlag;

//---------------------------------------------------------
// LCD点阵规格类型(6种)
typedef enum{
                LcdSpec1601 = 0,    // 16x1 Alphanumeric Lcd
                LcdSpec1602 = 1,    // 16x2 Alphanumeric Lcd
                LcdSpec1604 = 2,    // 16x4 Alphanumeric Lcd
                LcdSpec2002 = 3,    // 20x2 Alphanumeric Lcd
                LcdSpec2004 = 4,    // 20x4 Alphanumeric Lcd
                LcdSpec4002 = 5     // 40x2 Alphanumeric Lcd
            }eM_LcdSpec;


//---------------------------------------
// 自定义字型RAM(CG RAM)地址初始
// #define CG_RAM_ADDRESS    0x40
// 数据显示RAM(DD RAM)地址初始
// #define DD_RAM_ADDRESS    0x80
// RAM类型
#define CG_RAM    0x40    // 自定义字型RAM
#define DD_RAM    0x80    // 数据显示RAM




//-------------------------------------------------------
// 公用函数
void LceInit(void);

                 
void DisplayOneChar(    
                        unsigned char XStart, 
                        unsigned char YStart, 
                        unsigned char DData    
                    );


void DisplayListChar(
                        unsigned char XStart,    // 开始显示的X坐标像素值
                        unsigned char YStart,    // 开始显示的Y坐标像素值 
                        unsigned char *pData    // 待写入字符数组的首地址
                    );

//-------------------------------------------------------

#endif 

//******************end of file***************************


// 以下是端口头文件

/*-------------------------------------------------------*-

    Port.H (V1.1)

    端口头文件 (Port Header)

-*-------------------------------------------------------*/

/*
 * Copyright (c) 2006,
 * All rights reserved
 * 
 * 文件名称: Port.h
 * 文件标识: 端口头文件(Port Header) 
 * 摘     要: 使用端口头文件,你可以将整个项目中所有不
 *             不同的端口访问特性都放入同一个(头)文件中
 *             这样每个其它的项目文件需要#include文件Port.H
 * 
 * 当前版本: V1.0             * 取代版本:
 * 作     者: wsl             * 修     改:  
 * 版本信息: 2006-09-14         * 修改信息: 
 */ 

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

#ifndef    _PORT_H_
#define    _PORT_H_

//------------------LcdModule.C--------------------------

#define DBPort P2    
sbit LcdRs        = P3^5;
sbit LcdRw        = P3^6;
sbit LcdEn      = P3^7;


//-------------------------------------------------------


/*------------------------------------------------------*/
#endif

/*------------------------------------------------------*-
      
        END OF FILE

-*------------------------------------------------------*/

相关帖子

沙发
reckon| | 2007-9-5 22:30 | 只看该作者

兼容hd44780的,网上就有啊

使用特权

评论回复
板凳
1dqmoon| | 2007-9-5 22:34 | 只看该作者

re

void LCD_Write(eM_LcdSendCommand style, eM_LcdBusyFlag busy, const unsigned char input)
{
    if (busy)    // 是否判忙
    {
        LcdReadBusy();
    }

    LcdRs = style;    // 选择寄存器
    LcdRw = 0;         // 写模式
    
    // 写入Lcd
    LcdEn = 1;         // 启动数据读写
    DBPort = input;    
    _nop_();    _nop_();    //注意顺序
    LcdEn = 0;            


中,建议
    DBPort = input;    
    LcdEn = 1;         // 启动数据读写
    _nop_();    _nop_();    //注意顺序
    LcdEn = 0;   
这样写,

还有就是,程序中不要读忙, 一个avr单片机配12mhz晶振都不需要读忙,51单片机就更不用.而且有时候读忙会出问题
}

使用特权

评论回复
地板
新好男孩|  楼主 | 2007-9-6 15:55 | 只看该作者

??

回2楼:
   此程序跑HD44780没有问题.

回3楼:
   我按你说的改过来也不行.不判忙也不行.

为什么跑HD44780没有问题,而跑ST7066不行呢?

我测试程序用的单片机是STC89C51RC.时钟晶体是22.1184M.

使用特权

评论回复
5
hsw_21| | 2007-9-6 16:01 | 只看该作者

检查硬件VO脚,用示波器挂数据线上波形试试。

使用特权

评论回复
6
新好男孩|  楼主 | 2007-9-6 16:35 | 只看该作者

谢谢5楼.是硬件V0脚的问题.程序没有问题.

谢谢5楼.是硬件V0脚的问题.程序没有问题.

使用特权

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

本版积分规则

25

主题

136

帖子

0

粉丝