📄 clock.c
字号:
/*****Written by yians*****/
#include <absacc.h>
#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define LED5 XBYTE [0xA000] //数码管地址
#define LED6 XBYTE [0xA001]
#define LED7 XBYTE [0xA002]
#define LED8 XBYTE [0xA003]
#define LED1 XBYTE [0xA004]
#define LED2 XBYTE [0xA005]
#define LED3 XBYTE [0xA006]
#define LED4 XBYTE [0xA007]
#define KEY XBYTE [0xA100] //键盘地址
/*扫描键盘使用的变量 */
sbit first_row = P1^4; //键盘第一行控制
sbit second_row = P1^3; //键盘第二行控制
bit first_getkey = 0,control_readkey = 0; //读键盘过程中的标志位
bit getkey = 0; //获得有效键值标志位 等于1时代表得到一个有效键值
bit keyon = 0; //防止按键冲突标志位
uchar keynum = 0; //获得的有效按键值寄存器
uchar hour,minute,second,aorp,bell,bell_count2,aorc,mode,ahour,aminute,aaorp;//
unsigned int count,bell_count1,count1,count2,alarm_count1,alarm_count2;
bit bell_on = 0;//响铃标志位
bit alarm_on = 0;//闹铃标志位
/*数码管显示使用的变量和常量*/
uchar lednum = 0; //数码管显示位控制寄存器
uchar led[8] = {0,0,0,0,0,0,0,0}; //数码管显示内容寄存器
uchar code segtab[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff}; //七段码段码表
// "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "P" ,"black"
void leddisp(void); //数码管显示函数
void readkey(void); //读键盘函数
void flash1(void);//时钟设置闪烁
void flash2(void);//闹钟设置闪烁
void alarm(void);//闹铃
void intT0() interrupt 1 //T0 定时中断处理函数
{
TH0 = -2300/256;//1ms
TL0 = -2300%256;
count++;
if (count==1000)
{
count=0;
second++;
if(second>=60)
{
second=0;
minute++;
if (minute>=60)
{
minute=0;
bell_on = 1;
hour++;
if (hour>=12)
{
if(aorp==0x0a)//上午
{
aorp = 0x10;
}
else//下午
{
aorp = 0x0a;
}
second=0;
minute=0;
hour=0;
}
}
}
if (aorc==0)
{
if (mode==0)
{
led[2]=aorp;
led[4]=second%10;
led[5]=second/10;
led[6]=minute%10;
led[7]=minute/10;
led[0]=hour%10;
led[1]=hour/10;
}
}
}
if (aorc==1)
{
if (mode==0)
{
led[0]=aaorp;
led[4]=aminute%10;
led[5]=aminute/10;
led[6]=ahour%10;
led[7]=ahour/10;
led[1]=0x11;
led[2]=0x11;
}
}
flash1();
flash2();
alarm();
if (bell_on == 1)
{
if (bell_count2!=0)
{
bell_count1++;
if (bell_count1<250)//0。5秒亮一次,一次0.25秒
{bell = 0x11;}
else if (bell_count1<500)
{bell = 0x08;}
else
{
bell_count1 = 0;
bell_count2--;
}
led[3] = bell;
}
else
{
bell_on = 0;
bell_count2 = 10;
led[3] = 0x11;
}
}
leddisp(); //每次定时中断显示更新一次
if(control_readkey == 1) //每两次定时中断扫描一次键盘
{
readkey();
}
control_readkey = !control_readkey;
}
void main(void)
{
TMOD = 0x01; //
TH0 = -2300/256; //定时器中断时间间隔 1ms
TL0 = -2300%256;
TCON = 0x10;
ET0 = 1;
EA = 1;
count = 0;
count1 = 0;
count2 = 0;
second = 0;
minute = 0;
hour = 0;
aorp = 0x0a;
bell = 0x11;
bell_count1 = 0;//count1用来设定2hz的频率
bell_count2 = 10;//count2用来设定显示的次数
alarm_count1 = 0;//count1用来设定1hz的频率
alarm_count2 =10;//count2用来设定显示的次数
led[3] = bell;
aorc=0;
mode=0;
aaorp= 0x10;
ahour = 0;
aminute =0;
while(1)
{
if(getkey == 1) //判断是否获得有效按键
{
getkey = 0;
if(keynum == 0)
{
if (aorc==0)
{
aorc=1;
mode=0;
}
else {aorc=0;mode=0;}
}
if(keynum == 1)
{
if (aorc==0)
{
if (mode==3)
{
mode=0;
}
else {mode++;}
}
else
{
if (mode==2)
{
mode=0;
}
else {mode++;}
}
}
if(keynum==2)
{
if (aorc==0)
{
switch (mode)
{
case 0x00:break;
case 0x01:
second++;
if(second==60)
{second=0;}
break;
case 0x02:
minute++;
if(minute==60)
{minute=0;}
break;
case 0x03:
hour++;
if(hour>=12)
{
if(aorp == 0x0a)
{
hour = 0;
aorp = 0x10;
}
else
{
hour = 0;
aorp = 0x0a;
}
}
break;
default: break;
}
}
if (aorc==1)
{
switch (mode)
{
case 0x00:break;
case 0x01:
aminute++;
if(aminute==60)
{aminute=0;}
break;
case 0x02:
ahour++;
if(ahour>=12)
{
if(aaorp == 0x0a)
{
ahour = 0;
aaorp = 0x10;
}
else
{
ahour = 0;
aaorp = 0x0a;
}
}
break;
default: break;
}
}
}
if(keynum==3)
{
if (aorc==0)//当前显示是时钟吗?
{
switch (mode)
{
case 0x00:break;
case 0x01:
second--;
if(second==0xff)
{second=59;}
break;
case 0x02:
minute--;
if(minute==0xff)
{minute=59;}
break;
case 0x03:
hour--;
if(hour==0xff)
{
if(aorp == 0x0a)
{
hour = 11;
aorp = 0x10;
}
else
{
hour = 11;
aorp = 0x0a;
}
}
break;
default: break;
}
}
if (aorc==1)//当前显示是闹钟吗?
{
switch (mode)
{
case 0x00:break;
case 0x01:
aminute--;
if(aminute==0xff)
{aminute=59;}
break;
case 0x02:
ahour--;
if(ahour==0xff)
{
if(aaorp == 0x0a)
{
ahour = 11;
aaorp = 0x10;
}
else
{
ahour = 11;
aaorp = 0x0a;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -