找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4853|回复: 13
打印 上一主题 下一主题
收起左侧

1602LCD屏没显示,各位大侠帮小白看一下

[复制链接]
跳转到指定楼层
楼主
ID:156156 发表于 2017-3-20 14:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1602LCD屏没显示,各位大侠帮小白看一下,它的功能是在液晶屏上显示ds1990a的序列号,麻烦各位了。下面是代码:
#include<reg52.h>
#include"lcd.h"

#define uint  unsigned int
#define uchar unsigned char

sbit DQ=P1^0;
uchar DS1990A_ID[8]={0}; //64位序列号

/*-----------函数声明----------*/
void Init_DS1990();
uchar Readbyte();
void Writebyte(uchar dat);
void Read1990();
void Delay(uint i);
void display_id(uchar *discode);
/*------主函数---------------*/
void main()
{
  LcdInit();
  DisplayListChar(0,0,"Lcd_Init...");
  Lcd1602_Delay1ms(500);
  Lcd1602_Delay1ms(500);
  ClearScreen();
  DisplayListChar(0,0,"DS1990A_ID:");
while(1)
  {
    Read1990();//读卡
    display_id(&DS1990A_ID);//显示序列号
  }
}

/*-------DS1990A初始化-----------*/
void Init_DS1990()
{
  uchar i;
  DQ=0;                  //置低
  Delay(60);   //延时480us
  DQ=1;       //释放
  Delay(10);   //延时85us
  for(i=0;i<10;i++)         //延时检测应答脉冲
   {
           if(DQ==0)
          {
           break;//有卡
          }
   }
   Delay(20); //160us
}
/*--------从DS1990A读一个字节的函数----*/
uchar Readbyte()
{
uchar i=0;
uchar temp=0;
for(i=0;i<8;i++)
  {
          DQ=0;
        temp>>=1;
        DQ=1;
        if(DQ)temp|=0x80;
        Delay(8);//65us
  }
  return temp;
}
/*--------向DS1990A写一个字节函数-------*/
void Writebyte(uchar dat)
{
uchar i=0,send;
for(i=0;i<8;i++)
{
   DQ=0;
   send=dat&0x01;//从最低位发送
   if(send==0x01)
    {
         DQ=1;
         Delay(15);        //120us
        }
        else
         {
          Delay(15);//120us
          DQ=1;
         }
        dat>>=1;//65us
}
Delay(8);
}
/*----------读取身份信息-------*/
void Read1990()
{
uchar i;
Init_DS1990();
   while(DQ==0);//等待拉高
   Writebyte(0x33);//Read ROM [33h]
   for(i=0;i<8;i++)
     DS1990A_ID[i]=Readbyte(); //写入32位序列号
}

/*---------延时--------------
延时时间=8*i*T(约等于,实际值比此值大,延时时间越长,误差越大,最大误差262*T)
*/
void Delay(uint i)
{
while(i--);//12T
}

/*-------显示32位数组-------*/
void display_id(uchar *discode)
{
  uchar i,temp;
  LcdWriteCom(0x80+0x40);
for(i=0;i<8;i++)//第二行显示
{
  temp=((*discode)>>4)&0x0f; //显示高四位
  if(temp>=0&&temp<=9){LcdWriteData(0x30+temp);}
  else LcdWriteData(0x37+temp);
  temp=(*discode)&0x0f;
  if(temp>=0&&temp<=9){LcdWriteData(0x30+temp);}
  else LcdWriteData(0x37+temp);
  discode++;
}
}


图片2.png (31.14 KB, 下载次数: 63)

图片2.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82765 发表于 2017-3-20 15:18 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:156156 发表于 2017-3-20 15:34 | 只看该作者
cjjcjj1 发表于 2017-3-20 15:18
你在程序确实LCD的内容

什么意思啊大神?没懂哎
回复

使用道具 举报

地板
ID:156156 发表于 2017-3-20 15:36 | 只看该作者
cjjcjj1 发表于 2017-3-20 15:18
你在程序确实LCD的内容

这边我贴上了LCD.c的文件,代码如下:
#include"lcd.h"

/*******************************************************************************
* 函 数 名         : 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
* 输    出         : 无
*******************************************************************************/
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;
}

/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能                   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/                  
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;
}
/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能                 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/                  
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x38);  //开显示
        LcdWriteCom(0x0c);  //开显示不显示光标
        LcdWriteCom(0x06);  //写一个指针加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //设置数据指针起点

}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char Y, unsigned char X, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码
LcdWriteCom(X); //这里不检测忙信号,发送地址码
LcdWriteData(DData);
}
//按指定位置显示一串字符
void DisplayListChar(unsigned char Y, unsigned char X, char *DData)
{
unsigned char ListLength;
  ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (*DData!='\0') //若到达字串尾则退出
  {
   if (X <= 0xF) //X坐标应小于0xF
    {
     DisplayOneChar(Y, X, *DData); //显示单个字符
     DData++;
     X++;
    }
  }
}

//清屏
void ClearScreen(void)
{
  unsigned char ii,jj;
  for(ii=0;ii<2;ii++)
  {
    for(jj=0;jj<16;jj++)
    {
      DisplayOneChar(ii,jj,' ');
    }
  }
}


回复

使用道具 举报

5#
ID:111634 发表于 2017-3-20 17:50 | 只看该作者
本帖最后由 zl2168 于 2017-3-20 17:51 编辑

实例67  LCD1602显示屏显示


Proteus仿真一下,确认有效。
实例61 LCD1602显示屏显示.rar (49.26 KB, 下载次数: 8)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1
书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

6#
ID:156156 发表于 2017-3-20 18:00 | 只看该作者
zl2168 发表于 2017-3-20 17:50
实例67  LCD1602显示屏显示

版主,压缩包里面没有程序呀
回复

使用道具 举报

7#
ID:151348 发表于 2017-3-20 21:06 | 只看该作者
没看见你程序里有LCD1602的管脚声明啊
回复

使用道具 举报

8#
ID:108715 发表于 2017-3-20 21:22 | 只看该作者
你看看有没有LCD.h文件,c文件没有LCD1602_RW、LCD1602_RS、LCD1602_E和数据口的定义,应该在.h文件里,在看看你的实物硬件接口是不是和定义的管脚接口一致。
回复

使用道具 举报

9#
ID:156156 发表于 2017-3-20 21:45 | 只看该作者
imxuheng 发表于 2017-3-20 21:06
没看见你程序里有LCD1602的管脚声明啊

谢谢大侠找到了
回复

使用道具 举报

10#
ID:111634 发表于 2017-3-21 12:11 | 只看该作者
gy2264458415 发表于 2017-3-20 18:00
版主,压缩包里面没有程序呀

仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。
回复

使用道具 举报

11#
ID:951 发表于 2017-3-21 16:37 | 只看该作者
可能你的电源正负极接反了!
回复

使用道具 举报

12#
ID:167786 发表于 2017-3-21 16:39 | 只看该作者
没定义吧
回复

使用道具 举报

13#
ID:142988 发表于 2017-3-22 18:59 | 只看该作者
这个是一个1602的显示的例子,按照里面的引脚连就可以用了。也可以单纯地参考一下显示部分就行。

1602显示示例.zip

41.91 KB, 下载次数: 14

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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