PIC16F877A 控制DS1302 在数码管上显示时间 怎么都调不出来 高手来帮我

2020-02-09 11:24发布

这是我的源程序,一运行6位数码管全部显示0,是不是因为IO不该用RC4啊,因为我看网上好多人都用RC5作为IO,求救啊,最近要交货了,连这个小程序都弄不出来 哎呀
附:源代码
#include "pic.h"
#include"math.h"
#define IO       RC4                                             //定义DS1302的数据口
#define CLK      RC3                                               //定义DS1302的时钟口
#define RST       RC2                                             //定义DS1302的复位口

#define uchar unsigned char        //宏定义uchar为无符号字符型
#define uint unsigned int //宏定义uint为无符号整型

uchar ACC;
const uchar  table2[]={0x22,0x22,0x10,0x11,0x00,0x11,0x00};  //初值显示
uchar table1[7];        //总缓存数组
uchar set_tab[7];        //调整时间后的缓存数组
const char table[] = { 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char TABLE_BIT_SELECT[]={0x01,0x02,0x04,0x20,0x10,0x08};
//unsigned char TABLE_NUMBER[]={ZERO,ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE};
unsigned char TABLE_NUMBER[]={0x00,0x08,0x01,0x09,0x02,0x0a,0x03,0x0b,0x04,0x0c};
char sec,min,hou,day,month,week,year,weekadd,week1;//秒,分,时,日,月,星期,年,星期时间选择参数
uchar count,i; //用于计数button2的次数;用于延时计数
uchar a,b;         //用于十六进制码转换成BCD码的寄存变量
uchar *pda;         //用于设置时间的指针变量
void delay(uchar dly);   //延时函数n毫秒


/*******************************************/               
//                                   ds1302模块
/*******************************************/


/****************八位数据写入函数*********************/
void inputbyte(uchar cdata)                  
{
  uchar i;
TRISC=0;
ACC=cdata;
  for(i=8;i>0;i--)
  {               
if(ACC&0x01==1)
    IO=0x01;
else
IO=0;
CLK=1;   
CLK=0;   
//delay(50);
        ACC=ACC>>1;                          //在时钟上升沿写入一位数据
  }
//CLK=0;////
}

/***************八位数据读出函数*********************/
uchar outputbyte(void)                                 
{
   uchar i;
  // uchar cdata=0;
TRISC=0x10;
   for(i=8;i>0;i--)
   {       
      ACC =ACC >> 1;
if(PORTC&0x10==0x10)
{
ACC|=0x80;
}          
else ACC&=0x7f;
CLK = 1;
CLK = 0;
   }
   return(ACC);
TRISC=0;
}

/*************************************************************/
//名称:re_1302
//功能:读出对应寄存器的内容
//调用:inputbyte(uchar cdata)、outputbyte(void)
/***************************************************************/
uchar re_1302(uchar add)               
{
  uchar cdata;
TRISC=0;
  RST=0;
  CLK=0;
  RST=1;
  inputbyte(add);
  cdata = outputbyte();
CLK=1;
  RST=0;
delay(40);
  return(cdata);
}

/*********************************************************/
//名称:wr_1302
//功能:将指令或数据写入对应寄存器
//调用:inputbyte(uchar cdata)
/******************************************************************/
void wr_1302(uchar add,uchar cdata)          
{
TRISC=0;  
RST=0;
  CLK=0;
  RST=1;
  inputbyte(add);
  inputbyte(cdata);

  CLK=1;
  RST=0;
//delay(40);
}

/**************************************************************/
//名称:set_1302
//功能:设置时间初值
//调用:wr_1302(uchar add,uchar cdata)
/***************************************************************/
void set_1302(uchar *pda)               
{
  uchar i;
  uchar add=0x80;
  wr_1302(0x8e,0x00);         //将控制寄存器值设为零,最高位WP=0允许写
  for(i=7;i>0;i--)                 //将七个时间初值写入对应寄存器
  {
    wr_1302(add,*pda++);          //写对应时钟寄存器的值
        add+=2;
  }
  wr_1302(0x8e,0x80);        //写保护,防止干扰影响时间值??????????
}



/*******************************************************************/
//名称:get_1302                               
//功能:读取当前时间值
//调用函数:re_1302() 、 BCD_transform()
/*******************************************************************/
void get_1302()
{
  uchar i;
  uchar add=0x81;
  for(i=0;i<7;i++)
  {
    table1=re_1302(add);  //读对应时钟寄存器的值
    add+=2;
  }
                 

}


/****************************************************************************
* 名    称:display()
* 功    能:数码管显示
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void display()
{
        int i, temp, temp1;                         //定义查表变量

i = table1[0] & 0x0f;                     //求秒的个位
        PORTD = TABLE_NUMBER;                                //点亮秒的个位
        //PORTD=i;
PORTA = TABLE_BIT_SELECT[0];
        delay(10);                              //延长一段时间,保证亮度
        i = table1[0] & 0xf0;                     //求秒的十位
        i = i >> 4;                               //右移4位
        PORTD =TABLE_NUMBER;                      //送D口显示
//PORTD=i;       
PORTA = TABLE_BIT_SELECT[1];                           //点亮秒的十位
        delay(10);                              //延长一段时间,保证亮度

        i = table1[1] & 0x0f;                     //求分的个位
        PORTD =TABLE_NUMBER ;                 //送D口显示,并显示小数点
//PORTD=i;       
PORTA = TABLE_BIT_SELECT[2];                           //点亮分的个位
        delay(10);                              //延时一定时间,保证亮度
        i = table1[1] & 0xf0;                     //求分的十位
        i = i >> 4;
        PORTD = TABLE_NUMBER;                      //送D口显示
//PORTD=i;
        PORTA = TABLE_BIT_SELECT[3];                           //点亮分的十位
        delay(10);                              //延长一段时间,保证亮度

        i = table1[2] & 0x0f;                     //求时的个位
        PORTD = TABLE_NUMBER ;                 //送D口显示,并加上小数点
//PORTD=i;
        PORTA = TABLE_BIT_SELECT[4];                           //点亮时的个位
        delay(10);                              //延时一定时间,保证亮度
        i = table1[2] & 0xf0;                     //求时的十位
        i = i >> 4;
        PORTD =TABLE_NUMBER;
        //送D口显示
//PORTD=i;       
PORTA = TABLE_BIT_SELECT[5];                           //点亮时的十位
        delay(10);                              //延长一段时间,保证亮度


}
/****************************************************************************
* 名    称:ds1302_init()
* 功    能:DS1302初始化
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void ds1302_init()
{
        CLK=0;                            //拉低时钟信号
        RST=0;                            //复位DS1302
RST=1;                             //使能DS1302
//inputbyte(0x8e);                //发控制命令
//inputbyte(0);                   //允许写DS1302
RST=0;                             //复位
}
/****************************************************************************
* 名    称:port_init()
* 功    能:引脚初始化
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void port_init()
{
        ADCON1 = 0X07;                       //设置A口为普通I/O口
        //TRISB = 0X0F;                                          //设置B口低4位为输入//高四位为输出
        SSPCON=0;
TRISD = 0;                                          //portd 输出
        TRISA = 0;                                          //porta 输出
        PORTA = 0x3f;                                        //先关闭所有显示
        PORTD = 0x08;
        TRISC = 0X00;                                        //rc输出
}


/****************************************************************************
* 名    称:delay()   
* 功    能:延时
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void delay(uchar dly)                                      //延时程序
{                                         //定义整形变量
        for (;dly>0;dly--);                        //延时
}


       
/***********************************************************/
//功能:主函数
//调用:set_1302()、get_1302()、display()
/************************************************************/
void main()
{
        port_init();                     //调用引脚初始化函数
        ds1302_init();                   //调用DS1302初始化函数
        set_1302(table);                      //调用设置时间函数
        while (1)
        {        get_1302();
                         //调用取时间函数
                display();                  //调用显示函数
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
my2009
2020-02-09 14:43
按这个调试步骤你看可否帮到你
*   先不管DS1302的实际数据, 你将这个数据固定为12.34, 看显示是否正确, 再将数据改为56.78, 再看一下显示结果,确保你的显示程序是正确的。
*   读出DS1302的数据, 直接显示, 不要做任何转换, 对照手册, 检查读出的数据是否正确。
*   将数据转换为温度数据, 显示
-----------------------------------------------------------------
程序是一步步走的, 你一上来就一个完整的程序, 谁能确定是那里的问题呢, 要把功能分开, 分别调试成功后再组合

一周热门 更多>