用msp430配合ds12cr887(3.3v)配合做万年历,程序如下:
#include <msp430x14x.h>
#include "BoardConfig.h"
#include "subfuncs.h"
#include "dispdata.h"
uchar count,shi,fen,miao;
uchar day,date,month,year;
uchar s1num;
//数据口全部连P6
#define dscs_1 P3OUT|=BIT4//3.4
#define dscs_0 P3OUT&=~BIT4
#define dsas_1 P3OUT|=BIT5//3.5
#define dsas_0 P3OUT&=~BIT5
#define dsrw_1 P3OUT|=BIT6//3.6
#define dsrw_0 P3OUT&=~BIT6
#define dsds_1 P3OUT|=BIT7//3.7
#define dsds_0 P3OUT&=~BIT7
#define dsirq_1 P5OUT|=BIT3//5.3
#define dsirq_0 P5OUT&=~BIT3
//sbit beep=P2^3;
void init()
{
P3DIR|=0xf0;//P3.4---P3.7 设置为输出
P5DIR|=BIT3;//P5.3 设置为输出
}
void write_ds(uchar add,uchar dat)//向ds12c887 里面写数据,参量包括地址和数据
{
dsas_1;
dsds_1;
dsrw_1;
dscs_0;
P6DIR=0XFF;
P6OUT=add;
dsas_0;//add 送入芯片内部
dsrw_0;
P6DIR=0XFF;
P6OUT=dat;
dsrw_1;//数据送入芯片
dsas_1;//恢复原状
dscs_1;//恢复原状
}
uchar read_ds(uchar add)//读取数据
{
uchar ds_date;
dsas_1;
dsds_1;
dsrw_1;
dscs_0;
P6DIR=0XFF;
P6OUT=add;
dsas_0;
dsds_0;
P6DIR=0XFF;
P6OUT=0xff;
P6DIR=0X00;
ds_date=P6IN;
dsds_1;
dsas_1;
dscs_1;
return ds_date;
}
void set_time()
{
write_ds(4,3);
write_ds(2,29);
write_ds(0,50);
write_ds(6,7);
write_ds(7,15);
write_ds(8,10);
write_ds(9,11);
}
void set_alarm(uchar ashi,uchar afen,uchar amiao)
{
write_ds(1,amiao);
write_ds(3,afen);
write_ds(5,ashi);
}
void main()//主函数是反复执行的。
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
Ini_Lcd();
init();
write_ds(0x0A,0x20);// 设置日历芯片起振
Delay_Nms(5);
write_ds(0x0B,0x26);// 设置格式
set_time();
while(1)
{
miao=read_ds(0);
Delay_Nms(5);
fen=read_ds(2);
Delay_Nms(5);
shi=read_ds(4);
Delay_Nms(5);;
day=read_ds(6);
Delay_Nms(5);
date=read_ds(7);
Delay_Nms(5);
month=read_ds(8);
Delay_Nms(5);
year=read_ds(9);
Delay_Nms(5);
write_sfm(0x8c,miao);
write_sfm(0x8a,fen);
write_sfm(0x88,shi);
write_sfm(0x90,year);
write_sfm(0x92,month);
write_sfm(0x94,date);
write_sfm(0x86,day);
}
}
遇到问题如下:
1.我在12864液晶上显示年月日,时分秒,但是秒钟总是冯7变0,如此两次后,遇到7会变24,然后遇到39后,跌落到32。。。。。。但是,分钟显示正常,60秒就会加一。
2.set_time()这个函数设置芯片的起始时间,时分秒的起始时间已经在液晶上正常呈现。但是,年月日的起始时间却不对,很不解为什么。因为大家也看到了,我设置年月日,时分秒的方式其实是一样的。
先谢谢各位大牛! |