我用TX-C板或参考TX-C板的电原理图焊接硬件。
学习大神的程序,在调时方面作些修改,下面是我的全部程序,供大家参考:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Time_DS=P1^7;
sbit Time_RW=P1^6;//DS12C887模块写入输出信号
sbit Time_AS=P1^5;
sbit Time_CS=P1^4;//DS12C887模块片选信号
sbit duan=P2^6;//数码管段选信号;
sbit wei =P2^7;//数码管位选信号
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit rd=P3^7;
sbit beep=P2^3;
uchar flag,num,k1_flag,k1_num,shi,ge,qian,bai,shiwan,wan,hr,min,sec;
void delayms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void di()
{
beep=0;
delayms(100);
beep=1;
}
void init()
{
rd=0;
}
void Write_Data(uchar Time_add,uchar Time_data)//写入DS12C887模块函数,add为地址,data为数据
{
P0=0xff;
Time_CS=0;
Time_DS=1;
Time_RW=1;
Time_AS=1;
P0=Time_add;
Time_AS=0;
Time_RW=0;
P0=Time_data;
Time_RW=1;
Time_AS=1;
Time_CS=1;
}
uchar Read_Data(uchar Time_add)//读出DS12c887模块函数,add为地址,data为数据
{
uchar Time_data;
P0=0xff;
Time_DS=1;
Time_RW=1;
Time_AS=1;
Time_CS=0;
P0=Time_add;
Time_AS=0;
Time_DS=0;
P0=0xff;
Time_data=P0;
Time_DS=1;
Time_AS=1;
Time_CS=1;
return Time_data;
}
//用法:show(位,数字);添加代码:sbit duan=P2^6;sbit wei =P2^7;
void show(unsigned char x,unsigned char y)//数码管方位显示
{
unsigned char code Shu[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
unsigned char code Weid[]={
0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsigned int time=51;
P0=0xff;
wei=1;
P0=Weid[x];
wei=0;
P0=0xff;
duan=1;
P0=Shu[y];
duan=0;
while(time--);
}
void keyscan()
{
rd=0;
if(k1==0)
{
delayms(10);
if(k1==0)
{
k1_num++;
flag=1;
while(!k1);(di);
}
}
switch(k1_num)
{
uchar ge,shi,tamp;
case 1:
tamp=Read_Data(0);
shi=tamp/10;
ge=tamp%10;
show(6,ge);
show(5,shi);
break;
case 2:
tamp=Read_Data(2);
shi=tamp/10;
ge=tamp%10;
show(4,ge);
show(3,shi);
break;
case 3:
tamp=Read_Data(4);
shi=tamp/10;
ge=tamp%10;
show(2,ge);
show(1,shi);
break;
case 4:
k1_num=0;
flag=0;
break;
}
if(k1_num!=0)
{
if(k2==0)//加键按下
{
delayms(10);
if(k2==0)
{
while(!k2);di();
switch(k1_num)
{
case 1:
sec++;
if(sec==60)
sec=0;
shi=sec/10;//秒的十位
ge=sec%10;//秒的个位
Write_Data(0,sec);
break;
case 2:
min++;
if(min==60)
min=0;
qian=min/10;//分钟的十位
bai=min%10;//分钟的个位
Write_Data(2,min);
break;
case 3:
hr++;
if(hr==24)
hr=0;
shiwan=hr/10;//时钟的十位
wan=hr%10;//时钟的个位
Write_Data(4,hr);
break;
}
}
}
if(k3==0)//减键按下
{
delayms(10);
if(k3==0)
{
while(!k3);di();
switch(k1_num)
{
case 1:
sec--;
if(sec==-1)
sec=59;
shi=sec/10;//秒的十位
ge=sec%10;//秒的个位
Write_Data(0,sec);
break;
case 2:
min--;
if(min==-1)
min=59;
qian=min/10;//分钟的十位
bai=min%10;//分钟的个位
Write_Data(2,min);
break;
case 3:
hr--;
if(hr==-1)
hr=23;
shiwan=hr/10;//时钟的十位
wan=hr%10;//时钟的个位
Write_Data(4,hr);
break;
}
}
}
}
}
void main()
{
init();
while(1)
{
keyscan();
if(flag==0)
{
uchar ge,shi,tamp;
tamp=Read_Data(0);
shi=tamp/10;
ge=tamp%10;
show(6,ge);//以上读的是秒
show(5,shi); //以上读的是秒
tamp=Read_Data(2);
shi=tamp/10;
ge=tamp%10;
show(4,ge);//以上读的是分
show(3,shi); //以上读的是分
tamp=Read_Data(4);
shi=tamp/10;
ge=tamp%10;
show(2,ge);//以上读的是时
show(1,shi); //以上读的是时
}
}
}