独立按键控制由数码管显示的时钟加减代码
时间: 2023-10-01 13:05:37 浏览: 90
好的,以下是独立按键控制由数码管显示的时钟加减的代码:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key_add=P3^2; //加时间按键
sbit key_sub=P3^3; //减时间按键
uchar sec=0,min=0,hour=0; //秒、分、时
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void display()
{
P0=0x00; //清空 P0
switch(hour/10) //显示十位小时
{
case 0:P0|=0x3f;break;
case 1:P0|=0x06;break;
case 2:P0|=0x5b;break;
case 3:P0|=0x4f;break;
case 4:P0|=0x66;break;
case 5:P0|=0x6d;break;
case 6:P0|=0x7d;break;
case 7:P0|=0x07;break;
case 8:P0|=0x7f;break;
case 9:P0|=0x6f;break;
}
delay(5);
P0=0x00; //清空 P0
switch(hour%10) //显示个位小时
{
case 0:P0|=0x3f;break;
case 1:P0|=0x06;break;
case 2:P0|=0x5b;break;
case 3:P0|=0x4f;break;
case 4:P0|=0x66;break;
case 5:P0|=0x6d;break;
case 6:P0|=0x7d;break;
case 7:P0|=0x07;break;
case 8:P0|=0x7f;break;
case 9:P0|=0x6f;break;
}
P2=0xfe;delay(5);P2=0xff; //选择第一位数码管
P0=0x00; //清空 P0
switch(min/10) //显示十位分钟
{
case 0:P0|=0x3f;break;
case 1:P0|=0x06;break;
case 2:P0|=0x5b;break;
case 3:P0|=0x4f;break;
case 4:P0|=0x66;break;
case 5:P0|=0x6d;break;
}
P2=0xfd;delay(5);P2=0xff; //选择第二位数码管
P0=0x00; //清空 P0
switch(min%10) //显示个位分钟
{
case 0:P0|=0x3f;break;
case 1:P0|=0x06;break;
case 2:P0|=0x5b;break;
case 3:P0|=0x4f;break;
case 4:P0|=0x66;break;
case 5:P0|=0x6d;break;
case 6:P0|=0x7d;break;
case 7:P0|=0x07;break;
case 8:P0|=0x7f;break;
case 9:P0|=0x6f;break;
}
P2=0xfb;delay(5);P2=0xff; //选择第三位数码管
P0=0x00; //清空 P0
switch(sec/10) //显示十位秒钟
{
case 0:P0|=0x3f;break;
case 1:P0|=0x06;break;
case 2:P0|=0x5b;break;
case 3:P0|=0x4f;break;
case 4:P0|=0x66;break;
case 5:P0|=0x6d;break;
}
P2=0xf7;delay(5);P2=0xff; //选择第四位数码管
P0=0x00; //清空 P0
switch(sec%10) //显示个位秒钟
{
case 0:P0|=0x3f;break;
case 1:P0|=0x06;break;
case 2:P0|=0x5b;break;
case 3:P0|=0x4f;break;
case 4:P0|=0x66;break;
case 5:P0|=0x6d;break;
case 6:P0|=0x7d;break;
case 7:P0|=0x07;break;
case 8:P0|=0x7f;break;
case 9:P0|=0x6f;break;
}
}
void time_add() //时间加 1s
{
sec++;
if(sec==60)
{
sec=0;
min++;
}
if(min==60)
{
min=0;
hour++;
}
if(hour==24)
{
hour=0;
}
}
void time_sub() //时间减 1s
{
if(sec==0)
{
sec=59;
if(min==0)
{
min=59;
if(hour==0)
{
hour=23;
}
else
{
hour--;
}
}
else
{
min--;
}
}
else
{
sec--;
}
}
void main()
{
TMOD=0x01; //设置计时器 0 为模式 1
TH0=(65536-45872)/256;TL0=(65536-45872)%256; //设置计时器 0 的初值,使其中断时间为 1s
ET0=1;EA=1; //开启计时器 0 中断和总中断
TR0=1; //启动计时器 0
while(1)
{
display(); //显示时间
if(key_add==0) //加时间按键按下
{
delay(10); //延时消抖
if(key_add==0) //再次判断是否按下
{
time_add(); //时间加 1s
}
while(!key_add); //等待按键松开
}
if(key_sub==0) //减时间按键按下
{
delay(10); //延时消抖
if(key_sub==0) //再次判断是否按下
{
time_sub(); //时间减 1s
}
while(!key_sub); //等待按键松开
}
}
}
void timer0() interrupt 1 //计时器 0 中断服务程序
{
TH0=(65536-45872)/256;TL0=(65536-45872)%256; //重新设置计时器 0 的初值,使其中断时间为 1s
time_add(); //时间加 1s
}
```
这段代码使用了 4 个共阳数码管和两个独立按键,其中一个按键用于加时间,另一个按键用于减时间。按下加时间按键,时钟会加 1s,按下减时间按键,时钟会减 1s。同时,时钟会在 4 个数码管上显示出来。注意,由于按键的按下可能会出现抖动,因此在按键检测时需要加上一定的延时,以消除抖动。
阅读全文