找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

求助DS1302+液晶时间显示如何设置时间?

[复制链接]
admin 发表于 2012-9-2 13:43:35 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
最近写了一个DS1302+液晶时间显示的程序我希望加入按键设置时间。按下key1键时,时间停止走,按下key2时,key1_num=1时设置年。。。。。。。key1_num=7时设置周。可是我设置好时间后它不是接着我设置的时间走,而是接着我设置前的时间在走,后来发现是没有写让时钟停止指令,可我加入ds1302_write_byte(0x80,0x80)后还是不行,不知道是什么原因,本人是初学者,希望有高人指点我写的程序如下:
1302部分:
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define second 0x80 //秒数据地址
#define minute 0x82 //分数据地址
#define hour 0x84 //时数据地址
#define date 0x86 //日数据地址
#define month 0x88 //月数据地址
#define week 0x8a //星期数据地址
#define year 0x8c //年数据地址
#define wp 0x8e //控制数据地址
#define charger 0x90 //慢充电寄存器地址
#define clkburst 0xbe // 时钟突发寄存器地址
sbit SCK = P3^6 ;
sbit IO = P3^4 ;
sbit RST = P3^5 ;
uchar time_buf1[8]={20,10,9,27,23,59,50,1};
uchar time_buf[8];
void ds1302_write_byte(uchar addr,uchar Da)//向DS1302某地址写入1B的数据
{
uchar i;
RST=1; /*启动DS1302总线*/
/*写入目标地址:addr*/
addr&= 0xFE;/*最低位置零*/
for (i = 0; i < 8; i ++)
{
if (addr & 0x01)
{
IO=1;
}
else
{
IO=0;
}
SCK=1;
SCK=0;
addr = addr >> 1;
}
/*写入数据:Da*/
for (i = 0; i < 8; i ++)
{
if (Da & 0x01)
{
IO=1;
}
else
{
IO=0;
}
SCK=1;
SCK=0;
Da = Da >> 1;
}
RST=0; /*停止DS1302总线*/
}
uchar ds1302_read_byte (uchar addr) //从1302某地址读取1B的数据
{
uchar i,temp;
RST=1;
/*写入目标地址:addr*/
addr|=0x01;
for(i=0;i<8;i++)
{
if(addr&0x01)
{IO=1;}
else
{IO=0;}
SCK=1;
SCK=0;
addr=addr>>1;
}
/*输出数据:temp*/
for(i=0;i<8;i++)
{
temp>>=1;
if(IO)
{temp|=0x80;}
else
{temp&=0x7f;}
SCK=1;
SCK=0;
}
RST=0;
return temp;
}
/*向DS1302写入时钟数据*/
void write_time(void)
{
uchar i,tmp;
for(i=0;i<8;i++) // BCD码处理
{
tmp=time_buf1/10;
time_buf=time_buf1%10;
time_buf=time_buf+tmp*16;
}
ds1302_write_byte(wp,0x00);//关闭写保护
// ds1302_write_byte(second,0x80);//振荡器停止
ds1302_write_byte(charger,0xa9);//涓流充电
ds1302_write_byte(year,time_buf[1]);
ds1302_write_byte(month,time_buf[2]);
ds1302_write_byte(date,time_buf[3]);
ds1302_write_byte(hour,time_buf[4]);
ds1302_write_byte(minute,time_buf[5]);
ds1302_write_byte(second,time_buf[6]);
ds1302_write_byte(week,time_buf[7]);
ds1302_write_byte(wp,0x80);
}
/*从DS302读出时钟数据*/
void read_time(void)
{
uchar i,tmp;
time_buf[1]=ds1302_read_byte(year);
time_buf[2]=ds1302_read_byte(month);
time_buf[3]=ds1302_read_byte(date);
time_buf[4]=ds1302_read_byte(hour);
time_buf[5]=ds1302_read_byte(minute);
time_buf[6]=ds1302_read_byte(second);
time_buf[7]=ds1302_read_byte(week);
for(i=0;i<8;i++)
{
tmp=time_buf/16;
time_buf1= time_buf%16;
time_buf1= time_buf1+tmp*10;
}
}
/*DS302初始化函数*/
void ds1302_init(void)
{
RST=0; /*RST脚置低*/
SCK=0; /*SCK脚置低*/
}


1602部分:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^4; //定义端口
sbit RW = P2^5;
sbit EN = P2^6;
uchar TempData[8];
uchar Line1[]=" ";
uchar Line2[]=" ";


/******************************************************************/
/* 微秒延时函数 */
/******************************************************************/
void delay_us(uint n) //延时 如果需要高精度延时 请嵌入汇编
{
if (n == 0)
{
return ;
}
while (--n);
}
/******************************************************************/
/* 毫秒函数声明 */
/******************************************************************/
void delay_ms(uchar i)
{
uchar a, b;
for (a = 1; a < i; a++)
{
for (b = 1; b; b++)
{ ; }
}
}
/******************************************************************/
/* 写入命令函数 */
/******************************************************************/
void LCD_write_com(uchar com)
{
RS=0;
RW=0;
EN=1;
delay_ms(5);
P0=com;
EN=0;
delay_ms(5);
}
/******************************************************************/
/* 写入数据函数 */
/******************************************************************/
void LCD_write_Data(uchar Data)
{
RS=1;
RW=0;
EN=1;
delay_ms(5);
P0=Data;
EN=0;
delay_ms(5);
}
/******************************************************************/
/* 清屏函数 */
/******************************************************************/
void LCD_clear(void)
{
LCD_write_com(0x01);
delay_ms(5);
}
/******************************************************************/
/* 写入字符串函数 */
/******************************************************************/
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_write_com(0x80 + x);
}
else
{
LCD_write_com(0xC0 + x);
}
while (*s)
{
LCD_write_Data( *s);
s ++;
}
}
/******************************************************************/
/* 写入字节函数 */
/******************************************************************/
void LCD_write_char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD_write_com(0x80 + x);
}
else
{
LCD_write_com(0xC0 + x);
}
LCD_write_Data( Data);
}
/******************************************************************/
/* 初始化函数 */
/******************************************************************/
void LCD_init(void)
{
LCD_write_com(0x38); /*显示模式设置*/
delay_ms(5);
LCD_write_com(0x38);
delay_ms(5);
LCD_write_com(0x38);
delay_ms(5);
LCD_write_com(0x38);
LCD_write_com(0x08); /*显示关闭*/
LCD_write_com(0x01); /*显示清屏*/
LCD_write_com(0x06); /*显示光标移动设置*/
// LCD_write_com(0x14);
delay_ms(5);
LCD_write_com(0x0C); /*显示开及光标设置*/
// LCD_write_com(0x0f);
}

void display()
{ //年-月-日 week
Line1[0]='0'+TempData[0]/10;
Line1[1]='0'+TempData[0]%10;
Line1[2]='0'+TempData[1]/10;
Line1[3]='0'+TempData[1]%10;
Line1[4]='-';
Line1[5]='0'+TempData[2]/10;
Line1[6]='0'+TempData[2]%10;
Line1[7]='-';
Line1[8]='0'+TempData[3]/10;
Line1[9]='0'+TempData[3]%10;
Line1[12]='0'+TempData[7]%10;
//时:分:秒
Line2[0]='0'+TempData[4]/10;
Line2[1]='0'+TempData[4]%10;
Line2[2]=':';
Line2[3]='0'+TempData[5]/10;
Line2[4]='0'+TempData[5]%10;
Line2[5]=':';
Line2[6]='0'+TempData[6]/10;
Line2[7]='0'+TempData[6]%10;
LCD_write_str(3,0,Line1);
LCD_write_str(4,1,Line2);
}



主函数:
#include<reg52.h>
#include"1302.h"
#include"1602.h"
sbit key1 =P3^0;
sbit key2 =P3^1;
sbit key3 =P3^2;
sbit key4 =P3^4;
bit key1_flag=0;
uchar key1_num=0;
void key_scan()
{ uchar i;
if(key1==0)
{
delay_ms(5);
if(key1==0)
{
key1_flag=1;
key1_num++;
if(key1_num==8)
{
key1_flag=0;
key1_num=0;
}
}
}
if(key2==0)
{
delay_ms(5);
if(key2==0)
{
switch (key1_num)
{
case 1:TempData[1]++;break;
case 2:TempData[2]++;break;
case 3:TempData[3]++;break;
case 4:TempData[4]++;break;
case 5:TempData[5]++;break;
case 6:TempData[6]++;break;
case 7:TempData[7]++;break;
default:break;
}
}
}
}
void main()
{
uchar i;
ds1302_init();
LCD_init();
write_time();
delay_ms(10);
while(1)
{
key_scan();
read_time();
for(i=0;i<8;i++)
{
TempData=time_buf1;
if(key1_flag==1)
{
ds1302_write_byte(second,0x80);
}
}
display();
}
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 19:34 , Processed in 0.059222 second(s), 11 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表