當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀] 用c語言寫的一個時鬧鐘程序單片機用16F877,主時鐘用20MHz,用32768作定時時間。可以實現(xiàn)2路定鬧,每一路都可分別設(shè)置和開關(guān),采用4x4鍵盤,16x2的字符型LCD顯示。連線在程序開頭有說明。程序的功能:(

c語言寫的一個時鬧鐘程序

單片機用16F877,主時鐘用20MHz,用32768作定時時間。可以實現(xiàn)2路定鬧,每一路都可分別設(shè)置和開關(guān),采用4x4鍵盤,16x2的字符型LCD顯示。連線在程序開頭有說明。
程序的功能:
(1)上電后LCD背光打開,并顯示倒計時5秒,然后時鐘開始工作。
(2)用模式鍵(*)切換模式,如顯示時間、日期、鬧鐘1、鬧鐘2等,并且可以用上、下鍵控制加1、減1或是鬧鐘的On、Off。

(3)原程序有16個鍵,包括0~9數(shù)字鍵,可以直接輸入要設(shè)置的時間值,但后來將數(shù)字鍵取消了,你仍然可以通過修改程序的部分注釋恢復(fù)此功能。
(4)鬧鐘有2路,時間到后鬧2分鐘,可按任意鍵取消本次鬧鐘。鬧鐘響時有2種音調(diào),是用PIC的PWM實現(xiàn)的。
(5)按任意鍵可打開背光,1分鐘后自動關(guān)閉背光。
(6)RA0~RA3為按鍵掃描輸入,應(yīng)接下拉電阻。



主程序
//FileName:Main.c
//MCU:MicroChipPIC16F877
//Tool:CCS-Ccompiler
//Author:KingEDA,MSN:kingeda@163.com,skype:kingeda,E-mail:kingeda@163.com
//Website:http://www.EDAKING.com
//Description:
//Atimerprogram
//Ver0.1:2003-03-31,allcLOCkfunctionwithdatedisplay,2wayalarm.
//Ver0.2:2003-05-05,(1)Alarmdefaultison,modifyalarm1timeto7:00:00,
//andalarm2to13:30:00.
//(2)BacklightwillbeenabLEDwhenalarming.
//(3)Automaticadjustday(28,30,31).
//(4)Automatic MOV ecursortonextlocationwhensetitem.
//PINConnection:
//RC0~1:32768Hzcrystal
//RC2:Buzzer
//RC3:LCDBackLight,driveaPNPBJT
//RD0~RD7:toLCDDB0~DB7
//RA0~RA3:keypadcolin
//RC4~RC7:keypadlineout
//789#
//456↑
//123↓
//0←→*
//RE0:LCDRS
//RE1:LCDRW
//RE2:LCDE

#include"my16f877.h"
#deviceICD=true
//#fusesHS,NOWDT,NOPROTECT,PUT,BROWNOUT
#usedelay(clock=24000000)
//#usefast_io(C)
#usefast_io(E)
#definelcd_busy(lcd_read_addr()&0x80)==0x80
#definetime_start_addr0x80+0x04
#definetime_hourh_addrtime_start_addr
#definetime_hourl_addrtime_start_addr+1
#definetime_minuteh_addrtime_start_addr+3
#definetime_minutel_addrtime_start_addr+4
#definetime_secondh_addrtime_start_addr+6
#definetime_secondl_addrtime_start_addr+7
#definekey_00x11
#definekey_10x21
#definekey_20x22
#definekey_30x24
#definekey_40x41
#definekey_50x42
#definekey_60x44
#definekey_70x81
#definekey_80x82
#definekey_90x84
#definekey_left0x12
#definekey_right0x14
#definekey_up0x48
#definekey_down0x28
#definekey_mode0x18
#definekey_CANcel0x88

charStrPower1[]="*Poweron*";
charStrSetTime[]="*Adjusttime*";
charStrSetDate[]="*Adjustdate*";
charStrAlarm1[]="*Setalarm1*";
charStrAlarm2[]="*Setalarm2*";
unsignedcharPORTC_MAP;
#bitBackLightEn=PORTC_MAP.3
unsignedcharBackLightTimer;
int1led;
#bitlcd_rs=PORTE.0
#bitlcd_rw=PORTE.1
#bitlcd_e=PORTE.2
#bytelcd_bus=PORTD
#bytelcd_dir=TRISD
#definePWM_on0x0c
#definePWM_off0x00
#definePWM_period200
#definePWM_DC100
unsignedcharlcd_addr;
unsignedcharKeyLine;
unsignedcharKeyOld;
unsignedcharKeyNew;

structmTime{
unsignedcharhourh;//hour,0~23
unsignedcharhourl;
unsignedcharminuteh;//minute,0~59
unsignedcharminutel;
unsignedcharsecondh;//second,0~59
unsignedcharsecondl;
};
structmTimeCurrentTime={1,2,0,0,0,0};
structmTimeAlarmTime1={0,7,0,0,0,0};//07:00:00
structmTimeAlarmTime2={1,3,3,0,0,0};//13:30:00
unsignedcharAlarmStatus;
#bitAlarm1Enable=AlarmStatus.0
#bitAlarm2Enable=AlarmStatus.1
#bitAlarm1Alarm=AlarmStatus.2
#bitAlarm2Alarm=AlarmStatus.3
unsignedcharAlarm1Cnt;//alarm1secondcount
unsignedcharAlarm2Cnt;
unsignedcharCurrentMode;
#definemode_time0
#definemode_set_time1
#definemode_set_date2
#definemode_set_alarm13
#definemode_set_alarm24
unsignedcharadjust_item;
structmDate{
unsignedcharyear1;//
unsignedcharyear2;
unsignedcharyear3;
unsignedcharyear4;
unsignedcharmonthh;
unsignedcharmonthl;
unsignedchardayh;
unsignedchardayl;
};
structmDateCurrentDate={2,0,0,3,0,1,0,1};
unsignedchar*pStr;

//-------------------------------------------------------
unsignedcharlcd_read_addr()
{
unsignedcharch;
lcd_dir=0xff;//readfromlcd
lcd_rs=0;
lcd_rw=1;//inst
lcd_e=1;
#asm
nop
nop
nop
#endasm
ch=lcd_bus;
lcd_e=0;
lcd_dir=0x00;//setwritetolcd
returnch;
}

//-------------------------------------------------------
unsignedcharlcd_write_data(unsignedcharch)
{
while(lcd_busy)
{restart_wdt();}
lcd_rs=1;//data
lcd_rw=0;//write
lcd_bus=ch;//writeout
lcd_e=1;
#asm
nop
nop
nop
#endasm
lcd_e=0;
return’Y’;
}

//-------------------------------------------------------
unsignedcharlcd_write_inst(unsignedcharch)
{
while(lcd_busy)
{restart_wdt();}
lcd_rs=0;//inst
lcd_rw=0;//write
lcd_bus=ch;
lcd_e=1;
#asm
nop
nop
nop
#endasm
lcd_e=0;
return’Y’;
}


//-------------------------------------------------------
unsignedcharlcd_read_data()
{
unsignedcharch;
while(lcd_busy)
{restart_wdt();}
lcd_dir=0xff;//readfromlcd
lcd_rs=1;//data
lcd_rw=1;//read
lcd_e=1;
#asm
nop
nop
nop
#endasm
ch=lcd_bus;//readin
lcd_e=0;
lcd_dir=0x00;//setwritetolcd
returnch;
}

//-------------------------------------------------------
voidlcd_init()
{
unsignedcharTempch;
lcd_addr=0;
delay_ms(100);
Tempch=0x38;//1-linemode,5x8dots
lcd_write_inst(Tempch);//Functionset
Tempch=0x0f;//lcdon,cursoron,blinkon
lcd_write_inst(Tempch);//Displayon/off
Tempch=0x06;//Incrementmode,Entireshiftoff
lcd_write_inst(Tempch);
Tempch=0x01;//cleardisplay
lcd_write_inst(Tempch);
delay_ms(3);
}

//-------------------------------------------------------
//#int_timer1
//voidtimer1_interrupt(void)
#int_ccp2
voidccp2_interrupt(void)
{
//TMR1H=0x80;
if(CurrentTime.secondl==9)
{
CurrentTime.secondl=0;
if(CurrentTime.secondh==5)
{
CurrentTime.secondh=0;
if(CurrentTime.minutel==9)
{
CurrentTime.minutel=0;
if(CurrentTime.minuteh==5)
{
CurrentTime.minuteh=0;
if(CurrentTime.hourl==9)
{
CurrentTime.hourl=0;
CurrentTime.hourh++;
}
elseif((CurrentTime.hourl==3)&&(CurrentTime.hourh==2))
{
CurrentTime.hourl=0;
CurrentTime.hourh=0;
if((((CurrentDate.dayl==8)||(CurrentDate.dayl==9))&&(CurrentDate.dayh==2)&&(CurrentDate.monthl==2)&&(CurrentDate.monthh==0))||
((CurrentDate.dayl==0)&&(CurrentDate.dayh==3)&&((((CurrentDate.monthl==4)||(CurrentDate.monthl==6)
||(CurrentDate.monthl==9))&&(CurrentDate.monthh==0))||((CurrentDate.monthl==1)&&(CurrentDate.monthh==1))))||
((CurrentDate.dayl==1)&&(CurrentDate.dayh==3)))
{
CurrentDate.dayl=1;
CurrentDate.dayh=0;
if((CurrentDate.monthl==2)&&(CurrentDate.monthh==1))
{
CurrentDate.monthl=1;
CurrentDate.monthh=0;
if(CurrentDate.year4==9)
{
CurrentDate.year4=0;
if(CurrentDate.year3==9)
{
CurrentDate.year3=0;
if(CurrentDate.year2==9)
{
CurrentDate.year2=0;
CurrentDate.year1++;
}
else
CurrentDate.year2++;
}
else
CurrentDate.year3++;
}
else
CurrentDate.year4++;
}
elseif(CurrentDate.monthl==9)
{
CurrentDate.monthl=0;
CurrentDate.monthh++;
}
else
CurrentDate.monthl++;
}
elseif(CurrentDate.dayl==9)
{
CurrentDate.dayl=0;
CurrentDate.dayh++;
}
else
CurrentDate.dayl++;
}
else
CurrentTime.hourl++;
}
else
CurrentTime.minuteh++;
}
else
CurrentTime.minutel++;
}
else
CurrentTime.secondh++;
}
else
CurrentTime.secondl++;
if((Alarm1Alarm==false)&(Alarm2Alarm==false))
{
led=0;
CCP1CON=PWM_off;
}
else
{
if(led==1)
{
led=0;
PR2=PWM_period;//setpwmperiod
CCPR1L=PWM_DC;//setpwmdutycycle
//CCP1CON=PWM_on;
}
else
{
led=1;
PR2=PWM_period/2;//setpwmperiod
CCPR1L=PWM_DC/2;//setpwmdutycycle
//CCP1CON=PWM_off;
}
}
Alarm1Cnt++;
Alarm2Cnt++;
if(BackLightEn==0)
if(((BackLightTimer++)>=60)&(Alarm1Alarm==false)&(Alarm1Alarm==false))
BackLightEn=1;//dISAblebacklight
PORTC=PORTC_MAP;
//TMR1IF=0;
//PIR1=PIR2=0x00;
CCP2IF=0;
}

//-------------------------------------------------------
unsignedcharget_key(void)
{
unsignedcharkey_in,tmp;
TRISC=0x03;
KeyLine=0xf0;
PORTC=KeyLine|PORTC_MAP;
#asm
nop
nop
nop
#endasm
if((PORTA&0x0f)!=0)
{
tmp=0x10;
for(KeyLine=tmp;KeyLine!=0;KeyLine=tmp)
{
PORTC=KeyLine|PORTC_MAP;
tmp=KeyLine<<1;
#asm
nop
nop
nop
#endasm
key_in=PORTA&0x0f;
if(key_in!=0)
{
return(key_in|KeyLine);
}
}
return0;
}
else
return0;
}

//-------------------------------------------------------
voidset_mode(void)
{
if(CurrentMode==mode_set_alarm2)
CurrentMode=mode_time;
else
{
CurrentMode++;
adjust_item=0;
}
lcd_write_inst(0x01);//clearLCDdisplay
lcd_write_inst(time_start_addr);//setLCDline1
if(CurrentMode==mode_set_time)
{
lcd_write_data(CurrentTime.hourh+’0’);
lcd_write_data(CurrentTime.hourl+’0’);
lcd_write_data(’:’);
lcd_write_data(CurrentTime.minuteh+’0’);
lcd_write_data(CurrentTime.minutel+’0’);
lcd_write_data(’:’);
lcd_write_data(CurrentTime.secondh+’0’);
lcd_write_data(CurrentTime.secondl+’0’);
pStr=StrSetTime;
}
elseif(CurrentMode==mode_set_date)
{
lcd_write_data(CurrentDate.year1+’0’);
lcd_write_data(CurrentDate.year2+’0’);
lcd_write_data(CurrentDate.year3+’0’);
lcd_write_data(CurrentDate.year4+’0’);
lcd_write_data(’/’);
lcd_write_data(CurrentDate.monthh+’0’);
lcd_write_data(CurrentDate.monthl+’0’);
lcd_write_data(’/’);
lcd_write_data(CurrentDate.dayh+’0’);
lcd_write_data(CurrentDate.dayl+’0’);
pStr=StrSetDate;
}
elseif(CurrentMode==mode_set_alarm1)
{
lcd_write_data(AlarmTime1.hourh+’0’);
lcd_write_data(AlarmTime1.hourl+’0’);
lcd_write_data(’:’);
lcd_write_data(AlarmTime1.minuteh+’0’);
lcd_write_data(AlarmTime1.minutel+’0’);
lcd_write_data(’:’);
lcd_write_data(AlarmTime1.secondh+’0’);
lcd_write_data(AlarmTime1.secondl+’0’);
lcd_write_data(’’);
lcd_write_data(’O’);
if(Alarm1Enable)
{
lcd_write_data(’n’);
}
else
{
lcd_write_data(’f’);
lcd_write_data(’f’);
}
pStr=StrAlarm1;
Alarm1Cnt=0;
}
elseif(CurrentMode==mode_set_alarm2)
{
lcd_write_data(AlarmTime2.hourh+’0’);
lcd_write_data(AlarmTime2.hourl+’0’);
lcd_write_data(’:’);
lcd_write_data(AlarmTime2.minuteh+’0’);
lcd_write_data(AlarmTime2.minutel+’0’);
lcd_write_data(’:’);
lcd_write_data(AlarmTime2.secondh+’0’);
lcd_write_data(AlarmTime2.secondl+’0’);
lcd_write_data(’’);
lcd_write_data(’O’);
if(Alarm2Enable)
{
lcd_write_data(’n’);
}
else
{
lcd_write_data(’f’);
lcd_write_data(’f’);
}
pStr=StrAlarm2;
Alarm2Cnt=0;
}
lcd_write_inst(0xc0);//setLCDline2
if(CurrentMode!=mode_time)
{
for(;*pStr!=0;pStr++)
{//writehintmessage
lcd_write_data(*pStr);
}
lcd_write_inst(0x0f);//LCDcursoron
lcd_write_inst(time_start_addr);// MOV ecursortostart
}
else//timemode,writedatetosecondline
{
lcd_write_inst(0x0c);//LCDsursoroff
/*lcd_write_inst(0xc0+3);//setdatestartaddress
lcd_write_data(CurrentDate.year1+’0’);
lcd_write_data(CurrentDate.year2+’0’);
lcd_write_data(CurrentDate.year3+’0’);
lcd_write_data(CurrentDate.year4+’0’);
lcd_write_data(’/’);
lcd_write_data(CurrentDate.monthh+’0’);
lcd_write_data(CurrentDate.monthl+’0’);
lcd_write_data(’/’);
lcd_write_data(CurrentDate.dayh+’0’);
lcd_write_data(CurrentDate.dayl+’0’);
*/}
if(CurrentMode==mode_set_time)
{
lcd_write_inst(time_start_addr);// MOV ecursortostart
}
elseif(CurrentMode==mode_set_date)
{
lcd_write_inst(time_start_addr);// MOV ecursortostart
}
elseif(CurrentMode==mode_set_alarm1)
{
lcd_write_inst(time_secondl_addr+3);
adjust_item=6;
}
elseif(CurrentMode==mode_set_alarm2)
{
lcd_write_inst(time_secondl_addr+3);
adjust_item=6;
}
else
{
lcd_write_inst(0x0c);//LCDcursoroff
}
}


//-------------------------------------------------------
voidset_date(void)
{
if(adjust_item==0)//adjustyear
{
if((KeyNew>=0)&(KeyNew<=9))
{
CurrentDate.year1=KeyNew;
lcd_write_data(CurrentDate.year1+’0’);
//lcd_write_inst(time_start_addr);
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item=7;
lcd_write_inst(time_start_addr+9);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_start_addr+1);
}
}
elseif(adjust_item==1)
{
if((KeyNew>=0)&(KeyNew<=9))
{
CurrentDate.year2=KeyNew;
lcd_write_data(CurrentDate.year2+’0’);
//lcd_write_inst(time_start_addr+1);
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_start_addr+0);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_start_addr+2);
}
}
elseif(adjust_item==2)
{
if((KeyNew>=0)&(KeyNew<=9))
{
CurrentDate.year3=KeyNew;
lcd_write_data(CurrentDate.year3+’0’);
//lcd_write_inst(time_start_addr+2);
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_start_addr+1);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_start_addr+3);
}
}
elseif(adjust_item==3)
{
if((KeyNew>=0)&(KeyNew<=9))
{
CurrentDate.year4=KeyNew;
lcd_write_data(CurrentDate.year4+’0’);
//lcd_write_inst(time_start_addr+3);
adjust_item++;
lcd_write_inst(time_start_addr+5);
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_start_addr+2);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_start_addr+5);
}
}
elseif(adjust_item==4)
{
if(((CurrentDate.monthl>2)&(KeyNew==0))|((CurrentDate.monthl==0)&(KeyNew==1))
|(((CurrentDate.monthl==1)|(CurrentDate.monthl==2))&(KeyNew<2)))
{
CurrentDate.monthh=KeyNew;
lcd_write_data(CurrentDate.monthh+’0’);
//lcd_write_inst(time_start_addr+5);
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_start_addr+3);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_start_addr+6);
}
}
elseif(adjust_item==5)
{
if(((CurrentDate.monthh==3)&(KeyNew<2))|((CurrentDate.monthh!=3)&(KeyNew>=0)&(KeyNew<=9)))
{
CurrentDate.monthl=KeyNew;
lcd_write_data(CurrentDate.monthl+’0’);
//lcd_write_inst(time_start_addr+6);
adjust_item++;
lcd_write_inst(time_start_addr+8);
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_start_addr+5);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_start_addr+8);
}
}
elseif(adjust_item==6)
{
if(((CurrentDate.dayl>1)&((KeyNew==1)|(KeyNew==2)))|((CurrentDate.dayl==0)&(KeyNew>0)&(KeyNew<4))
|((CurrentDate.dayl==1)&(KeyNew<4)))
{
CurrentDate.dayh=KeyNew;
lcd_write_data(CurrentDate.dayh+’0’);
//lcd_write_inst(time_start_addr+8);
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_start_addr+6);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_start_addr+9);
}
}
elseif(adjust_item==7)
{
if(((CurrentDate.dayh==3)&(KeyNew<2))|((CurrentDate.dayh!=3)&(KeyNew>=0)&(KeyNew<=9)))
{
CurrentDate.dayl=KeyNew;
lcd_write_data(CurrentDate.dayl+’0’);
//lcd_write_inst(time_start_addr+9);
adjust_item++;
lcd_write_inst(time_start_addr+0);
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_start_addr+8);
}
elseif(KeyNew==key_right)
{
adjust_item=0;
lcd_write_inst(time_start_addr+0);
}
}
}

//-------------------------------------------------------
voidset_time(void)
{
if(adjust_item==0)//sethourh
{
if(((CurrentTime.hourl<4)&(KeyNew<3))|((CurrentTime.hourl>3)&(KeyNew<2)))
{
CurrentTime.hourh=KeyNew;
lcd_write_data(CurrentTime.hourh+’0’);//refreshhourh
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item=5;
lcd_write_inst(time_secondl_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_hourl_addr);
}
}
elseif(adjust_item==1)//sethourl
{
if(((CurrentTime.hourh==2)&(KeyNew<4))|((CurrentTime.hourh<2)&(KeyNew<=9)))
{
CurrentTime.hourl=KeyNew;
lcd_write_data(CurrentTime.hourl+’0’);//refreshhourl
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
lcd_write_inst(time_minuteh_addr);
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_hourh_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_minuteh_addr);
}
}
elseif(adjust_item==2)//setminuteh
{
if(KeyNew<6)
{
CurrentTime.minuteh=KeyNew;
lcd_write_data(CurrentTime.minuteh+’0’);
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_hourl_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_minutel_addr);
}
}
elseif(adjust_item==3)//setminutel
{
if((KeyNew>=0)&(KeyNew<=9))
{
CurrentTime.minutel=KeyNew;
lcd_write_data(CurrentTime.minutel+’0’);
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
lcd_write_inst(time_secondh_addr);
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_minuteh_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_secondh_addr);
}
}
elseif(adjust_item==4)//setsecondh
{
if(KeyNew<6)
{
CurrentTime.secondh=KeyNew;
lcd_write_data(CurrentTime.secondh+’0’);
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item--;
&nb,sp;lcd_write_inst(time_minutel_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_secondl_addr);
}
}
elseif(adjust_item==5)//setsecondl
{
if((KeyNew>=0)&(KeyNew<=9))
{
CurrentTime.secondl=KeyNew;
lcd_write_data(CurrentTime.secondl+’0’);
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item=0;
lcd_write_inst(time_hourh_addr);
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_secondh_addr);
}
elseif(KeyNew==key_right)
{
adjust_item=0;
lcd_write_inst(time_hourh_addr);
}
}
}

//-------------------------------------------------------
voidset_alarm1(void)
{
if(adjust_item==0)//sethourh
{
if(((AlarmTime1.hourl<4)&(KeyNew<3))|((AlarmTime1.hourl>3)&(KeyNew<2)))
{
AlarmTime1.hourh=KeyNew;
lcd_write_data(AlarmTime1.hourh+’0’);//refreshhourh
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item=6;
lcd_write_inst(time_secondl_addr+3);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_hourl_addr);
}
}
elseif(adjust_item==1)//sethourl
{
if(((AlarmTime1.hourh==2)&(KeyNew<4))|((AlarmTime1.hourh<2)&(KeyNew<=9)))
{
AlarmTime1.hourl=KeyNew;
lcd_write_data(AlarmTime1.hourl+’0’);//refreshhourl
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
lcd_write_inst(time_minuteh_addr);
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_hourh_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_minuteh_addr);
}
}
elseif(adjust_item==2)//setminuteh
{
if(KeyNew<6)
{
AlarmTime1.minuteh=KeyNew;
lcd_write_data(AlarmTime1.minuteh+’0’);
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_hourl_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_minutel_addr);
}
}
elseif(adjust_item==3)//setminutel
{
if((KeyNew>=0)&(KeyNew<=9))
{
AlarmTime1.minutel=KeyNew;
lcd_write_data(AlarmTime1.minutel+’0’);
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
lcd_write_inst(time_secondh_addr);
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_minuteh_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_secondh_addr);
}
}
elseif(adjust_item==4)//setsecondh
{
if(KeyNew<6)
{
AlarmTime1.secondh=KeyNew;
lcd_write_data(AlarmTime1.secondh+’0’);
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_minutel_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_secondl_addr);
}
}
elseif(adjust_item==5)//setsecondl
{
if((KeyNew>=0)&(KeyNew<=9))
{
AlarmTime1.secondl=KeyNew;
lcd_write_data(AlarmTime1.secondl+’0’);
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
lcd_write_inst(time_secondl_addr+3);
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_secondh_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_secondl_addr+3);
}
}
elseif(adjust_item==6)//seton/off
{
if((KeyNew==key_up)|(KeyNew==key_down))
{
if(Alarm1Enable)
{
Alarm1Enable=false;//disablealarm1
lcd_write_data(’f’);
lcd_write_data(’f’);
}
else
{
Alarm1Enable=true;//enablealarm1
lcd_write_data(’n’);
lcd_write_data(’’);
}
//lcd_write_inst(time_secondl_addr+3);
adjust_item=0;
lcd_write_inst(time_hourh_addr);
Alarm1Cnt=0;
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_secondl_addr);
}
elseif(KeyNew==key_right)
{
adjust_item=0;
lcd_write_inst(time_hourh_addr);
}
}

}

//-------------------------------------------------------
voidset_alarm2(void)
{
if(adjust_item==0)//sethourh
{
if(((AlarmTime2.hourl<4)&(KeyNew<3))|((AlarmTime2.hourl>3)&(KeyNew<2)))
{
AlarmTime2.hourh=KeyNew;
lcd_write_data(AlarmTime2.hourh+’0’);//refreshhourh
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item=6;
lcd_write_inst(time_secondl_addr+3);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_hourl_addr);
}
}
elseif(adjust_item==1)//sethourl
{
if(((AlarmTime2.hourh==2)&(KeyNew<4))|((AlarmTime2.hourh<2)&(KeyNew<=9)))
{
AlarmTime2.hourl=KeyNew;
lcd_write_data(AlarmTime2.hourl+’0’);//refreshhourl
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
lcd_write_inst(time_minuteh_addr);
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_hourh_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_minuteh_addr);
}
}
elseif(adjust_item==2)//setminuteh
{
if(KeyNew<6)
{
AlarmTime2.minuteh=KeyNew;
lcd_write_data(AlarmTime2.minuteh+’0’);
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_hourl_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_minutel_addr);
}
}
elseif(adjust_item==3)//setminutel
{
if((KeyNew>=0)&(KeyNew<=9))
{
AlarmTime2.minutel=KeyNew;
lcd_write_data(AlarmTime2.minutel+’0’);
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
lcd_write_inst(time_secondh_addr);
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_minuteh_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_secondh_addr);
}
}
elseif(adjust_item==4)//setsecondh
{
if(KeyNew<6)
{
AlarmTime2.secondh=KeyNew;
lcd_write_data(AlarmTime2.secondh+’0’);
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_minutel_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_secondl_addr);
}
}
elseif(adjust_item==5)//setsecondl
{
if((KeyNew>=0)&(KeyNew<=9))
{
AlarmTime2.secondl=KeyNew;
lcd_write_data(AlarmTime2.secondl+’0’);
//lcd_write_inst(0x10);// MOV ecursorback
adjust_item++;
lcd_write_inst(time_secondl_addr+3);
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_secondh_addr);
}
elseif(KeyNew==key_right)
{
adjust_item++;
lcd_write_inst(time_secondl_addr+3);
}
}
elseif(adjust_item==6)//seton/off
{
if((KeyNew==key_up)|(KeyNew==key_down))
{
if(Alarm2Enable)
{
Alarm2Enable=false;//disablealarm2
lcd_write_data(’f’);
lcd_write_data(’f’);
}
else
{
Alarm2Enable=true;//enablealarm2
lcd_write_data(’n’);
lcd_write_data(’’);
}
//lcd_write_inst(time_secondl_addr+3);
adjust_item=0;
lcd_write_inst(time_hourh_addr);
Alarm2Cnt=0;
}
elseif(KeyNew==key_left)
{
adjust_item--;
lcd_write_inst(time_secondl_addr);
}
elseif(KeyNew==key_right)
{
adjust_item=0;
lcd_write_inst(time_hourh_addr);
}
}

}

//-------------------------------------------------------
voidmain(void)
{
unsignedcharcnt;
TRISC=0x03;//PORTC.3driveled,lowactive
PORTC_MAP=0x00;
led=0;
BackLightEn=0;
BackLightTimer=0;
PORTC=PORTC_MAP;
TRISA=0xff;//lowhalfbyteaskeyscanin
TRISE=0x00;
ADCON0=0x00;
ADCON1=0x06;//alldigitalI/Os
lcd_init();
INTCON=0x00;
lcd_write_inst(0x80);//setlcdddramaddress
for(pStr=StrPower1;*pStr!=0;pStr++)
{
lcd_write_data(*pStr);
}
lcd_write_inst(0x0c);//LCDcursoroff
PIR1=PIR2=0x00;
T1CON=0x0f;//T1CON:--T1CKPS1T1CPS0T1OSCEN/T1SYNCTMR1CSTMR1ON
TMR1H=0x80;
TMR1L=0x00;
TMR1IF=0;
CCPR2H=0x7f;
CCPR2L=0xff;
CCP2CON=0x0b;//comparemode,setccp2if,resettmr1
CCP2IF=0;
for(cnt=5;cnt>0;cnt--)//testfor5sec.
{
lcd_write_inst(0xc0+8);//setLCDadress
lcd_write_data(cnt+’0’);
while(CCP2IF==0)//waitfortimer1overflow
{
restart_wdt();
}
//TMR1H=0x80;
CCP2IF=0;
}
//writecurrentdatetolcdline2
lcd_write_inst(0x01);//clearLCDdisplay
lcd_write_inst(0xc0+3);//setLCDline2
lcd_write_data(CurrentDate.year1+’0’);
lcd_write_data(CurrentDate.year2+’0’);
lcd_write_data(CurrentDate.year3+’0’);
lcd_write_data(CurrentDate.year4+’0’);
lcd_write_data(’/’);
lcd_write_data(CurrentDate.monthh+’0’);
lcd_write_data(CurrentDate.monthl+’0’);
lcd_write_data(’/’);
lcd_write_data(CurrentDate.dayh+’0’);
lcd_write_data(CurrentDate.dayl+’0’);
Alarm1Enable=true;//false;
Alarm2Enable=true;//false;
INTCON=0xc0;//setGIE&PEIE
//TMR1IE=1;//enabletimer1interrupt
CCP2IE=1;//enableccp2interrupt
CurrentMode=mode_time;
Alarm1Cnt=Alarm2Cnt=0;
T2CON=0x07;//T2CON:-TOUTPS3TOUTPS2TOUTPS1TOUTPS0TMR2ONT2CKPS1T2CKPS0
//timer2enable,prescaler=16
PR2=PWM_period;//setpwmperiod
CCPR1L=PWM_DC;//setpwmdutycycle
CCP1CON=PWM_off;
while(1)
{
restart_wdt();
KeyOld=get_key();
delay_ms(20);
KeyNew=get_key();
if(((KeyNew&0x0f)!=0x00)&(KeyNew==KeyOld))
{//somekeypressed
if(BackLightEn==1)//backlightnoton
{
BackLightEn=0;//enableback-light
BackLightTimer=0;//startdelaycounter
}
else
{
if(KeyNew==key_0)
KeyNew=0;
elseif(KeyNew==key_1)
KeyNew=1;
elseif(KeyNew==key_2)
KeyNew=2;
elseif(KeyNew==key_3)
KeyNew=3;
elseif(KeyNew==key_4)
KeyNew=4;
elseif(KeyNew==key_5)
KeyNew=5;
elseif(KeyNew==key_6)
KeyNew=6;
elseif(KeyNew==key_7)
KeyNew=7;
elseif(KeyNew==key_8)
KeyNew=8;
elseif(KeyNew==key_9)
KeyNew=9;
elseif(KeyNew==key_mode)//MODEkeypressed
set_mode();
elseif(KeyNew==key_cancel)//cancelbuzzy
{
led=0;
CCP1CON=PWM_off;
BackLightEn=1;
BackLightTimer=0;
}
if(CurrentMode==mode_set_time)
{
set_time();
}
elseif(CurrentMode==mode_set_date)
{
set_date();
}
elseif(CurrentMode==mode_set_alarm1)
{
set_alarm1();
}
elseif(CurrentMode==mode_set_alarm2)
{
set_alarm2();
}
}
do//waitforkeyreleased
{
delay_ms(30);
KeyNew=get_key();
restart_wdt();
BackLightTimer=0;//keypressedyet
}while((KeyNew&0x0f)!=0x00);
KeyOld=KeyNew=0x00;
}
if((CurrentMode==mode_set_time)|(CurrentMode==mode_time))
{//refreshtimedisplay,bacauseint_timer1dosn’tdothis
lcd_addr=lcd_read_addr()&0x7f;//savecursorlocation
lcd_write_inst(time_start_addr);//setLCDline1
lcd_write_data(CurrentTime.hourh+’0’);
lcd_write_data(CurrentTime.hourl+’0’);
lcd_write_data(’:’);
lcd_write_data(CurrentTime.minuteh+’0’);
lcd_write_data(CurrentTime.minutel+’0’);
lcd_write_data(’:’);
lcd_write_data(CurrentTime.secondh+’0’);
lcd_write_data(CurrentTime.secondl+’0’);
lcd_write_inst(lcd_addr|0x80);//resumecursorlocation
}
if(CurrentMode==mode_time)
{//refreshdatedisplay
lcd_addr=lcd_read_addr()&0x7f;//savecursorlocation
lcd_write_inst(0xc0+3);//setLCDline2
lcd_write_data(CurrentDate.year1+’0’);
lcd_write_data(CurrentDate.year2+’0’);
lcd_write_data(CurrentDate.year3+’0’);
lcd_write_data(CurrentDate.year4+’0’);
lcd_write_data(’/’);
lcd_write_data(CurrentDate.monthh+’0’);
lcd_write_data(CurrentDate.monthl+’0’);
lcd_write_data(’/’);
lcd_write_data(CurrentDate.dayh+’0’);
lcd_write_data(CurrentDate.dayl+’0’);
lcd_write_inst(lcd_addr|0x80);//resumecursorlocation
}
if(Alarm1Enable)
{
if((AlarmTime1.hourh==CurrentTime.hourh)&(AlarmTime1.hourl==CurrentTime.hourl)
&(AlarmTime1.minuteh==CurrentTime.minuteh)&(AlarmTime1.minutel==CurrentTime.minutel)
&(AlarmTime1.secondh==CurrentTime.secondh)&(AlarmTime1.secondl==CurrentTime.secondl))
{
Alarm1Alarm=true;
CCP1CON=PWM_on;
BackLightEn=0;
}
if(Alarm1Cnt>120)//twominutes
{
Alarm1Alarm=false;
Alarm1Cnt=0;
BackLightEn=1;
BackLightTimer=0;
}
}
else
{
Alarm1Alarm=false;
Alarm1Cnt=0;
}
if(Alarm2Enable)
{
if((AlarmTime2.hourh==CurrentTime.hourh)&(AlarmTime2.hourl==CurrentTime.hourl)
&(AlarmTime2.minuteh==CurrentTime.minuteh)&(AlarmTime2.minutel==CurrentTime.minutel)
&(AlarmTime2.secondh==CurrentTime.secondh)&(AlarmTime2.secondl==CurrentTime.secondl))
{
Alarm2Alarm=true;
CCP1CON=PWM_on;
BackLightEn=0;
}
if(Alarm2Cnt>120)//twominutes
{
Alarm2Alarm=false;
Alarm2Cnt=0;
BackLightEn=1;
BackLightTimer=0;
}
}
else
{
Alarm2Alarm=false;
Alarm2Cnt=0;
}
}
}

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉