📄 ds1302.c
字号:
#include <lcm1602.c>
#define uchar unsigned char
//---------------------------定义端口--------------------------------
sbit SCLK=P3^7; //时钟
sbit IO_DATA=P3^6; //数据
sbit RESET=P3^5; //复位
sbit ACC0=ACC^0; //定义累加器最低位
sbit ACC7=ACC^7; //定义累加器最高位
//--------------------------定义端口完毕-----------------------------
//---------------------------时序初始化-----------------------------
ds1302_init()
{
RESET=0;
SCLK=0;
RESET=1;
}
//----------------------------时序初始完毕----------------------------
ds1302_end() //写结束
{
RESET=0;
SCLK=1;
}
ds1302_write(uchar position) //写指令与数据函数
{uchar i;
ACC=position;
for(i=1;i<9;i++) //这里i不能从0开始循环,否则全刷0
{
SCLK=0; //也可以用 IO_DATA=ACC0;
IO_DATA=ACC0; // SCLK=0; 来实现,写指令时换下位置一样
SCLK=1; //时钟脉冲上升沿写入数据
ACC>>=1; //累加器值右移一位
}
}
//-------------------------------写指令-------------------------------
ds1302_write_command(uchar position,uchar ds1302_data)
{
ds1302_init();
ds1302_write(position); //先写指令,后写数据;
ds1302_write(ds1302_data);
ds1302_end();
}
//------------------------------写指令完毕----------------------------
//---------------------------------读数据-----------------------------
ds1302_read()
{uchar i;
for(i=1;i<9;i++) //这里i不能从0开始循环,否则全刷0
{
ACC>>=1; //要先把上次写的地址移走
SCLK=1;
SCLK=0;
ACC7=IO_DATA; //读数据在下降沿有效
}
return(ACC);
}
//--------------------------------读数据完毕--------------------------
//------------------------十六进制至十进制转换----------------------------
ds1302_change_16_10(uchar read_data)
{uchar ten,ge,sum; // 定义十六进制十位和个位和所合成十进制数
ten=read_data/16;
ge=read_data%16;
sum=ten*10+ge;
return(sum);
}
//-----------------------------转换完毕-----------------------------
//------------------------------读函数----------------------------
ds1302_read_command(uchar position)
{uchar readdata; //存放临时读出数据
ds1302_init();
ds1302_write(position); //先写地址
readdata=ds1302_read();
readdata=ds1302_change_16_10(readdata); //进行十六进制至十进制转换
ds1302_end();
return(readdata);
}
//------------------------------读完毕----------------------------
//-----------------------------显示函数-----------------------------
ds1302_display(uchar *display)
{
display_a_string(0,"20");
display_a_char(0x02,(display[6]/10)|0x30);//year
display_a_char(0x03,(display[6]%10)|0x30);
display_a_char(0x04,'-');
display_a_char(0x05,(display[4]/10)|0x30);//mon
display_a_char(0x06,(display[4]%10)|0x30);
display_a_char(0x07,'-');
display_a_char(0x08,(display[3]/10)|0x30);//date
display_a_char(0x09,(display[3]%10)|0x30);
display_a_char(0x0d,(display[5]/10)|0x30);//day
display_a_char(0x0e,(display[5]%10)|0x30);
display_a_char(0x10,(display[2]/10)+0x30);//hr
display_a_char(0x11,(display[2]%10)+0x30);
display_a_char(0x12,':');
display_a_char(0x13,(display[1]/10)+0x30);//min
display_a_char(0x14,(display[1]%10)+0x30);
display_a_char(0x15,':');
display_a_char(0x16,(display[0]/10)+0x30);//sec
display_a_char(0x17,(display[0]%10)+0x30);
}
//-----------------------------显示完毕-----------------------------
main()
{uchar i,position;
uchar begin[7]={0x00,0x08,0x08,0x26,0x07,0x02,0x08}; //赋初值
lcd_init(); //液晶初始化
//ds1302_write_command(0x80,0x80); //停止时钟震荡器 32.768M
//ds1302_write_command(0x84,0x0*); //24小时计时制;上午AM选择;
//*号表示和前面一位共5位数构成0-23小时初值
ds1302_write_command(0x90,0xa4); //涓流充电打开 TCS=1010;DS=01;RS=00;
ds1302_write_command(0x8e,0x00); //关闭写保护
position=0x80;
for(i=0;i<7;i++)
{ds1302_write_command(position,begin[i]);
position+=2;
}
ds1302_write_command(0x8e,0x80); //打开写保护
while(1)
{position=0x81;
for(i=0;i<7;i++)
{begin[i]=ds1302_read_command(position);
position+=2;
}
ds1302_display(begin);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -