今天仿照一个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();
} |