单片机/MCU论坛
直播中

武瑭

7年用户 29经验值
擅长:控制/MCU
私信 关注

DS1302万年历的程序有错误,查不出原因

`#include
#include

//定义DS1302使用的端口
***it DSIO=P3^4;
***it SCLK=P3^6;
***it CE=P3^5;
//定义LCD使用的端口
***it LCD_E=P2^7;
***it LCD_RW=P2^5;
***it LCD_RS=P2^6;
#define LCDIO P0

unsigned char code ds1302readaddr[7]={0x8B,0x81,0x83,0x85,0x87,0x89,0x8D};//读寄存器地址
unsigned char code ds1302writeaddr[7]={0x8A,0x80,0x82,0x84,0x86,0x88,0x8C};//写寄存器地址
unsigned char code time[7]={0x04,0,0,0,0x03,0x08,0x17};//星期 秒 分 时 日 月 年        //初始时间2017年8月3日00点00分00秒星期四  BCD码表示

void lcddisplay();
void ds1302write(unsigned char addr,unsigned char dat);
void ds1302read(unsigned char addr);
void ds1302init();
void ds1302readtime();
void lcd1602writecom(unsigned char com);
void lcd1602writedata(unsigned char data);
void lcdinit();
void delayms(unsigned char c);
void main()           //主程序,显示时间
{
   lcdinit();//初始化LCD
   ds1302init();//初始化ds1302
   while(1)
  {
    ds1302readtime();//读取ds1302的数据
    lcddisplay();//lcd显示ds1302的数据
  }
}

void lcddisplay()
{
  lcd1602writecom(0x80);//在第一行显示
  lcd1602writedata('0'+Time[3]/16);
  lcd1602writedata('0'+Time[3]&0x0f);
  lcd1602writedata(':');
  lcd1602writedata('0'+Time[2]/16);
  lcd1602writedata('0'+Time[3]&0x0f);
  lcd1602writedata(':');
  lcd1602writedata('0'+Time[1]/16);
  lcd1602writedata('0'+Time[1]&0x0f);

  lcd1602writecom(0xc0);
  lcd1602writedata('2');
  lcd1602writedata('0');
  lcd1602writedata('1'+Time[6]/16);
  lcd1602writedata('7'+Time[6]&0x0f);
  lcd1602writedata('-');
  lcd1602writedata('0'+Time[5]/16);
  lcd1602writedata('8'+Time[5]&0x0f);
  lcd1602writedata('-');
  lcd1602writedata('4'+Time[4]&0x07);
}


//DS1302程序段
//写入地址和数据
void ds1302write(unsigned char addr,unsigned char dat)
{
   unsigned char n;
   CE=0;
   _nop_();
   SCLK=0;
   _nop_();
   CE=1;

  for(n=0;n<8;n++)  //写入地址码
  {
   DSIO=addr&0x01;
   addr>>1;
   SCLK=1;
   _nop_();
   SCLK=0;
   _nop_();
   }  
   for(n=0;n<8;n++)  //写入数据码
  {
   DSIO=dat&0x01;
   dat>>1;
   SCLK=1;
   _nop_();
   SCLK=0;
   _nop_();
   }  
   CE=0;
  _nop_();
}

void ds1302read(unsigned char addr)//读取数据
{
  unsigned char n,dat1,dat;
  CE=0;
   _nop_();
   SCLK=0;
   _nop_();
   CE=1;

   for(n=0;n<8;n++)
   {
   DSIO=addr&0x01;
   addr>>1;
   SCLK=1;
   _nop_();
   SCLK=0;
   _nop_();   
   }
   _nop_();
   for(n=0;n<8;n++)
   {
    dat1=DSIO&0x01;
    dat1=dat1<<7;
    dat=(dat>>1)|(dat1);
    SCLK=1;
    _nop_();
    SCLK=0;
    _nop_();
   }
   CE=0;
   _nop_();
   SCLK=1;
   _nop_();
   DSIO=0;
  _nop_();
   DSIO=1;
  _nop_();
  return dat;
}

void ds1302init() //初始化DS1302
{
  unsigned char n;
  ds1302write(0x8E,0x00);     //关闭写保护
  for(n=0;n<7;n++)
{
  ds1302write(ds1302writeaddr[n],Time[n]);
}
ds1302write(0x8E,0x80);     //开启写保护
}


void ds1302readtime() //读取时钟信息
{
  unsigned char n;
  for(n=0;n<7;n++)
  {
   Time[n]=ds1302read(ds1302readaddr[n]);
   }
}

//LCD程序段
void lcd1602writecom(unsigned char com)    //lcd1602写命令程序
{
   LCD_E=0;                 //使能端为0
   LCD_RS=0;                //数据命令端为0,代表命令
   LCD_RW=0;                //读写端为0,代表写入

   LCDIO=com;               //输入端输入一个命令字节
   delayms(40);             //延迟40ns
   LCD_E=1;                 
   delayms(150);            //使能端至少延迟150ns
   LCD_E=0;                 //复位
}

void lcd1602writedata(unsigned char data)    //lcd1602写数据程序
{
   LCD_E=0;                 //使能端为0
   LCD_RS=1;                //数据命令端为1,代表数据
   LCD_RW=0;                //读写端为0,代表写入

   LCDIO=data;               //输入端输入一个命令字节
   delayms(40);             //延迟40ns
   LCD_E=1;                 
   delayms(150);            //使能端至少延迟150ns
   LCD_E=0;                 //复位
}

void lcdinit()                //初始化LCD1602
{
  lcd1602writecom(0x38);
  lcd1602writecom(0x0c);
  lcd1602writecom(0x06);
  lcd1602writecom(0x01);
  lcd1602writecom(0x80);
}

void delayms(unsigned char c)   //误差 0us
{
    unsigned char a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }
           
}


` 编译软件显示的错误

回帖(1)

alecs

2017-8-14 09:06:45
data是关键字,不能定义为变量,换个变量名;其次,移位操作>>后面少个=;再次,Time数组你都定义成code类型了后面还想修改么,把code去掉;最后,你的ds1302read函数有返回值的,定义的时候应该是unsigned char类型而不是void
举报

更多回帖

发帖
×
20
完善资料,
赚取积分