源程序:
#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;
}
}
}
電路圖見附件
|