void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)
{
unsigned char i;
unsigned char ucTempData;
dig_hc595_sh_dr=0;
dig_hc595_st_dr=0;
ucTempData=ucDigStatusTemp16_09; //先送高8位
for(i=0;i<8;i++)
{
if(ucTempData>=0x80)dig_hc595_ds_dr=1;
else dig_hc595_ds_dr=0;
dig_hc595_sh_dr=0; //SH引腳的上升沿把數(shù)據(jù)送入寄存器
delay_short(1);
dig_hc595_sh_dr=1;
delay_short(1);
ucTempData=ucTempData<<1;
}
ucTempData=ucDigStatusTemp08_01; //再先送低8位
for(i=0;i<8;i++)
{
if(ucTempData>=0x80)dig_hc595_ds_dr=1;
else dig_hc595_ds_dr=0;
dig_hc595_sh_dr=0; //SH引腳的上升沿把數(shù)據(jù)送入寄存器
delay_short(1);
dig_hc595_sh_dr=1;
delay_short(1);
ucTempData=ucTempData<<1;
}
dig_hc595_st_dr=0; //ST引腳把兩個(gè)寄存器的數(shù)據(jù)更新輸出到74HC595的輸出引腳上并且鎖存起來
delay_short(1);
dig_hc595_st_dr=1;
delay_short(1);
dig_hc595_sh_dr=0; //拉低,抗干擾就增強(qiáng)
dig_hc595_st_dr=0;
dig_hc595_ds_dr=0;
}
//LED燈的74HC595驅(qū)動(dòng)函數(shù)
void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)
{
unsigned char i;
unsigned char ucTempData;
hc595_sh_dr=0;
hc595_st_dr=0;
ucTempData=ucLedStatusTemp16_09; //先送高8位
for(i=0;i<8;i++)
{
if(ucTempData>=0x80)hc595_ds_dr=1;
else hc595_ds_dr=0;
hc595_sh_dr=0; //SH引腳的上升沿把數(shù)據(jù)送入寄存器
delay_short(1);
hc595_sh_dr=1;
delay_short(1);
ucTempData=ucTempData<<1;
}
ucTempData=ucLedStatusTemp08_01; //再先送低8位
for(i=0;i<8;i++)
{
if(ucTempData>=0x80)hc595_ds_dr=1;
else hc595_ds_dr=0;
hc595_sh_dr=0; //SH引腳的上升沿把數(shù)據(jù)送入寄存器
delay_short(1);
hc595_sh_dr=1;
delay_short(1);
ucTempData=ucTempData<<1;
}
hc595_st_dr=0; //ST引腳把兩個(gè)寄存器的數(shù)據(jù)更新輸出到74HC595的輸出引腳上并且鎖存起來
delay_short(1);
hc595_st_dr=1;
delay_short(1);
hc595_sh_dr=0; //拉低,抗干擾就增強(qiáng)
hc595_st_dr=0;
hc595_ds_dr=0;
}
void T0_time() interrupt 1
{
TF0=0; //清除中斷標(biāo)志
TR0=0; //關(guān)中斷
key_scan(); //按鍵掃描函數(shù)
if(ucStartFlag==1) //啟動(dòng)倒計(jì)時(shí)的計(jì)時(shí)器
{
uiTimeCnt++;
if(uiTimeCnt>=const_1s) //1秒鐘的時(shí)間到
{
if(ucCountDown!=0) //加這個(gè)判斷,就是避免在0的情況下減1
{
ucCountDown--; //倒計(jì)時(shí)當(dāng)前顯示值減1
}
if(ucCountDown==0) //倒計(jì)時(shí)結(jié)束
{
ucStartFlag=0; //暫停
uiVoiceCnt=const_voice_long; //蜂鳴器觸發(fā)提醒,滴一聲就停。
}
ucWd1Update=1; //窗口1更新顯示標(biāo)志
uiTimeCnt=0; //計(jì)時(shí)器清零,準(zhǔn)備從新開始計(jì)時(shí)
}
}
if(uiVoiceCnt!=0)
{
uiVoiceCnt--; //每次進(jìn)入定時(shí)中斷都自減1,直到等于零為止。才停止鳴叫
beep_dr=0; //蜂鳴器是PNP三極管控制,低電平就開始鳴叫。
// beep_dr=1; //蜂鳴器是PNP三極管控制,低電平就開始鳴叫。
}
else
{
; //此處多加一個(gè)空指令,想維持跟if括號(hào)語句的數(shù)量對(duì)稱,都是兩條指令。不加也可以。
beep_dr=1; //蜂鳴器是PNP三極管控制,高電平就停止鳴叫。
// beep_dr=0; //蜂鳴器是PNP三極管控制,高電平就停止鳴叫。
}
display_drive(); //數(shù)碼管字模的驅(qū)動(dòng)函數(shù)
TH0=0xfe; //重裝初始值(65535-500)=65035=0xfe0b
TL0=0x0b;
TR0=1; //開中斷
}
void delay_short(unsigned int uiDelayShort)
{
unsigned int i;
for(i=0;i {
; //一個(gè)分號(hào)相當(dāng)于執(zhí)行一條空語句
}
}
void delay_long(unsigned int uiDelayLong)
{
unsigned int i;
unsigned int j;
for(i=0;i {
for(j=0;j<500;j++) //內(nèi)嵌循環(huán)的空指令數(shù)量
{
; //一個(gè)分號(hào)相當(dāng)于執(zhí)行一條空語句
}
}
}
void initial_myself() //第一區(qū) 初始化單片機(jī)
{
/* 注釋三:
* 矩陣鍵盤也可以做獨(dú)立按鍵,前提是把某一根公共輸出線輸出低電平,
* 模擬獨(dú)立按鍵的觸發(fā)地,本程序中,把key_gnd_dr輸出低電平。
* 朱兆祺51學(xué)習(xí)板的S1就是本程序中用到的一個(gè)獨(dú)立按鍵。
*/
key_gnd_dr=0; //模擬獨(dú)立按鍵的地GND,因此必須一直輸出低電平
led_dr=0; //關(guān)閉獨(dú)立LED燈
beep_dr=1; //用PNP三極管控制蜂鳴器,輸出高電平時(shí)不叫。
hc595_drive(0x00,0x00); //關(guān)閉所有經(jīng)過另外兩個(gè)74HC595驅(qū)動(dòng)的LED燈
TMOD=0x01; //設(shè)置定時(shí)器0為工作方式1
TH0=0xfe; //重裝初始值(65535-500)=65035=0xfe0b
TL0=0x0b;
}
void initial_peripheral() //第二區(qū) 初始化外圍
{
ucDigDot8=0; //小數(shù)點(diǎn)全部不顯示
ucDigDot7=0;
ucDigDot6=0;
ucDigDot5=0;
ucDigDot4=0;
ucDigDot3=0;
ucDigDot2=0;
ucDigDot1=0;
EA=1; //開總中斷
ET0=1; //允許定時(shí)中斷
TR0=1; //啟動(dòng)定時(shí)中斷
}