本帖最后由 環境開會看見和 于 2019-12-10 21:46 編輯
#include<reg52.h> //頭文件 #define uc unsigned char //宏定義 #define ui unsigned int //宏定義
sbit key1=P1^0;//定義調小時 sbit key2=P1^1;//定義調分鐘 sbit key3=P1^2;//定義秒清零
sbit LED=P1^6;//定義LED sbit beep=P1^7;//設蜂鳴器
uc min,hour,sec,led,num; //無符號字符型變量
bit bdata hourLED,halfLED,hourbeep,halfbeep; //位變量
//uc code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰極編碼 uc code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽級編碼
void delay(ui x)//1ms延時函數 { ui i,j; for(i=0;i<x;i++) for(j=0;j<121;j++); } void display() //掃描顯示函數,高位到低位 {
P0=tab[hour/10]; //給小時的十位送形 P2=0x01; //1000 0000 共陽打開位選 共陽需要接高電平才亮 delay(1); //延時動態掃描 P2=0x00; //共陽的 關閉位選
/*P3=0xfe; //1111 1110 共陰打開位選 共陰需要接低電平才亮 delay(1); P3=0xff; //共陰的 關閉位選 */
P0=(tab[hour%10]); //|0x80;*//給第二位后加“點 P2=0x02; //0100 0000 delay(1); P2=0x00;
/*P3=0xfd; //1111 1101 共陰 delay(1); P3=0xff;*/
/***********G橫杠效果***************/
P0=0xbf; // 橫杠共陽 P2=0x04; //0010 0000 delay(1); P2=0x00;
/*P2=0x40; //共陰 P3=0xfb; //1111 1011 delay(1); P3=0xff;*/ /***********G橫杠效果***************/
P0=tab[min/10]; P2=0x08; //0001 0000 delay(1); P2=0x00;
/*P3=0xf7; //1111 0111 delay(1); P3=0xff; */
P0=(tab[min%10]); /*|0x80;*/ //給第四位后加“點” P2=0x10; //0000 1000 delay(1); P2=0x00;
/*P3=0xef; //1110 1111 delay(1); P3=0xff;*/
/***********G橫杠效果***************/
P0=0xbf; //共陽 P2=0x20; //0000 0100 delay(1); P2=0x00;
/*P2=0x40; //共陰 P3=0xdf; //1101 1111 共陰 delay(1); P3=0xff;*/
/***********G橫杠效果***************/
P0=tab[sec/10]; P2=0x40; //0000 0010 delay(1); P2=0x00;
/*P3=0xbf; //1011 1111 P3=0xff; delay(1);*/
P0=tab[sec%10]; P2=0x80; //0000 0001 delay(1); P2=0x00;
/*P3=0x7f; //0111 1111 delay(1); P3=0xff;*/
}
void keyscan()//鍵盤掃描,開關接地 { if(key1==0) //如果小時加按鍵按下 { delay(5); //延時去抖 if(key1==0) //確定是否按鍵 { hour++; //小時加一 if(hour==24) //如果小時等于24 hour=0; //小時歸零 } while(!key1) display();//判斷是否松開 } if(key2==0) //如果分鐘加按鍵按下 { delay(5); //延時去抖 if(key2==0) //確定是否按鍵 { min++; //分鐘加一 if(min==60)// 如果分鐘等于60 min=0; //分鐘歸零 } while(!key2) display();//判斷是否松開 } if(key3==0)//判斷調整秒按鍵 { delay(5); //延時去抖 if(key3==0) //確定是否按鍵 {sec=0;} //秒清零 while(!key3) display();//判斷是否松開 } } void strike()//報時函數 { if((hour>6)&&(hour<22))//判斷大于6點并且小于22點 { if(sec==0)//以下判斷是否整點 { if(min==0)//如果秒和分都等于0 { hourbeep=1; //那么蜂鳴器和小燈位開啟 hourLED=1; } else if(min==30)//如果分鐘等于30 { if(num<10) //閃5下響一聲 halfbeep=1; halfLED=1; } } } else //小于6點和大于22點的時候 { if(sec==0)//以下判斷是否整點 { if(min==0)//如果分鐘等于0 hourLED=1; //led位開 else if(min==30)//如果分鐘=0 halfLED=1;//進行半點報時 } } }
void init()//初始化函數 { sec=0;//一通電,顯示12:30:00,蜂鳴器響一下 min=30; hour=12; TMOD=0x01;//設置定時器為定時器0工作方式為1 TH0=(65536-46083)/256; //賦初值 TL0=(65536-46083)%256; //賦初值 EA=1; //開總中斷 ET0=1; //開定時器0中斷 TR0=1; //啟動定時器0 }
void main()//主函數 { init();//初始化函數 while(1) //主循環 { display(); //顯示 keyscan();//掃描是否有鍵按下 strike();//報時函數 } }
|