找回密码
 立即注册

QQ登录

只需一步,快速开始

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

pcf8563编程之后51单片机的lcd亮了但是什么都不显示

[复制链接]
跳转到指定楼层
楼主
ID:116786 发表于 2016-4-26 13:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit SDA=P2^2;   //SDA口设置
sbit SCL=P2^3;   //SCL口设置


void delay()    //略微延时  6us约>4.7us
{
_nop_();
  _nop_();
   _nop_();
    _nop_();
         _nop_();
          _nop_();
}

void iic_start()   //启动信号
{
  SDA=1;
  SCL=1;
  delay();
  SDA=0;
  delay();
  SCL=0;

}

void iic_stop()  //停止信号
{
SDA=0;
SCL=1;
delay();
SDA=1;
delay();
SCL=0;
}

void iic_ack()   //应答信号
{
uchar i=0;
SCL=1;
delay();
while((SDA==1)&&(i<255))
i++;
SCL=0;
delay();
}

void iic_send_byte(uchar bat)  //发送数据
{
uchar i,temp;
temp=bat;
for(i=0;i<=7;i++)
{
  temp=temp<<1;
  SCL=0;
  SDA=CY;
  delay();
  SCL=1;
  delay();
}
SCL=0;
delay();
SDA=1;
delay();
}

uchar iic_rev()  //接受数据
{
  uchar temp,i;
  SCL=0;
  delay();
  SDA=1;
  for(i=0;i<=7;i++)
  {
   SCL=1;
   delay();
   temp=(temp<<1)|SDA;
   SCL=0;
   delay();
  }
  delay();
  return temp;
}

void iic_send_add_byte(uchar add,uchar bat) //向某个地址发送某数据
{
iic_start();
iic_send_byte(0xa2);
iic_ack();
iic_send_byte(add);
iic_ack();
iic_send_byte(bat);
iic_ack();
iic_stop();
}

uchar iic_rec_add_byte(uchar add) //从某个地址读出数据
{
   uchar temp;
   iic_start();
   iic_send_byte(0xa2);
   iic_ack();
   iic_send_byte(add);
   iic_ack();
   iic_start();
   iic_send_byte(0xa3);
   iic_ack();
   temp=iic_rev();
   iic_stop();
   return temp;
}

#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;


void Delay1us(uint a)
{        
uint b,c;
for(c=a;c>0;c--)               
for(b=110;b>0;b--);
}

void LCD1602_WriteCom(uchar com)          //写入命令
{
        LCD1602_E=0;
        LCD1602_RS=0;
        LCD1602_RW=0;
        LCD1602_DATAPINS=com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
        Delay1us(10);
        LCD1602_E=1;
        Delay1us(10);
        LCD1602_E=0;
        Delay1us(10);
        LCD1602_DATAPINS=com<<4;
        Delay1us(10);
        LCD1602_E=1;
        Delay1us(10);
        LCD1602_E=0;
}

void LCD1602_WriteData(uchar dat)                        //写入数据
{
        LCD1602_E=0;
        LCD1602_RS=1;
        LCD1602_RW=0;
        LCD1602_DATAPINS=dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
        Delay1us(10);
        LCD1602_E=1;
        Delay1us(10);
        LCD1602_E=0;
        LCD1602_DATAPINS=dat<<4;
        Delay1us(10);
        LCD1602_E=1;
        Delay1us(10);
        LCD1602_E=0;
}

void LCD1602_Init()                                                  //LCD初始化子程序
{
        LCD1602_WriteCom(0x32);         //将8位总线转为4位总线
        LCD1602_WriteCom(0x28);         //在四位线下的初始化
        LCD1602_WriteCom(0x0c);  //开显示不显示光标
        LCD1602_WriteCom(0x06);  //写一个指针加1
        LCD1602_WriteCom(0x01);  //清屏
        LCD1602_WriteCom(0x80);  //设置数据指针起点
}

//----- 主函数---------#ifndef __IIC_H__

#include <reg52.h>         
#include <lcd.h>
#include "iic.h"

//-----------延时用于稳定-------------
void delay_kk(uint k)
{
  while(k--);
}
void time_init()
{
   iic_send_add_byte(0x02,0x50);         //0秒
        iic_send_add_byte(0x03,0x59);         //0分钟   
    iic_send_add_byte(0x04,0x23);          //0小时            
         iic_send_add_byte(0x05,0x26);  //26号
         iic_send_add_byte(0x07,0x05);           //5月  20世纪的
         iic_send_add_byte(0x08,0x14);         //2014年
}
void pcf_init()
{
        iic_send_add_byte(0x00,0x00);  //启动时钟
}

//----------------BCD转10进制-----------
uchar bcd_dec(uchar bat)
{
uchar temp1,temp2,tol;
temp1=bat&0x0f;
temp2=(bat&0xf0)>>4;
tol=temp2*10+temp1;
return tol;
}

//------------LCD1602显示:年,月,日,小时,分钟,秒,
void display_time(uchar sec,min,hour,dat,moom,year)
{
  LCD1602_WriteCom(0x80);
  LCD1602_WriteData('_');
LCD1602_WriteData('2');
LCD1602_WriteData('0');
LCD1602_WriteData(year/10+48);
LCD1602_WriteData(year%10+48);
LCD1602_WriteData('/');
LCD1602_WriteData(moom+48);
LCD1602_WriteData('/');
LCD1602_WriteData(dat/10+48);
LCD1602_WriteData(dat%10+48);
  LCD1602_WriteCom(0xc4);
   LCD1602_WriteData(hour/10+48);
    LCD1602_WriteData(hour%10+48);
LCD1602_WriteData(':');
LCD1602_WriteData(min/10+48);
LCD1602_WriteData(min%10+48);
LCD1602_WriteData(':');
LCD1602_WriteData(sec/10+48);
LCD1602_WriteData(sec%10+48);
}

void main()
{
   uchar sec,min,hour,dat,moom,year,sec1,min1,hour1,dat1,moom1,year1;  //PCF8563读出的变量和代转换成的十进制变量
   LCD1602_Init();
   iic_send_add_byte(0x00,0x20);  // 关闭时钟
  delay_kk(1000);
         time_init();    //时钟芯片初始时间设置
         pcf_init();
    delay_kk(1000);
  while(1)
  {
            sec=0x7f&iic_rec_add_byte(0x02);    //读取秒
         min=0x7f&iic_rec_add_byte(0x03);   //读取分钟
         hour=0x3f&iic_rec_add_byte(0x04);  //读取小时
         dat=0x3f&iic_rec_add_byte(0x05);   //读取天数
         moom=0x1f&iic_rec_add_byte(0x07);  //读取月
         year=0xff&iic_rec_add_byte(0x08);    //读取年
         sec1=bcd_dec(sec);                   //将读取的BCD码秒转换成十进制秒以便运算
         min1=bcd_dec(min);
         hour1=bcd_dec(hour);
         dat1=bcd_dec(dat);
         moom1=bcd_dec(moom);
         year1=bcd_dec(year);
         display_time(sec1,min1,hour1,dat1,moom1,year1);   //LCD1602显示时间
  }                                          
}
编译之后显示2.c(178): warning C318: can't open file 'lcd.h'2.c(179): warning C318: can't open file 'iic.h'
该怎么解决

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

使用道具 举报

沙发
ID:459949 发表于 2019-6-26 10:51 | 只看该作者
添加头文件就好了,自己写一个加上
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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