找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 25464|回复: 24
收起左侧

为什么1602液晶屏上显示不出来?什么叫8位转4位?

  [复制链接]
ID:72462 发表于 2015-1-30 00:05 | 显示全部楼层 |阅读模式
以下是我认真对照郭天祥的视频来写的!
但就是显示不出来!!!
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit LCD1602_E=P2^7; //使能
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;//低电平时写指令,高电平时写数据
/*延时函数*/
void delay_ms(uint xms)
{
uint i,j;
for(i=xms;i>0;i++)
{
  for(j=110;j>0;j--)
  {
   ;
  }
}
}
/*指令子函数*/
void write_com(uchar com)
{
LCD1602_E=0;
LCD1602_RS=0;//低电平时写指令
LCD1602_RW=0;//选择写入
P0=com;
delay_ms(5);
LCD1602_E=1;//变高电平
delay_ms(5);
LCD1602_E=0;//接受指令完成
}
/*数据子函数*/
void write_data(uchar dat)
{
LCD1602_E=0;
LCD1602_RS=1;//高电平时写数据
LCD1602_RW=0;//选择写入
P0=dat;
delay_ms(5);
LCD1602_E=1;//变高电平
delay_ms(5);
LCD1602_E=0;//接受数据完成
}
/*初始化子函数*/
void init()
{
LCD1602_E=0;//使能信号赋低电平,转变高电平时可以接受(数据)或(指令)
write_com(0x38);//指令 初始化液晶
write_com(0x0f);//指令 光标及闪烁
write_com(0x06);//指令
write_com(0x01);//指令 清屏
write_com(0x80);//指令 数据指针初始化  
}
/*主函数*/
void main()
{
init();
write_data('1');
while(1);
}

为什么1602液晶屏上显示不出来?还有,我看了例程,例程里有一个8位总线转4位总线,表示不懂,求各路大神详细解答。一定要详细解答!!!
回复

使用道具 举报

ID:57234 发表于 2015-1-30 01:43 来自手机 | 显示全部楼层
我建议你先把光盘里面的hex文件下载进去看看能不能显示,如果不能显示的话那就是硬件有问题了。1602一共有两种接线的方式,一种是使用八个io作为数据口,另外一种是使用四个io作为数据口。至于八位转四位我觉得很有可能他就是用四位io作为数据口来显示的。我也不太懂,看看能不能帮到你
回复

使用道具 举报

ID:71843 发表于 2015-1-30 09:42 | 显示全部楼层
我用的就是郭天祥的,你试试这个,我在实验板上试过了,你的程序有明显错误,我的让你参考,你在好好检查一下自己的程序。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar num,num1,flay;
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void write_com(uchar com)
{
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void write_data(uchar date)
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;       
}
void init()
{
        dula=0;
        wela=0;
        lcden=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}
void main()
{
        init();
        while(1)
        {               
                        write_com(0x80);
                        write_data('~');
                        delay(5);
        }
}
回复

使用道具 举报

ID:72462 发表于 2015-1-30 12:40 | 显示全部楼层
dengdaimc 发表于 2015-1-30 09:42
我用的就是郭天祥的,你试试这个,我在实验板上试过了,你的程序有明显错误,我的让你参考,你在好好检查一 ...

我知道你的这个,我的硬件上是自己插线的,但就是不行
回复

使用道具 举报

ID:72462 发表于 2015-1-30 12:47 | 显示全部楼层
xiaoou 发表于 2015-1-30 01:43
我建议你先把光盘里面的hex文件下载进去看看能不能显示,如果不能显示的话那就是硬件有问题了。1602一共有 ...

光盘里的hex文件可以,但是硬件接口一般都是差不多啊,光盘里的代码
#include"lcd.h"

lcd.c
/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能                   : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //误差 0us
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }
           
}

/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能                   : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
#ifndef         LCD1602_4PINS         //当没有定义这个LCD1602_4PINS时
void LcdWriteCom(uchar com)          //写入命令
{
        LCD1602_E = 0;     //使能
        LCD1602_RS = 0;           //选择发送命令
        LCD1602_RW = 0;           //选择写入
       
        LCD1602_DATAPINS = com;     //放入命令
        Lcd1602_Delay1ms(1);                //等待数据稳定

        LCD1602_E = 1;                  //写入时序
        Lcd1602_Delay1ms(5);          //保持时间
        LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)          //写入命令
{
        LCD1602_E = 0;         //使能清零
        LCD1602_RS = 0;         //选择写入命令
        LCD1602_RW = 0;         //选择写入

        LCD1602_DATAPINS = com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

//        Lcd1602_Delay1ms(1);
        LCD1602_DATAPINS = com << 4; //发送低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能                   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/                  
#ifndef         LCD1602_4PINS                  
void LcdWriteData(uchar dat)                        //写入数据
{
        LCD1602_E = 0;        //使能清零
        LCD1602_RS = 1;        //选择输入数据
        LCD1602_RW = 0;        //选择写入

        LCD1602_DATAPINS = dat; //写入数据
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;   //写入时序
        Lcd1602_Delay1ms(5);   //保持时间
        LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)                        //写入数据
{
        LCD1602_E = 0;          //使能清零
        LCD1602_RS = 1;          //选择写入数据
        LCD1602_RW = 0;          //选择写入

        LCD1602_DATAPINS = dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

        LCD1602_DATAPINS = dat << 4; //写入低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能                 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/                  
#ifndef                LCD1602_4PINS
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x38);  //开显示
        LcdWriteCom(0x0c);  //开显示不显示光标
        LcdWriteCom(0x06);  //写一个指针加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //设置数据指针起点
}
#else
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x32);         //将8位总线转为4位总线
        LcdWriteCom(0x28);         //在四位线下的初始化
        LcdWriteCom(0x0c);  //开显示不显示光标
        LcdWriteCom(0x06);  //写一个指针加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //设置数据指针起点
}
#endif


(这个是lcd.h)
#ifndef __LCD_H_
#define __LCD_H_
/**********************************
当使用的是4位数据传输的时候定义,
使用8位取消这个定义
**********************************/
#define LCD1602_4PINS

/**********************************
包含头文件
**********************************/
#include<reg51.h>

//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c);   //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/       
void LcdWriteData(uchar dat)        ;
/*LCD1602初始化子程序*/               
void LcdInit();                                                  

#endif



接下来是主函数
/*******************************************************************************
*                 
*                                        普中科技
--------------------------------------------------------------------------------
* 实 验 名                 : LCD1602显示试验
* 实验说明       : LCD1602显示Pechin Science
* 连接方式       : 见连接图
* 注    意                 :
*******************************************************************************/
#include<reg51.h>       
#include"lcd.h"

//--定义全局变量--//
unsigned char PuZh[]=" Pechin Science ";

/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
        unsigned char i;
        LcdInit();
        for(i=0;i<16;i++)
        {
                LcdWriteData(PuZh);       
        }
        while(1)
        {
        }                               
}

求指点!!!
回复

使用道具 举报

ID:72462 发表于 2015-1-30 12:47 | 显示全部楼层
xiaoou 发表于 2015-1-30 01:43
我建议你先把光盘里面的hex文件下载进去看看能不能显示,如果不能显示的话那就是硬件有问题了。1602一共有 ...

光盘里的hex文件可以,但是硬件接口一般都是差不多啊,光盘里的代码
#include"lcd.h"

lcd.c
/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能                   : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //误差 0us
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }
           
}

/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能                   : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
#ifndef         LCD1602_4PINS         //当没有定义这个LCD1602_4PINS时
void LcdWriteCom(uchar com)          //写入命令
{
        LCD1602_E = 0;     //使能
        LCD1602_RS = 0;           //选择发送命令
        LCD1602_RW = 0;           //选择写入
       
        LCD1602_DATAPINS = com;     //放入命令
        Lcd1602_Delay1ms(1);                //等待数据稳定

        LCD1602_E = 1;                  //写入时序
        Lcd1602_Delay1ms(5);          //保持时间
        LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)          //写入命令
{
        LCD1602_E = 0;         //使能清零
        LCD1602_RS = 0;         //选择写入命令
        LCD1602_RW = 0;         //选择写入

        LCD1602_DATAPINS = com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

//        Lcd1602_Delay1ms(1);
        LCD1602_DATAPINS = com << 4; //发送低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能                   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/                  
#ifndef         LCD1602_4PINS                  
void LcdWriteData(uchar dat)                        //写入数据
{
        LCD1602_E = 0;        //使能清零
        LCD1602_RS = 1;        //选择输入数据
        LCD1602_RW = 0;        //选择写入

        LCD1602_DATAPINS = dat; //写入数据
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;   //写入时序
        Lcd1602_Delay1ms(5);   //保持时间
        LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)                        //写入数据
{
        LCD1602_E = 0;          //使能清零
        LCD1602_RS = 1;          //选择写入数据
        LCD1602_RW = 0;          //选择写入

        LCD1602_DATAPINS = dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

        LCD1602_DATAPINS = dat << 4; //写入低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能                 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/                  
#ifndef                LCD1602_4PINS
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x38);  //开显示
        LcdWriteCom(0x0c);  //开显示不显示光标
        LcdWriteCom(0x06);  //写一个指针加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //设置数据指针起点
}
#else
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x32);         //将8位总线转为4位总线
        LcdWriteCom(0x28);         //在四位线下的初始化
        LcdWriteCom(0x0c);  //开显示不显示光标
        LcdWriteCom(0x06);  //写一个指针加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //设置数据指针起点
}
#endif


(这个是lcd.h)
#ifndef __LCD_H_
#define __LCD_H_
/**********************************
当使用的是4位数据传输的时候定义,
使用8位取消这个定义
**********************************/
#define LCD1602_4PINS

/**********************************
包含头文件
**********************************/
#include<reg51.h>

//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c);   //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/       
void LcdWriteData(uchar dat)        ;
/*LCD1602初始化子程序*/               
void LcdInit();                                                  

#endif



接下来是主函数
/*******************************************************************************
*                 
*                                        普中科技
--------------------------------------------------------------------------------
* 实 验 名                 : LCD1602显示试验
* 实验说明       : LCD1602显示Pechin Science
* 连接方式       : 见连接图
* 注    意                 :
*******************************************************************************/
#include<reg51.h>       
#include"lcd.h"

//--定义全局变量--//
unsigned char PuZh[]=" Pechin Science ";

/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
        unsigned char i;
        LcdInit();
        for(i=0;i<16;i++)
        {
                LcdWriteData(PuZh);       
        }
        while(1)
        {
        }                               
}

求指点!!!
回复

使用道具 举报

ID:72751 发表于 2015-1-30 16:55 | 显示全部楼层
本帖最后由 wind02072107 于 2015-1-30 16:57 编辑

void main() { init();
  write_cmd(字符显示位置);
  write_data('1');
  while(1);  }
回复

使用道具 举报

ID:72462 发表于 2015-2-2 16:11 | 显示全部楼层
wind02072107 发表于 2015-1-30 16:55
void main() { init();
  write_cmd(字符显示位置);
  write_data('1');

好吧,谢谢了,不过还是没有解决我的问题
回复

使用道具 举报

ID:73362 发表于 2015-2-6 22:57 | 显示全部楼层
楼主,你要显示的东西你没有写吧,例如加上uchar code table[]=" 2015-01-21 Wed";
uchar code table1[]="    15:00:00";然后把初始化函数里加个变量uchar num;然后从write_com(0x38);改为
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);
        delay(20);
        write_com(0x80);
        for(num=0;num<15;num++)
        {
                write_date(table[num]);
                delay(5);
        }
       
        write_com(0xc0);
        for(num=0;num<12;num++)
        {
                write_date(table1[num]);
                delay(5);
        }
主函数的write date('1')去掉
你再试试,感觉你这么写没把要表达的数字1的位写入程序
回复

使用道具 举报

ID:72462 发表于 2015-2-12 21:01 | 显示全部楼层
Devil 发表于 2015-2-6 22:57
楼主,你要显示的东西你没有写吧,例如加上uchar code table[]=" 2015-01-21 Wed";
uchar code table1[]=" ...

你的代码试过了,不行,

但是光盘里的hex文件可以,但是硬件接口一般都是差不多啊,光盘里的代码如下,你能给我解释解释么?

#include"lcd.h"
lcd.c
/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能                   : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //误差 0us
{
     uchar a,b;
         for (; c>0; c--)
         {
                  for (b=199;b>0;b--)
                  {
                           for(a=1;a>0;a--);
                  }      
         }
            
}

/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能                   : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
#ifndef         LCD1602_4PINS         //当没有定义这个LCD1602_4PINS时
void LcdWriteCom(uchar com)          //写入命令
{
         LCD1602_E = 0;     //使能
         LCD1602_RS = 0;           //选择发送命令
         LCD1602_RW = 0;           //选择写入
         
        LCD1602_DATAPINS = com;     //放入命令
         Lcd1602_Delay1ms(1);                //等待数据稳定

        LCD1602_E = 1;                  //写入时序
         Lcd1602_Delay1ms(5);          //保持时间
         LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)          //写入命令
{
         LCD1602_E = 0;         //使能清零
         LCD1602_RS = 0;         //选择写入命令
         LCD1602_RW = 0;         //选择写入

        LCD1602_DATAPINS = com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
         Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //写入时序
         Lcd1602_Delay1ms(5);
         LCD1602_E = 0;

//        Lcd1602_Delay1ms(1);
         LCD1602_DATAPINS = com << 4; //发送低四位
         Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //写入时序
         Lcd1602_Delay1ms(5);
         LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能                   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/                  
#ifndef         LCD1602_4PINS                  
void LcdWriteData(uchar dat)                        //写入数据
{
         LCD1602_E = 0;        //使能清零
         LCD1602_RS = 1;        //选择输入数据
         LCD1602_RW = 0;        //选择写入

        LCD1602_DATAPINS = dat; //写入数据
         Lcd1602_Delay1ms(1);

        LCD1602_E = 1;   //写入时序
         Lcd1602_Delay1ms(5);   //保持时间
         LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)                        //写入数据
{
         LCD1602_E = 0;          //使能清零
         LCD1602_RS = 1;          //选择写入数据
         LCD1602_RW = 0;          //选择写入

        LCD1602_DATAPINS = dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
         Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //写入时序
         Lcd1602_Delay1ms(5);
         LCD1602_E = 0;

        LCD1602_DATAPINS = dat << 4; //写入低四位
         Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //写入时序
         Lcd1602_Delay1ms(5);
         LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能                 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/                  
#ifndef                LCD1602_4PINS
void LcdInit()                                                  //LCD初始化子程序
{
         LcdWriteCom(0x38);  //开显示
         LcdWriteCom(0x0c);  //开显示不显示光标
         LcdWriteCom(0x06);  //写一个指针加1
         LcdWriteCom(0x01);  //清屏
         LcdWriteCom(0x80);  //设置数据指针起点
}
#else
void LcdInit()                                                  //LCD初始化子程序
{
         LcdWriteCom(0x32);         //将8位总线转为4位总线
         LcdWriteCom(0x28);         //在四位线下的初始化
         LcdWriteCom(0x0c);  //开显示不显示光标
         LcdWriteCom(0x06);  //写一个指针加1
         LcdWriteCom(0x01);  //清屏
         LcdWriteCom(0x80);  //设置数据指针起点
}
#endif


(这个是lcd.h)
#ifndef __LCD_H_
#define __LCD_H_
/**********************************
当使用的是4位数据传输的时候定义,
使用8位取消这个定义
**********************************/
#define LCD1602_4PINS

/**********************************
包含头文件
**********************************/
#include<reg51.h>

//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c);   //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/        
void LcdWriteData(uchar dat)        ;
/*LCD1602初始化子程序*/               
void LcdInit();                                                  

#endif



接下来是主函数
/*******************************************************************************
*                 
*                                        普中科技
--------------------------------------------------------------------------------
* 实 验 名                 : LCD1602显示试验
* 实验说明       : LCD1602显示Pechin Science
* 连接方式       : 见连接图
* 注    意                 :
*******************************************************************************/
#include<reg51.h>        
#include"lcd.h"

//--定义全局变量--//
unsigned char PuZh[]=" Pechin Science ";

/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
         unsigned char i;
         LcdInit();
         for(i=0;i<16;i++)
         {
                 LcdWriteData(PuZh);        
        }
         while(1)
         {
         }                                
}

求指点!!!
回复

使用道具 举报

ID:73752 发表于 2015-2-19 23:54 | 显示全部楼层
你的延时函数写错了,这一句
for(i=xms;i>0;i++),把i++变成i--就行了。
回复

使用道具 举报

ID:75466 发表于 2015-6-28 11:11 | 显示全部楼层
  会不会你用的液晶不一样???????????

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:84178 发表于 2015-6-28 20:42 | 显示全部楼层
我这有现成的HEX文件,需要的话可以交流
回复

使用道具 举报

ID:86179 发表于 2015-7-19 19:29 | 显示全部楼层
楼主问题解决了吗?  我碰到跟你一样的问题,,求解决方法、、
回复

使用道具 举报

ID:72462 发表于 2015-8-12 13:25 | 显示全部楼层
花花草草 发表于 2015-7-19 19:29
楼主问题解决了吗?  我碰到跟你一样的问题,,求解决方法、、

楼主的问题没有解决,但是普中的板子是4位转8位的LCD1602,驱动程序跟别的不一样,普中的例程里有驱动程序,就用他的吧
回复

使用道具 举报

ID:92912 发表于 2015-10-19 14:08 | 显示全部楼层
普中用的那个LCD1602是4位的。如果1602是8位的,那么数据或者命令用一条指令一次就可以写入如LCD1602_DATAPINS = 0x80;如果1602是4位的,就需要分两次写入数据或者命令:先把一个数据如0x80(10000000)的高四位(1000)通过D4-D7写入,就是程序里的这句:LCD1602_DATAPINS = dat;        但只是将0x80的前半部分数据(1000)写入了LCD,后半部分(0000)还没写,由于数据只能通过LCD的D4-D7的高四位写入,所以需要将数据左移四位,将低四位的数据移动到高四位上(高四位由原来的1000变成0000),就是程序里的这句:LCD1602_DATAPINS = dat << 4。然后再写入。
回复

使用道具 举报

ID:72462 发表于 2015-10-22 14:32 | 显示全部楼层
小冬0606 发表于 2015-10-19 14:08
普中用的那个LCD1602是4位的。如果1602是8位的,那么数据或者命令用一条指令一次就可以写入如LCD1602_DATAP ...

谢谢啦!
回复

使用道具 举报

ID:159270 发表于 2017-1-11 02:03 | 显示全部楼层
结果怎样?
回复

使用道具 举报

ID:374263 发表于 2018-7-18 17:05 | 显示全部楼层
我也遇到了这个问题,最后发现我的LCD板子是四位的,而不是八位的,所以只能用四位总线去配置,建议你检查下你的LCD是八位的还是四位的
回复

使用道具 举报

ID:57570 发表于 2019-2-10 01:30 来自手机 | 显示全部楼层
一个是串口一个是并口
回复

使用道具 举报

ID:619259 发表于 2020-3-11 22:21 | 显示全部楼层
先玩八位,如果端口够用,就用八位吧。理解了再玩四位
回复

使用道具 举报

ID:86450 发表于 2020-3-13 08:26 | 显示全部楼层
结果怎样?
回复

使用道具 举报

ID:739727 发表于 2020-5-6 11:55 | 显示全部楼层
14楼说的对,目测是延时那里死循环了,下次你可以debug,这样找出问题比较快
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表