📄 数字钟.c
字号:
//数字钟
//P3.0、P3.1、P3.2接键盘;P1口接数码管的A-H;P2口接数码管的位码。
#include <regX52.h>
sbit KB1=P3^0; //定义P3.0为按键1
sbit KB2=P3^1; //定义P3.1为按键2
sbit KB3=P3^2; //定义P3.2为按键3
unsigned char second; //定义秒钟变量
unsigned char minite; //定义分钟变量
unsigned char hour; //定义小时变量
//0-F的段码值以及-的段码值
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
//数码管的位码值
unsigned char dispbitcode[]={0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
//每个数码管的显示值
unsigned char dispbuf[8]={0,0,16,0,0,16,0,0}; //数码管上的各个数位值包括-
unsigned char dispbitcnt; //定义数组偏移变量
unsigned int tcnt; //T0计数器重复计数变量0-4000
unsigned char mstcnt; //0-8计数变量,显示延时计数变量2ms延时
unsigned char i,j;
//主程序
void main(void)
{
second=0;
minite=0;
hour=12;
TMOD=0x02; //定时/计数器T0为方式2,可自动重装载的8位计数器。
TH0=0x06; //初始化计数器为0606H,0.25ms
TL0=0x06;
TR0=1; //定时/计数器T0启动
ET0=1; //定时/计数器T0开溢出中断
EA=1; //CPU开总中断
while(1)
{
if(KB1==0) //秒钟加1按键P3.0=0时
{
for(i=5;i>0;i--)
for(j=248;j>0;j--); //按键仿抖动延时
if(KB1==0) //秒钟加1按键P3.0=0时
{
second++; //秒钟加1
if(second==60) //秒钟=60时,重新初始化秒钟
{
second=0;
}
dispbuf[0]=second%10; //秒钟的个位数字存储在dispbuf[0]
dispbuf[1]=second/10; //秒钟的十位数字存储在dispbuf[1]
while(KB1==0);
}
}
if(KB2==0) //分钟加1按键P3.1=0时
{
for(i=5;i>0;i--)
for(j=248;j>0;j--); //按键仿抖动延时
if(KB2==0) //分钟加1按键P3.0=0时
{
minite++; //分钟加1
if(minite==60) //分钟=60时,重新初始化分钟
{
minite=0;
}
dispbuf[3]=minite%10; //分钟的个位数字存储在dispbuf[3]
dispbuf[4]=minite/10; //分钟的十位数字存储在dispbuf[4]
while(KB2==0);
}
}
if(KB3==0) //小时加1按键P3.2=0时
{
for(i=5;i>0;i--)
for(j=248;j>0;j--); //按键仿抖动延时
if(KB3==0) //小时加1按键P3.2=0时
{
hour++; //小时加1
if(hour==24) //小时=24时,重新初始化小时
{
hour=0;
}
dispbuf[6]=hour%10; //小时的个位数字存储在dispbuf[6]
dispbuf[7]=hour/10; //小时的十位数字存储在dispbuf[7]
while(KB3==0);
}
}
}
}
//定时/计数器T0中断服务子程序
void t0(void) interrupt 1 using 0
{
mstcnt++; //mstcnt加1
if(mstcnt==8) //如果mstcnt=8
{
mstcnt=0; //重新初始化
P0=dispcode[dispbuf[dispbitcnt]]; //P0口输出各个数码管的段码值
P2=dispbitcode[dispbitcnt]; //P2口输出各个数码管的位码值
dispbitcnt++; //
if(dispbitcnt==8) //如果dispbitcnt=8
{
dispbitcnt=0; //重新初始化
}
}
tcnt++;
if(tcnt==4000) //一秒种时间到
{
tcnt=0; //tcnt重新初始化
second++; //秒钟加1
if(second==60) //second=60
{
second=0; //重新初始化
minite++; //分钟加1
if(minite==60) //minite=60
{
minite=0; //重新初始化
hour++; //小时加1
if(hour==24) //hour=24
{
hour=0; //重新初始化
}
}
}
dispbuf[0]=second%10; //秒钟的个位数字存储在dispbuf[0]
dispbuf[1]=second/10; //秒钟的十位数字存储在dispbuf[1]
dispbuf[3]=minite%10; //分钟的个位数字存储在dispbuf[3]
dispbuf[4]=minite/10; //分钟的十位数字存储在dispbuf[4]
dispbuf[6]=hour%10; //小时的个位数字存储在dispbuf[6]
dispbuf[7]=hour/10; //小时的十位数字存储在dispbuf[7]
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -