|
- #include <STC12C5A60S2.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- uchar code acLEDCS[] = {0xef, 0xdf, 0xbf, 0x7f}; /* 位選地址碼,低電平有效,接在P2口的高四位*/
- uchar code acLEDCS1[] = {0xe7, 0xd7, 0xb7, 0x77};
- uchar code acLedSegCode[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c}; /* 段碼 */
- uchar acLED[4]; /* 顯示緩沖區(qū) */
- char cScanIndex; /* 位選指針 0~3 */
- uchar cKey; /* 初始鍵值 */
- uchar cKeyCode; /* 鍵值 */
- uint nDelayKey; /*鍵盤延時變量,為定時中斷間隔時間的整數(shù)倍*/
- uchar cLongDelay; /* 按鍵長按時間*/
- bit bStill; /*是否松鍵標(biāo)志*/
- char cMode = 2; /*顯示方式變量,0~3對應(yīng)4種方式*/
- char cSetMode = 0; /*功能模式變量,0~10對應(yīng)11種方式*/
- uint nTimer1 = 0; /*定時計數(shù)變量,為定時中斷間隔時間的整數(shù)倍*/
- uint nTimer = 0; /*定時計數(shù)變量,為定時中斷間隔時間的整數(shù)倍*/
- /*********鬧鈴,低電平有效**************/
- uchar cTimeMin = 0; /*鬧鈴定時時間變量:分鐘*/
- uchar cTimeHour = 0; /*鬧鈴定時時間變量:小時*/
- uchar cTimeflag = 0;
- sbit bell = P2^3;
- int flag = 0;
- /************* 秒表 *************/
- uint nStopflag = 0; /*秒表計數(shù)開始標(biāo)志,為1有效*/
- uint nStop = 0; /*秒表計數(shù),為中斷的整數(shù)倍:100uS*/
- uint nStopSec = 0; /*秒表的秒*/
- uint nStopTenms = 0; /* 秒表的亳秒*/
- uint ncountSec = 30; /*倒計時的秒*/
- uint ncountTenms = 0; /* 倒計時的亳秒*/
- uint ncountflag = 0; /*倒計時 開始標(biāo)志,為1有效*/
- uint ncount = 0; /*倒計時 計數(shù),為中斷的整數(shù)倍:100uS*/
- /*通用位尋址寄存器*/
- uchar bdata Reg = 0;
- sbit bReg0 = Reg^0; /* 串行移位之用*/
- sbit bReg7 = Reg^7; /* 串行移位之用*/
- /************ DS 1302 驅(qū)動程序 ************* */
- sbit DS_CLK = P1^4;
- sbit DS_IO = P1^5;
- sbit DS_RST = P1^6;
- typedef struct StrClock
- {
- uchar Sec; /* 秒 */
- uchar Min; /* 分 */
- uchar Hour; /* 時 */
- uchar Day; /* 日 */
- uchar Mon; /* 月 */
- uchar Week; /*星期*/
- uchar Year; /* 年 */
- uchar Ctr; /*控制字*/
- };
- union UniClock /*時鐘聯(lián)合體1*/
- {
- struct StrClock sClock;
- uchar Time[8];
- }idata uClock; /*時鐘*/
- typedef struct StrTime /* 時鐘結(jié)構(gòu)體 2 */
- {
- uchar Sec; /* 秒 */
- uchar Min; /* 分 */
- uchar Hour; /* 時 */
- uchar Day; /* 日 */
- uchar Mon; /* 月 */
- uchar Year; /* 年 */
- };
- union UniTime /*時鐘聯(lián)合體2 */
- {
- struct StrTime sTime;
- uchar Time[6];
- } idata uTime; /* 時鐘 */
- /* 16進制碼轉(zhuǎn)換為BCD碼*/
- uchar H_BCD(uchar dat)
- {
- uchar datl, dat2;
- datl = dat / 10;
- dat2 = dat % 10 + (datl<<4);
- return(dat2);
- }
- void W_DS1302(uchar adr, uchar dat);/* 寫一字節(jié)(dat)到指定地址(adr)*/
- uchar R_DS1302(uchar adr);
- /***************************************************/
- /***** DS 1302 驅(qū)動程序 *****/
- /*初始化*/
- void InitDS1302()
- {
- uchar dat;
- W_DS1302(0x8e, 0); /* 控制命令,禁止寫保護 */
- W_DS1302(0x90, 0xa5); /* 2K電阻,一個二極管 */
- dat=R_DS1302(0x81); /* 讀秒字節(jié) */
- if(dat>127)
- {
- dat=0;
- W_DS1302(0x80, dat); /* 啟動時鐘 */
- }
- W_DS1302(0x8e,0x80); /* 控制命令,使能寫保護 */
- }
- /* 寫一字節(jié) */
- void W_DS1302Byte(uchar dat)
- {
- uchar i=8;
- Reg=dat;
- while(i--)
- {
- DS_CLK=0;
- DS_IO=bReg0;
- DS_CLK=1;
- Reg >>=1;
- }
- }
- /*讀一字節(jié)*/
- uchar R_DS1302Byte()
- {
- uchar i = 8;
- while(i--)
- {
- DS_CLK = 0;
- Reg >>= 1;
- bReg7 = DS_IO;
- DS_CLK = 1;
- }
- return(Reg);
- }
- /*寫一字節(jié)(dat)到指定地址(adr) */
- void W_DS1302(uchar adr, uchar dat)
- {
- DS_CLK = 0;
- DS_RST = 0;
- DS_RST = 1;
- W_DS1302Byte(adr); /* 地址,命令 */
- W_DS1302Byte(dat); /* 寫 IByte 數(shù)據(jù)*/
- DS_RST = 0;
- DS_CLK = 0;
- }
- /*讀一字節(jié)指定地址(adr)的數(shù)據(jù)*/
- uchar R_DS1302(uchar adr)
- {
- uchar dat;
- DS_CLK = 0;
- DS_RST = 1;
- W_DS1302Byte(adr); /* 地址,命令 */
- dat=R_DS1302Byte(); /* 讀 IByte 數(shù)據(jù) */
- DS_RST = 0;
- DS_CLK = 0;
- return(dat);
- }
- /***************** 讀時鐘數(shù)據(jù) ******************/
-
- /*格式為:秒分時日月星期年控制*/
- void R_DS1302Timer()
- {
- uchar i;
- DS_CLK = 0;
- DS_RST = 1;
- W_DS1302Byte(0xbf); /* Oxbf:時鐘多字節(jié)讀命令 */
- for(i = 0; i < 8; i++)
- uClock.Time[i] = R_DS1302Byte();
- DS_RST = 0;
- DS_CLK = 0;
- }
- /*************** 數(shù)碼管顯示函數(shù) ****************** /*加(I 0x80)是為了點亮該數(shù)碼管的小數(shù)點*/
- void display()
- {
- {
- if(cSetMode > 0 )
- {
- switch(cMode)
- {
- case 0: //顯示設(shè)置年
- acLED[0] = acLedSegCode[2];
- acLED[1] = acLedSegCode[0];
- acLED[2] = acLedSegCode[uTime.sTime.Year /10];
- acLED[3] = acLedSegCode[uTime.sTime.Year %10];
- break;
- case 1: //顯示設(shè)置月/設(shè)置日
- acLED[0] = acLedSegCode[uTime.sTime.Mon /10];
- acLED[1] = acLedSegCode[uTime.sTime.Mon %10] | 0x80;
- acLED[2] = acLedSegCode[uTime. sTime. Day / 10];
- acLED[3] = acLedSegCode[uTime. sTime. Day % 10];
- break;
- case 2: //顯示設(shè)置時/設(shè)置分
- if (cSetMode == 1 || cSetMode == 2)
- {
- acLED[0] = acLedSegCode[uTime.sTime.Hour /10];
- acLED[1] = acLedSegCode[uTime.sTime.Hour %10] | 0x80;
- acLED[2] = acLedSegCode[uTime. sTime. Min / 10];
- acLED[3] = acLedSegCode[uTime. sTime. Min % 10];
- break;
- }
- else if (cSetMode == 3 || cSetMode == 4)
- {
- acLED[0] = acLedSegCode[cTimeHour /10];
- acLED[1] = acLedSegCode[cTimeHour %10] | 0x80;
- acLED[2] = acLedSegCode[cTimeMin / 10];
- acLED[3] = acLedSegCode[cTimeMin % 10];
- break;
- }
- case 3: //顯示設(shè)置秒
- acLED[0] = 0;
- acLED[1] = 0 | 0x80;
- acLED[2] = acLedSegCode[uTime.sTime.Sec /10];
- acLED[3] = acLedSegCode[uTime.sTime.Sec %10];
- break;
- case 6:
- acLED[0] = acLedSegCode[ncountSec / 10];
- acLED[1] = acLedSegCode[ncountSec % 10] | 0x80;
- acLED[2] = acLedSegCode[ncountTenms / 10];
- acLED[3] = acLedSegCode[ncountTenms % 10];
- break;
- case 7: // 顯示
- acLED[0] = acLedSegCode[nStopSec / 10];
- acLED[1] = acLedSegCode[nStopSec % 10] | 0x80;
- acLED[2] = acLedSegCode[nStopTenms / 10] ;
- acLED[3] = acLedSegCode[nStopTenms % 10];
- break;
- default:
- break;
- }
- }
- else
- {
- switch(cMode)
- {
- case 0: //顯示年
- acLED[0] = acLedSegCode[2];
- acLED[1] = acLedSegCode[0];
- acLED[2] = acLedSegCode[uClock.Time[6] >>4];
- acLED[3] = acLedSegCode[uClock.Time[6] & 0x0f];
- break;
- case 1: //顯示月/日
- acLED[0] = acLedSegCode[uClock.Time[4]>>4];
- acLED[1] = acLedSegCode[uClock.Time[4] & 0x0f] | 0x80;
- acLED[2] = acLedSegCode[uClock.Time[3] >>4];
- acLED[3] = acLedSegCode[uClock.Time[3] & 0x0f];
- break;
- case 2: //顯示時/分
-
- acLED[0] = acLedSegCode[uClock.Time[2]>>4];
- acLED[1] = acLedSegCode[uClock.Time[2] & 0x0f] | 0x80;
- acLED[2] = acLedSegCode[uClock.Time[1] >>4];
- acLED[3] = acLedSegCode[uClock.Time[1]& 0x0f];
- break;
- case 3: //顯示?
- acLED[0] = acLedSegCode[uClock.Time[1] >>4];
- acLED[1] = acLedSegCode[uClock.Time[1]& 0x0f] | 0x80;
- acLED[2] = acLedSegCode[uClock.Time[0] >>4];
- acLED[3] = acLedSegCode[uClock.Time[0] & 0x0f];
- break;
- case 4:
- acLED[0] = acLedSegCode[0];
- acLED[1] = acLedSegCode[0];
- acLED[2] = acLedSegCode[0];
- acLED[3] = acLedSegCode[0];
- break;
- default:
- break;
-
- }
- }
- }
- }
- /******************** 按鍵處理程序 ******************/
- void DisposeKEY()
- {
- switch(cKeyCode)
- {
- case 2:
- if(bStill == 0)
- {
- cMode++;
- if(cMode >= 5)
- {
- cMode = 0;
- }
- bStill = 1;
- }
- break;
- case 3:
- /*******設(shè)置 DS 1302 的時間*******/
- if (cMode == 0 && cSetMode == 1)/*修改年數(shù)*/
- {
- if(uTime.sTime.Year < 99)
- {
- uTime.sTime.Year++;
- nDelayKey = 2000; /*按住鍵不動,可連續(xù)產(chǎn)生鍵值,相當(dāng)于連續(xù)按鍵*/
- }
- W_DS1302(0x8e, 0); /*控制命令,禁止寫保護*/
- W_DS1302(0x8c, H_BCD(uTime.sTime.Year));
- W_DS1302(0x8e, 0x80); /*控制命令,使能寫保護*/
- break;
- }
- else if(cMode == 1 && cSetMode == 1)/*修改月數(shù)*/
- {
- if (uTime.sTime.Mon < 12)
- {
- uTime.sTime.Mon++;
- nDelayKey = 2000;
- }
- W_DS1302(0x8e, 0);
- W_DS1302(0x88, H_BCD(uTime.sTime.Mon));
- W_DS1302(0x8e, 0x80);
- break;
- }
- else if(cMode == 1 && cSetMode == 2) /*修改天數(shù)*/
- {
- if(uTime.sTime.Day < 31)
- {
- uTime.sTime.Day++;
- nDelayKey = 2000;
- }
- W_DS1302(0x8e, 0);
- W_DS1302(0x86, H_BCD(uTime.sTime.Day));
- W_DS1302(0x8e, 0x80);
- break;
- }
-
- else if(cMode == 2 && cSetMode == 1) /*修改小時數(shù)*/
- {
- if(uTime.sTime.Hour < 24)
- {
- uTime.sTime.Hour++;
- nDelayKey = 2000;
- }
- W_DS1302(0x8e, 0);
- W_DS1302(0x84, H_BCD(uTime.sTime.Hour));
- W_DS1302(0x8e, 0x80);
- break;
- }
- else if(cMode == 2 && cSetMode == 2) /*修改分鐘數(shù)*/
- {
- if(uTime.sTime.Min < 59)
- {
- uTime.sTime.Min++;
- nDelayKey = 2000;
- }
- W_DS1302(0x8e, 0);
- W_DS1302(0x82, H_BCD(uTime.sTime.Min));
- W_DS1302(0x8e, 0x80);
- break;
- }
- /********設(shè)置鬧鈴時間*******/
- else if(cMode == 2 && cSetMode == 3)/*設(shè)置鬧鈴小時數(shù)*/
- {
- if(cTimeHour < 24)
- {
- cTimeHour++;
- nDelayKey = 2000;
- }
- break;
- }
- else if(cMode == 2 && cSetMode == 4)/*設(shè)置鬧鈴分鐘數(shù)*/
- {
- if(cTimeMin < 59)
- {
- cTimeMin++;
- nDelayKey = 2000;
- }
- break;
- }
- else if (cMode == 3 && (cSetMode == 1)) /*修改 秒數(shù)*/
- {
- if (uTime.sTime.Sec < 59)
- {
- uTime.sTime.Sec++;
- nDelayKey = 2000;
- }
- W_DS1302(0x8e, 0);
- W_DS1302(0x80, H_BCD(uTime.sTime.Sec));
- W_DS1302(0x8e, 0x80);
- break;
- }
- else if (cMode == 6 && cSetMode == 3) /*修改 倒計時分 */
- {
- if( ncountSec < 91)
- {
- ncountSec++;
- nDelayKey = 2000;
- }
- ncountTenms = 0;
- if (ncountSec == 91)
- ncountSec = 0;
- break;
- }
-
- else
- {
- break;
- }
- case 6: /*功能:KeySUB */
- /********設(shè)置 DS1302 的時間*********/
- if (cMode == 0 && cSetMode == 1 )/*修改年數(shù)*/
- {
- if(uTime.sTime.Year > 0)
- {
- uTime.sTime.Year--;
- nDelayKey = 1000;
- }
- W_DS1302(0x8e, 0);
- W_DS1302(0x8c, H_BCD(uTime.sTime.Year));
- W_DS1302(0x8e, 0x80);
- nDelayKey = 2000;
- break;
- }
- else if(cMode == 1 && cSetMode == 1)/*修改月數(shù)*/
- {
- if(uTime.sTime.Mon > 0)
- {
- uTime. sTime.Mon--;
- nDelayKey = 2000;
- }
- W_DS1302(0x8e, 0);
- W_DS1302(0x88, H_BCD(uTime. sTime. Mon));
- W_DS1302(0x8e, 0x80);
- break;
- }
- else if (cMode == 1 && cSetMode == 2)/*修改天數(shù)*/
- {
- if(uTime. sTime. Day > 0)
- {
- uTime.sTime.Day--;
- nDelayKey = 2000;
- }
- W_DS1302(0x8e, 0);
- W_DS1302(0x86, H_BCD(uTime.sTime.Day));
- W_DS1302(0x8e, 0x80);
- break;
- }
- else if(cMode == 2 && cSetMode == 1)/*修改小時數(shù)*/
- {
- if(uTime.sTime.Hour > 0)
- {
- uTime.sTime.Hour--;
- nDelayKey = 1000;
- }
- W_DS1302(0x8e, 0);
- W_DS1302(0x84, H_BCD(uTime.sTime.Hour));
- W_DS1302(0x8e, 0x80);
- break;
- }
- else if(cMode == 2 && cSetMode == 2)/*修改分鐘數(shù)*/
- {
- if(uTime.sTime.Min > 0)
- {
- uTime.sTime.Min--;
- nDelayKey = 2000;
- }
- W_DS1302(0x8e, 0);
- W_DS1302(0x82, H_BCD(uTime.sTime.Min));
- W_DS1302(0x8e, 0x80);
- break;
- }
- else if (cMode == 3 && (cSetMode == 1 )) /*修改 秒數(shù)*/
- {
- if(uTime.sTime.Sec > 0)
- {
- uTime.sTime.Sec--;
- nDelayKey = 2000;
- }
- W_DS1302(0x8e, 0);
- W_DS1302(0x80, H_BCD(uTime.sTime.Sec));
- W_DS1302(0x8e, 0x80);
- break;
- }
- /********設(shè)置鬧鈴時間********/
- else if (cMode == 2 && cSetMode == 3)/*設(shè)置鬧鈴小時數(shù)*/
- {
- if(cTimeHour > 0)
- {
- cTimeHour--;
- nDelayKey = 2000;
- }
- break;
- }
- else if(cMode == 2 && cSetMode == 4)/*設(shè)置鬧鈴分鐘數(shù)*/
- {
- if(cTimeMin > 0)
- {
- cTimeMin --;
- nDelayKey = 2000;
- }
- break;
- }
- else if (cMode == 6 && cSetMode == 3) /*修改 倒計時分 */
- {
- if(ncountSec > 0)
- {
- ncountSec--;
- nDelayKey = 2000;
- }
- ncountTenms = 0;
- if (ncountSec == 0)
- ncountSec = 90;
- break;
- }
- else
- {
- break;
- }
- case 5:
-
- if(bStill == 0)
- {
- cSetMode++;
- bStill = 1;
- }
- if(cMode == 0 && cSetMode == 2)
- {
- cSetMode = 0;
- break;
- }
- else if(cMode == 1 && cSetMode == 3)
- {
- cSetMode = 0;
- break;
- }
- else if(cMode == 2 && cSetMode == 5)
- {
- cSetMode = 0;
- break;
- }
- else if(cMode == 2 && cSetMode == 1&& cTimeflag == 1)
- {
- cTimeHour = 24;
- cTimeMin = 60;
- cTimeflag =0;
- break;
- }
-
-
-
- else if(cMode == 3 && cSetMode == 2)
- {
- cSetMode = 0;
- break;
- }
- else if(cMode == 6 && cSetMode == 6)
- {
- cSetMode = 0;
- cMode =4;
- ncountTenms = 0;
- ncountSec = 30;
- nStopTenms = 0;
- nStopSec = 0;
-
- break;
- }
- else if(cMode == 3 && cSetMode == 2)
- {
- cSetMode = 0;
- break;
- }
- else if(cMode == 7 && cSetMode == 3)
- {
- ncountflag = 1;
- break;
- }
- else if(cMode == 6 && cSetMode == 5)
- {
- ncountflag = 0;
- break;
- }
- else if(cMode == 4 && cSetMode == 1)
- {
- nStopflag = 1;
- break;
- }
- else if(cMode == 7 && cSetMode == 2)
- {
- nStopflag = 0;
- break;
- }
- else
- {
- break;
- }
- }
-
- display ();
- cKeyCode = 0;
- }
- void Alarm()
- {
- if (cTimeHour - uClock.Time[2] == 0&& cTimeMin - uClock.Time[1] == 0&& cSetMode == 0 )
- {
- cTimeflag = 1; /*啟動鬧鈴*/
- bell = 0;
- }
- else /*不啟動鬧鈴*/
- bell = 1;
- cTimeflag = 0; /*不啟動鬧鈴*/
-
- }
- /****************** 秒表函 數(shù) *******************/
- void StopWatch()
- {
- if(nStopflag == 1)
- {
- cMode = 7;
- if(nStop >= 100)
- {
- nStop = 0;
- nStopTenms++;
- if(nStopTenms >= 100) /*100*10ms=ls*/
- {
- nStopTenms = 0;
- if(nStopSec < 99)
- nStopSec++; /*秒表秒加一*/
- else /*最長秒表為99.99s*/
- {
- nStopSec = 99;
- nStopTenms = 99;
- nStopflag = 0;
- }
- }
- }
- }
-
- display();
- }
- void CountDown(void)
- {
- if (ncountflag == 1)
- {
- cMode= 6;
- }
- if(cMode == 6 && cSetMode == 4)/*開始倒計時*/
- {
- if(ncount >= 100)
- {
- ncount = 0;
- if (ncountTenms != 0)
- {
- ncountTenms--;
- }
- else if(ncountTenms==0 && ncountSec != 0)
- {
- ncountTenms =99;
- ncountSec--;
- }
-
- else
- {
- ncountTenms =0;
- ncountSec = 0;
- ncountflag = 0;
- }
- }
- }
- }
- /************************** 主函數(shù) *****************************/
- void main(void)
- /**************** 定時器初始化 *******************/
- {
- AUXR &= 0x7F;
- TMOD &= 0xF0;
- TMOD |= 0x01;
- TL0 = 0x48;
- TH0 = 0xFF;
- TF0 = 0;
- TR0 = 1;
- ET0 = 1;
- EA = 1; /*開總中斷*/
- P0M0 = 0xff; /*定義P0 口為強推挽模式*/
- P0M1 = 0x00; /*POM1 = 00000000B*/
- InitDS1302(); /* 初始化 DS1302 */
- R_DS1302Timer(); /*讀時鐘數(shù)據(jù)()*/
- display(); /*顯示初始界面*/
- while(1)
- {
- if(cKeyCode != 0)
- {
- DisposeKEY(); /*響應(yīng)按鍵操作*/
- }
- R_DS1302Timer(); /*讀時鐘數(shù)據(jù)*/
- display() ; /*顯示函數(shù)*/
- Alarm(); /*鬧鈴函數(shù)*/
- StopWatch(); /*秒表函數(shù)*/
- CountDown(); /*倒計時函數(shù)*/
- }
- }
- /**************** 多任務(wù)時序控制時鐘中斷 *****************/
- void IntT0() interrupt 1
- {
- TL0 = 0x48;
- TH0 = 0xFF;
- nTimer1++;
-
- if(ncountflag == 1)
- {
- ncount++; /*秒表計數(shù),為中斷的整數(shù)倍:100us*/
- }
- if(nStopflag == 1)
- {
- nStop++; /*秒表計數(shù),為中斷的整數(shù)倍:100us*/
- }
- if (cTimeflag == 1)
- {
- P0 = 0;
- P2 = acLEDCS1[cScanIndex];
- P0 = acLED[cScanIndex++];
- cScanIndex &= 3;
- }
- else
- {
- if (cSetMode > 0 && cSetMode < 8) /*此處用于閃爍時,設(shè)置時間及鬧鈴。閃爍是通過數(shù)碼管間歇性顯示有效實現(xiàn)的*/
- {
- if(nTimer1 <= 2500 )
- {
- if (cMode == 0 && cSetMode == 1 ) /*設(shè)置 年時,數(shù)碼管閃爍*/
- /*先淸顯示再換位選*/
- {
- P0 = 0;
- P2 = acLEDCS[cScanIndex];
- cScanIndex++;
- P0 = 0;
- cScanIndex &= 3;
- }
- else if(cSetMode == 1 && cMode == 1)
- {
- P0 = 0;
- P2 = acLEDCS[cScanIndex];
- cScanIndex++;
- if(cScanIndex >= 1 && cScanIndex <= 2)
- P0 = 0;
- else
- {
- P0 = acLED[cScanIndex - 1];
- cScanIndex &= 3;
- }
- }
- else if(cSetMode == 2 && cMode == 1) /*日時,后兩位數(shù)碼管閃爍*/
- {
- P0 = 0;
- P2 = acLEDCS[cScanIndex];
- cScanIndex++;
- if(cScanIndex >= 3 && cScanIndex <= 4)
- {
- P0 = 0;
- cScanIndex &= 4; /*位選指針回位*/
- }
- else
- P0 = acLED[cScanIndex - 1]; /*送顯示數(shù)據(jù),位選指針移位*/
- }
- else if(cSetMode == 1 && cMode == 2) /*設(shè)置小時,前兩位數(shù)碼管閃爍*/
-
- {
- P0 = 0; /*先淸顯示再換位選*/
- P2 = acLEDCS[cScanIndex]; /*送位選數(shù)據(jù)*/
- cScanIndex++;
- if(cScanIndex >= 1 && cScanIndex <= 2)
- P0 = 0;
- else
- {
- P0 = acLED[cScanIndex - 1]; /*送顯示數(shù)據(jù),位選指針移位*/
- cScanIndex &= 3; /*位選指針回位*/
- }
- }
- else if(cSetMode == 2 && cMode == 2) /*設(shè)置分鐘時,后兩位數(shù)碼管閃爍*/
- {
- P0 = 0;/*先淸顯示再換位選*/
- P2 = acLEDCS[cScanIndex] ; /* 送位選數(shù)據(jù)*/
- cScanIndex++;
- if(cScanIndex >= 3 && cScanIndex <= 4)
- {
- P0 = 0;
- cScanIndex &= 4; /* 位選指針回位*/
- }
- else
- P0 = acLED[cScanIndex - 1]; /* 送顯示數(shù)據(jù),位選指針移位*/
- }
- else if (cMode == 3 && (cSetMode == 1 || cSetMode == 2))/*設(shè)置秒時,數(shù)碼管閃爍*/
- {
- P0 = 0; /*先清顯示再換位選*/
- P2 = acLEDCS[cScanIndex]; /*送位選數(shù)據(jù)*/
- cScanIndex++;
- P0 = 0;
- cScanIndex &= 3; /*位選指針回位*/
- }
- else if(cSetMode == 3 && cMode == 2) /*設(shè)置鬧鈴小時時, 前兩位數(shù)碼管閃爍*/
- {
- P0 = 0; /*先淸顯示再換位選*/
- P2 = acLEDCS[cScanIndex]; /*送位選數(shù)據(jù)*/
- cScanIndex++;
- if(cScanIndex >= 1 && cScanIndex <= 2)
- P0 = 0;
-
- else
- {
- P0 = acLED[cScanIndex -1];
- cScanIndex &= 3;
- }
- }
- else if(cSetMode == 4 && cMode == 2)
- {
- P0 = 0;
- P2 = acLEDCS[cScanIndex];
- cScanIndex++;
- if(cScanIndex >= 3 && cScanIndex <= 4)
- {
- P0 = 0;
- cScanIndex &= 4;
- }
- else
- P0 = acLED[cScanIndex - 1];
- }
- else if(cMode == 6 && cSetMode == 3)
- {
- P0 = 0; /*先淸顯示再換位選*/
- P2 = acLEDCS[cScanIndex]; /*送位選數(shù)據(jù)*/
- cScanIndex++;
- if(cScanIndex >= 1 && cScanIndex <= 2)
- P0 = 0;
- else
- {
- P0 = acLED[cScanIndex - 1]; /*送顯示數(shù)據(jù),位選指針移位*/
- cScanIndex &= 3; /*位選指針回位*/
- }
- }
- else /*不閃爍*/
- {
- P0 = 0;
- P2 = acLEDCS[cScanIndex];
- P0 = acLED[cScanIndex++];
- cScanIndex &= 3;
- }
- }
- else
- {
- if(nTimer1 >= 5000 )
- nTimer1 = 0;
- P0 = 0;
- P2 = acLEDCS[cScanIndex];
- P0 = acLED[cScanIndex++];
- cScanIndex &= 3;
- }
- }
- else
- {
- P0 = 0;
- P2 = acLEDCS[cScanIndex];
- P0 = acLED[cScanIndex++];
- cScanIndex &= 3;
- }
- }
- /*********************掃 描按鍵********************/
- if(nDelayKey == 0)
- {
- cKey = P2 & 0x07; /* 取鍵值 P20、P21、P22*/
- if(cKey != 0x07)
- nDelayKey = 100; /*設(shè)置延退時間削顫*/
- else
- {
- bStill = 0;
- cLongDelay = 0;/*松鍵*//*有按鍵利用DelayKey按鍵消顫*/
- }
- }
- else
- {
- nDelayKey--;
- if(nDelayKey == 0)
- {
- cKeyCode = P2 & 0x07;
- if(cKey != cKeyCode)
- {
- cKeyCode = 0;
- }
- }
- }
- }
復(fù)制代碼 |
|