📄 shizhong.c
字号:
#include<reg52.h> //1脚电源,4脚地,8脚备用电源,2 3脚晶震,5脚复位,6脚i/0口,7脚时钟//
#define uchar unsigned char
#define uint unsigned int
void wrbyte(uchar byte);//写入1字节//
uchar readbyte(void);//读1字节//
void w1302(uchar addr,uchar da);//写1字节地址和写1字节数据//
uchar r1302(uchar addr);//读去1302某地址的数据//
void get1302(uchar curtime[]);//读取1302当前的时间//
void set1302(uchar *p);//写入1302设置时间//
void dis_scan(uchar buff[]);//数码管的扫描//
void ini_ds1302(void);//初始化1302//
void delay(uint k);//延时//
void scan_key(void);//键盘扫描//
void shanshuo(uchar mov_temp);//数码管闪烁//
uchar code seg7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar timebuf[7]={0x03,0x38,0x10,0x03,0x04,0x02,0x07};//默认时间//
uchar led[16];//led 要显示的数字缓冲器//
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;//调时和调整//
sbit P31=P3^1;//led移动的闪烁//
sbit P32=P3^2;//加//
sbit P33=P3^3;//减//
uchar mov,cout;//移动的位置//led闪烁的计数//
bit K1,K2,K3,K4;//按键的标志位//
void main()
{
P3=0xff;
ini_ds1302();//初始化1302//
get1302(timebuf);//读取现在的时间//
while(1)
{
scan_key();//键盘扫描//
if(K1==0){dis_scan(timebuf);mov=6;get1302(timebuf);}
else shanshuo(mov);
}
}
void scan_key(void)//键盘扫描//
{
if(P30==0){delay(5);
if(P30==0){K1=!K1;//k1=0时正常//k1=1调时//
if(K1==0){w1302(0x8e,0x00);//wp=0允许写操作//
set1302(timebuf);//写入1302设置的时间//
w1302(0x8e,0x80);//WP=1,写保护//禁止写操作//
}
}
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闪烁的移动//
if(K3==1&&P32==1){K3=0;//调时加//
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;//时//
if(timebuf[1]>0x59)timebuf[1]=0;//分//
if(timebuf[0]>0x59)timebuf[0]=0;//秒//
}
if(K4==1&P33==1){K4=0;//调时减//
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;//时//
if(timebuf[1]==0)timebuf[1]=0x59+1;//分//
if(timebuf[0]==0)timebuf[0]=0x59+1;//秒//
}
}
void shanshuo(uchar mov_temp)//数码管闪烁//
{
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[])//数码管扫描//
{
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)//写入1字节//
{
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字节//
{
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)//写1字节地址和写1字节数据//
{
T_RST=0;
T_CLK=0;
T_RST=1;
wrbyte(addr);
wrbyte(da);
T_CLK=1;
T_RST=0;
}
uchar r1302(uchar addr)//读取1302某地址的数据//
{
uchar da;
T_RST=0;
T_CLK=0;
T_RST=1;
wrbyte(addr);//地址//
da=readbyte();//读1 BYTE 数据//
T_CLK=1;
T_RST=0;
return(da);
}
void set1302(uchar *p)//写入1302设置的时间
{
uchar i;
uchar addr=0x80;//设置时间的地址
w1302(0x8e,0x00);//WP=0,允许写操作
for(i=0;i<7;i++)
{
w1302(addr,*p);
P2++;
addr+=2;
}
w1302(0x8e,0x80);//WP=1,写保护//禁止写操作/
}
void get1302(uchar curtime[])//读取1302当前时间
{
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -