×
单片机 > 单片机程序设计 > 详情

51单片机显示时间日期

发布时间:2020-07-08 发布时间:
|

#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);  //去写保护

}





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会