📄 clock.c
字号:
#include"at89x52.h"
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define nop _nop_() /* 定义空操作指令 */
#define port_led XBYTE[0x7FFF]
#define display_disappear 0x00;
#define DSA XBYTE[0x800A]
#define DSB XBYTE[0x800B]
#define DSC XBYTE[0x800C]
#define DSD XBYTE[0x800D]
#define sec XBYTE[0x8000]
#define min XBYTE[0x8002]
#define hour XBYTE[0x8004]
#define sec_alarm XBYTE[0x8001]
#define min_alarm XBYTE[0x8003]
#define hour_alarm XBYTE[0x8005]
uchar code tab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; /*共阴极LED数码显示器的段码*/
uchar code tab_dp[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
sbit com0=P1^0;
sbit com1=P1^1;
sbit com2=P1^2;
sbit com3=P1^3;
sbit light0=P1^4;
sbit light1=P1^6;
sbit light_combo=P1^5;
sbit alarm=P3^0;
sbit bee=P1^7;
sbit key0=P3^2;
sbit key1=P3^3;
char sec_buffer=0,min_buffer=0,hour_buffer=0;
char min_buffer_alarm,hour_buffer_alarm;
char sec_temp,min_temp,hour_temp;
char light_count=0,count_timer0=0,flag_set,flag_display;
char count_bee=0,count_rect=0;
bit bee_flag=0;
uchar ptr_key=0,flag_key=0;
void delay (unsigned int value) /*延时副程式*/
{
while (value!=0) value--; /*10US延时*/
}
void initialize_DS(void)
{
DSA=0x0F;
DSB=0x82;
ACC=DSC;
ACC=DSD;
DSA=0x2F;
DSB=0x22;
}
void start_DS(void)
{
DSA=0x0F;
DSB=0x82;
sec=sec_buffer;
min=min_buffer;
hour=hour_buffer;
sec_alarm=0x00;
min_alarm=0x00;
hour_alarm=0x00;
DSA=0x2F;
DSB=0x22;
}
char disassemble_BCD(char BCD_DS,bit flag_DS)
{
if(flag_DS==0) return BCD_DS&0x0f;
else return BCD_DS>>4;
}
void scan(void)
{
if(flag_display==0)
{
com3=0;
port_led=tab[disassemble_BCD(min_temp,0)];
delay(300);
com3=1;
com2=0;
port_led=tab[disassemble_BCD(min_temp,1)];
delay(300);
com2=1;
com1=0;
port_led=tab_dp[disassemble_BCD(hour_temp,0)];
delay(300);
com1=1;
com0=0;
port_led=tab[disassemble_BCD(hour_temp,1)];
delay(300);
com0=1;
}
if(flag_display==1)
{
com3=0;
port_led=display_disappear;
delay(300);
com3=1;
com2=0;
port_led=display_disappear;
delay(300);
com2=1;
com1=0;
port_led=tab_dp[disassemble_BCD(hour_temp,0)];
delay(300);
com1=1;
com0=0;
port_led=tab[disassemble_BCD(hour_temp,1)];
delay(300);
com0=1;
}
if(flag_display==2)
{
com3=0;
port_led=tab[disassemble_BCD(min_temp,0)];
delay(300);
com3=1;
com2=0;
port_led=tab[disassemble_BCD(min_temp,1)];
delay(300);
com2=1;
com1=0;
port_led=display_disappear;
delay(300);
com1=1;
com0=0;
port_led=display_disappear;
delay(300);
com0=1;
}
if(flag_display==3)
{
com3=0;
port_led=tab[disassemble_BCD(min_alarm,0)];
delay(300);
com3=1;
com2=0;
port_led=tab[disassemble_BCD(min_alarm,1)];
delay(300);
com2=1;
com1=0;
port_led=tab_dp[disassemble_BCD(hour_alarm,0)];
delay(300);
com1=1;
com0=0;
port_led=tab[disassemble_BCD(hour_alarm,1)];
delay(300);
com0=1;
}
if(flag_display==4)
{
com3=0;
port_led=display_disappear;
delay(300);
com3=1;
com2=0;
port_led=display_disappear;
delay(300);
com2=1;
com1=0;
port_led=tab_dp[disassemble_BCD(hour_alarm,0)];
delay(300);
com1=1;
com0=0;
port_led=tab[disassemble_BCD(hour_alarm,1)];
delay(300);
com0=1;
}
if(flag_display==5)
{
com3=0;
port_led=tab[disassemble_BCD(min_alarm,0)];
delay(300);
com3=1;
com2=0;
port_led=tab[disassemble_BCD(min_alarm,1)];
delay(300);
com2=1;
com1=0;
port_led=display_disappear;
delay(300);
com1=1;
com0=0;
port_led=display_disappear;
delay(300);
com0=1;
}
if(sec_temp!=sec)
{
switch(light_count)
{case 0:light1=0;light0=1;break;
case 1:light0=0;light1=1;break;
default:break;
}
light_count++;
light_count=light_count%2;
sec_temp=sec;
min_temp=min;
hour_temp=hour;
if((hour_temp==hour_alarm)&&(min_temp==min_alarm)&&(sec_temp==sec_alarm))
{TR1=1;}
}
}
void timer_0() interrupt 1 using 2
{
EA=0;
count_timer0++;
if(count_timer0>=10)
{
TH0=15536/256;
TL0=15536%256;
count_timer0=0;
if(flag_set==1)
switch(flag_display)
{
case 0:flag_display=1;break;
case 1:flag_display=0;break;
default:break;
}
if(flag_set==2)
switch(flag_display)
{
case 0:flag_display=2;break;
case 2:flag_display=0;break;
default:break;
}
if(flag_set==4)
switch(flag_display)
{
case 3:flag_display=4;break;
case 4:flag_display=3;break;
default:break;
}
if(flag_set==5)
switch(flag_display)
{
case 3:flag_display=5;break;
case 5:flag_display=3;break;
default:break;
}
}
EA=1;
}
void timer_1() interrupt 3 using 2
{
EA=0;
TH1=15536/256;
TL1=15536%256;
count_rect++;
if(bee_flag==1)
{
alarm=1;
bee=1;
if(count_rect>=3)
{
bee_flag=0;
bee=0;
alarm=0;
TR1=0;
count_rect=0;
}
}
else
{
if(count_rect>=8)
{
alarm=!alarm;
bee=!bee;
count_rect=0;
count_bee++;
if(count_bee>=64)
{TR1=0;bee=0;alarm=0;count_bee=0;light_combo=0;}
}
}
EA=1;
}
void key_scan(void)
{
ptr_key=0;
flag_key=0;
key0=1;
key1=1;
if(key0==0){flag_key=1;ptr_key=0;}
if(key1==0){flag_key=1;ptr_key=1;}
}
void key_check(void)
{
if(flag_key==1)
{
TR1=0;
bee_flag=1;
TR1=1;
if(ptr_key==0)
{
flag_set++;
flag_set=flag_set%6;
switch(flag_set)
{
case 0: flag_display=0;TR0=0;light_combo=0;break;
case 1: flag_display=0;TR0=1;break;
case 2: flag_display=0;TR0=1;break;
case 3: flag_display=3;TR0=0;light_combo=1;break;
case 4: flag_display=3;TR0=1;break;
case 5: flag_display=3;TR0=1;break;
default:break;
}
delay(100);
while(key0==0);
}
else
{
DSA=0x0f;
DSB=0x82;
sec_alarm=0;
switch(flag_set)
{
case 0:break;
case 1:{
min_buffer=min;
min_buffer++;
if((min_buffer&0x0f)>=10)
min_buffer=min_buffer+0x06;
if(min_buffer>=96)
min_buffer=0;
min=min_buffer;
break;
}
case 2:{
hour_buffer=hour;
hour_buffer++;
if((hour_buffer&0x0f)>=10)
hour_buffer=hour_buffer+0x06;
if(hour_buffer>=36)
hour_buffer=0;
hour=hour_buffer;
break;
}
case 3:break;
case 4:{
min_buffer_alarm=min_alarm;
min_buffer_alarm++;
if((min_buffer_alarm&0x0f)>=10)
min_buffer_alarm=min_buffer_alarm+0x06;
if(min_buffer_alarm>=96)
min_buffer_alarm=0;
min_alarm=min_buffer_alarm;
break;
}
case 5:{
hour_buffer_alarm=hour_alarm;
hour_buffer_alarm++;
if((hour_buffer_alarm&0x0f)>=10)
hour_buffer_alarm=hour_buffer_alarm+0x06;
if(hour_buffer_alarm>=36)
hour_buffer_alarm=0;
hour_alarm=hour_buffer_alarm;
break;
}
default:break;
}
DSB=0x22;
DSA=0x2f;
delay(100);
while(key1==0);
}
}
}
void main(void)
{
com0=0;
com1=0;
com2=0;
com3=0;
key0=1;
key1=1;
light0=0;
light1=0;
light_combo=0;
bee=0;
alarm=0;
count_rect=0;
count_bee=0;
flag_display=0;
count_timer0=0;
flag_set=0;
TH0=15536/256;
TL0=15536%256;
TH1=15536/256;
TL1=15536%256;
TMOD=0x11;
ET0=1;
ET1=1;
EA=1;
PT0=1;
TR0=0;
TR1=0;
delay(50000);
while(1)
{
scan();
key_scan();
key_check();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -