📄 c51_数字钟.txt
字号:
#include<reg51.h>
#include<absacc.h>
#define second XBYTE [0x6000]
#define second_n XBYTE [0x6001]
#define minute XBYTE [0x6002]
#define minute_n XBYTE [0x6003]
#define hour XBYTE [0x6004]
#define hour_n XBYTE [0x6005]
#define day XBYTE [0x6007]
#define month XBYTE [0x6008]
#define year XBYTE [0x6009]
#define reg_a XBYTE [0x600a]
#define reg_b XBYTE [0x600b]
#define reg_c XBYTE [0x600c]
#define reg_d XBYTE [0x600d]
#define Order XBYTE [0x2021]
#define Date XBYTE [0x2020]
#define uchar unsigned char
uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*8279对应字符表*/
unsigned int se,mi,ho,da,mo,ye,se1,mi1,ho1,sta = 0,times=10;
sbit clflag = ACC^7;
sbit p1_0 = P1^0;
sbit p1_1 = P1^1;
sbit p1_2 = P1^2;
uchar deky(void)
{
uchar i;
i=Order;
return(i&0x0f);
}
uchar keyin(void)
{
uchar i;
while(deky()==0);
Order=0x40;
i=Date;
i=i&0x3f;//取低六位
return(i);
}
void delay()/*延时*/
{
int i,j;
for(i = 0;i < 100;i++)
{
for(j = 0;j < 100;j++)
{
}
}
}
void init()/*8279初始化*/
{
Order = 0xd1;//总清除
do
{
ACC = Order;
}while(clflag == 1);
Order = 0x00;
Order = 0x34;
Order = 0x90;
reg_a = 0x2f;//启动晶振
delay();
}
void writetime()/*初始显示*/
{
reg_b = 0xc0;
second = second;
minute = minute;
hour = hour;
day = day;
month = month;
year = year;
second_n = second_n;
minute_n = minute_n;
hour_n = hour_n;
reg_b = 0x42;//set=0;BCD模式24进制
ACC = 0x00;
ACC = reg_b;
}
readtime()
{
do
{
ACC = reg_a;
}while(clflag == 1);
se = second;
mi = minute;
ho = hour;
da = day;
mo = month;
ye = year;
se1 = second_n;
mi1 = minute_n;
ho1 = hour_n;
}
void ds12887() interrupt 0
{
EX1 =0;
ACC = reg_c;
readtime();
P1 = 0xff;
if(se == second_n && mi == minute_n && ho == hour_n)/*闹铃*/
{
do
{
Order = 0x80;
Date = table[ho/16];
Order = 0x81;
Date = table[ho%16];
Order = 0x83;
Date = table[mi/16];
Order = 0x84;
Date = table[mi%16];
Order = 0x86;
Date = table[se/16];
Order = 0x87;
Date = table[se%16];
delay();
Order = 0xc3;
delay();
p1_2 = p1_2 ^ 1;
delay();
times--;
}while(times>0);
}
if(p1_0==1) {sta = sta+1;if (sta==4) sta=0;}
if(sta==0 && p1_1==1)/*显示十分秒*/
{
Order = 0x80;
Date = table[ho/16];
Order = 0x81;
Date = table[ho%16];
Order = 0x83;
Date = table[mi/16];
Order = 0x84;
Date = table[mi%16];
Order = 0x86;
Date = table[se/16];
Order = 0x87;
Date = table[se%16];
}
if(sta==1 && p1_1==1)/*显示年月日*/
{
Order = 0x80;
Date = table[ye/16];
Order = 0x81;
Date = table[ye%16];
Order = 0x83;
Date = table[mo/16];
Order = 0x84;
Date = table[mo%16];
Order = 0x86;
Date = table[da/16];
Order = 0x87;
Date = table[da%16];
}
if(sta ==2 && p1_1==1)/*显示闹铃*/
{
Order = 0x80;
Date = table[ho1/16];
Order = 0x81;
Date = table[ho1%16];
Order = 0x83;
Date = table[mi1/16];
Order = 0x84;
Date = table[mi1%16];
Order = 0x86;
Date = table[se1/16];
Order = 0x87;
Date = table[se1%16];
}
if(sta==3 && p1_1==1)/*省电*/
{
Order = 0xc3;
}
EX1 =1;
}
void xp8279() interrupt 2
{
int temp1,temp2,temp3;
P1 = 0xff;
EX1=0;
reg_b|=0x80;//12887停止计时
if(p1_0 == 1) {sta = sta+1;if (sta==3) sta=0;}
if(p1_1 == 1 )
{
temp3=keyin();
}
if(p1_1 == 0 && sta==0)/*修改时分秒*/
{
temp1 = keyin();
Order = 0x80;
Date = table[temp1];
temp2 = keyin();
Order = 0x81;
Date = table[temp2];
hour = temp1 * 16 + temp2;
temp1 = keyin();
Order = 0x83;
Date = table[temp1];
temp2 = keyin();
Order = 0x84;
Date = table[temp2];
minute = temp1 * 16 + temp2;
temp1 = keyin();
Order = 0x86;
Date = table[temp1];
temp2 = keyin();
Order = 0x87;
Date = table[temp2];
second = temp1 * 16 + temp2;
}
if(p1_1 == 0 && sta==1)/*修改年月日*/
{
temp1 = keyin();
Order = 0x80;
Date = table[temp1];
temp2 = keyin();
Order = 0x81;
Date = table[temp2];
year = temp1 * 16 + temp2;
temp1 = keyin();
Order = 0x83;
Date = table[temp1];
temp2 = keyin();
Order = 0x84;
Date = table[temp2];
month = temp1 * 16 + temp2;
temp1 = keyin();
Order = 0x86;
Date = table[temp1];
temp2 = keyin();
Order = 0x87;
Date = table[temp2];
day = temp1 * 16 + temp2;
}
if(p1_1 == 0 && sta==2)/*修改闹铃*/
{
temp1 = keyin();
Order = 0x80;
Date = table[temp1];
temp2 = keyin();
Order = 0x81;
Date = table[temp2];
hour_n = temp1 * 16 + temp2;
temp1 = keyin();
Order = 0x83;
Date = table[temp1];
temp2 = keyin();
Order = 0x84;
Date = table[temp2];
minute_n = temp1 * 16 + temp2;
temp1 = keyin();
Order = 0x86;
Date = table[temp1];
temp2 = keyin();
Order = 0x87;
Date = table[temp2];
second_n = temp1 * 16 + temp2;
}
reg_b&=0x7f;//允许计时
EX1 = 1;
}
void main()
{
init();
writetime();
/*中断设置*/
EA = 1;
PX1 = 1;
EX1 = 1;
EX0 = 1;
readtime();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -