蓝桥杯单片机DS1302时钟芯片驱动代码注释

版权声明: https://blog.csdn.net/miaoxiaocheng/article/details/88429745

蓝桥杯单片机DS1302时钟芯片驱动代码之前的疑惑注释了下

/*
DS1302 芯片包含一个 实时时钟/日历和 31 字节的静态 RAM.
与时钟/RAM 通讯只需要三根线: CE,I/O (数据线),SCLK (串行时钟).

*/


#include<STC15F2K60S2.H>
#include<intrins.h>

#define uchar unsigned char 
#define uint unsigned int	
	
sbit CE=P1^3;
sbit IO=P2^3;
sbit SCLK=P1^7;

uchar code ds[]={55,59,23,10,10,1,16};

uchar shijian[7];

uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
uchar yi,er,san,si,wu ,liu,qi,ba;

void delayms(int ms);
void allinit();
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);


void writebyte(uchar dat);
void write(uchar add,uchar dat);
void dsinit();
uchar read(uchar add);
uchar readbyte();
void readtime();

void main()
{
	allinit();
	dsinit();
	yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;
	while(1)
	{
		readtime();
		yi=shijian[2]/10;er=shijian[2]%10;san=10;
		si=shijian[1]/10;wu=shijian[1]%10;liu=10;
		qi=shijian[0]/10;ba=shijian[0]%10;
		
		display1(yi,er);
		display2(san,si);
		display3(wu,liu);
		display4(qi,ba);
	}
}


void readtime()
{
	uchar i;
	uchar add=0x81;
	write(0x8e,0x00);//找到control寄存器,关闭写保护
	for(i=0;i<7;i++)
	{
		shijian[i]=read(add);
		add=add+2;
	}
	write(0x8e,0x80);	//找到control寄存器,打开写保护
}


uchar read(uchar add)//读某个地址(COMMAND BYTE)的数据
{
	uchar i,temp;
	uchar dat1,dat2;
	CE=0;//预开始
	SCLK=0;
	CE=1;
	
	writebyte(add);//命令字写入,此条语句执行后SCLK=1
	for(i=0;i<8;i++)
	{
		SCLK=0;//SCLK=1--->SCKL=0形成下降沿
		
		temp>>=1;//整体右移一位,留出一位0,下面用来|
		if(IO)
		{
			temp|=0x80;
		}
		SCLK=1;
		
		
		
	}
	
	IO=0;
	
	dat1=temp/16;//保留高四位,不好理解的话就写成按权乘开的形式
	dat2=temp%16;//留下低四位
	
	temp=dat1*10+dat2;
	
	return temp;
}


void writebyte(uchar dat)//在SCLK的上升沿写入对的IO数据
{
	uchar i;
	for(i=0;i<8;i++)
	{
		SCLK=0;
		IO=dat&0x01;
		SCLK=1;
		dat>>=1;
	}
}

void write(uchar add,uchar dat)//向某个地址(实际上这里的add是COMMAND BYTE)写dat
{
	uchar num;
	
	CE=0;//
	SCLK=0;
	CE=1;
	
	writebyte(add);
	num=(dat/10<<4)|(dat%10);// 十进制BCD码的转换
	writebyte(num);
	CE=0;
}


void dsinit()
{
	uchar i;
	uchar add=0x80;
	write(0x8e,0x00);	//找到control寄存器,关闭写保护
															
	for(i=0;i<7;i++)
	{
		write(add,ds[i]);//用ds[i]把0x80-0x8c这些寄存器初始化
		add=add+2;
	}
	write(0x8e,0x80);//找到control寄存器,打开写保护
	
}

void delayms(int ms)
{
	int i,j;
	for(i=ms;i>0;i--)
		for(j=845;j>0;j--);
}

void allinit()
{
	P2=0XA0;
	P0=0X00;//关闭蜂鸣器,继电器
	
	P2=0X80;
	P0=0XFF;//关闭LED灯
	
	P2=0XC0;
	P0=0XFF;//选择所有数码管
	P2=0XFF;
	P0=0XFF;//关闭所有数码管
}

void display1(uchar yi,uchar er)
{
		P2=0XC0;//打开位选573   U8
		P0=0X01;//选择第一个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[yi];
		delayms(1);
		
		P2=0XC0;//打开位选573   U8
		P0=0X02;//选择第二个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[er];
		delayms(1);
}	

void display2(uchar san,uchar si)
{
		P2=0XC0;//打开位选573   U8
		P0=0X04;//选择第三个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[san];
		delayms(1);
		
		P2=0XC0;//打开位选573   U8
		P0=0X08;//选择第四个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[si];
		delayms(1);
}

void display3(uchar wu,uchar liu)
{
		P2=0XC0;//打开位选573   U8
		P0=0X10;//选择第一个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[wu];
		delayms(1);
		
		P2=0XC0;//打开位选573   U8
		P0=0X20;//选择第一个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[liu];
		delayms(1);
}

void display4(uchar qi,uchar ba)
{
		P2=0XC0;//打开位选573   U8
		P0=0X40;//选择第一个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[qi];
		delayms(1);
		
		P2=0XC0;//打开位选573   U8
		P0=0X80;//选择第一个数码管
		P2=0XFF;//打开段选573   U7
		P0=tab[ba];
		delayms(1);
}



注释在代码里,不单独列出。

猜你喜欢

转载自blog.csdn.net/miaoxiaocheng/article/details/88429745