题目要求:
用四个数码管完成时钟形式显示。
如显示1 2. 0 0
然后一个按键控制暂停并闪烁,另一个按键控制分钟加1
要求:当第一个按键不按下时,第二个按键无法完成加1动作。
仿真图,如下:
按键K1控制暂停闪烁,开始,K2加1
这里需要说明一下,因为没有教到时钟,时钟部分,将在下一个微博实现,其实很简单,用时钟中断即可完成,那样的时钟比较准确。
写代码之前,要仔细看仿真的接口问题,这样才能写好代码,代码如下:
#include <reg51.h>
/* 按下key1 暂停并闪烁,再按一下 继续, key2按下加1,但是key2必须在key1按下后操作*/
unsigned char c[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; // 0-9
sbit key1=P1^0;
sbit key2=P1^1;
int hour; // 小时
int min; // 分钟
void delay()
{
int i,j;
for(i=1;i<10;i++)
{
for(j=1;j<100;j++);
}
}
void display()
{
P2=0X7F;
P0=c[hour/10];
delay();
P2=0XBF;
P0=c[hour%10]&0X7F; // 第二个数码管显示时,需要有点,要注意
delay();
P2=0XDF;
P0=c[min/10];
delay();
P2=0XEF;
P0=c[min%10];
delay();
P2=0XFF;
}
void delay_2()
{
int i,j;
for(i=1;i<2;i++)
{
for(j=1;j<10;j++)
{
display();
}
}
}
void delay_3()
{
int i,j;
for(i=1;i<20;i++)
{
for(j=1;j<200;j++);
}
}
void delay_4()
{
int i,j;
for(i=1;i<100;i++)
{
for(j=1;j<100;j++);
}
}
void display_2()
{
for(hour=0;hour<24;hour++)
{
for(min=0;min<60;min++)
{
display();
if(0 == key1)
{
delay_3(); // 消抖
if(0 == key1)
{
while(1)
{
display();
delay_4();
if(0 == key1)
{
delay_3();//消抖
if(0 == key1)
{
break; // 再按key1退出闪烁
}
}
if(0 == key2)
{
delay_3();//消抖
if(0 == key2)
{
min++;// 分钟加1
if(60 == min)
{
min=0;
}
}
}
}
}
}
delay_2();
}
}
}
void main()
{
while(1)
{
display_2();
}
}
结果如下:
实验结果,不要截图,希望大家下载运行实现