📄 ds1302beta0.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 + -