51单片机显示时间日期

2019-04-15 18:19发布

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