📄 clock.c
字号:
/************************************************************/
/* 广州天河双龙电子有限公司 */
/* http://www.sl.com.cn */
/* 电脑时钟演示程序(KEIL 51版本) */
/* 程序作者:詹卫前 */
/* 接线方式:CS=P2.4 CLK=P2.3 DATA=P2.2 KEY=P2.1 */
/* 处理器:AT89C51 晶振频率:8MHZ */
/* SL279 晶振频率:12MHZ */
/************************************************************/
#include<at89x51.h>
sbit cs=P2^4;
sbit clk=P2^3;
sbit dat=P2^2;
sbit key=P2^1;
sbit bp=P2^0;
unsigned char flag=0;//时间刷新标志
unsigned char dflag=0;//计数方向标志
unsigned char count=20;
/* 定义结构体time */
struct time
{
signed char second;
signed char minute;
signed char hour;
} time;
/* 90us延时程序 */
void delay_90us(void)
{
unsigned char i;
for (i=0;i<18;i++)
;
}
/* 10us延时程序 */
void delay_10us(void)
{
unsigned char i;
for (i=0;i<1;i++)
;
}
/* ms级延时程序 */
void delay_ms(unsigned int number)
{
unsigned char i;
do
{
for(i=0;i<11;i++)
delay_90us();
}
while(--number!=0);
}
/* 字节发送函数 */
void send_byte( unsigned char para)
{
unsigned char i;
cs=0;
delay_90us();
for (i=0;i<8;i++)
{
if (para&0x80)
{
dat=1;
}
else
{
dat=0;
}
clk=1;
delay_10us();
clk=0;
delay_10us();
para=para<<1;
}
dat=0;
clk=0;
}
/* 字节接收函数 */
unsigned char receive_byte(void)
{
unsigned char i, temp;
dat=1;
delay_90us();
for (i=0;i<8;i++)
{
clk=1;
delay_10us();
temp=temp<<1;
if (dat)
{
temp=temp|0x01;
}
clk=0;
delay_10us();
}
dat=0;
return (temp);
}
/* 写sl279双字节命令 */
void write279(unsigned char cmd1, unsigned char cmd2)
{
send_byte (cmd1);
send_byte (cmd2);
cs=1;
}
/*在启动时设置时间,按shift键后进入计时状态*/
void initdis()
{
unsigned char i=7;
unsigned char keyval=0;
write279(0xc8,0);
write279(0xc9,0);
write279(0x92,1);
write279(0xcb,0);
write279(0xcc,0);
write279(0x95,1);
write279(0xce,0);
write279(0xcf,0);
write279(0x88,0x7f);
do
{
while(key!=0)
;
send_byte(0x15);
keyval=receive_byte();
cs=1;
switch (i)
{
case 7:{
if(keyval<3)
{
write279(0xc8+i,keyval);
i--;
write279(0x88,0xbf);
time.hour=time.hour%10+keyval*10;
}
break;
}
case 6:{
if(keyval<10)
{
if((time.hour<20)|(keyval<4))
{
write279(0xc8+i,keyval);
i--;
i--;
write279(0x88,0xef);
time.hour=(time.hour/10)*10+keyval;
}
}
break;
}
case 4:{
if(keyval<6)
{
write279(0xc8+i,keyval);
i--;
write279(0x88,0xf7);
time.minute=time.minute%10+keyval*10;
}
break;
}
case 3:{
if(keyval<10)
{
write279(0xc8+i,keyval);
i--;
i--;
write279(0x88,0xfd);
time.minute=(time.minute/10)*10+keyval;
}
break;
}
case 1:{
if(keyval<6)
{
write279(0xc8+i,keyval);
i--;
write279(0x88,0xfe);
time.second=time.second%10+keyval*10;
}
break;
}
case 0:{
if(keyval<10)
{
write279(0xc8+i,keyval);
i=7;
write279(0x88,0x7f);
time.second=(time.second/10)*10+keyval;
}
break;
}
}
while(key==0)//按键释放检查
;
}
while(keyval!=0x17);
write279(0x88,0xff);
}
/* 设置定时器1及中断系统 */
void opentime()
{
TMOD=0x11;
TL1=101;
TH1=253;
TL0=202;
TH0=125;
TR0=1;
TR1=1;
IE=0x82;
IP=0x02;
}
/* 显示刷新 */
void display(void)
{
write279(0xc8,time.second%10);
write279(0xc9,time.second/10);
write279(0x92,1);
write279(0xcb,time.minute%10);
write279(0xcc,time.minute/10);
write279(0x95,1);
write279(0xce,time.hour%10);
write279(0xcf,time.hour/10);
}
/* 正计时 */
void inctime(void)
{
if(time.second<59)
time.second++;
else
{
time.second=0;
if(time.minute<59)
time.minute++;
else
{
time.minute=0;
if(time.hour<23)
time.hour++;
else
time.hour=0;
}
}
}
/* 倒计时 */
void dectime(void)
{
if(time.second>0)
time.second--;
else
{
time.second=59;
if(time.minute>0)
time.minute--;
else
{
time.minute=59;
if(time.hour>0)
time.hour--;
else
time.hour=23;
}
}
}
/*启动时为正计时,按shift键进行正计时和倒计时切换 */
/*启动时允许整点报时,按0~F中任意键一次关闭,二次打开*/
void main(void)
{
unsigned char temp,bpflag=0;
delay_ms(30);
send_byte(0xa4);
cs=1;
initdis();
opentime();
while(1)
{
if(flag==0x01)
{
if(dflag==0)
inctime();
else
dectime();
display();
flag=0;
}
if(key==0)//检查shift按键
{
send_byte(0x15);
temp=receive_byte();
cs=1;
if(temp==0x17)
{
if (dflag==0)
dflag=1;
else
dflag=0;
}
else
bpflag^=0x01;
while(key==0)
;
}
if ((time.minute==0)&(bpflag==0))
ET1=1; //整点报时
else
ET1=0;
}
}
void timer1_ovf() interrupt 1 //溢出中断子程序
{
if(--count==0)
{
flag=0x01;
count=20;
}
TL0=202;
TH0=125;
}
void timer0_ovf() interrupt 3
{
static unsigned int i;
i++;
if(i<400)
{
bp^=1;
}
if(i>800)
i=0;
TL1=101;
TH1=253;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -