打印

新手写ds1302数码管时钟显示乱码?求大侠们解答

[复制链接]
2586|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a06040051|  楼主 | 2011-4-21 17:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天仿照一个ds1302数码管时钟显示的程序,发现数码管乱码显示也不走动,然后对着原程序一一对应,结果发现是写字节函数和读字节函数里的for语句不同,但是很疑惑,都是循环8次,换个写法就出错,程序下图(原程序),我写的时候把其中for循环改成的for(i=0;i<8;i++)后就出错了
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit T_CLK = P1^6; /*实时时钟时钟线引脚 */
sbit T_IO = P3^5; /*实时时钟数据线引脚 */
sbit RST = P1^7; /*实时时钟复位线引脚 */
void Delay_1ms(uchar i)
{
uchar x,y;
for(x=i;x>0;x--)
for(y=148;y>0;y--);
}
/********************************************************************
* 名称 :  v_RTInputByte()
* 功能 :  往DS1302写入1Byte数据
* 输入 :  ucDa 写入的数据
* 输出 :  无
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
uchar i;
RST=1;
ACC=ucDa;
for(i=8;i>0;i--)
{
  T_IO=ACC0;
  T_CLK=1;
  T_CLK=0;
  ACC=ACC>>1;
}  

}
/********************************************************************
* 名称  :   uc_RTOutputByte()
* 功能  :   从DS1302读取1Byte数据
* 输入  : 无
* 返回值:   ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
uchar i;
RST=1;
for(i=0;i<8;i++)
{
  ACC=ACC>>1;
  T_IO=1;
  ACC7=T_IO;
  T_CLK=1;
  T_CLK=0;
}
return(ACC);
}
/********************************************************************
* 名称   :   v_W1302(uchar ucAddr, uchar ucDa)
* 功能   :   往DS1302写入数据
* 输入   :   ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值 :   无
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
RST=0;
T_CLK=0;
RST=1;
v_RTInputByte(ucAddr);
v_RTInputByte(ucDa);
T_CLK=1;
RST=0;

}
/********************************************************************
* 名称   :  uc_R1302(uchar ucAddr)
* 功能   :  读取DS1302某地址的数据
* 输入   :  ucAddr: DS1302地址
* 返回值 :  ucDa :读取的数据
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
RST=0;
T_CLK=0;
RST=1;
v_RTInputByte(ucAddr);
ucDa=uc_RTOutputByte();
T_CLK=1;
RST=0;
return(ucDa);
}
void Write_DS1302Init(void)
{
v_W1302(0x8e,0);
v_W1302(0x80,0x50); //写入秒
v_W1302(0x8e,0);
v_W1302(0x82,0x59); //写入分
v_W1302(0x8e,0);
v_W1302(0x84,0x07); //写入小时
v_W1302(0x8e,0);
v_W1302(0x86,0x08); //写入日
v_W1302(0x8e,0);
v_W1302(0x88,0x08); //写入月
v_W1302(0x8e,0);
v_W1302(0x8a,0x05); //写入星期
v_W1302(0x8e,0);
v_W1302(0x8c,0x08); //写入年
}
/********************************************************************
* 名称 : Run_DS1302(void)
* 功能 : 读出DS1302中的数据,并在液晶1602上进行显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Run_DS1302(void)
{
uchar sec, min, hour, day, month, year;
while(1)
{
  v_W1302(0x8f, 0);
  sec = uc_R1302(0x81);    //读出DS1302中的秒
  v_W1302(0x8f, 0);
  min =uc_R1302(0x83);    //读出DS1302中的分
  v_W1302(0x8f, 0);
  hour = uc_R1302(0x85);   //读出DS1302中的小时
  v_W1302(0x8f, 0);
  day = uc_R1302(0x87);    //读出DS1302中的日
  v_W1302(0x8f, 0);
  month = uc_R1302(0x89);  //读出DS1302中的月
  v_W1302(0x8f, 0);
  year =uc_R1302(0x8d);   //读出DS1302中的年
  P0 = table[hour>>4];
  P2 = 0;
  Delay_1ms(2);
  P0 = table[hour &0x0f];
  P2 = 1;
  Delay_1ms(2);
  P0 = 0x80;
  P2 = 2;
  Delay_1ms(2);
  P0 = table[min>>4];
  P2 = 3;
  Delay_1ms(2);
  P0 = table[min&0x0f];
  P2 = 4;
  Delay_1ms(2);
  P0 = 0x80;
  P2 = 5;
  Delay_1ms(2);
  P0 = table[sec >>4];
  P2 = 6;
  Delay_1ms(2);
  P0 = table[sec&0x0f];
  P2 = 7;
  Delay_1ms(2);
}
}
void main(void)
{
Write_DS1302Init();
Run_DS1302();
}

相关帖子

沙发
songsong070| | 2011-4-21 17:36 | 只看该作者
是共阴还是共阳的 正负极  都看一下 可能是这的问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

14

帖子

0

粉丝