源程序:
#include<reg51.h>//导入包含文件
#define uchar unsigned char//无符号数据的宏定义
#define uint unsigned int
uchar code number[]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};//共阳极数码管“0~9”等字符的编码
uchar code table[]={0x07,0x0B,0x0D,0x0E};//不带小数点数码管位选编码
uchar code table2[]={0x80,0x40,0x20,0x10};//带小数点
//延时子程序
void delay(uint i) //1毫秒的循环
{
uint j;
for(i; i > 0; i--) //一次for循环大约10微秒
for(j = 110; j > 0; j--); //110~120次循环大约1毫秒
}
//数码管显示函数
void display_CA(uchar num,uchar tab)
{
P2=table2[tab];//通过p2口选择显示的位
P0=~number[num];];//通过p0口显示出数字
}
void keyscan(uint *A,uint *C)//调用按键扫描函数
{
uchar key;
P1=0xff;
key=P1;
key=~key;//对端口值取反
switch(key)
{
case 1: *A=0;*C=0;break;//p1.0按下时,对变量A和A的增量c为零
case 2: *C=!*C;break;//p1.1按下,使增量c为零
default:break;
}
}
void main()
{
uint B=0,A=0,A1,C;
int jj;//定义变量jj。在后面的for循环中作计数用
while(1)//while循环语句,1表示始终为真,一直循环
{
C=1;
for(B=0;B<=3600;B++)
{
A1=A/60*100+A%60;//把秒转换成分
for(jj=0;jj<41;jj++)
{
delay(7);//延时,使得从视觉上看到灯的亮灭
display_CA(A1/1000,3); delay(4); //在数码管上显示结果,将计算结果a的个十百千位取出,分别显示在四位的数码管上
display_CA(A1/100%10,2); delay(4);
display_CA(A1/10%10,1); delay(4);
display_CA(A1%10,0); delay(4);
display_CA(10,2); delay(4);
}、
if((P1&0xff)!=0xff)//判断p1是否按下,调用按键扫描函数
{
delay(1);//延时消抖
if((P1&0xff)!=0xff)
{
keyscan(&A,&C);
}
}
A=A+C;
}
}
}
电路图见附件
|