|
QQ截圖20170325122230.png (73.82 KB, 下載次數(shù): 38)
下載附件
2017-3-25 12:23 上傳
仿真電路可以調(diào)時(shí),焊接實(shí)物后只能顯示時(shí)間,設(shè)置按鈕可以用,加和減按鈕不能用,不知道為什么?
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define D P0 //段選
#define W P2 //位選
sbit IO=P3^6; //數(shù)據(jù)口
sbit SCLK=P3^5; //控制數(shù)據(jù)時(shí)鐘
sbit RST=P3^7; //使能端、復(fù)位端
/************按鍵引腳定義***********/
sbit led=P3^1; //閃爍的小數(shù)點(diǎn)......燈.....
sbit s3=P3^2; //按鍵 選擇
sbit s1=P3^3; //按鍵 加
sbit s2=P3^4; //按鍵 減
uchar s, knum=0,snum,fnum;
bit flag;
/***********寫時(shí)分秒地址************/
#define write_shi 0x84
#define write_fen 0x82
#define write_miao 0x80
/***********讀時(shí)分秒地址************/
#define read_shi 0x85
#define read_fen 0x83
#define read_miao 0x81
bit miao_flag;
char miao_num;
char Dmiao;
char shi,fen,miao; //讀出數(shù)據(jù)存儲(chǔ)變量
uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //不帶小數(shù)點(diǎn)
uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //帶小數(shù)點(diǎn)
void delay(uint z) //延時(shí)函數(shù),z的取值為這個(gè)函數(shù)的延時(shí)ms數(shù),如 delay(200);大約延時(shí)200ms.
{ //delay(500);大約延時(shí)500ms.
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void t0_init() //定時(shí)50ms一個(gè)中斷
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
uchar read_1302(uchar add) //讀函數(shù)
{
uchar i,date;
RST=0; //禁止讀寫數(shù)據(jù)
for(i=0;i<8;i++)
{
RST=1;
SCLK=0;
IO=add&0x01;
add>>=1;
SCLK=1;
}
for(i=0;i<8;i++)
{
if(IO)
date=date|0x80;
else
date=date|0x00;
SCLK=1;
date>>=1;
SCLK=0;
}
RST=0;
date=date/16*10+date%16;//進(jìn)制轉(zhuǎn)換 16轉(zhuǎn)10進(jìn)制
IO=0; //數(shù)據(jù)讀完后,IO口必須為0,不然小時(shí)一直顯示85
return date;
}
void write_1302(uchar add,uchar dat) //寫函數(shù)
{
uchar i;
RST=0; //禁止讀寫數(shù)據(jù)
SCLK=0;
for(i=0;i<8;i++) //寫地址
{
RST=1; //允許讀寫數(shù)據(jù)
SCLK=0;
IO=add&0x01;
add>>=1;
SCLK=1;
}
for(i=0;i<8;i++) //寫數(shù)據(jù)
{
RST=1; //允許讀寫數(shù)據(jù)
SCLK=0;
IO=dat&0x01;
dat>>=1;
SCLK=1;
}
RST=0;
}
void init_1302() //初始化函數(shù) 設(shè)置時(shí)間
{
flag=read_1302(0x81);
if(flag&0x80)
write_1302(0x8e,0x00); //保護(hù)取消,可以進(jìn)行讀寫操作
write_1302(write_miao,0x56);
write_1302(write_fen,0x49);
write_1302(write_shi,0x14);
write_1302(0x90,0xa5);
write_1302(0x8e,0x80); //保護(hù)啟動(dòng),不能進(jìn)行讀寫操作
}
void display(uchar shi,uchar fen) //顯示函數(shù)
{
if(knum==0)
{
snum=30;
fnum=30;
}
if(knum==1)
{
fnum++;
snum=30;
}
if(knum==2)
{
snum++;
fnum=30;
}
if(snum>=30)
{
W=0xFb; //位選
s=d[shi/10];//段碼先給s,判斷其值是否為0,
if(s==0xc0)
{
W=0xff;
D=0xff;
}
D=s;//s不為零則給D,讓其顯示
delay(5);
D=0Xff; //消隱
if(miao_flag) //小數(shù)點(diǎn)閃爍
{
miao_flag=0;
W=0xF7;
D=dd[shi%10];
delay(5);
D=0Xff; //消隱
}
else
{
W=0xF7;
D=d[shi%10];
delay(5);
D=0Xff;
}
if(snum==60)
snum=0;
}
if(fnum>=30)
{
W=0xEf;
D=d[fen/10];
delay(5);
D=0Xff; //消隱
W=0xDf;
D=d[fen%10];
delay(5);
D=0Xff; //消隱
if(fnum==60)
fnum=0;
}
}
//讀取函數(shù)。。。。。。。。。。
void read_sf()
{
miao=read_1302(read_miao);
/*if(miao!=Dmiao)
{
Dmiao=miao;
TR0=1;
miao_flag=1;
} */
fen=read_1302(read_fen);
shi=read_1302(read_shi);
display(shi,fen); //讀取函數(shù)內(nèi)的顯示函數(shù)。。。。。。。。。。。。。。。
}
//掃描函數(shù),用于調(diào)時(shí)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
void keyscan() //按鍵掃描函數(shù)
{
if(s3==0) //選擇按鍵按下
{
delay(10);
if(s3==0)
{
while(!s3)
display(shi,fen); //加上這句,按鍵按下就不會(huì)閃
knum++;
if(knum==1) //分閃爍
{
write_1302(0x8e,0x00); //保護(hù)取消
write_1302(write_miao,0x80);
}
if(knum==3) //時(shí)鐘啟動(dòng)
{
knum=0;
write_1302(write_miao,0x00);
write_1302(0x8e,0x80); //保護(hù)啟動(dòng)
}
}
}
if(knum==1) //分鐘調(diào)節(jié)
{
if(s1==0) //加
{
delay(10);
if(s1==0)
{
while(!s1)
display(shi,fen); //加上這句,按鍵按下就不會(huì)閃
fen++;
if(fen==60)
fen=0;
write_1302(write_fen,fen/10*16+fen%10); //寫入1302
// read_sf(); //讀出時(shí)間,然后顯示
}
}
if(s2==0)
{
delay(10);
if(s2==0)
{
while(!s2)
display(shi,fen); //加上這句,按鍵按下就不會(huì)閃
fen--;
if(fen==-1)
fen=59;
write_1302(write_fen,fen/10*16+fen%10);
read_sf();
}
}
}
if(knum==2)
{
if(s1==0)
{
delay(10);
if(s1==0)
{
while(!s1)
display(shi,fen); //加上這句,按鍵按下就不會(huì)閃
shi++;
if(shi==24)
shi=0;
write_1302(write_shi,shi/10*16+shi%10);
read_sf();
}
}
if(s2==0)
{
delay(10);
if(s2==0)
{
while(!s2)
display(shi,fen); //加上這句,按鍵按下就不會(huì)閃
shi--;
if(shi==-1)
shi=23;
write_1302(write_shi,shi/10*16+shi%10);
read_sf();
}
}
}
}
void main()
{
init_1302();
t0_init();
while(1)
{ if(miao_num<10)
led=0;
if(miao_num>=10)
led=1;
read_sf();
keyscan();
}
}
void t0_timer() interrupt 1
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
miao_num++;
if(miao_num>=20)
{
miao_num=0;
miao_flag=1;
}
}
|
|