打印
[51单片机]

LCD1602

[复制链接]
1670|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fengjiex|  楼主 | 2013-9-27 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己写了一个1602的程序,在Proteus上仿真没有问题,但在自己焊的板子上就出现无法初始化的问题,只能显示一行16个黑色方块。这是1602的程序,请各位高手指点一下。
/*-----------------------------------------------------------------
*名称:LCD1602.h
*日期:2013.7.29
*引脚定义:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
------------------------------------------------------------------*/

#include "1602.h"

//定义端口
sbit RS=P2^7;          //LCD数据/命令端
sbit RW=P2^6;          //LCD读/写端
sbit EN=P2^5;          //LCD使能端

#define DataPort P0    //LCD数据端口

//宏定义
#define RS_CLR RS=0    //LCD指向命令寄存器
#define RS_SET RS=1    //LCD指向数据寄存器

#define RW_CLR RW=0    //LCD读操作
#define RW_SET RW=1    //LCD写操作

#define EN_CLR EN=0    //LCD关闭
#define EN_SET EN=1    //LCD使能

uchar flag;        //LCD状态标志
uchar dis_buf[5];                        //显示缓冲区
uchar code dis[]={"0123456789."};        //显示代码

/*****************************************************
                        5ms延时
*****************************************************/
void Delay5Ms(void)
{
        uint i=5552;
        while(i--);
}

/*****************************************************
                        10us延时
*****************************************************/
void Delay10us(n)
{
        uint i;
        for(i=0;i<n;i++)
        {
                _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        }
}

/******************************************************
                        LCD1602状态检测
******************************************************/
void Lcd_Check_Busy(void)
{
        flag=0x80;
        while(flag & 0x80)
        {
                DataPort=0xff;
                RS_CLR;
                RW_SET;
                _nop_();
                EN_SET;
                _nop_();
                flag=DataPort;
                _nop_();_nop_();_nop_();
                EN_CLR;
        }
}

/*******************************************************
                        LCD1602写指令
*******************************************************/
void Write_Lcd_Command(uchar Com_Code,uchar Check_By)
{
        if (Check_By)
                Lcd_Check_Busy();
        RS_CLR;
        RW_CLR;       
        _nop_();
        DataPort=Com_Code;
        _nop_();
        EN_SET;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        EN_CLR;
}

/********************************************************
                        LCD1602写数据
********************************************************/
void Write_Lcd_Data(uchar dat)
{
       
        Lcd_Check_Busy();
        RS_SET;
        RW_CLR;
        _nop_();
        DataPort=dat;
        _nop_();
        EN_SET;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        EN_CLR;                       
}

/********************************************************
                        LCD1602初始化
********************************************************/
void Lcd_Init()
{
        Delay5Ms();        Delay5Ms();Delay5Ms();Delay5Ms();
        Write_Lcd_Command(0x38,0);       //显示模式设置(不检测忙信号)
        Delay5Ms();Delay5Ms();Delay5Ms();
        Write_Lcd_Command(0x38,0);
        Delay5Ms();Delay5Ms();Delay5Ms();
        Write_Lcd_Command(0x38,1);       //显示模式设置(检测忙信号)
        Write_Lcd_Command(0x08,1);       //显示关闭(检测忙信号)
        Write_Lcd_Command(0x01,1);       //显示清屏(检测忙信号)
        Write_Lcd_Command(0x06,1);       //输入模式设置(检测忙信号)
        Write_Lcd_Command(0x0c,1);       //显示及光标设置(检测忙信号)
}

/*********************************************************
                     LCD1602显示定位
*********************************************************/
void Lcd_Start(uchar start)
{
        Write_Lcd_Command(start|0x80,1);
}

/*********************************************************
                     LCD1602数据调整
*********************************************************/
uchar Dat_Adj(uint dat)
{
        uchar i;
        dis_buf[0]=(uchar)(dat/1000%10);
        dis_buf[1]=(uchar)((dat%1000)/100);
        dis_buf[2]=(uchar)((dat%100)/10);
        dis_buf[3]=10;
        dis_buf[4]=(uchar)(dat%10);
        for(i=0;i<2;i++)
        {
                if(dis_buf[i]!=0)
                        break;
        }
        return(i);
}

/*********************************************************
                     LCD1602显示字符
*********************************************************/
void Lcd_Disp_Char(uint dat,uchar loca)
{
        uchar temp,j;
        temp=Dat_Adj(dat);
        Lcd_Start(loca+temp);
        for(j=temp;j<5;j++)
                Write_Lcd_Data(dis[dis_buf[j]]);
}

/**********************************************************
                     LCD1602显示字符串
**********************************************************/
void Lcd_Disp_Str(uchar *str)
{
        while(*str!='\0')
        {
                Write_Lcd_Data(*str);
                str++;
        }
}

相关帖子

沙发
ayb_ice| | 2013-9-27 11:08 | 只看该作者
proteus下不是有例程吗

使用特权

评论回复
板凳
13392526687| | 2013-10-26 22:38 | 只看该作者
调一下灰度

使用特权

评论回复
地板
金融小数| | 2013-10-27 11:33 | 只看该作者
Write_Lcd_Command(0x08,1);       //显示关闭(检测忙信号)
为什么显示关闭了,后面没有打开显示开启呢?不开启,会显示东西吗?

使用特权

评论回复
5
li09| | 2013-11-4 23:57 | 只看该作者
EN是不是有问题

使用特权

评论回复
6
浅唱246| | 2013-11-6 11:42 | 只看该作者
调下电位器试试

使用特权

评论回复
7
伟布斯| | 2013-11-7 13:10 | 只看该作者
我帮你顶贴吧

使用特权

评论回复
8
qazokmty| | 2013-11-7 15:40 | 只看该作者
用51吗?
P0 不会要加个PULL HIGH电阻吧

使用特权

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

本版积分规则

5

主题

17

帖子

0

粉丝