网上查了查也没什么结果,所以跑来问问;下面是我的代码;时钟数码显示;
#include "reg51.h"
#include "intrins.h"
#define SMGXSK P0 //数码管接受段选端口;
#define SMGWX P2 //位选端口;
#define u8 unsigned char
sbit rst=P3^5;
sbit SCLK=P3^6;
sbit IO=P3^4;
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码;
u8 code b[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; //读出秒分时日月周年地址
u8 code a[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; //写入地址秒分时日月周年的地址
u8 code time[7] = {0,0,0x24,0x07,0x05,0x06,0x16}; //存入时间;
u8 readtime[7]={0}; //定义保存时间数组;
u8 ledduan[8]={0}; //定义保存段选数组;
void delay(u8 t)
{
u8 i,j; //延时
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
/************* 写入数据***************/
void writedata(u8 addr,u8 dat)
{
u8 i;
rst=0;
_nop_();
SCLK=0;
_nop_();
rst=1;
_nop_();
for(i=0;i<8;i++)
{
IO=addr & 0x01;
addr=addr>>1;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
for(i=0;i<8;i++)
{
IO=dat & 0x01;
dat=dat>>1;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
rst=0;
_nop_();
}
/*********读出数据**************/
u8 readdata(u8 addr)
{
u8 i,dat,dat1;
rst=0;
_nop_();
SCLK=0;
_nop_();
OE=1;
_nop_();
for(i=0;i<8;i++)
{
IO=addr & 0x01;
addr=addr>>1;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
for(i=0;i<8;i++)
{
dat=IO;
dat=dat<<7;
dat1=dat1>>1;
dat=dat|dat1;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
rst = 0;
_nop_(); //DS1302复位的稳定时间
SCLK = 1;
_nop_();
IO = 0;
_nop_();
IO = 1;
_nop_();
return dat;
}
/***********初始化时间******************/
void uint()
{
u8 i;
writedata(0x8e,0x00); //关闭写保护;
for(i=0;i<7;i++)
{
writedata(a,time); //写入时钟寄存器器地址和时间;
}
writedata(0x8e,0x80); //打开写保护;
}
void rdtm()
{
u8 i;
for(i=0;i<7;i++)
{
readtime=readdata(b); //读取时间;
}
}
/*************取时间的个位和十位***************/
void LEDDUAN()
{
ledduan[0]=smgduan[readtime[0]&0x0f]; //秒的个位;
ledduan[1]=smgduan[readtime[0]/16]; //秒的十位;
ledduan[2]=0x40;
ledduan[3]=smgduan[readtime[1]&0x0f];
ledduan[4]=smgduan[readtime[1]/16]; //分;
ledduan[5]=0x40;
ledduan[6]=smgduan[readtime[2]&0x0f];
ledduan[7]=smgduan[readtime[2]/16]; //时;
}
/********数码管显示******************/
void display()
{
SMGXSK=ledduan[0];
SMGWX=0x00;
delay(1);
SMGWX=0xff;
SMGXSK=ledduan[1];
SMGWX=0x04;
delay(1);
SMGWX=0xff;
SMGXSK=ledduan[2];
SMGWX=0x08;
delay(1);
SMGWX=0xff;
SMGXSK=ledduan[3];
SMGWX=0x0c;
delay(1);
SMGWX=0xff;
SMGXSK=ledduan[4];
SMGWX=0x10;
delay(1);
SMGWX=0xff;
SMGXSK=ledduan[5];
SMGWX=0x14;
delay(1);
SMGWX=0xff;
SMGXSK=ledduan[6];
SMGWX=0x18;
delay(1);
SMGWX=0xff;
SMGXSK=ledduan[7];
SMGWX=0x1c;
delay(1);
SMGWX=0xff;
}
void main()
{
uint(); //初始化时间;
while(1)
{
rdtm();
LEDDUAN();
display();
}
}
|