亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? shizhongxiugai_v1.c

?? 89c51的數字鐘程序
?? C
字號:
#include <reg51.h>
#include <absacc.h>

/**************在設置模式下對秒分時的宏定義*****************/
#define SECOND 0   /*對應數碼管右邊兩位*/
#define MINUTE 1   /*對應數碼管中間兩位*/
#define HOUR 2     /*對應數碼管左邊兩位*/

/********************定義三種工作模式***********************/
#define CLOCK clockstr /*時鐘模式*/
#define DATE datestr   /*日期模式*/
#define TIMER timerstr /*秒表模式*/

/****************以下是所有子函數的聲明*********************/
void sys_init(void);                    /*系統的初始化程序*/
void display(void);   /*動態刷新一次數碼管子程序*/
void clockplus(void);   /*時間加1S對分時日月年進位的子程序*/
void timerplus(void);   /*秒表走時加1/100秒子程序*/
void update_clockstr(void);  /*更新時間顯示編碼*/
void update_datestr(void);   /*更新日期顯示編碼*/
void update_timerstr(void);  /*更新秒表時間的顯示編碼*/
void delay(int);    /*延時子程序*/
void update_dispbuf(unsigned char *);  /*更新顯示緩沖區*/
void getkeycode(void);  /*獲取鍵值子程序*/
unsigned char getmonthdays(unsigned int,unsigned char);/*計算某月的天數子程序*/

/*功能鍵功能子函數*/
void Akey(void);    /*當前設置位+1 開關秒表*/
void Bkey(void);    /*當前設置位-1*/
void Ckey(void);    /*設置位選擇  秒表清零*/
void Dkey(void);    /*切換三種工作模式*/

/**********************全局變量聲明部分*********************/
unsigned char led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*從0~9的LED編碼*/

struct{        /*時間結構體變量*/
 unsigned char s;
 unsigned char m;
 unsigned char h;
 }clock={30,59,23};

struct{                                 /*日期結構體變量*/
        unsigned char year;
        unsigned char month;
        unsigned char day;
        }date={7,1,1};

struct{                                 /*秒表時間結構體變量*/
        unsigned char ms;
        unsigned char s;
        unsigned char m;
        }timer={0,0,0};

sfr p0=0x80;
sfr p1=0x90;
sfr p2=0xa0;
sbit p10=P1^0;
sbit p11=P1^1;
sbit p12=P1^2;
sbit p13=P1^3;

unsigned char dispbuf[6]; /*顯示緩沖區數組*/
unsigned char clockstr[6];/*時間顯示的數碼管編碼數組*/
unsigned char datestr[6]; /*日期顯示的數碼管編碼數組*/
unsigned char timerstr[6];/*秒表顯示的數碼管編碼數組*/

unsigned int itime=0,idot=0;/*定時器0中斷計數,秒表小數點閃爍控制*/
unsigned char itime1=0;   /*定時器1中斷計數*/

bdata bit IsSet=0;  /*設置模式標志位 0:正常走時 1:設置模式*/
unsigned char SetSelect; /*在設置模式IsSet=1時,正在被設置的位*/
unsigned char *CurrentMode; /*標志當前正設置的功能,如CurrentMode=CLOCK等*/

void main(void)
{
    sys_init();
    while(1)
     {
      while(p10&&p11&&p12&&p13==1) /*檢測是否有鍵按下,無則一直進行LED的刷新顯示*/
            display();
      getkeycode();  /*有鍵按下時得到鍵值,并送入鍵值處理程序*/
      display();
     }
}

void sys_init(void)
{p1=0xff;     /*寫1以便讀按鍵*/
 p2=0xff;     /*LED全滅*/
 TMOD=0x22;  /*定時器0和1都設置為工作方式2,基準定時250×1us=250us=0.25ms*/
 TH0=6;          /*定時器0中斷服務用來產生1秒時鐘定時及鬧鐘蜂鳴器蜂鳴脈沖*/
 TL0=6;          /*定時器1中斷服務留給秒表使用,產生1/100秒定時*/
 TH1=6;
 TL1=6;
 ET0=1;     /*定時器0允許*/
 ET1=1;     /*定時器1允許*/
 EA=1;      /*cpu允許中斷*/
 TR0=1;     /*定時器0開始計時*/
 TR1=0;     /*秒表缺省為停止*/
 update_clockstr();       /*初始化時鐘顯示編碼數組*/
 update_datestr();        /*初始化日期顯示編碼數組*/
 update_timerstr();       /*初始化秒表顯示編碼數組*/
 CurrentMode=CLOCK;       /*默認的顯示摸式為時鐘*/
 update_dispbuf(CurrentMode);        /*初始化顯示緩沖數組*/
 display();
}

void timer0(void) interrupt 1 using 1  /*定時器0中斷服務器,用來產生1秒定時*/
{
 itime++;
 if(itime==2000)
  {
   if(IsSet)  /*在設置模式下,對正在設置的位閃爍顯示*/
    {
     dispbuf[SetSelect*2]=0x80;  /*對正在設置的位所對應的顯示緩沖區元素賦0,使LED滅,只顯示小數點*/
     dispbuf[SetSelect*2+1]=0;
    }
  }
 if(itime==4000)   /*兩千次計數為1S  4000×0.25ms=1s*/
  {
   itime=0;   /*定時1s時間到,軟計數清零*/
   clockplus();   /*時間結構體變量秒數加1 */
   update_clockstr();  /*更新時間顯示編碼數組 */
   update_datestr();   /*更新日期顯示編碼*/
   if(CurrentMode!=TIMER) update_dispbuf(CurrentMode);
  }
}

void timer1(void) interrupt 3 using 2    /*定時器1中斷服務器,用來產生1/100秒定時*/
{
 idot++;
 if(++itime1==40)       /*40*0.25ms=10ms*/
  {
   itime1=0;
   timerplus();
   update_timerstr();
   if(CurrentMode==TIMER) update_dispbuf(CurrentMode);
   else
    {
     if(idot<2000)                  /*閃爍顯示小數點*/
      {
       dispbuf[2]=dispbuf[2]|0x80;
       dispbuf[4]=dispbuf[4]|0x80;
      }
     else
      {dispbuf[2]=dispbuf[2]&0x7f;  /*關閉小數點的顯示*/
       dispbuf[4]=dispbuf[4]&0x7f;
      }
    }
  }
 if(idot==4000) idot=0;
}

void clockplus(void)  /*時間加1s判斷分,時,日,月,年子函數*/
{
 if(++clock.s==60)  /*秒位判斷*/
 {
  clock.s=0;
  if(++clock.m==60) /*分位判斷*/
  {
   clock.m=0;
   if(++clock.h==24) /*時位判斷*/
   {
    clock.h=0;
    if(++date.day==(getmonthdays(date.year,date.month)+1))
     {
      date.day=1;
      if(++date.month==13)
      {date.month=1;
       if(++date.year==100) date.year=0;
      }
     }
   }
  }
 }
}

/*秒表功能子模塊*/
void timerplus()        /*秒表1/100秒位加1,判斷秒、分子程序*/
{
 if(++timer.ms==100)
 {
  timer.ms=0;
  if(++timer.s==60)
   {
    timer.s=0;
    if(++timer.m==60) timer.m=0;
   }
 }
}

void update_clockstr(void) /*更新時鐘顯示代碼數組clockstr*/
{
 clockstr[0]=led[clock.s%10];  /*給元素0賦相應數碼管顯示編碼,編碼序號是秒數的個位*/
 clockstr[1]=led[(int)(clock.s/10)]; /*給元素1賦相應數碼管顯示編碼,編碼序號是秒數的十位*/
 clockstr[2]=led[clock.m%10];  /*以下類推*/
 clockstr[3]=led[(int)(clock.m/10)];
 clockstr[4]=led[clock.h%10];
 clockstr[5]=led[(int)(clock.h/10)];
}

void update_datestr(void)       /*更新日期顯示代碼數組datestr*/
{
 datestr[0]=led[date.day%10];
 datestr[1]=led[(int)(date.day/10)];
 datestr[2]=led[date.month%10];
 datestr[3]=led[(int)(date.month/10)];
 datestr[4]=led[date.year%10];
 datestr[5]=led[(int)(date.year/10)];
}

void update_timerstr(void)      /*更新秒表顯示代碼數組timerstr*/
{
 timerstr[0]=led[timer.ms%10];
 timerstr[1]=led[(int)(timer.ms/10)];
 timerstr[2]=led[timer.s%10];
 timerstr[3]=led[(int)(timer.s/10)];
 timerstr[4]=led[timer.m%10];
 timerstr[5]=led[(int)(timer.m/10)];
}

void display(void)        /*刷新顯示六位LED一次*/
{unsigned char i;
 for(i=0;i<6;i++,p2=0xff)
 {p0=dispbuf[i];
  switch(i)
  {case 0: p2=0xfe;delay(50);break;
   case 1: p2=0xfd;delay(50);break;
   case 2: p2=0xfb;delay(50);break;
   case 3: p2=0xf7;delay(50);break;
   case 4: p2=0xef;delay(50);break;
   case 5: p2=0xdf;delay(50);break;
   default: break;
  }
 }
}

/*void update_dispbuf(unsigned char *str)    /*更新顯示緩沖區子函數,參數為要用來更新緩沖區的源字符數組的首地址*/
/*{if(strcmp(str,CLOCK)==0)
    {   dispbuf[0]=clockstr[0]; /*將要更新的源字符數組內容COPY至dispbuf數組,用作顯示緩沖區*/
/*        dispbuf[1]=clockstr[1];
        dispbuf[2]=clockstr[2]|0x80; /*默認把時位和分位后面的小數點顯示出來,根據需要再取舍*/
/*        dispbuf[3]=clockstr[3];
        dispbuf[4]=clockstr[4]|0x80;
        dispbuf[5]=clockstr[5];
    }
 else if(strcmp(str,TIMER)==0)
	{dispbuf[0]=timerstr[0];
         dispbuf[1]=timerstr[1];
         dispbuf[2]=timerstr[2]|0x80;
         dispbuf[3]=timerstr[3];
         dispbuf[4]=timerstr[4]|0x80;
         dispbuf[5]=timerstr[5];
	}
      else if(strcmp(str,DATE)==0)
            {dispbuf[0]=datestr[0];
             dispbuf[1]=datestr[1];
             dispbuf[2]=datestr[2]|0x80;
             dispbuf[3]=datestr[3];
             dispbuf[4]=datestr[4]|0x80;
             dispbuf[5]=datestr[5];
            }
} */

void update_dispbuf(unsigned char *str)    /*更新顯示緩沖區子函數,參數為要用來更新緩沖區的源字符數組的首地址*/
{
        dispbuf[0]=str[0]; /*將要更新的源字符數組內容COPY至dispbuf數組,用作顯示緩沖區*/
        dispbuf[1]=str[1];
        dispbuf[2]=str[2]|0x80; /*默認把時位和分位后面的小數點顯示出來,根據需要再取舍*/
        dispbuf[3]=str[3];
        dispbuf[4]=str[4]|0x80;
        dispbuf[5]=str[5];
}

void delay(int i)  /*延時子函數*/
{
  while(i--);
}

void getkeycode(void) /*鍵盤掃描子程序,返回獲得的鍵碼*/
{
 display();              /*用刷新數碼管顯示的時間去抖*/
 if(p10==0) Akey();       /*對當前設置位進行加一操作,如果設置秒位,則給秒位清零,秒表模式下啟閉走時*/
 else if(p11==0) Bkey();  /*對當前設置位進行減一操作,如果設置秒分,則給秒位清零,類比Akey()函數*/
       else if(p12==0) Ckey(); /*正常走時模式和設置模式的切換*/
             else if(p13==0) Dkey(); /*工作狀態切換:時鐘、日期、秒表*/
 update_dispbuf(CurrentMode);
}

unsigned char getmonthdays(unsigned int year,unsigned char month)/*得到某月的天數*/
{
 unsigned char days;
 switch (month)
 {
  case 4:
  case 6:
  case 9:
  case 11:days=30;
          break;
  case 2: if(year%4==0) days=29;
   else days=28;
          break;
  default:days=31;
          break;
 }
 return days;
}

/*功能鍵子函數部分*/
void Akey(void) /*對當前設置位進行加一操作,如果設置秒位,則給秒位清零,秒表模式啟/停秒表*/
{
 if(CurrentMode==TIMER)  /*秒表模式下啟閉走時*/
  {TR1=!TR1;
   return;
  }
 if(!IsSet) return;     /*如果不是設置模式退出*/
 switch (SetSelect)
 {
  case SECOND:if(CurrentMode==CLOCK)
               {
                clock.s=0;  /*如果當前被設置位是秒位,則清零秒位*/
                update_clockstr();
               }
              if(CurrentMode==DATE)
               {
                if(++date.day==(getmonthdays(date.year,date.month)+1)) date.day=1;
                update_datestr();
               }
              break;
  case MINUTE:if(CurrentMode==CLOCK)
               {
                if(++clock.m==60) clock.m=0; /*如果當前被設置分位,則分位加1*/
		            update_clockstr();
               }
              if(CurrentMode==DATE)
               {
                if(++date.month==13) date.month=1;
                update_datestr();
               }
              break;
  case HOUR:  if(CurrentMode==CLOCK)
               {
                if(++clock.h==24) clock.h=0; /*如果當前被設置時位,則時位加1*/
                update_clockstr();
               }
              if(CurrentMode==DATE)
               {
                if(++date.year==100) date.year=0;
                update_datestr();
               }
              break;
    default:   break;
 }
}

void Bkey(void)  /*對當前設置位進行減一操作,如果設置秒分,則給秒位清零,類比Akey()函數*/
{
        if(!IsSet) return;
 switch (SetSelect)
 {
  case SECOND:if(CurrentMode==CLOCK)
               {
                clock.s=0;
                update_clockstr();
               }
              if(CurrentMode==DATE)
               {
                if(--date.day==0x00) date.day=getmonthdays(date.year,date.month);
                update_datestr();
               }
              break;
  case MINUTE:if(CurrentMode==CLOCK)
               {
                if(--clock.m==0xff) clock.m=59;
                update_clockstr();
               }
              if(CurrentMode==DATE)
               {
                if(--date.month==0x00) date.month=12;
                update_datestr();
               }
       break;
  case HOUR:  if(CurrentMode==CLOCK)
               {
                if(--clock.h==0xff) clock.h=23;
                update_clockstr();
               }
              if(CurrentMode==DATE)
               {
                if(--date.year==0xffff) date.year=99;
                update_datestr();
               }
	      break;
  default:    break;
 }
}

void Ckey(void) /*正常走時模式和設置模式的切換*/
{
  if(CurrentMode==TIMER)
	{
        TR1=0;          /*初始化定時器1設置,停止秒表記時*/
        TH1=6;
        TL1=6;
        timer.ms=0;     /*初始化秒表數組*/
        timer.s=0;
        timer.m=0;
        update_timerstr();
	}
  else
	{
     if(IsSet==0) /*在非秒表模式下,第一次按下C鍵進入設置模式,設置時位*/
	 {
	  IsSet=1; /*置位標志位,進入設置模式 */
	  SetSelect=HOUR;
	  return;
	 }   /*第二次按C鍵設置分位,第三次按鍵設置秒位,第四次按鍵完成退出設置*/
     if(SetSelect==SECOND) /*按到第四次,即設置完秒位后,將標志位IsSet置0,完成設置*/
	 {
      IsSet=0; /*復位標志位,進入正常走時模式*/
      return;
	 }
     if(SetSelect>0) SetSelect--;    /*設置位的標志變量SetSelect=2:時位 1:分位 0:秒位*/
	}
}

void Dkey(void) /*工作狀態切換:時鐘、日期、秒表*/
{
        if(CurrentMode==CLOCK)         /*切換至日期,同時關閉設置模式*/
		    { CurrentMode=DATE;
		      IsSet=0;
          return;
        }
        if(CurrentMode==DATE)          /*切換至秒表,同時關閉設置模式*/
        { CurrentMode=TIMER;
          IsSet=0;
          return;
        }
        if(CurrentMode==TIMER)         /*切換至時鐘*/
        {
          CurrentMode=CLOCK;
          return;
        }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜电影网一区| 久久精品男人天堂av| 日韩亚洲欧美在线| 国产午夜精品久久久久久久| 一区二区高清在线| 美女mm1313爽爽久久久蜜臀| 91麻豆精品一区二区三区| 日韩美女一区二区三区| 亚洲欧美一区二区三区孕妇| 久色婷婷小香蕉久久| 欧美综合视频在线观看| 中文字幕不卡一区| 韩国女主播一区二区三区| 欧美老年两性高潮| 依依成人精品视频| 成人av片在线观看| 日韩欧美激情一区| 日韩精品一二三| 色综合婷婷久久| 最新国产成人在线观看| 懂色一区二区三区免费观看| 欧美精品一区二区三区在线播放| 日韩精品免费视频人成| 欧美影视一区在线| 亚洲色图视频网| 91色九色蝌蚪| 亚洲精品大片www| 色狠狠色狠狠综合| 亚洲色图另类专区| 91蝌蚪porny九色| 欧美电影在线免费观看| 成人精品亚洲人成在线| 欧美亚洲自拍偷拍| 久久综合99re88久久爱| 久久99久久99小草精品免视看| 欧美日韩久久不卡| 日韩和欧美一区二区三区| 欧美私模裸体表演在线观看| 性欧美大战久久久久久久久| 欧美精品在欧美一区二区少妇| 午夜久久久久久| 欧美人狂配大交3d怪物一区| 青青草91视频| 久久伊99综合婷婷久久伊| 国内精品久久久久影院色| 精品精品国产高清a毛片牛牛| 国产一区在线观看麻豆| 国产欧美久久久精品影院| 99v久久综合狠狠综合久久| 亚洲图片激情小说| 欧美三级一区二区| 美女脱光内衣内裤视频久久网站| 精品少妇一区二区三区日产乱码| 国产一区二区精品久久91| 国产精品嫩草99a| 在线看国产一区二区| 免费人成黄页网站在线一区二区 | 乱一区二区av| 久久精品在线免费观看| 91免费国产视频网站| 亚洲五码中文字幕| 欧美大片在线观看| 成人高清视频免费观看| 亚洲综合精品自拍| 亚洲精品一区二区三区福利| 成人av在线一区二区| 亚洲国产精品视频| 2024国产精品| 91网上在线视频| 久久精品国产99久久6| 国产精品麻豆网站| 欧美日韩美少妇| 国产成人免费视频| 性做久久久久久| 中文字幕国产精品一区二区| 欧美欧美午夜aⅴ在线观看| 国产精品羞羞答答xxdd| 美国十次了思思久久精品导航| 精品国产区一区| 欧美在线免费观看亚洲| 国产福利一区在线| 三级久久三级久久| 国产亚洲一区二区三区| 欧美另类久久久品| 91伊人久久大香线蕉| 另类成人小视频在线| 一区二区三区蜜桃| 国产日韩av一区| 日韩一区二区三区在线| 在线观看免费一区| 丁香婷婷深情五月亚洲| 激情亚洲综合在线| 日韩专区在线视频| 亚洲午夜激情av| 亚洲婷婷综合色高清在线| 久久久久久久久久久黄色| 56国语精品自产拍在线观看| 一本到三区不卡视频| 国产福利不卡视频| 久久99精品久久只有精品| 婷婷久久综合九色综合伊人色| 亚洲日本一区二区| 中文字幕中文在线不卡住| 久久综合成人精品亚洲另类欧美| 欧美一卡二卡三卡四卡| 欧美日韩一区二区三区高清| 欧美aaa在线| 中文字幕一区免费在线观看| 国内成人自拍视频| 国产精品毛片a∨一区二区三区| 久久久夜色精品亚洲| 精品国产自在久精品国产| 日本久久精品电影| 91女厕偷拍女厕偷拍高清| 99国产麻豆精品| 91香蕉视频污| 欧美性色aⅴ视频一区日韩精品| 色综合久久久久综合99| 91美女片黄在线观看91美女| 99在线热播精品免费| 91视视频在线观看入口直接观看www| 丁香婷婷综合五月| 99视频超级精品| 色吊一区二区三区| 欧美日韩国产一级二级| 91精品国产综合久久久久久| 欧美一级欧美一级在线播放| 日韩精品一区在线| 久久久精品国产免大香伊 | 欧美草草影院在线视频| 欧美日韩国产一级| 日韩一区二区免费电影| 欧美成人精品高清在线播放| 久久精品一区四区| 亚洲欧洲av色图| 一区二区三区久久| 青青草伊人久久| 国产成人免费视| 欧美性做爰猛烈叫床潮| 日韩欧美的一区| 中文字幕一区二区三区四区不卡 | 久久亚洲综合av| 国产精品成人一区二区三区夜夜夜| 亚洲男人都懂的| 免费观看在线综合色| 成人黄色小视频| 欧美日本视频在线| 欧美经典三级视频一区二区三区| 亚洲少妇屁股交4| 日韩va欧美va亚洲va久久| 国产suv精品一区二区6| 欧美性大战xxxxx久久久| 日韩女优视频免费观看| 国产精品免费网站在线观看| 婷婷夜色潮精品综合在线| 国产精品一区二区免费不卡| 在线观看av不卡| 国产亚洲成aⅴ人片在线观看| 亚洲综合偷拍欧美一区色| 韩国女主播一区二区三区| 欧美综合久久久| 国产精品三级电影| 日韩激情一区二区| 97精品电影院| 精品国产91洋老外米糕| 亚洲国产中文字幕在线视频综合| 国产麻豆精品久久一二三| 欧美色精品天天在线观看视频| 久久久久国产精品麻豆ai换脸| 亚洲地区一二三色| av亚洲精华国产精华精| 久久久久久影视| 日韩av在线发布| 欧美日韩在线综合| 亚洲欧洲日本在线| 国产高清不卡二三区| 日韩精品专区在线| 亚洲mv在线观看| 在线观看一区日韩| 中文字幕一区二区三区视频| 经典三级视频一区| 91精品午夜视频| 香蕉久久一区二区不卡无毒影院| 91丨九色丨蝌蚪丨老版| 欧美激情一区二区三区蜜桃视频| 美国三级日本三级久久99| 67194成人在线观看| 亚洲嫩草精品久久| 97se亚洲国产综合自在线观| 国产精品私人自拍| 国产成人福利片| 国产午夜三级一区二区三| 麻豆传媒一区二区三区| 欧美一区二区美女| 日韩av二区在线播放| 欧美军同video69gay| 亚洲超碰97人人做人人爱| 欧美日韩一区二区三区视频| 亚洲国产精品影院| 欧美在线一区二区|