?? shizhong.c
字號(hào):
#include<reg52.h> //1腳電源,4腳地,8腳備用電源,2 3腳晶震,5腳復(fù)位,6腳i/0口,7腳時(shí)鐘//
#define uchar unsigned char
#define uint unsigned int
void wrbyte(uchar byte);//寫(xiě)入1字節(jié)//
uchar readbyte(void);//讀1字節(jié)//
void w1302(uchar addr,uchar da);//寫(xiě)1字節(jié)地址和寫(xiě)1字節(jié)數(shù)據(jù)//
uchar r1302(uchar addr);//讀去1302某地址的數(shù)據(jù)//
void get1302(uchar curtime[]);//讀取1302當(dāng)前的時(shí)間//
void set1302(uchar *p);//寫(xiě)入1302設(shè)置時(shí)間//
void dis_scan(uchar buff[]);//數(shù)碼管的掃描//
void ini_ds1302(void);//初始化1302//
void delay(uint k);//延時(shí)//
void scan_key(void);//鍵盤(pán)掃描//
void shanshuo(uchar mov_temp);//數(shù)碼管閃爍//
uchar code seg7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar timebuf[7]={0x03,0x38,0x10,0x03,0x04,0x02,0x07};//默認(rèn)時(shí)間//
uchar led[16];//led 要顯示的數(shù)字緩沖器//
sbit T_IO=P3^7;
sbit T_CLK=P3^6;
sbit T_RST=P3^5;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit P30=P3^0;//調(diào)時(shí)和調(diào)整//
sbit P31=P3^1;//led移動(dòng)的閃爍//
sbit P32=P3^2;//加//
sbit P33=P3^3;//減//
uchar mov,cout;//移動(dòng)的位置//led閃爍的計(jì)數(shù)//
bit K1,K2,K3,K4;//按鍵的標(biāo)志位//
void main()
{
P3=0xff;
ini_ds1302();//初始化1302//
get1302(timebuf);//讀取現(xiàn)在的時(shí)間//
while(1)
{
scan_key();//鍵盤(pán)掃描//
if(K1==0){dis_scan(timebuf);mov=6;get1302(timebuf);}
else shanshuo(mov);
}
}
void scan_key(void)//鍵盤(pán)掃描//
{
if(P30==0){delay(5);
if(P30==0){K1=!K1;//k1=0時(shí)正常//k1=1調(diào)時(shí)//
if(K1==0){w1302(0x8e,0x00);//wp=0允許寫(xiě)操作//
set1302(timebuf);//寫(xiě)入1302設(shè)置的時(shí)間//
w1302(0x8e,0x80);//WP=1,寫(xiě)保護(hù)//禁止寫(xiě)操作//
}
}
while(P30==0);//等待暗鍵K1的釋放//
}
if(K1==1)
{if(P31==0&&K2==0){delay(5);if(P31==0)K2=1;}
if(P32==0&&K3==0){delay(5);if(P32==0)K3=1;}
if(P33==0&&K4==0){delay(5);if(P33==0)K4=1;}
}
if(K2==1&&P31==1){K2=0;if(mov==0)mov=7;mov--;}//led閃爍的移動(dòng)//
if(K3==1&&P32==1){K3=0;//調(diào)時(shí)加//
if((timebuf[mov]&0x0f)==9)timebuf[mov]+=6;
timebuf[mov]++;
if(timebuf[5]>0x07)timebuf[5]=0;//星期//
if(timebuf[4]>0x12)timebuf[4]=0;//月//
if(timebuf[3]>0x31)timebuf[3]=0;//日//
if(timebuf[2]>0x23)timebuf[2]=0;//時(shí)//
if(timebuf[1]>0x59)timebuf[1]=0;//分//
if(timebuf[0]>0x59)timebuf[0]=0;//秒//
}
if(K4==1&P33==1){K4=0;//調(diào)時(shí)減//
if((timebuf[mov]&0x0f==0))timebuf[mov]-=6;
timebuf[mov]--;
if(timebuf[5]==0)timebuf[5]=0x7+1;//星期//
if(timebuf[4]==0)timebuf[4]=0x12+1;//月//
if(timebuf[3]==0)timebuf[3]=0x31+1;//日//
if(timebuf[2]==0)timebuf[2]=0x12+1;//時(shí)//
if(timebuf[1]==0)timebuf[1]=0x59+1;//分//
if(timebuf[0]==0)timebuf[0]=0x59+1;//秒//
}
}
void shanshuo(uchar mov_temp)//數(shù)碼管閃爍//
{
uchar i;
for(i=0;i<7;i++)
{
led[i*2]=timebuf[i]&0x0f;//取低四位/
led[i*2+1]=(timebuf[i]&0xf0)>>4;//高四位//
}
P2=0xff;
cout++;
if(cout<10){led[2*mov_temp]=10;led[2*mov_temp+1]=10;}//閃爍
if(cout>20)cout=0;//閃爍頻率
for(i=0;i<14;i++)//14位掃描//
{
P1=seg7[led[i]];
P2++;
delay(1);
P1=0xff;
}
}
void dis_scan(uchar buff[])//數(shù)碼管掃描//
{
uchar i;
for(i=0;i<7;i++)
{
led[i*2]=buff[i]&0x0f;
led[i*2+1]=(buff[i]&0xf0)>>4;
}
P2=0xff;
for(i=0;i<14;i++)
{
P1=seg7[led[i]];
P2++;
delay(1);
P1=0xff;
}
}
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++);
}
}
void wrbyte(uchar byte)//寫(xiě)入1字節(jié)//
{
uchar i;
ACC=byte;
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=1;
T_CLK=0;
ACC=ACC>>1;
}
}
uchar readbyte(void)//讀1字節(jié)//
{
uchar i;
for(i=8;i>0;i--) {
ACC=ACC>>1;
ACC7=T_IO;
T_CLK=1;
T_CLK=0;
}
return(ACC);
}
void w1302(uchar addr,uchar da)//寫(xiě)1字節(jié)地址和寫(xiě)1字節(jié)數(shù)據(jù)//
{
T_RST=0;
T_CLK=0;
T_RST=1;
wrbyte(addr);
wrbyte(da);
T_CLK=1;
T_RST=0;
}
uchar r1302(uchar addr)//讀取1302某地址的數(shù)據(jù)//
{
uchar da;
T_RST=0;
T_CLK=0;
T_RST=1;
wrbyte(addr);//地址//
da=readbyte();//讀1 BYTE 數(shù)據(jù)//
T_CLK=1;
T_RST=0;
return(da);
}
void set1302(uchar *p)//寫(xiě)入1302設(shè)置的時(shí)間
{
uchar i;
uchar addr=0x80;//設(shè)置時(shí)間的地址
w1302(0x8e,0x00);//WP=0,允許寫(xiě)操作
for(i=0;i<7;i++)
{
w1302(addr,*p);
P2++;
addr+=2;
}
w1302(0x8e,0x80);//WP=1,寫(xiě)保護(hù)//禁止寫(xiě)操作/
}
void get1302(uchar curtime[])//讀取1302當(dāng)前時(shí)間
{
uchar i;
uchar addr=0x81;
for(i=0;i<7;i++)
{
curtime[i]=r1302(addr);
addr+=2;
}
}
void ini_ds1302(void)
{
w1302(0x8e,0x00);
w1302(0x90,0x00);
T_CLK=0;
T_RST=0;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -