⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302beta0.c

📁 时钟芯片DS1302的使用,用LED显示的
💻 C
字号:
#include <reg52.h>

sbit  DS_CLK=P3^5;
sbit  DS_IO=P3^6;
sbit  DS_RST=P3^7;
sbit  BIT7=ACC^7;
sbit  BIT0=ACC^0;
char  curtime[7];
unsigned  char  code num[10]={0x3F,0x06,0x5B,0x4F,0x66,
					0x6D,0x7D,0x07,0x7F,0x6F
				   };//0~9编码
unsigned char key;

//八位数据写入函数
void  InputByte(unsigned char ucData)
{
	unsigned char i;
	ACC=ucData;
	DS_RST=1;
	
	for (i=8;i>0;i--)
	{
		DS_IO=BIT0;
		DS_CLK=0;
		DS_CLK=1;
		ACC=ACC>>1;
	}
}

//八位数据读出函数
unsigned char  OutputByte(void)
{
	unsigned char i;
	DS_RST=1;
	
	for (i=8;i>0;i--)
	{
		ACC=ACC>>1;
		DS_IO=1;
		DS_CLK=1;
		DS_CLK=0;
		BIT7=DS_IO;
	}
	
	return(ACC);
}

//将指令或数据写入指定寄存器
void Write_1302(unsigned char add,unsigned char ucData)
{
	DS_RST=0;
	DS_CLK=0;
	DS_RST=1;
	InputByte(add);
	InputByte(ucData);
	DS_RST=0;
	//DS_IO=1;////???没用
}

//读出对应寄存器数据
unsigned char Read_1302(unsigned char add)
{
	unsigned char  ucData;

	DS_RST=0;
	DS_CLK=0;
	DS_RST=1;
	InputByte(add);
	ucData=OutputByte();
	DS_RST=0;
	return(ucData);
}

//设置时间初值
void SetTime(unsigned char *time)
{
	unsigned char  i;
	unsigned char  add=0x80;
	
	Write_1302(0x8E,0x00);//禁止写保护
	for (i=7;i>0;i--)
	{
		Write_1302(add,*time);
		time++;
		add+=2;
	}
	Write_1302(0x8E,0x80);//写保护
}

//获取时间值
void GetTime(void)
{
	unsigned char  i,j;
	unsigned char  add=0x81;
	unsigned char  temp;

	for (i=0;i<7;i++)
	{
		curtime[i]=Read_1302(add);
		temp=curtime[i];
		j=temp>>4;
		j*=10;
		temp=temp&0x0F;
		temp+=j;
		curtime[i]=temp;
		add+=2;
	}
}

//十进制时间转化成BCD码
void convert(unsigned char *p)
{
	unsigned char  i;
	unsigned char  temp;

	for (i=0;i<7;i++)
	{
		temp=(*p)/10;
		temp=temp<<4;
		temp+=(*p)%10;
		*p=temp;
		p++;
	}
}

/*****判断键盘是否按下*****/  
bit  JudgeKey(void) 
{
	unsigned char i;
	P2=0xF0;
	if ((P2&0xF0)!=0xF0)
	{
		for (i=100;i>0;i--);	//延时,消抖  
		if ((P2&0xF0)!=0xF0)
		{
			return 1;//确实有键按下 
		}
		else
		{
			return 0;//实际无键按下 
		} 
	}
	else
	{
		return 0;    //无键按下  
	}
}

/*判断具体按下的是哪一个键*/  
void  WhichKey(void) 
{
	unsigned char col;
	unsigned char row;
	switch(P2)
	{
		case  0x70:
			col=1;  break;
    		case  0xB0:
			col=2;  break;
		case  0xD0:
			col=3;  break;
		case  0xE0:
			col=4;  break;
		default:
			break;
	}
	P2=0x0F;
	switch(P2)
	{
		case  0x07:
			row=1;  break;
		case  0x0B:
			row=2;  break;
		case  0x0D:
			row=3;  break;
		case  0x0E:
			row=4;  break;
		default:
			break;
	}
	key=4*(col-1)+row;
}


/*LED显示时间*/ 
void Display(void)
{
	unsigned  int i;
	unsigned  char  Dspbuf[6];   //时间显示缓存数组 
	unsigned  char temp;   //临时变量,用于存编码的下标  
	char k;
	for (i=0;i<3;i++)
	{
		temp=curtime[i]%10;
		Dspbuf[2*i]=num[temp];//Dspbuf[2*i+0]
		temp=curtime[i]/10;
		Dspbuf[2*i+1]=num[temp];
	}
	for (k=0;k<=5;k++)        //动态显示 
	{
		P0=Dspbuf[k];
		for (i=300;i>0;i--);  //延时
		if  (P1&0x20)          //位选循环左移 
			P1=(P1<<1)+1; 
		else
		{
			P1=P1<<1;
			P0=Dspbuf[0];
		}
	}
}

/*键盘动作*/
void Keyscan(void)
{
	bit flag;
	unsigned char  *p;

	if(JudgeKey())
	{
		WhichKey();
		if (key==4)
		{
			Write_1302(0x80,0x80);
			flag=1;
		}
		while (flag==1)
		{
			if (JudgeKey())
			{
				do
				{
					WhichKey();
					Display();
				}
				while(JudgeKey());//等待按键释放 
					
				switch (key)
				{
					case 1:
						curtime[2]++;
						if (curtime[2]==24)
							curtime[2]=0;
						break;
					case 2:
						curtime[1]++;
						if (curtime[1]==60)
							curtime[1]=0;
						break;
					case 3:
						curtime[0]++;
						if (curtime[0]==60)
							curtime[0]=0;
						break;
					case 5:
						curtime[2]--;
						if (curtime[2]<0)
							curtime[2]=23;
						break;
					case 6:
						curtime[1]--;
						if (curtime[1]<0)
							curtime[1]=59;
						break;
					case 7:
						curtime[0]--;
						if (curtime[0]<0)
							curtime[0]=59;
						break;
					case 8:
						Write_1302(0x80,0x00);
						flag=0;
						p=&curtime[0];
						convert(p);
						p=&curtime[0];
						SetTime(p);	
				        break;
					default:
							break;
				}
			}
			Display();
		}
	}
}

void main()
{
	unsigned char  *p;
	unsigned char  settime[7]={0,0,0,0,0,0,0};

	P0=0xFF;
	P1=0xFE;
	p=&settime[0];
	convert(p);
	p=&settime[0];
	SetTime(p);	
	do{
		GetTime();
		Display();
		Keyscan();
	}while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -