📄 ds1302用max7219控制8位led显示时钟的设计.c
字号:
#include<reg51.h>
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar xingqi,nian,yue,ri,xiaoshi,fen,miao;
uchar nianh,nianl,yueh,yuel,rih,ril,xiaoshih,xiaoshil,fenh,fenl,miaoh,miaol;
uchar dd=2;
sbit clk=P1^0;
sbit dat=P1^1;
sbit rst=P1^2;
sbit A0=ACC^0;
sbit A1=ACC^1;
sbit A2=ACC^2;
sbit A3=ACC^3;
sbit A4=ACC^4;
sbit A5=ACC^5;
sbit A6=ACC^6;
sbit A7=ACC^7;
sbit p30=P3^0;
sbit p31=P3^1;
sbit p32=P3^2;
sbit p33=P3^3;
sbit p34=P3^4;
sbit p35=P3^5;
sbit p36=P3^6;
sbit p37=P3^7;
sbit date=P2^0;
sbit load=P2^1;
sbit clkk=P2^2;
uchar bdata bitmsb;
sbit m7 = bitmsb^7;
uchar x,y,c;
bit flag=0;
bit flagh=1;
uchar code tab[]={ 0xff,//任意数
0X06,/*1*/ //共阴数码管
0X5B,/*2*/
0X4F,/*3*/
0X66,/*4*/
0X6D,/*5*/
0X7D,/*6*/
0X07,/*7*/
};
uchar code tab2[]={0x7e,0x30,0x6d,0x79,0x33,
0x5b,0x5f,0x70,0x7f,0x7b};//max7219 0到9的 字库
uchar code tab1[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,
0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,
0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,
0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
0x48,0x49,0x50,0x51,0x52,0x53,0x54,0x55,
0x56,0x57,0x58,0x59,0x60};
//-------------------------------------------------------
void send(void) //送一个字节
{ uchar count;
bitmsb=x;
for(count=0;count<8;count++)
{ if(m7)
{ clkk=0;
date=1;
_nop_();
clkk=1;
}
else { clkk=0;
date=0;
_nop_();
clkk=1;
}
bitmsb <<= 1;
}
}
void wr(void)
{
load=0;
send();
x=y;
send();
load=1;
}
void ready(void)
{
x=0xfb; //设置扫描限制
y=0x07;
wr();
x=0xf9; //译码模式
y=0x00;
wr();
x=0xfa; //亮度调节
y=0x0c;
wr();
x=0xfc; //关断模式
y=0x01;
wr();
}
//---------------------------------------------------------------
void InputByte(uchar dd)//写一个字节到1302中
{ uchar i;
ACC=dd;
for(i=8;i>0;i--)
{
dat=A0;
clk=1;
clk=0;
ACC=ACC>>=1;
}
}
//-------------------------------------------------------
void OutputByte(void) //从ds1302中读i个数据出来
{ uchar i;
dat=1;
for(i=8;i>0;i--)
{ ACC=ACC>>1;
A7=dat;
clk=1;
clk=0;
}
dd=ACC;
}
void Write(uchar addr,uchar num)
{ rst=0;
clk=0;
rst=1;
InputByte(addr); //写地址
InputByte(num); //写数据
clk=1;
rst=0;
}
void WriteSec(uchar num)
{
Write(0x80,num);
}
void WriteMin(uchar num)
{
Write(0x82,num);
}
void WriteHr(uchar num)
{
Write(0x84,num);
}
void WriteDay(uchar num)
{
Write(0x86,num);
}
void WriteMn(uchar num)
{
Write(0x88,num);
}
void WriteWe(uchar num)
{
Write(0x8a,num);
}
void WriteYs(uchar num)
{
Write(0x8c,num);
}
void DisableWP(void) //write data,read 0
{
Write(0x8e,0x00);
}
void Read(uchar addr)
{ rst=0;
clk=0;
rst=1;
InputByte(addr);
OutputByte();
clk=1;
rst=0;
}
//初始化设置时间 08年5月27号,23点58分00秒
void main(void)
{ uchar i;
uint xt=0;
uchar fen1,fen2,fen3,fen4;
P3=0xff;
DisableWP();//非写保护
WriteSec(0x00);//秒 //bcd码
WriteMin(0x58);//分
WriteHr(0x23);//时
WriteDay(0x27);//日
WriteMn(0x05);//月
WriteYs(0x08);//年
WriteWe(0x02);//星期
//7219设置
ready(); //初始化
for(i=0;i<222;i++);
for(i=0;i<222;i++);
while(1)
{ Read(0x8b);//读星期数据
xingqi=dd;
Read(0x8d);//读年数据
fen1=dd;
fen2=fen1&0x0f;
//这是因为proteus提供的显示方式用的bcd进制,所以就要这种方法转十进制
fen3=fen1&0xf0;
fen3>>=4;
nian=fen3*10+fen2;
nianh=nian/10;
nianl=nian%10;
Read(0x89);//读月数据
fen1=dd;
fen2=fen1&0x0f;
fen3=fen1&0xf0;
fen3>>=4;
yue=fen3*10+fen2;
yueh=yue/10;
yuel=yue%10;
Read(0x87);//读日数据
fen1=dd;
fen2=fen1&0x0f;
fen3=fen1&0xf0;
fen3>>=4;
ri=fen3*10+fen2;
rih=ri/10;
ril=ri%10;
Read(0x85);//读小时数据
fen1=dd;
fen2=fen1&0x0f;
fen3=fen1&0xf0;
fen3>>=4;
xiaoshi=fen3*10+fen2;
xiaoshih=xiaoshi/10;
xiaoshil=xiaoshi%10;
Read(0x83);//读分数据
fen1=dd;
fen2=fen1&0x0f;
fen3=fen1&0xf0;
fen3>>=4;
fen=fen3*10+fen2;
fenh=fen/10;
fenl=fen%10;
Read(0x81);//读秒数据
fen1=dd;
fen2=fen1&0x0f;
fen3=fen1&0xf0;
fen3>>=4;
miao=fen3*10+fen2;
miaoh=miao/10;
miaol=miao%10;
if(flagh)
{ c=1;
x=1;
for(i=0;i<1;i++)
{
y=tab2[xiaoshih];
x=c;
wr();
c++;
y=tab2[xiaoshil];
x=c;
wr();
c++;
y=0x01;
x=c;
wr();
c++;
y=tab2[fenh];
x=c;
wr();
c++;
y=tab2[fenl];
x=c;
wr();
c++;
y=0x01;
x=c;
wr();
c++;
y=tab2[miaoh];
x=c;
wr();
c++;
y=tab2[miaol];
x=c;
wr();
// c++;
P0=tab[xingqi];
}
}
else
{ c=1;
x=1;
y=tab2[nianh];
x=c;
wr();
c++;
y=tab2[nianl];
x=c;
wr();
c++;
y=0x01;
x=c;
wr();
c++;
y=tab2[yueh];
x=c;
wr();
c++;
y=tab2[yuel];
x=c;
wr();
c++;
y=0x01;
x=c;
wr();
c++;
y=tab2[rih];
x=c;
wr();
c++;
y=tab2[ril];
x=c;
wr();
// c++;
P0=tab[xingqi];
}
if(p30==0) //xingqi
if(flag)
{ Read(0x8b);//读数据
xingqi=dd;
xingqi++;
if(xingqi>=8)
xingqi=1;
WriteWe(xingqi);//星期
while(p30==0);
}
if(p31==0) //nian
if(flag)
{ Read(0x8d);//读数据
fen1=dd;
fen2=fen1&0x0f;
//这是因为proteus提供的显示方式用的bcd进制,所以就要这种方法转十进制
fen3=fen1&0xf0;
fen3>>=4;
nian=fen3*10+fen2;
nian++;
if(nian>=51)
nian=0;
WriteYs(tab1[nian]);
//这里是用查表的方法显示bcd ,也可以用十进制转bcd
while(p31==0);
}
if(p32==0) //yue
if(flag)
{ Read(0x89);//读数据
fen1=dd;
fen2=fen1&0x0f;
fen3=fen1&0xf0;
fen3>>=4;
yue=fen3*10+fen2;
yue++;
if(yue>=13)
yue=1;
WriteMn(tab1[yue]);
while(p32==0);
}
if(p33==0) //ri
if(flag)
{ Read(0x87);//读数据
fen1=dd;
fen2=fen1&0x0f;
fen3=fen1&0xf0;
fen3>>=4;
ri=fen3*10+fen2;
ri++;
if(ri>=32)
ri=1;
WriteDay(tab1[ri]);//ri
while(p33==0);
}
if(p34==0) //xiaoshi
if(flag)
{ Read(0x85);//读数据
fen1=dd;
fen2=fen1&0x0f;
fen3=fen1&0xf0;
fen3>>=4;
xiaoshi=fen3*10+fen2;
xiaoshi++;
if(xiaoshi>=24)
xiaoshi=0;
WriteHr(tab1[xiaoshi]);
while(p34==0);
}
if(p35==0) //fen
if(flag)
{ Read(0x83);//读数据
fen1=dd;
fen2=fen1&0x0f;
fen3=fen1&0xf0;
fen3>>=4;
fen=fen3*10+fen2;
fen++;
fen4=0;
if(fen>=60)
fen=0;
WriteMin(tab1[fen]);
while(p35==0);
}
if(p37==0)//调整标志
{ flag=~flag;
if(flag)
WriteSec(0x80);
else
WriteSec(0x00);
while(p37==0);
}
if(p36==0)//调整标志
{ flagh=~flagh;
while(p36==0);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -