📄 digital clock.txt
字号:
#include <REGX51.H> //调用特殊功能寄存器
#define TIMER0_COUNT 0XEE18 /*10000h-(12,000,000/(12*200)) */ //对定时器T0进行初始化,让T0每一秒中断200次
#define TRUE 1 //定义TRUE为1
#define FALSE 0 //定义FALSE为0
#define DISPLAY 0 //定义DISPALY为0
#define SET 1 //定义SET为1
#define TIMES 25 //定义TIMES为25
const seven_seg[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0-9的七段字形码
const scan[4]={0X0E,0X0D,0X0B,0X07}; //定义四个七段显示器轮流亮的顺序
typedef struct{ //定义一个时间结构体
char hour ; //定义字符小时
char minite ; //定义字符分钟
char second; //定义字符秒
}time;
unsigned char timer0_tick,i=0,keyA=0,keyB=0,mode=0; //定义字符变量timer0_tick,i=0,keyA=0,keyB=0,mode=0
time now; //定义时间变量now
static void timer0_isr(void) interrupt TF0_VECTOR using 1 //T0中断函数
{
TRO=0; //中断停止 *********************
TL0=(TIMER0_COUNT & 0x00FF); //加载T0的低8位 *利用keyA=times来消除键盘
TH0=(TIMER0_COUNT >> 8); //加载T0的高8位 *的抖动
TR0=1; //中断开始 *同样利用keyB=times来消除
if(keyA!=0){ //如果keyA不等于0 *键盘的抖动
keyA--; //那么keyA自减 *
if(keyA==0&&P2_0==0){ //如果keyA等于0同时P2_0等于0 *每按一次keyB加一分钟,当加满
mode++; //mode(模式)自增 *60时,小时加1,小时加到24的时候
if(mode==2) mode=0; //如果mode等于2则mode等于0 *小时也变为0
} *
}else if(P2_0==0) keyA=TIMES; //如果P2_0=0,则keyA=25 **********************
if(keyB!=0){ //如果keyB!=0
keyB--; //keyB自减
if(keyB==0&&P2_1==0){ //如果keyB=0同时P2_0=0
now.minute++; //now.minute自增
if(now.minute==60){ //如果now.minute=60
now.hour++; //now。hour自增
now.minute=0; //now.minute=0
if(now.hour==24) now.hour=0; //如果now.hour=24,now.hour=0
}
}
}else if(P2_1==0) keyB=TIMES; //如果P2_1=0,则keyB=25
time0_tick++; //time0_tick自增
if(timer0_tick==200){ //如果time0_tick=200
timer0_tick=0; //time0_tick=0
now.second++; //秒自增1
if(now.second==60){ //秒=60时
now.minute++; //分钟自增1
now.second=0; //秒=0
if(now.minute==60){ //分钟=60时
now.minute=0; //分钟=0
now.hour++; //小时自增1
if(now.hour==24) now.hour=0; //小时=24时,小时=0
}
}
}
switch(mode){
case DISPLAY: //当模式为显示的时候
switch(i){ //变量为i
case 0:P1=seven_seg[now.minute%10]; //显示分钟的个位
P1_7=(now.second%2); //当秒为偶数的时候,分钟个位的小数点亮
break; //跳出
case 1:P1=seven_seg[now.minute/10]; //显示分钟的十位
break; //跳出
case 2:P1=seven_seg[now.hour%10]; //显示小时的个位
P1_7=0; //小时的个位的小数点亮
break; //跳出
case 3:P1=seven_seg[now.hour/10]; //显示小时的十位
break; //跳出
}
break; //跳出
case SET: //当模式为设置的时候
switch(i){
case 0:if(now.second%2) P1=seven_seg[now.minute%10]; //如果秒为奇数,则分钟个位数码管显示相应的字形码
else P1=0XFF; //如果秒为偶数,则分钟个位数码管不亮
break; //跳出
case 1:if(now.second%2) P1=seven_seg[now.minute/10]; //如果秒为奇数,则分钟十位数码管显示相应的字形码
else P1=0XFF; //如果秒为偶数,则分钟十位数码管不亮
break; //跳出
case 2:if(now.second%2) P1=seven_seg[now.hour%10]; //如果秒为奇数,则小时个位数码管显示相应的字形码
else P1=0XFF; //如果秒为偶数,则小时个位数码管不亮
break; //跳出
case 3:if(now.second%2) P1=seven_seg[now.hour/10]; //如果秒为奇数,则小时十位数码管显示相应的字形码
else P1=0XFF; //如果秒为偶数,则小时十位数码管不亮
break; //跳出内嵌套的switch case
}
break; //跳出外嵌套的switch case
}
P0=scan[i]; //P0输出四个七段数码管的相应的一个数码管显示相应的字形码
i++; //i自增,i的值决定哪个数码管亮
if(i==4) i=0; //如果i=4,则i=0
}
static void timer0_initialize(void){ //timer0初始化
EA=0; //cpu总中断关
timer0_tick=0; //timer0_tick=0
TR0=0; //中断停止
TMOD&=0XF0; //对定时器T0初始化
TMOD |=0X01; //定义T0工作在方式1,为16位定时器/计数器
TL0=(TIMER0_COUNT & 0x00FF); //T0低八位初始化
TH0=(TIMER0_COUNT >> 8); //T0高八位初始化
PT0=0; //P0优先级为低
ET0=1; //T0中断允许
TR0=1; //T0中断开始
EA=1; //cpu总中断开始
}
void main(void){
timer0_initialize(); //timer0初始化
while(1); //无限等待
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -