1个回答
展开全部
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
/*七段共阴管显示定义*/
uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};
/*定义并初始化变量*/
uchar seconde=0;
uchar minite=0;
uchar hour=12;
uchar mstcnt=0;
sbit P1_0=P1^0; // second 调整定义
sbit P1_1=P1^1; //minite调整定义
sbit P1_2=P1^2; //hour调整定义
/*函数声明*/
void delay(uchar k ); //延时子程序
void time_pro( ); //时间处理子程序
void display( ); //显示子程序
void keyscan( ); //键盘扫描子程序
/*****************************/
/*延时子程序*/
/****************************/
void delay (uchar k)
{
uchar j;
while((k--)!=0)
{
for(j=0;j<125;j++)
{;}
}
}
/**************************/
/*时间处理子程序*/
/**************************/
void time_pro( void)
{
if(seconde==60) //秒钟设为60进制
{ seconde=0;
minite++;
if( minite==60) //分钟设为60进制
{ minite=0;
hour++;
if(hour==24) //时钟设为24进制
{hour=0; }
}
}
}
/*****************************/
/* 显示子程序*/
/*****************************/
void display(void)
{
P2=0xfe;
P0=dispcode[hour/10]; //显示小时的十位
delay(4);
P2=0xfd;
P0=(dispcode[(hour%10)])|0X80; //显示小时的个位
delay(4);
P2=0xfb;
P0=dispcode[minite/10]; //显示分的十位
delay(4);
P2=0xf7;
P0=(dispcode[minite%10])|0X80; //显示分的个位
delay(4);
P2=0xef;
P0=dispcode[seconde/10]; //显示秒的十位
delay(4);
P2=0xdf;
P0=dispcode[seconde%10]; //显示秒的个位
delay(4);
}
/*******************************/
/*键盘扫描子程序*/
/*******************************/
void keyscan (void)
{
if(P1_0==0) //按键1秒的调整
{
delay(30);
if(P1_0==0)
{
seconde++;
if(seconde==60)
{seconde=0; }
}
}
if(P1_1==0) //按键2分的调整
{
delay(30);
if(P1_1==0)
{
minite++;
if(minite==60)
{minite=0;}
}
}
if(P1_2==0) //按键3小时的调整
{
delay(30);
if(P1_2==0)
{
hour++;
if(hour==24)
{hour=0; }
}
}
}
void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次
{
TH0=0x3c;
TMOD = 0x11;
mstcnt++;
if(mstcnt==20)
{
seconde++;
mstcnt=0; //注意点。对计数单元的清零十分的重要,本次调试中就是
} //因为忽略了这一点,给我早成了很大的被动。
}
/**************************/
/*主函数*/
/**************************/
void main(void)
{ P1=0xff; //初始化p1口,全设为1
TMOD = 0x11; //time0为定时器,方式1
TH0=0x3c; //预置计数初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
while (1)
{
keyscan( ); //按键扫描
time_pro( ); //时间处理
display( ); //显示时间
}
}
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
/*七段共阴管显示定义*/
uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};
/*定义并初始化变量*/
uchar seconde=0;
uchar minite=0;
uchar hour=12;
uchar mstcnt=0;
sbit P1_0=P1^0; // second 调整定义
sbit P1_1=P1^1; //minite调整定义
sbit P1_2=P1^2; //hour调整定义
/*函数声明*/
void delay(uchar k ); //延时子程序
void time_pro( ); //时间处理子程序
void display( ); //显示子程序
void keyscan( ); //键盘扫描子程序
/*****************************/
/*延时子程序*/
/****************************/
void delay (uchar k)
{
uchar j;
while((k--)!=0)
{
for(j=0;j<125;j++)
{;}
}
}
/**************************/
/*时间处理子程序*/
/**************************/
void time_pro( void)
{
if(seconde==60) //秒钟设为60进制
{ seconde=0;
minite++;
if( minite==60) //分钟设为60进制
{ minite=0;
hour++;
if(hour==24) //时钟设为24进制
{hour=0; }
}
}
}
/*****************************/
/* 显示子程序*/
/*****************************/
void display(void)
{
P2=0xfe;
P0=dispcode[hour/10]; //显示小时的十位
delay(4);
P2=0xfd;
P0=(dispcode[(hour%10)])|0X80; //显示小时的个位
delay(4);
P2=0xfb;
P0=dispcode[minite/10]; //显示分的十位
delay(4);
P2=0xf7;
P0=(dispcode[minite%10])|0X80; //显示分的个位
delay(4);
P2=0xef;
P0=dispcode[seconde/10]; //显示秒的十位
delay(4);
P2=0xdf;
P0=dispcode[seconde%10]; //显示秒的个位
delay(4);
}
/*******************************/
/*键盘扫描子程序*/
/*******************************/
void keyscan (void)
{
if(P1_0==0) //按键1秒的调整
{
delay(30);
if(P1_0==0)
{
seconde++;
if(seconde==60)
{seconde=0; }
}
}
if(P1_1==0) //按键2分的调整
{
delay(30);
if(P1_1==0)
{
minite++;
if(minite==60)
{minite=0;}
}
}
if(P1_2==0) //按键3小时的调整
{
delay(30);
if(P1_2==0)
{
hour++;
if(hour==24)
{hour=0; }
}
}
}
void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次
{
TH0=0x3c;
TMOD = 0x11;
mstcnt++;
if(mstcnt==20)
{
seconde++;
mstcnt=0; //注意点。对计数单元的清零十分的重要,本次调试中就是
} //因为忽略了这一点,给我早成了很大的被动。
}
/**************************/
/*主函数*/
/**************************/
void main(void)
{ P1=0xff; //初始化p1口,全设为1
TMOD = 0x11; //time0为定时器,方式1
TH0=0x3c; //预置计数初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
while (1)
{
keyscan( ); //按键扫描
time_pro( ); //时间处理
display( ); //显示时间
}
}
追问
需要汇编语言,而且只有4个数码管显示时和分的。秒用发光二极管闪烁来计的。不过还是谢谢大神
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
上海矽旭微电子
2024-12-16 广告
2024-12-16 广告
数字IC学习资料丰富多样,涵盖基础知识到高级应用。初学者可从《数字电子技术基础》等教材入手,掌握数电基础、硬件描述语言(如Verilog)及计算机组成原理。进阶学习可探索SoC设计方法、静态时序分析(STA)、SystemVerilog及U...
点击进入详情页
本回答由上海矽旭微电子提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询