標(biāo)題:
stc12單片機(jī)多功能數(shù)字電表程序
[打印本頁]
作者:
david147
時(shí)間:
2020-5-13 17:04
標(biāo)題:
stc12單片機(jī)多功能數(shù)字電表程序
#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í)變量,為定時(shí)中斷間隔時(shí)間的整數(shù)倍*/
uchar cLongDelay; /* 按鍵長按時(shí)間*/
bit bStill; /*是否松鍵標(biāo)志*/
char cMode = 2; /*顯示方式變量,0~3對(duì)應(yīng)4種方式*/
char cSetMode = 0; /*功能模式變量,0~10對(duì)應(yīng)11種方式*/
uint nTimer1 = 0; /*定時(shí)計(jì)數(shù)變量,為定時(shí)中斷間隔時(shí)間的整數(shù)倍*/
uint nTimer = 0; /*定時(shí)計(jì)數(shù)變量,為定時(shí)中斷間隔時(shí)間的整數(shù)倍*/
/*********鬧鈴,低電平有效**************/
uchar cTimeMin = 0; /*鬧鈴定時(shí)時(shí)間變量:分鐘*/
uchar cTimeHour = 0; /*鬧鈴定時(shí)時(shí)間變量:小時(shí)*/
uchar cTimeflag = 0;
sbit bell = P2^3;
int flag = 0;
/************* 秒表 *************/
uint nStopflag = 0; /*秒表計(jì)數(shù)開始標(biāo)志,為1有效*/
uint nStop = 0; /*秒表計(jì)數(shù),為中斷的整數(shù)倍:100uS*/
uint nStopSec = 0; /*秒表的秒*/
uint nStopTenms = 0; /* 秒表的亳秒*/
uint ncountSec = 30; /*倒計(jì)時(shí)的秒*/
uint ncountTenms = 0; /* 倒計(jì)時(shí)的亳秒*/
uint ncountflag = 0; /*倒計(jì)時(shí) 開始標(biāo)志,為1有效*/
uint ncount = 0; /*倒計(jì)時(shí) 計(jì)數(shù),為中斷的整數(shù)倍:100uS*/
/*通用位尋址寄存器*/
uchar bdata Reg = 0;
sbit bReg0 = Reg^0; /* 串行移位之用*/
sbit bReg7 = Reg^7; /* 串行移位之用*/
/************ DS 1302 驅(qū)動(dòng)程序 ************* */
sbit DS_CLK = P1^4;
sbit DS_IO = P1^5;
sbit DS_RST = P1^6;
typedef struct StrClock
{
uchar Sec; /* 秒 */
uchar Min; /* 分 */
uchar Hour; /* 時(shí) */
uchar Day; /* 日 */
uchar Mon; /* 月 */
uchar Week; /*星期*/
uchar Year; /* 年 */
uchar Ctr; /*控制字*/
};
union UniClock /*時(shí)鐘聯(lián)合體1*/
{
struct StrClock sClock;
uchar Time[8];
}idata uClock; /*時(shí)鐘*/
typedef struct StrTime /* 時(shí)鐘結(jié)構(gòu)體 2 */
{
uchar Sec; /* 秒 */
uchar Min; /* 分 */
uchar Hour; /* 時(shí) */
uchar Day; /* 日 */
uchar Mon; /* 月 */
uchar Year; /* 年 */
};
union UniTime /*時(shí)鐘聯(lián)合體2 */
{
struct StrTime sTime;
uchar Time[6];
} idata uTime; /* 時(shí)鐘 */
/* 16進(jìn)制碼轉(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ū)動(dòng)程序 *****/
/*初始化*/
void InitDS1302()
{
uchar dat;
W_DS1302(0x8e, 0); /* 控制命令,禁止寫保護(hù) */
W_DS1302(0x90, 0xa5); /* 2K電阻,一個(gè)二極管 */
dat=R_DS1302(0x81); /* 讀秒字節(jié) */
if(dat>127)
{
dat=0;
W_DS1302(0x80, dat); /* 啟動(dòng)時(shí)鐘 */
}
W_DS1302(0x8e,0x80); /* 控制命令,使能寫保護(hù) */
}
/* 寫一字節(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í)鐘數(shù)據(jù) ******************/
/*格式為:秒分時(shí)日月星期年控制*/
void R_DS1302Timer()
{
uchar i;
DS_CLK = 0;
DS_RST = 1;
W_DS1302Byte(0xbf); /* Oxbf:時(shí)鐘多字節(jié)讀命令 */
for(i = 0; i < 8; i++)
uClock.Time[i] = R_DS1302Byte();
DS_RST = 0;
DS_CLK = 0;
}
/*************** 數(shù)碼管顯示函數(shù) ****************** /*加(I 0x80)是為了點(diǎn)亮該數(shù)碼管的小數(shù)點(diǎn)*/
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í)/設(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: //顯示時(shí)/分
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 的時(shí)間*******/
if (cMode == 0 && cSetMode == 1)/*修改年數(shù)*/
{
if(uTime.sTime.Year < 99)
{
uTime.sTime.Year++;
nDelayKey = 2000; /*按住鍵不動(dòng),可連續(xù)產(chǎn)生鍵值,相當(dāng)于連續(xù)按鍵*/
}
W_DS1302(0x8e, 0); /*控制命令,禁止寫保護(hù)*/
W_DS1302(0x8c, H_BCD(uTime.sTime.Year));
W_DS1302(0x8e, 0x80); /*控制命令,使能寫保護(hù)*/
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í)數(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è)置鬧鈴時(shí)間*******/
else if(cMode == 2 && cSetMode == 3)/*設(shè)置鬧鈴小時(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) /*修改 倒計(jì)時(shí)分 */
{
if( ncountSec < 91)
{
ncountSec++;
nDelayKey = 2000;
}
ncountTenms = 0;
if (ncountSec == 91)
ncountSec = 0;
break;
}
else
{
break;
}
case 6: /*功能:KeySUB */
/********設(shè)置 DS1302 的時(shí)間*********/
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í)數(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è)置鬧鈴時(shí)間********/
else if (cMode == 2 && cSetMode == 3)/*設(shè)置鬧鈴小時(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) /*修改 倒計(jì)時(shí)分 */
{
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; /*啟動(dòng)鬧鈴*/
bell = 0;
}
else /*不啟動(dòng)鬧鈴*/
bell = 1;
cTimeflag = 0; /*不啟動(dòng)鬧鈴*/
}
/****************** 秒表函 數(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)/*開始倒計(jì)時(shí)*/
{
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)
/**************** 定時(shí)器初始化 *******************/
{
AUXR &= 0x7F;
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x48;
TH0 = 0xFF;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1; /*開總中斷*/
P0M0 = 0xff; /*定義P0 口為強(qiáng)推挽模式*/
P0M1 = 0x00; /*POM1 = 00000000B*/
InitDS1302(); /* 初始化 DS1302 */
R_DS1302Timer(); /*讀時(shí)鐘數(shù)據(jù)()*/
display(); /*顯示初始界面*/
while(1)
{
if(cKeyCode != 0)
{
DisposeKEY(); /*響應(yīng)按鍵操作*/
}
R_DS1302Timer(); /*讀時(shí)鐘數(shù)據(jù)*/
display() ; /*顯示函數(shù)*/
Alarm(); /*鬧鈴函數(shù)*/
StopWatch(); /*秒表函數(shù)*/
CountDown(); /*倒計(jì)時(shí)函數(shù)*/
}
}
/**************** 多任務(wù)時(shí)序控制時(shí)鐘中斷 *****************/
void IntT0() interrupt 1
{
TL0 = 0x48;
TH0 = 0xFF;
nTimer1++;
if(ncountflag == 1)
{
ncount++; /*秒表計(jì)數(shù),為中斷的整數(shù)倍:100us*/
}
if(nStopflag == 1)
{
nStop++; /*秒表計(jì)數(shù),為中斷的整數(shù)倍:100us*/
}
if (cTimeflag == 1)
{
P0 = 0;
P2 = acLEDCS1[cScanIndex];
P0 = acLED[cScanIndex++];
cScanIndex &= 3;
}
else
{
if (cSetMode > 0 && cSetMode < 8) /*此處用于閃爍時(shí),設(shè)置時(shí)間及鬧鈴。閃爍是通過數(shù)碼管間歇性顯示有效實(shí)現(xiàn)的*/
{
if(nTimer1 <= 2500 )
{
if (cMode == 0 && cSetMode == 1 ) /*設(shè)置 年時(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í),后兩位數(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í),前兩位數(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í),后兩位數(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í),數(shù)碼管閃爍*/
{
P0 = 0; /*先清顯示再換位選*/
P2 = acLEDCS[cScanIndex]; /*送位選數(shù)據(jù)*/
cScanIndex++;
P0 = 0;
cScanIndex &= 3; /*位選指針回位*/
}
else if(cSetMode == 3 && cMode == 2) /*設(shè)置鬧鈴小時(shí)時(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è)置延退時(shí)間削顫*/
else
{
bStill = 0;
cLongDelay = 0;/*松鍵*//*有按鍵利用DelayKey按鍵消顫*/
}
}
else
{
nDelayKey--;
if(nDelayKey == 0)
{
cKeyCode = P2 & 0x07;
if(cKey != cKeyCode)
{
cKeyCode = 0;
}
}
}
}
復(fù)制代碼
作者:
david147
時(shí)間:
2020-5-13 17:06
這是一個(gè)完整的系統(tǒng),里面包含了年月日,鬧鐘,計(jì)時(shí),以及跳轉(zhuǎn)設(shè)置等
作者:
admin
時(shí)間:
2020-5-14 03:46
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1