#include
#include
#include
sbit p10=P1^0;
bit flag=0; //调整控制标记
bit flagh=1; //时间日期切换标记
uchar temp[7]; //调整前的时间
uchar curtime1[8],curtime2[8]; //调整后的时间显示模式
uchar tab1[]={30,40,11,31,8,2,14}; //DS1302初始化时间
uchar xingqi; //读取的星期
uchar code tab2[]={0xff,0xf9,0xA4,0xb0,0x99,0x92,0x82,0xf8}; //显示星期的共阴极LED
uchar tab4[11]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x01}; //显示时间与日期LED数码管显示代码
void delay2(void)
{
int i,j;
for(i=0; i<=10; i++);
for(j=0; j<=2; j++);
}
void main(void)
{
uchar i,temp0[8];
P3=0xff;
Init_7219(); //初始化MAX7219
set_rtc(tab1); //初始化DS1302
// init_DS1302();
temp0[2]=10; //固定位置显示“-”符号
temp0[5]=10;
while(1)
{
get_1302(); //读取时间保存在temp中
if(p10==0) //判断按键释放按下
delay2();
if( p10==0 )
{
flagh=0;
}
if((flagh==1)) //时间与日期显示切换标记
{
temp0[0]=temp[0]/16;
temp0[1]=temp[0]%16;
temp0[3]=temp[1]/16;
temp0[4]=temp[1]%16;
temp0[6]=temp[2]/16;
temp0[7]=temp[2]%16;
}
else
{ flagh=1; //正常显示时间,按下p10口键,显示日期
temp0[0]=temp[3]/16;
temp0[1]=temp[3]%16;
temp0[3]=temp[4]/16;
temp0[4]=temp[4]%16;
temp0[6]=temp[6]/16;
temp0[7]=temp[6]%16;
}
for(i=0;i<8;i++)
{
Write_7219(i+1,tab4[temp0[i]]);
}
}
}
#include
#include
/*-------------------------------------------------
此函数是向MAX7219写数据(操作字或者显示数据)
address是内部寄存器的地址;
dat是操作字或者显示的数据
-------------------------------------------------*/
void Write_7219(uchar address,uchar dat)
{ uchar i;
ACC=address;
LOAD=0; //拉低片选线,选中器件
//发送地址
for (i=0;i<8;i++) //移位循环8次
{
CLK=0; //清零时钟总线
DIN=A7; //每次取最高位 送max7219
CLK=1; //时钟上升沿,发送地址
address<<=1; //左移一位
}
//发送数据
ACC=dat;
for (i=0;i<8;i++)
{
CLK=0;
DIN=A7;
CLK=1; //时钟上升沿,发送数据
dat<<=1;
}
LOAD=1; //发送结束,上升沿锁存数据
}
/*-------------------------------------------------
这个是MAX7219的初始化程序
DECODE_MODE 0x09 //译码控制寄存器
INTENSITY 0x0A //亮度控制寄存器
SCAN_LIMIT 0x0B //扫描界限寄存器
SHUT_DOWN 0x0C //关断模式寄存器
DISPLAY_TEST 0x0F //测试控制寄存器
-------------------------------------------------*/
void Init_7219(void)
{
Write_7219(SHUT_DOWN,0x01); //开启正常工作模式(0xX1)
Write_7219(DISPLAY_TEST,0x00); //选择工作模式(0xX0)
Write_7219(DECODE_MODE,0x00); //选用不译码模式
Write_7219(SCAN_LIMIT,0x07); //8只LED全用
Write_7219(INTENSITY,0x04); //设置初始亮度
}
/*
void mul_write_7219( uchar *point) //写多个数据
{
uchar i;
for (i=0;i<8;i++)
{
Write_7219(i+1,*point);
point++;
}
}
*/
void set_rtc(uchar tab[])
{ uchar ucaddr=0x80; //向时间寄存器中写初始时间的初始地址
uchar a,i;
write_1302(0x8e,0x00); //,初始化里有去除写保护
for(i=0;i<7;i++)
{ a=tab[i]/10; //将十进制数转换为BCD码
tab[i]=tab[i]%10;
tab[i]=tab[i]+a*16;
write_1302(ucaddr,tab[i]);
ucaddr+=2;
}
// write_1302(0x8e,0x80); //添加写保护
}
/*-------------------------------------------------
这个函数是将1302的时间寄存器中的数据多字节一起读出,放到curtime数组里
{0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
从时间寄存器中读数据的初始地址
将读出的数据放到数组curtime中
-------------------------------------------------*/
void get_1302() //将1302的时间寄存器中的数据多字节一起读出,放到curtime数组里
{ uchar ucaddr=0x81; //从时间寄存器中读数据的初始地址
uchar i=0;
//for(i=0;i<7;i++)
while(i<7)
{
temp[i]=read_1302(ucaddr);
ucaddr+=2;
i++;
}
}
void init_DS1302(void) //分别初始化,没用循环语句
{
write_1302(0x80,0x30);
write_1302(0x82,0x25);
write_1302(0x84,0x01);
write_1302(0x86,0x25);
write_1302(0x88,0x02);
write_1302(0x8A,0x04);
write_1302(0x8c,0x14);
write_1302(0x8e,0x0); //去写保护
}