C++闹钟程序(API)
- 格式:docx
- 大小:23.70 KB
- 文档页数:10
单片机电子闹钟程序(亲自编写-可用)————————————————————————————————作者:————————————————————————————————日期:学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。
其中正常时间显示和闹钟时间显示可用一个开关来调整。
芯片选择STC89C52程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//定义显示段码uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar codebbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0};uchar clock1[]={12,30,0};uchar weikong[6];uchar bbduration=4;uchar lingtime=9;//学校打铃时间组uchar shangwu1[]={8,30};uchar shangwu2[]={10,0};uchar shangwu3[]={10,20};uchar shangwu4[]={11,50};uchar xiawu1[]={13,30};uchar xiawu2[]={15,00};uchar xiawu3[]={15,15};uchar xiawu4[]={16,45};//按键定义sbit mode=P1^7;sbit sec_clr=P1^0;sbit min_set_add=P1^3;sbit min_set_sub=P1^4;sbit hour_set_add=P1^1;sbit hour_set_sub=P1^2;sbit bb_set_add=P1^5;sbit bb_set_sub=P1^6;sbit speaker=P2^6;//延时函数void delay(unsigned int t){while(t--);//时钟进位函数void clockjinwei(){clock[0]++;if(clock[0]==20){clock[1]++;clock[0]=0;if(clock[1]==60){clock[2]++;clock[1]=0;if(clock[2]==60){clock[3]++;clock[2]=0;if(clock[3]==24)clock[3]=0;}}}}//定时器0中断服务函数void timer0(void) interrupt 1 using 1 {TMOD=0x01;TH0=0x3c;TL0=0xb0;clockjinwei();}//时钟分位显示函数void fenwei(){weikong[0]=clock[3]/10;weikong[1]=clock[3]%10;weikong[2]=clock[2]/10;weikong[3]=clock[2]%10;weikong[4]=clock[1]/10;weikong[5]=clock[1]%10;}//闹钟分位显示函数void naofen(){weikong[0]=clock1[0]/10;weikong[1]=clock1[0]%10;weikong[2]=clock1[1]/10;weikong[3]=clock1[1]%10;weikong[4]=clock1[2]/10;weikong[5]=clock1[2]%10; }//闹钟定时显示函数void naozhongdisplay(){uchar z,s;uchar x=0x01;naofen();for(z=0;z<6;z++){P2=0;P0=table[weikong[z]];P2=x;x=_crol_(x,1);for(s=0;s<255;s++);}}//时钟显示函数void display(){uchar i,j;uchar x=0x01;fenwei();for(i=0;i<6;i++){P2=0;P0=table[weikong[i]];P2=x;x=_crol_(x,1);for(j=0;j<255;j++);}}//总显示函数void zhongxian(){if(mode==1)delay(100);if(mode==1)display();if(mode==0)delay(100);if(mode==0)naozhongdisplay();}//按键处理程序void key_set(){zhongxian();P1=0xff;if(min_set_add==0){delay(100);if(min_set_add==0){if(mode==1){clock[2]++;if(clock[2]==60){clock[2]=0;}while(min_set_add==0)zhongxian();}}if(mode==0){clock1[1]++;if(clock1[1]==60){clock1[1]=0;}while(min_set_add==0)zhongxian();}}//if(min_set_sub==0){delay(100);if(min_set_sub==0){if(mode==1){clock[2]--;if(clock[2]==0)clock[2]=59;}while(min_set_sub==0)zhongxian();if(mode==0){clock1[1]--;if(clock1[1]==0)clock1[1]=59;}while(min_set_sub==0)zhongxian();}}//if(hour_set_add==0){delay(100);if(hour_set_add==0){if(mode==1){clock[3]++;if(clock[3]==24){clock[3]=0;}while(hour_set_add==0)zhongxian();}if(mode==0){clock1[0]++;if(clock1[0]==24){clock1[0]=0;}while(hour_set_add==0)zhongxian();}}}//if(hour_set_sub==0){delay(100);if(hour_set_sub==0){if(mode==1){clock[3]--;if(clock[3]==0)clock[3]=23;}while(hour_set_sub==0)zhongxian();if(mode==0){clock1[0]--;if(clock1[0]==0)clock1[0]=23;}while(hour_set_sub==0)zhongxian();}}//if(sec_clr==0){delay(100);if(sec_clr==0){clock[1]=0;}while(sec_clr==0)zhongxian();}}//闹钟响铃函数void bb(){if(clock[1]<=bbduration){speaker=1;delay(100);speaker=0;}else speaker=0;}//打铃函数void daling(){if(clock[1]<=lingtime){speaker=1;delay(100);speaker=0;}else speaker=0;}//时间比较函数void bijiao(){if(clock[3]==shangwu1[0]){if(clock[2]==shangwu1[1])daling();}if(clock[3]==shangwu2[0]){if(clock[2]==shangwu2[1])daling();}if(clock[3]==shangwu3[0]){if(clock[2]==shangwu3[1])daling();}if(clock[3]==shangwu4[0]){if(clock[2]==shangwu4[1])daling();}if(clock[3]==xiawu1[0]){if(clock[2]==xiawu1[1])daling();}if(clock[3]==xiawu2[0]){if(clock[2]==xiawu2[1])daling();}if(clock[3]==xiawu3[0]){if(clock[2]==xiawu3[1])daling();}if(clock[3]==xiawu4[0]){if(clock[2]==xiawu4[1])daling();}}//闹钟比较void naobijiao(){if(clock[3]==clock1[0]){if(clock[2]==clock1[1]||clock[2]==clock1[1]+1||clock[2]==clock1[1]+2) bb();}}//响铃时长显示函数void bbtimeshow(){P3=bbtime[bbduration];if(bbduration>15)bbduration=0;}//响铃按键处理函数void bbtime_set(){bbtimeshow();if(bb_set_add==0){delay(100);if(bb_set_add==0)bbduration++;while(bb_set_add==0)bbtimeshow();}if(bb_set_sub==0){delay(100);if(bb_set_sub==0)bbduration--;while(bb_set_sub==0)bbtimeshow();}}//主程序void main(){EA=1;ET0=1;TR0=1;while(1){key_set();bijiao();bbtime_set();naobijiao();}}电路图:分四部分显示:如果在学习这个程序过程中有什么问题,可以发邮件到询问。
void delay1ms(int i)//1毫秒延时{int j,k;while(i--)for(j=76;j>1;j--);for(k=29;k>1;k--);}void delaynus(unsigned char n) //延时若干微秒{unsigned char i;for(i=0;i<n;i++);}/***********蜂鸣器模块************/sbit beep=P3^7; //位定义,定义P.6位fmp void dely500(void){unsigned char i;for(i=250;i>0;i--){_nop_();}}void baojing(unsigned char n){unsigned char x,i;while(n--){for(i=0;i<5;i++){for(x=0;x<200;x++){beep=~beep;dely500();}}for(i=0;i<3;i++){for(x=0;x<200;x++){beep=~beep;dely500();dely500();}}}}void display_houra(unsigned char x) //闹钟小时部分显示{unsigned char i,j;i=x/10;j=x%10;Write_Address(0x44);Write_Date(digit[i]);Write_Date(digit[j]);}void display_minutea(unsigned char x)//闹钟分钟部分显示{unsigned char i,j;i=x/10;j=x%10;Write_Address(0x47);Write_Date(digit[i]);Write_Date(digit[j]);}void main(){IE=0X82; //打开定时中断TMOD=0X01; //选择定时器0工作在方式1TR0=0; //启动定时器0IntDS1302(); //初始化DS1302delay1ms(1);Lcd_Int(); //1602液晶初始化led=0; //打开LCD的背光电源delay1ms(2);displaystar(); //显示欢迎界面displaymainpart(); //显示主要部分(不变化)while(1){display_Time( );Set( );if(ADD==0){Write_com(0x01);delay1ms(5);Temperature();Write_com(0x01);displaymainpart();}if((hours==houra)&&(minutes==minutea)&&(seconds==0)){if(alarmmode==1){Write_com(0x01);delay1ms(5);Write_Address(0x03);Write_Date('T');Write_Date('I');Write_Date('M');Write_Date('E');Write_Address(0x08);Write_Date('U');Write_Date('P');Write_Date('!');delay1ms(5);while(1){baojing(1);if(CANL==0){Write_com(0x01);delay1ms(5);displaymainpart();break;}}}}}}/***********蜂鸣器模块************/void delay1ms(int i)//1毫秒延时{int j,k;while(i--)for(j=76;j>1;j--);for(k=29;k>1;k--);}sbit beep=P3^7; //位定义,定义P.6位fmpvoid dely500(void){unsigned char i;for(i=250;i>0;i--){_nop_();}}void baojing(unsigned char n){unsigned char x,i;while(n--){for(i=0;i<5;i++){for(x=0;x<200;x++){beep=~beep;dely500();}}for(i=0;i<3;i++){for(x=0;x<200;x++){beep=~beep;dely500();dely500();}}}}void display_houra(unsigned char x) //闹钟小时部分显示{unsigned char i,j;i=x/10;j=x%10;GotoXY(4, 1);LCD_Write(LCD_DATA, digit[i]);LCD_Write(LCD_DATA, digit[j]);}void display_minutea(unsigned char x)//闹钟分钟部分显示{unsigned char i,j;i=x/10;j=x%10;GotoXY(4, 1);LCD_Write(LCD_DATA, digit[i]);LCD_Write(LCD_DATA, digit[j]);}void alarmhourset(void) //闹钟小时调整{unsigned char value;value=houra;while(1){if(Up==0){delay1ms(20);if(Up==0){LCD_Write(LCD_COMMAND, 0x0c);delay1ms(5);value++;if(value>23) value=0;while(Up==0);}}if(Down==0){delay1ms(20);if(Down==0){value--;if(value==0) value=23;while(Down==0);}houra=value;display_houra(houra);GotoXY(5, 1);delay1ms(5);LCD_SetDisplay(0x07);delay1ms(5);if(Out==0){delay1ms(500);break;}}}void alarmminuteset(void) //闹钟分钟调整{while(1){if(Up==0){delay1ms(20);if(Up==0){minutea++;if(minutea>59) minutea=0;while(Up==0) ;}}if(Down==0){delay1ms(20);if(Down==0){minutea--;if(minutea==0) minutea=59;while(Down==0) ;}}display_minutea(minutea);GotoXY(8, 1);delay1ms(5);LCD_SetDisplay(0x07);delay1ms(5);if(Out==0)delay1ms(500);break;}}}void alarmswitchset(void){while(1){if(Up==0){delay1ms(100);if(Up==0){alarmmode=1;GotoXY(12, 1);Print("ON");}}if(Down==0){alarmmode=0;GotoXY(12, 1);Print("OFF");}if(Out==0){delay1ms(500);break;}}}/**************** 设置模块******************/ void Set_zhi (void){if(Set==0){delay1ms(10);if(Set==0){GotoXY(0, 1);Print("T") ;LCD_Write(LCD_COMMAND, 0x0f);delay1ms(1000);LCD_Write(LCD_COMMAND, 0x0c);while(1){keydone();if(Down==0){delay1ms(20);if(Down==0){LCD_Write(LCD_CLEAR_SCREEN, 0x01);//清屏delay1ms(5);GotoXY(2, 0);Print("ALARM SET");GotoXY(6, 1);Print("-");display_houra(houra);display_minutea(minutea);if(alarmmode==1){GotoXY(12, 1);Print("ON ");}if(alarmmode==0){GotoXY(12, 1);Print("OFF");}while(1){if(Set==0){delay1ms(100);if(Set==0){amode++;switch(amode){case(1):{ GotoXY(5, 1);delay1ms(5);LCD_SetDisplay(0x07);delay1ms(5);alarmhourset();LCD_Write(LCD_COMMAND, 0x0c);delay1ms(500);} break;case(2):{ GotoXY(8, 1);delay1ms(5);LCD_SetDisplay(0x07);delay1ms(5);alarmminuteset();LCD_Write(LCD_COMMAND, 0x0c);delay1ms(500);} break;case(3):{ GotoXY(12, 1);delay1ms(5);LCD_SetDisplay(0x07);delay1ms(5);alarmswitchset();LCD_Write(LCD_COMMAND, 0x0c);delay1ms(500);} break;}if(amode==4) amode=0;}}if(Out==0){LCD_Write(LCD_CLEAR_SCREEN,0x01);delay1ms(5);show_time() ;break;}}}}if(Out==0){GotoXY(0, 1);Print(" ");LCD_Write(LCD_COMMAND, 0x0c);break;}}}}}void main (){flag=1; //时钟停止标志LCD_Initial(); //液晶初始化Init_DS18B20( ) ; //DS18B20初始化Initial_DS1302(); //时钟芯片初始化up_flag=0;down_flag=0;done=0; //进入默认液晶显示//wireless_1=0;//wireless_2=0;//wireless_3=0;//wireless_4=0P3=0;displaystar(); //显示欢迎界面while(1){while(done==1)keydone(); //进入调整模式while(done==0){show_time(); //液晶显示数据Set_zhi( );if((hide_hour==houra)&&(hide_min==minutea)&&(hide_sec==0)){if(alarmmode==1){LCD_Write(LCD_CLEAR_SCREEN, 0x01);//清屏delay1ms(5);GotoXY(3, 0);Print("TTME");GotoXY(8, 0);Print("UP!");delay1ms(5);while(1){baojing(1);if(Out==0){LCD_Write(LCD_CLEAR_SCREEN, 0x01);//清屏delay1ms(5);show_time();break;}}}}//flag=0;Setkey(); //扫描各功能键}}}。
用C语言写的一个PIC16F877的时闹钟程序单片机用16F877,主时钟用20MHz,用32768作定时时间。
可以实现2路定闹,每一路都可分别设置和开关,采用4x4键盘,16x2的字符型LCD显示。
连线在程序开头有说明。
程序的功能:(1)上电后LCD背光打开,并显示倒计时5秒,然后时钟开始工作。
(2)用模式键(*)切换模式,如显示时间、日期、闹钟1、闹钟2等,并且可以用上、下键控制加1、减1或是闹钟的On、Off。
(3)原程序有16个键,包括0~9数字键,可以直接输入要设置的时间值,但后来将数字键取消了,你仍然可以通过修改程序的部分注释恢复此功能。
(4)闹钟有2路,时间到后闹2分钟,可按任意键取消本次闹钟。
闹钟响时有2种音调,是用PIC的PWM实现的。
(5)按任意键可打开背光,1分钟后自动关闭背光。
(6)RA0~RA3为按键扫描输入,应接下拉电阻。
主程序// FileName: Main.c// MCU: Microchip PIC16F877// Tool: CCS-C compiler// Author: KingEDA, MSN:kingeda@, skype:kingeda, E-mail:kingeda@// Website: // Description:// A timer program// Ver 0.1: 2003-03-31, all clock function with date display, 2 way alarm.// Ver 0.2: 2003-05-05, (1) Alarm default is on,modify alarm1 time to 7:00:00,// and alarm2 to 13:30:00.// (2) Backlight will be enabled when alarming.// (3) Automatic adjust day(28,30,31).// (4) Automatic move cursor to next location when set item.// PIN Connection:// RC0~1 : 32768Hz crystal// RC2 : Buzzer// RC3 : LCD Back Light,drive a PNP BJT// RD0~RD7 : to LCD DB0~DB7// RA0~RA3 : keypad col in// RC4~RC7 : keypad line out// 7 8 9 #// 4 5 6 ↑// 1 2 3 ↓// 0 ←→*// RE0 : LCD RS// RE1 : LCD RW// RE2 : LCD E#include "my16f877.h"#device ICD=true//#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT #use delay(clock = 24000000)//#use fast_io(C)#use fast_io(E)#define lcd_busy (lcd_read_addr()&0x80) == 0x80#define time_start_addr 0x80+0x04#define time_hourh_addr time_start_addr#define time_hourl_addr time_start_addr+1#define time_minuteh_addr time_start_addr+3#define time_minutel_addr time_start_addr+4#define time_secondh_addr time_start_addr+6#define time_secondl_addr time_start_addr+7#define key_0 0x11#define key_1 0x21#define key_2 0x22#define key_3 0x24#define key_4 0x41#define key_5 0x42#define key_6 0x44#define key_7 0x81#define key_8 0x82#define key_9 0x84#define key_left 0x12#define key_right 0x14#define key_up 0x48#define key_down 0x28#define key_mode 0x18#define key_cancel 0x88char StrPower1[] = " * Power on * ";char StrSetTime[] = " * Adjust time* ";char StrSetDate[] = " * Adjust date* ";char StrAlarm1[] = " * Set alarm 1* ";char StrAlarm2[] = " * Set alarm 2* ";unsigned char PORTC_MAP;#bit BackLightEn = PORTC_MAP.3unsigned char BackLightTimer;int1 led;#bit lcd_rs = PORTE.0#bit lcd_rw = PORTE.1#bit lcd_e = PORTE.2#byte lcd_bus = PORTD#byte lcd_dir = TRISD#define PWM_on 0x0c#define PWM_off 0x00#define PWM_period 200#define PWM_DC 100unsigned char lcd_addr;unsigned char KeyLine;unsigned char KeyOld;unsigned char KeyNew;struct mTime {unsigned char hourh; // hour,0~23unsigned char hourl;unsigned char minuteh; // minute,0~59unsigned char minutel;unsigned char secondh; // second,0~59unsigned char secondl;};struct mTime CurrentTime = {1,2,0,0,0,0};struct mTime AlarmTime1 = {0,7,0,0,0,0}; // 07:00:00 struct mTime AlarmTime2 = {1,3,3,0,0,0}; // 13:30:00 unsigned char AlarmStatus;#bit Alarm1Enable = AlarmStatus.0#bit Alarm2Enable = AlarmStatus.1#bit Alarm1Alarm = AlarmStatus.2#bit Alarm2Alarm = AlarmStatus.3unsigned char Alarm1Cnt; // alarm1 second count unsigned char Alarm2Cnt;unsigned char CurrentMode;#define mode_time 0#define mode_set_time 1#define mode_set_date 2#define mode_set_alarm1 3#define mode_set_alarm2 4unsigned char adjust_item;struct mDate {unsigned char year1; //unsigned char year2;unsigned char year3;unsigned char year4;unsigned char monthh;unsigned char monthl;unsigned char dayh;unsigned char dayl;};struct mDate CurrentDate = {2,0,0,3,0,1,0,1}; unsigned char *pStr;// ------------------------------------------------------- unsigned char lcd_read_addr(){unsigned char ch;lcd_dir = 0xff; // read from lcdlcd_rs = 0;lcd_rw = 1; // instlcd_e = 1;#asmnopnopnop#endasmch = lcd_bus;lcd_e = 0;lcd_dir = 0x00; // set write to lcdreturn ch;}// ------------------------------------------------------- unsigned char lcd_write_data(unsigned char ch) {while (lcd_busy){ restart_wdt(); }lcd_rs = 1; // datalcd_rw = 0; // writelcd_bus = ch; // write outlcd_e = 1;#asmnopnopnop#endasmlcd_e = 0;return 'Y';}// ------------------------------------------------------- unsigned char lcd_write_inst(unsigned char ch) {while (lcd_busy){ restart_wdt(); }lcd_rs = 0; // instlcd_rw = 0; // writelcd_bus = ch;lcd_e = 1;#asmnopnopnop#endasmlcd_e = 0;return 'Y';}// ------------------------------------------------------- unsigned char lcd_read_data(){unsigned char ch;while (lcd_busy){ restart_wdt(); }lcd_dir = 0xff; // read from lcdlcd_rs = 1; // datalcd_rw = 1; // readlcd_e = 1;#asmnopnopnop#endasmch = lcd_bus; // read inlcd_e = 0;lcd_dir = 0x00; // set write to lcdreturn ch;}// ------------------------------------------------------- void lcd_init(){unsigned char Tempch;lcd_addr = 0;delay_ms(100);Tempch = 0x38; // 1-line mode,5x8 dotslcd_write_inst(Tempch); // Function setTempch = 0x0f; // lcd on,cursor on,blink onlcd_write_inst(Tempch); // Display on/offTempch = 0x06; // Increment mode,Entire shift offlcd_write_inst(Tempch);Tempch = 0x01; // clear displaylcd_write_inst(Tempch);delay_ms(3);}// -------------------------------------------------------//#int_timer1//void timer1_interrupt(void)#int_ccp2void ccp2_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++;}else if((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++;}elseCurrentDate.year2++;}elseCurrentDate.year3++;}elseCurrentDate.year4++;}else if(CurrentDate.monthl == 9){CurrentDate.monthl = 0;CurrentDate.monthh++;}elseCurrentDate.monthl++;}else if(CurrentDate.dayl == 9){CurrentDate.dayl=0;CurrentDate.dayh++;}elseCurrentDate.dayl++;}elseCurrentTime.hourl++;}elseCurrentTime.minuteh++;}elseCurrentTime.minutel++;}elseCurrentTime.secondh++;}elseCurrentTime.secondl++;if ((Alarm1Alarm == false) & (Alarm2Alarm == false)){led = 0;CCP1CON = PWM_off;}else{if (led == 1){led = 0;PR2 = PWM_period; // set pwm periodCCPR1L = PWM_DC; // set pwm duty cycle//CCP1CON = PWM_on;}else{led = 1;PR2 = PWM_period/2; // set pwm periodCCPR1L = PWM_DC/2; // set pwm duty cycle//CCP1CON = PWM_off;}}Alarm1Cnt++;Alarm2Cnt++;if (BackLightEn == 0)if (((BackLightTimer++)>=60) & (Alarm1Alarm == false) & (Alarm1Alarm == false))BackLightEn = 1; // disable backlight PORTC = PORTC_MAP;//TMR1IF = 0;//PIR1 = PIR2 = 0x00;CCP2IF = 0;}// ------------------------------------------------------- unsigned char get_key(void){unsigned char key_in,tmp;TRISC = 0x03;KeyLine = 0xf0;PORTC = KeyLine | PORTC_MAP;#asmnopnopnop#endasmif ((PORTA & 0x0f) != 0){tmp = 0x10;for (KeyLine = tmp;KeyLine!=0;KeyLine = tmp){PORTC = KeyLine | PORTC_MAP;tmp = KeyLine <<1;#asmnopnopnop#endasmkey_in = PORTA & 0x0f;if (key_in != 0){return (key_in | KeyLine);}}return 0;}elsereturn 0;}// -------------------------------------------------------void set_mode(void){if (CurrentMode == mode_set_alarm2)CurrentMode = mode_time;else{CurrentMode++;adjust_item = 0;}lcd_write_inst(0x01); // clear LCD displaylcd_write_inst(time_start_addr); // set LCD line1 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;}else if(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;}else if(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;}else if(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); // set LCD line2 if (CurrentMode != mode_time){for (;*pStr!=0;pStr++){ // write hint messagelcd_write_data(*pStr);}lcd_write_inst(0x0f); // LCD cursor onlcd_write_inst(time_start_addr); // move cursor to start }else // time mode,write date to second line{lcd_write_inst(0x0c); // LCD sursor off/* lcd_write_inst(0xc0 + 3); // set date start address 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); // move cursor to start }else if (CurrentMode == mode_set_date){lcd_write_inst(time_start_addr); // move cursor to start }else if (CurrentMode == mode_set_alarm1){lcd_write_inst(time_secondl_addr+3);adjust_item = 6;}else if (CurrentMode == mode_set_alarm2){lcd_write_inst(time_secondl_addr+3);adjust_item = 6;}else{lcd_write_inst(0x0c); // LCD cursor off}}// ------------------------------------------------------- void set_date(void){if (adjust_item == 0) // adjust year{if ((KeyNew >=0) & (KeyNew <= 9)){CurrentDate.year1 = KeyNew;lcd_write_data(CurrentDate.year1 + '0');//lcd_write_inst(time_start_addr);adjust_item ++;}else if (KeyNew == key_left){adjust_item = 7;lcd_write_inst(time_start_addr + 9);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_start_addr + 1);}}else if(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 ++;}else if (KeyNew == key_left){adjust_item --;lcd_write_inst(time_start_addr + 0);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_start_addr + 2);}}else if(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 ++;}else if (KeyNew == key_left){adjust_item --;lcd_write_inst(time_start_addr + 1);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_start_addr + 3);}}else if(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);}else if (KeyNew == key_left){adjust_item --;lcd_write_inst(time_start_addr + 2);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_start_addr + 5);}}else if(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 ++;}else if (KeyNew == key_left){adjust_item --;lcd_write_inst(time_start_addr + 3);}else if (KeyNew == key_right){adjust_item ++;lcd_write_inst(time_start_addr + 6);}}else if(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);}else if (KeyNew == key_left){adjust_item --;lcd_write_inst(time_start_addr + 5);}else if (KeyNew == key_right){adjust_item ++;lcd_write_inst(time_start_addr + 8);}}else if(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 ++;}else if (KeyNew == key_left){adjust_item --;lcd_write_inst(time_start_addr + 6);}else if (KeyNew == key_right){adjust_item ++;lcd_write_inst(time_start_addr + 9);}}else if(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);}else if (KeyNew == key_left){adjust_item --;lcd_write_inst(time_start_addr + 8);}else if (KeyNew == key_right){adjust_item = 0;lcd_write_inst(time_start_addr + 0);}}}// -------------------------------------------------------void set_time(void){if (adjust_item == 0) // set hourh{if (((CurrentTime.hourl <4) & (KeyNew < 3)) | ((CurrentTime.hourl >3) & (KeyNew <2))){CurrentTime.hourh = KeyNew;lcd_write_data(CurrentTime.hourh + '0'); // refresh hourh//lcd_write_inst(0x10); // move cursor backadjust_item ++;}else if(KeyNew == key_left){adjust_item = 5;lcd_write_inst(time_secondl_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_hourl_addr);}}else if (adjust_item == 1) // set hourl{if (((CurrentTime.hourh == 2) & (KeyNew < 4)) | ((CurrentTime.hourh < 2) & (KeyNew <=9))){CurrentTime.hourl = KeyNew;lcd_write_data(CurrentTime.hourl + '0'); // refresh hourl//lcd_write_inst(0x10); // move cursor backadjust_item ++;lcd_write_inst(time_minuteh_addr);}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_hourh_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_minuteh_addr);}}else if (adjust_item == 2) // set minuteh{if (KeyNew <6){CurrentTime.minuteh = KeyNew;lcd_write_data(CurrentTime.minuteh + '0');//lcd_write_inst(0x10); // move cursor backadjust_item ++;}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_hourl_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_minutel_addr);}}else if (adjust_item == 3) // set minutel{if ((KeyNew >=0) & (KeyNew <=9)){CurrentTime.minutel = KeyNew;lcd_write_data(CurrentTime.minutel + '0');//lcd_write_inst(0x10); // move cursor backadjust_item ++;lcd_write_inst(time_secondh_addr);}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_minuteh_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_secondh_addr);}}else if (adjust_item == 4) // set secondh{if (KeyNew <6){CurrentTime.secondh = KeyNew;lcd_write_data(CurrentTime.secondh + '0');//lcd_write_inst(0x10); // move cursor backadjust_item ++;}else if(KeyNew == key_left){adjust_item --;&nb, sp; lcd_write_inst(time_minutel_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_secondl_addr);}}else if (adjust_item == 5) // set secondl{if ((KeyNew >=0) & (KeyNew <=9)){CurrentTime.secondl = KeyNew;lcd_write_data(CurrentTime.secondl + '0');//lcd_write_inst(0x10); // move cursor backadjust_item = 0;lcd_write_inst(time_hourh_addr);}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_secondh_addr);}else if(KeyNew == key_right){adjust_item = 0;lcd_write_inst(time_hourh_addr);}}}// -------------------------------------------------------void set_alarm1(void){if (adjust_item == 0) // set hourh{if (((AlarmTime1.hourl <4) & (KeyNew < 3)) | ((AlarmTime1.hourl >3) & (KeyNew <2))){AlarmTime1.hourh = KeyNew;lcd_write_data(AlarmTime1.hourh + '0'); // refresh hourh//lcd_write_inst(0x10); // move cursor backadjust_item ++;}else if(KeyNew == key_left){adjust_item = 6;lcd_write_inst(time_secondl_addr + 3);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_hourl_addr);}}else if (adjust_item == 1) // set hourl{if (((AlarmTime1.hourh == 2) & (KeyNew < 4)) | ((AlarmTime1.hourh < 2) & (KeyNew <=9))){AlarmTime1.hourl = KeyNew;lcd_write_data(AlarmTime1.hourl + '0'); // refresh hourl//lcd_write_inst(0x10); // move cursor backadjust_item ++;lcd_write_inst(time_minuteh_addr);}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_hourh_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_minuteh_addr);}}else if (adjust_item == 2) // set minuteh{if (KeyNew <6){AlarmTime1.minuteh = KeyNew;lcd_write_data(AlarmTime1.minuteh + '0');//lcd_write_inst(0x10); // move cursor backadjust_item ++;}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_hourl_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_minutel_addr);}}else if (adjust_item == 3) // set minutel{if ((KeyNew >=0) & (KeyNew <=9)){AlarmTime1.minutel = KeyNew;lcd_write_data(AlarmTime1.minutel + '0');//lcd_write_inst(0x10); // move cursor backadjust_item ++;lcd_write_inst(time_secondh_addr);}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_minuteh_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_secondh_addr);}}else if (adjust_item == 4) // set secondh{if (KeyNew <6){AlarmTime1.secondh = KeyNew;lcd_write_data(AlarmTime1.secondh + '0');//lcd_write_inst(0x10); // move cursor backadjust_item ++;}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_minutel_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_secondl_addr);}}else if (adjust_item == 5) // set secondl{if ((KeyNew >=0) & (KeyNew <=9)){AlarmTime1.secondl = KeyNew;lcd_write_data(AlarmTime1.secondl + '0');//lcd_write_inst(0x10); // move cursor backadjust_item ++;lcd_write_inst(time_secondl_addr+3);}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_secondh_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_secondl_addr+3);}}else if (adjust_item == 6) // set on/off{if ((KeyNew == key_up) | (KeyNew == key_down)){if (Alarm1Enable){Alarm1Enable =false; // disable alarm1lcd_write_data('f');lcd_write_data('f');}else{Alarm1Enable =true; // enable alarm1lcd_write_data('n');lcd_write_data(' ');}//lcd_write_inst(time_secondl_addr+3);adjust_item = 0;lcd_write_inst(time_hourh_addr);Alarm1Cnt = 0;}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_secondl_addr);}else if(KeyNew == key_right){adjust_item = 0;lcd_write_inst(time_hourh_addr);}}}// -------------------------------------------------------void set_alarm2(void){if (adjust_item == 0) // set hourh{if (((AlarmTime2.hourl <4) & (KeyNew < 3)) | ((AlarmTime2.hourl >3) & (KeyNew <2))){AlarmTime2.hourh = KeyNew;lcd_write_data(AlarmTime2.hourh + '0'); // refresh hourh//lcd_write_inst(0x10); // move cursor backadjust_item ++;}else if(KeyNew == key_left){adjust_item = 6;lcd_write_inst(time_secondl_addr+3);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_hourl_addr);}}else if (adjust_item == 1) // set hourl{if (((AlarmTime2.hourh == 2) & (KeyNew < 4)) | ((AlarmTime2.hourh < 2) & (KeyNew <=9))){AlarmTime2.hourl = KeyNew;lcd_write_data(AlarmTime2.hourl + '0'); // refresh hourl//lcd_write_inst(0x10); // move cursor backadjust_item ++;lcd_write_inst(time_minuteh_addr);}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_hourh_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_minuteh_addr);}}else if (adjust_item == 2) // set minuteh{if (KeyNew <6){AlarmTime2.minuteh = KeyNew;lcd_write_data(AlarmTime2.minuteh + '0');//lcd_write_inst(0x10); // move cursor backadjust_item ++;}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_hourl_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_minutel_addr);}}else if (adjust_item == 3) // set minutel{if ((KeyNew >=0) & (KeyNew <=9)){AlarmTime2.minutel = KeyNew;lcd_write_data(AlarmTime2.minutel + '0');//lcd_write_inst(0x10); // move cursor backadjust_item ++;lcd_write_inst(time_secondh_addr);}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_minuteh_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_secondh_addr);}}else if (adjust_item == 4) // set secondh{if (KeyNew <6){AlarmTime2.secondh = KeyNew;lcd_write_data(AlarmTime2.secondh + '0');//lcd_write_inst(0x10); // move cursor backadjust_item ++;}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_minutel_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_secondl_addr);}}else if (adjust_item == 5) // set secondl{if ((KeyNew >=0) & (KeyNew <=9)){AlarmTime2.secondl = KeyNew;lcd_write_data(AlarmTime2.secondl + '0');//lcd_write_inst(0x10); // move cursor backadjust_item ++;lcd_write_inst(time_secondl_addr+3);}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_secondh_addr);}else if(KeyNew == key_right){adjust_item ++;lcd_write_inst(time_secondl_addr+3);}}else if (adjust_item == 6) // set on/off{if ((KeyNew == key_up) | (KeyNew == key_down)){if (Alarm2Enable){Alarm2Enable =false; // disable alarm2lcd_write_data('f');lcd_write_data('f');}else{Alarm2Enable =true; // enable alarm2lcd_write_data('n');lcd_write_data(' ');}//lcd_write_inst(time_secondl_addr+3);adjust_item = 0;lcd_write_inst(time_hourh_addr);Alarm2Cnt = 0;}else if(KeyNew == key_left){adjust_item --;lcd_write_inst(time_secondl_addr);}else if(KeyNew == key_right){adjust_item = 0;lcd_write_inst(time_hourh_addr);}}}// -------------------------------------------------------void main(void){unsigned char cnt;TRISC = 0x03; // PORTC.3 drive led,low activePORTC_MAP = 0x00;led = 0;BackLightEn = 0;BackLightTimer = 0;PORTC = PORTC_MAP;TRISA = 0xff; // low half byte as keyscan inTRISE = 0x00;ADCON0 = 0x00;ADCON1 = 0x06; // all digital I/Oslcd_init();INTCON = 0x00;lcd_write_inst(0x80); // set lcd ddram addressfor (pStr = StrPower1;*pStr!=0;pStr++){lcd_write_data(*pStr);}lcd_write_inst(0x0c); // LCD cursor offPIR1 = PIR2 = 0x00;T1CON = 0x0f; // T1CON: -- T1CKPS1 T1CPS0 T1OSCEN /T1SYNC TMR1CS TMR1ONTMR1H = 0x80;TMR1L = 0x00;。
电子闹钟源程序模块一#include <reg51.h>extern void InitT0(void);extern void Init8255(void);extern unsigned char DispBuf[6];extern bit xTim,xKey;extern void KeyPro(void);extern unsigned char KeySts;extern void Delay(unsigned int ms) ;unsigned char sec,min,hour;Unsigned char code table[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86, 0x8E};sbit P1_1=P1^1;void TimUpdate(void){if(++sec==60){sec=0;if(++min==60){min=0;if(++hour==24){hour=0;}}}}void DisplayTim(){DispBuf[0]=table[sec % 10];DispBuf[1]=table[sec / 10];DispBuf[2]=table[min % 10];DispBuf[3]=table[min / 10];DispBuf[4]=table[hour % 10];DispBuf[5]=table[hour / 10];}void main(void){unsigned char i,x, xi ;x=1;for (i=0;i<6;i++) DispBuf[i]=0xFF;sec=0;min=0;hour=0;InitT0();Init8255();KeySts=0;while(1){if (xTim && (KeySts == 0)){xTim=0;TimUpdate();DisplayTim();// P1= ~x;// x<<=1;//if (x==0) x=1;}if (xKey){xKey =0;KeyPro();}if((sec==0)&&(min==0)){ xi=hour;if (xi==0){ xi=24; }while(xi--){ P1_1=1;DisplayTim();Delay(500);P1_1=0;DisplayTim();Delay(500);sec++;}}}}模块二#include <reg51.h>unsigned char xdata PA _at_ 0x8000; unsigned char xdata PB _at_ 0x8001; unsigned char xdata PC _at_ 0x8002; unsigned char xdata CtrlW _at_ 0x8003;unsigned char pLED;unsigned char DispBuf[6];unsigned char Digit[6]={0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}; unsigned char count;bit xTim,xKey;unsigned char KeyV al;void InitT0(void){pLED=0;xTim=0;count=0;TMOD=(TMOD&0xF0)|0x01;TH0=0xF1;TL0=0x00;TR0=1;ET0=1;EA=1;}void Delay(unsigned int ms){int i,j;for(i=0;i<ms;i++){for(j=0;j<114;j++){}}}void Init8255(void){Delay(1000);CtrlW=0x81;}void T0Srv(void) interrupt 1 using 1{TH0=0xF1;PA=0xFF;PB=Digit[pLED];PA=DispBuf[pLED];if(++pLED==6) pLED=0;count++;if((count&0x03)==0){KeyV al=PC & 0x0F;xKey=1;P1=KeyV al;}if(count==240){count=0;xTim=1;}}模块三#define SET 0x01#define LR 0x02#define UD 0x04#define OK 0x08#include <reg51.h>extern unsigned char sec,min,hour; extern unsigned char code table[16]; extern unsigned char DispBuf[6]; unsigned char EditSec,EditMin,EditHour; extern unsigned char KeyV al; unsigned char CurKey,LastKey; unsigned char KeySts;void DisplayEdit(){DispBuf[0]=table[EditSec%10]; DispBuf[1]=table[EditSec/10];DispBuf[2]=table[EditSec%10]; DispBuf[3]=table[EditSec/10];DispBuf[4]=table[EditSec%10]; DispBuf[5]=table[EditSec/10];DispBuf[6-KeySts]&=0x7F;}void Copy(){sec=EditSec;min=EditMin;hour=EditHour;}void KeyPro(void){unsigned char KeyPressed;LastKey=CurKey;CurKey=KeyV al;KeyPressed=CurKey^LastKey;if(KeyPressed==0) return;if(CurKey==0x0F) return;switch(KeySts){case 0:if(KeyPressed==SET){KeySts++;EditSec=sec;EditMin=min;EditHour=hour;}break;case 1:switch(KeyPressed){case LR: KeySts++;break;case UD: EditHour +=10;if(EditHour>=24) EditHour-=24; break;case OK: Copy();KeySts=0;break;}break;case 2:switch(KeyPressed){case LR: KeySts++;break;case UD: EditHour++;if(EditHour>=24) EditHour-=24; break;case OK: Copy();KeySts=0;break;}break;case 3:switch(KeyPressed){case LR: KeySts++;break;case UD:EditMin+=10;if(EditMin>=60) EditMin-=60; break;case OK:Copy();KeySts=0;break;}break;case 4:switch(KeyPressed){case LR: KeySts++;break;case UD: EditMin++;if(EditMin>=60) EditMin-=60; break;case OK: Copy();KeySts=0;break;}break;case 5:switch(KeyPressed){case LR: KeySts++;break;case UD: EditSec+=10;if(EditSec>=60) EditSec-=60; break;case OK: Copy();KeySts=0;break;}break;case 6:switch(KeyPressed){case LR:KeySts=1;break;case UD:EditSec++;if(EditSec>=60) EditSec-=60; break;case OK: Copy();KeySts=0;break;}break;default:KeySts=0;}DisplayEdit();}。
验收标准:1可按键调整当前时间(年月日时分秒)2设定闹钟时间闹钟时间到led闪烁时间不超过10秒可以按键停止闹钟3具有秒表功能,可暂停,开始,及复位秒表。
4通过按键实现不同的界面的切换5其他#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table1[]={0x40,0xe79,0x24,0xb0,0x19,0x12,0x02,0x78,0x00,0x18};uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//sbit beep=P2^3; //蜂鸣器sbit key1=P3^4;sbit key2=P3^5;sbit key3=P3^6;sbit key4=P3^7;sbit led0=P1^0;uchar tt,num0,nn,num,miao;uint nian=2012,yue=8,ri=19,fen1=0,shi1=0,shi=16,fen=25;void dlay(uint xms);uchar leee();void yue0();void d1();void keyscan(){if(key1==0){dlay(10);if(key1==0){num++;if(num==6){num=0;}while(!key1);}}if(key2==0){dlay(10);if(key2==0){fen1++;if(fen1==60)fen1=0;}while(!key2);}if(key3==0){dlay(10);if(key3==0){shi1++;if(shi1==24)shi1=0;}while(!key3);}if(key4==0){dlay(10);if(key4==0){TR0=~TR0;while(!key4);}}}void dlay(uint xms) {uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--); }void d1(void){if(num==1){P0=0xff;P2=0xef;P0=table[nian%10]; dlay(5);P0=0xff;P0=table[(nian%100)/10]; dlay(5);P0=0xff;P2=0xbf;P0=table[(nian/100)%10]; dlay(5);P0=0xff;P2=0x7f;P0=table[nian/1000]; dlay(5);}if(num==2){P0=0xff;P2=0xef;P0=table[ri%10];dlay(5);P0=0xff;P2=0xdf;P0=table[ri/10];dlay(5);P0=0xff;P2=0xbf;P0=table1[yue%10]; dlay(5);P0=0xff;P2=0x7f;P0=table[yue/10];dlay(5);}if(num==3){P0=0xff;P2=0xef;P0=table[fen%10];dlay(5);P0=0xff;P2=0xdf;P0=table[fen/10];dlay(5);P0=0xff;P0=table1[shi%10];dlay(5);P0=0xff;P2=0x7f;P0=table[shi/10];dlay(5);}if(num==4){P0=0xff;P2=0xbf;P0=table[miao%10]; dlay(5);P0=0xff;P2=0x7f;P0=table[miao/10]; dlay(5);}if(num==5){P0=0xff;P2=0xef;P0=table[fen1%10];dlay(5);P0=0xff;P2=0xdf;P0=table[fen1/10];dlay(5);P0=0xff;P2=0xbf;P0=table1[shi1%10];dlay(5);P0=0xff;P2=0x7f;P0=table[shi1/10];dlay(5);}}void timer0() interrupt 1 {TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++;{tt=0;miao++;}if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;ri++;yue0();if(ri==nn){ri=1;yue++;if(yue==12){yue=1;nian++;}}}}}}void naoz(){uint abc=100;if(fen==fen1&&shi==shi1) {while(abc--){led0=0;dlay(100);led0=1;dlay(100);}}}void main(){TMOD=0x01;TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1;ET0=1;TR0=1;while(1){keyscan();d1();naoz();}}uchar leee(){if(nian%4==0)return 29;elsereturn 28;}void yue0(uchar yue){switch(yue){case 1:case 3:case 5:case 7:case 8:case 10:case 12:nn=31;break;case 4:case 6:case 9:case 11:nn=30;break;case 2:nn=leee(); break;default: break;}}#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table1[]={0x40,0xe79,0x24,0xb0,0x19,0x12,0x02,0x78,0x00,0x18}; uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //sbit beep=P2^3; //蜂鸣器sbit key1=P3^4;sbit key2=P3^5;sbit key3=P3^6;sbit key4=P3^7;sbit led0=P1^0;uchar tt,num0,nn,num,miao;uint nian=2012,yue=8,ri=19,fen1=0,shi1=0,shi=16,fen=25; void dlay(uint xms);uchar leee();void yue0();void d1();void keyscan(){if(key1==0){dlay(10);if(key1==0){num++;if(num==6){num=0;}while(!key1);}}if(key2==0){dlay(10);if(key2==0){if(num0==1){yue++;if(yue==12)yue=1;}if(num0==2){ri++;if(ri==nn)ri=1;}if(num0==3){fen++;if(fen==60)fen=0;}if(num0==4){shi++;if(shi==24)shi=0;}if(num0==5){fen1++;if(fen1==60)fen1=0;}if(num0==6){shi1++;if(shi1==24)shi1=0;}}while(!key2);}if(key3==0) {dlay(10);if(key3==0){num0++;if(num0==7)num0=0;}while(!key3);}if(key4==0){dlay(10);if(key4==0){TR0=~TR0;while(!key4);}}}void dlay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void d1(void){if(num==1){P0=0xff;P2=0xef;P0=table[nian%10];dlay(5);P0=0xff;P2=0xdf;P0=table[(nian%100)/10]; dlay(5);P0=0xff;P2=0xbf;P0=table[(nian/100)%10]; dlay(5);P0=0xff;P2=0x7f;P0=table[nian/1000]; dlay(5);}if(num==2){P0=0xff;P2=0xef;P0=table[ri%10];dlay(5);P0=0xff;P2=0xdf;P0=table[ri/10];dlay(5);P0=0xff;P2=0xbf;P0=table1[yue%10]; dlay(5);P0=0xff;P2=0x7f;P0=table[yue/10];dlay(5);}if(num==3){P0=0xff;P2=0xef;P0=table[fen%10];dlay(5);P0=0xff;P2=0xdf;P0=table[fen/10];dlay(5);P0=0xff;P2=0xbf;P0=table1[shi%10]; dlay(5);P0=0xff;P2=0x7f;P0=table[shi/10];dlay(5);}if(num==4){P0=0xff;P2=0xbf;P0=table[miao%10]; dlay(5);P0=0xff;P2=0x7f;P0=table[miao/10]; dlay(5);}if(num==5){P0=0xff;P2=0xef;P0=table[fen1%10];dlay(5);P0=0xff;P2=0xdf;P0=table[fen1/10];dlay(5);P0=0xff;P2=0xbf;P0=table1[shi1%10];dlay(5);P0=0xff;P2=0x7f;P0=table[shi1/10];dlay(5);}}void timer0() interrupt 1 {TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++;if(tt==10){tt=0;miao++;}if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;ri++;yue0();if(ri==nn){ri=1;yue++;if(yue==12){yue=1;nian++;}}}}}void naoz(){uint abc=100;if(fen==fen1&&shi==shi1) {while(abc--){led0=0;dlay(100);led0=1;dlay(100);}}}void main(){TMOD=0x01;TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1;ET0=1;TR0=1;while(1){keyscan();d1();naoz();}}uchar leee(){if(nian%4==0)return 29;elsereturn 28;}void yue0(uchar yue){switch(yue){case 1:case 5:case 7:case 8:case 10:case 12:nn=31;break;case 4:case 6:case 9:case 11:nn=30;break;case 2:nn=leee(); break;default: break;}}。
C语⾔实现电⼦时钟程序本⽂实例为⼤家分享了C语⾔实现电⼦时钟程序的具体代码,供⼤家参考,具体内容如下Qt ⾥⾯运⾏#include<windows.h>#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <time.h>typedef struct{int x;int y;}Point;time_t now;struct tm *pt, t1, t2;int printpoint(Point p){Point p1;p1.x = p.x + 2; p1.y = p.y + 4;gotoxy(p1.x, p1.y); printf("%c%c", 2, 2);gotoxy(p1.x, p1.y + 1); printf("%c%c", 2, 2);p1.y += 4;gotoxy(p1.x, p1.y); printf("%c%c", 2, 2);gotoxy(p1.x, p1.y + 1); printf("%c%c", 2, 2);return 0;}int print0(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);elseprintf("%c%4s%c", 2, " ", 2);}return 0;}int print1(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);printf("%5s%c", " ", 2);}return 0;}int print2(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else if (i>0 && i<6)printf("%5s%c", " ", 2);elseprintf("%c", 2);}return 0;}int print3(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);elseprintf("%5s%c", " ", 2);}return 0;}int print4(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i<6) printf("%c%4s%c", 2, " ", 2);else if (i == 6)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else printf("%5s%c", " ", 2);}return 0;}int print5(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else if (i>0 && i<6)printf("%c", 2);elseprintf("%5s%c", " ", 2);}return 0;}int print6(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else if (i>0 && i<6)printf("%c", 2);elseprintf("%c%4s%c", 2, " ", 2);}return 0;}int print7(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0) printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2); else printf("%5s%c", " ", 2);}return 0;}int print8(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else printf("%c%4s%c", 2, " ", 2);}return 0;}int print9(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2); else if (i>0 && i<6)printf("%c%4s%c", 2, " ", 2);elseprintf("%5s%c", " ", 2);}return 0;}int clear(Point p){int i = 0;for (; i<13; i++)gotoxy(p.x, p.y + i); printf("%16s", " ");return 0;}int printtime(Point p, int n){int a, b;Point pp;a = n / 10,b = n % 10;pp.x = p.x + 8, pp.y = p.y;switch (a){case 0: print0(p); break;case 1: print1(p); break;case 2: print2(p); break;case 3: print3(p); break;case 4: print4(p); break;case 5: print5(p); break;}switch (b){case 0: print0(pp); break;case 1: print1(pp); break;case 2: print2(pp); break;case 3: print3(pp); break;case 4: print4(pp); break;case 5: print5(pp); break;case 6: print6(pp); break;case 7: print7(pp); break;case 8: print8(pp); break;case 9: print9(pp); break;}return 0;}int main(){Point phour, pmin, psec, point1, point2;phour.x = 9, pmin.x = 32, psec.x = 55;phour.y = pmin.y = psec.y = 7;point1.x = 25, point2.x = 49;point1.y = point2.y = 7;clrscr();textbackground(YELLOW); /* 设置背景颜⾊*/ textcolor(RED); /* 设置数字显⽰颜⾊*/now = time(0);pt = localtime(&now);t1 = *pt;printtime(phour, t1.tm_hour);printpoint(point1);printtime(pmin, t1.tm_min);printpoint(point2);printtime(psec, t1.tm_sec);while (1){now = time(0);pt = localtime(&now);t2 = *pt;if (t2.tm_sec != t1.tm_sec){t1 = t2;clrscr();printtime(phour, t1.tm_hour);printpoint(point1);printtime(pmin, t1.tm_min);printpoint(point2);printtime(psec, t1.tm_sec);}if (bioskey(1) == 0) continue;else exit(0);}return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
#include<reg51.h>//#include"DS18B20_3.H"#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp,key4n;//sheding 为调节打铃时间时显示//flag用于读取头文件中的温度值,和显示温度值uchar codeSeg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; unsigned int s_1,s_2,s_3,s_4,s_5,s_6;#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)uchar flag_xs=0,flag_m,flag_m1,flag_f,flag_f1,flag_s,flag_s1;uchar flag_n,flag_n1,flag_y,flag_y1,flag_r,flag_r1,flag_mb;uint numt;//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)//DS1302时钟芯片与C51之间的引脚连接定义sbit IO=P1^1;sbit SCLK=P1^0;sbit RST=P1^2;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit nyr=P3^1;sbit sfm=P3^0;/************************************************************ACC累加器=AACC.0=E0HACC.0就是ACC的第0位。
VC++ 程序设计设置闹钟题目:ds坐火车的时候昏昏欲睡,可是担心错过站,于是拿出手机设置闹钟。
时间格式为hh:mm(0<=hh<=23,0<=mm<=59),如下图所示。
每次只能调整hh或者mm,数值增大或者减小一,并且如果mm从00->59,hh减少一,如果mm从59->00,hh增大一。
比如14:32->14:33至少需要调整1次,14:59->15:00至少需要调整1次。
你知道h0h0:m0m0->h1h1:m1m1至少需要调整多少次吗?Input第一行一个整数T,表示有T组测试样例每组测试样例中给出h0h0:m0m0 h1h1:m1m1Output至少调整的次数Sample Input314:32 14:3304:59 05:0014:12 08:56Sample Output1121答案:# include <stdio.h># include <math.h>int main(){int T,i,h0,m0,h1,m1,h,m,min,min2;scanf("%d",&T);for(i=0;i<T;i++){scanf("%d:%d %d:%d",&h0,&m0,&h1,&m1);h=h1-h0;m=m1-m0;min=abs(h)+abs(m);if(abs(h)>12)min=24-abs(h)+abs(m);m=m1-m0-60;h=h1-h0+1;if(m1-m0<=0){m=m1-m0+60;h=h1-h0-1;}min2=abs(h)+abs(m);if(abs(h)>12)min2=24-abs(h)+abs(m);if(min2<min)min=min2;printf("%d\n",min);}return 0;}。
#include <afxwin.h>#include <math.h>#include "Clock.h"#include "Resource.h"#define SQUARESIZE 20#define ID_TIMER_CLOCK 1CMyApp myApp;///////////////////////////////////////////////////////////////////////// // CMyApp member functionsBOOL CMyApp::InitInstance (){SetRegistryKey (_T ("Programming Windows with MFC"));m_pMainWnd = new CMainWindow;if (!((CMainWindow*) m_pMainWnd)->RestoreWindowState ()) m_pMainWnd->ShowWindow (m_nCmdShow);m_pMainWnd->UpdateWindow ();return TRUE;}///////////////////////////////////////////////////////////////////////// // CMainWindow message map and member functionsBEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)ON_WM_CREATE ()ON_WM_PAINT ()ON_WM_TIMER ()ON_WM_GETMINMAXINFO ()ON_WM_NCHITTEST ()ON_WM_SYSCOMMAND ()ON_WM_CONTEXTMENU ()ON_WM_ENDSESSION ()ON_WM_CLOSE ()END_MESSAGE_MAP ()CMainWindow::CMainWindow (){m_bAutoMenuEnable = FALSE;CTime time = CTime::GetCurrentTime ();m_nPrevSecond = time.GetSecond ();m_nPrevMinute = time.GetMinute ();m_nPrevHour = time.GetHour () % 12;CString strWndClass = AfxRegisterWndClass (CS_HREDRAW | CS_VREDRAW,myApp.LoadStandardCursor (IDC_ARROW),(HBRUSH) (COLOR_3DFACE + 1),myApp.LoadIcon (IDI_APPICON));Create (strWndClass, _T ("Clock"));}BOOL CMainWindow::PreCreateWindow (CREATESTRUCT& cs){if (!CFrameWnd::PreCreateWindow (cs))return FALSE;cs.dwExStyle &= ~WS_EX_CLIENTEDGE;return TRUE;}int CMainWindow::OnCreate (LPCREATESTRUCT lpcs){if (CFrameWnd::OnCreate (lpcs) == -1)return -1;//// Set a timer to fire at 1-second intervals.//if (!SetTimer (ID_TIMER_CLOCK, 1000, NULL)) {MessageBox (_T ("SetTimer failed"), _T ("Error"),MB_ICONSTOP | MB_OK);return -1;}//// Customize the system menu.//CMenu* pMenu = GetSystemMenu (FALSE);pMenu->AppendMenu (MF_SEPARATOR);pMenu->AppendMenu (MF_STRING, IDM_SYSMENU_FULL_WINDOW, _T ("Remove &Title"));pMenu->AppendMenu (MF_STRING, IDM_SYSMENU_STAY_ON_TOP,_T ("Stay on To&p"));return 0;}void CMainWindow::OnClose (){SaveWindowState ();KillTimer (ID_TIMER_CLOCK);CFrameWnd::OnClose ();}void CMainWindow::OnEndSession (BOOL bEnding){if (bEnding)SaveWindowState ();CFrameWnd::OnEndSession (bEnding);}void CMainWindow::OnGetMinMaxInfo (MINMAXINFO* pMMI){pMMI->ptMinTrackSize.x = 120;pMMI->ptMinTrackSize.y = 120;}UINT CMainWindow::OnNcHitTest (CPoint point){UINT nHitTest = CFrameWnd::OnNcHitTest (point);if ((nHitTest == HTCLIENT) && (::GetAsyncKeyState (MK_LBUTTON) < 0)) nHitTest = HTCAPTION;return nHitTest;}void CMainWindow::OnSysCommand (UINT nID, LPARAM lParam){UINT nMaskedID = nID & 0xFFF0;if (nMaskedID == IDM_SYSMENU_FULL_WINDOW) {m_bFullWindow = m_bFullWindow ? 0 : 1;SetTitleBarState ();return;}else if (nMaskedID == IDM_SYSMENU_STAY_ON_TOP) {m_bStayOnTop = m_bStayOnTop ? 0 : 1;SetTopMostState ();return;}CFrameWnd::OnSysCommand (nID, lParam);}void CMainWindow::OnContextMenu (CWnd* pWnd, CPoint point){CRect rect;GetClientRect (&rect);ClientToScreen (&rect);if (rect.PtInRect (point)) {CMenu* pMenu = GetSystemMenu (FALSE);UpdateSystemMenu (pMenu);int nID = (int) pMenu->TrackPopupMenu (TPM_LEFTALIGN |TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD, point.x,point.y, this);if (nID > 0)SendMessage (WM_SYSCOMMAND, nID, 0);return;}CFrameWnd::OnContextMenu (pWnd, point);}void CMainWindow::OnTimer (UINT nTimerID){//// Do nothing if the window is minimized.//if (IsIconic ())return;//// Get the current time and do nothing if it hasn't changed.//CTime time = CTime::GetCurrentTime ();int nSecond = time.GetSecond ();int nMinute = time.GetMinute ();int nHour = time.GetHour () % 12;if ((nSecond == m_nPrevSecond) &&(nMinute == m_nPrevMinute) &&(nHour == m_nPrevHour))return;//// Center the origin and switch to the MM_ISOTROPIC mapping mode.//CRect rect;GetClientRect (&rect);CClientDC dc (this);dc.SetMapMode (MM_ISOTROPIC);dc.SetWindowExt (1000, 1000);dc.SetViewportExt (rect.Width (), -rect.Height ());dc.SetViewportOrg (rect.Width () / 2, rect.Height () / 2);//// If minutes have changed, erase the hour and minute hands.//COLORREF clrColor = ::GetSysColor (COLOR_3DFACE);if (nMinute != m_nPrevMinute) {DrawHand (&dc, 200, 4, (m_nPrevHour * 30) + (m_nPrevMinute / 2), clrColor);DrawHand (&dc, 400, 8, m_nPrevMinute * 6, clrColor);m_nPrevMinute = nMinute;m_nPrevHour = nHour;}//// If seconds have changed, erase the second hand and redraw all hands.//if (nSecond != m_nPrevSecond) {DrawSecondHand (&dc, 400, 8, m_nPrevSecond * 6, clrColor);DrawSecondHand (&dc, 400, 8, nSecond * 6, RGB (0, 0, 0));DrawHand (&dc, 200, 4, (nHour * 30) + (nMinute / 2),RGB (0, 0, 0));DrawHand (&dc, 400, 8, nMinute * 6, RGB (0, 0, 0));m_nPrevSecond = nSecond;}}void CMainWindow::OnPaint (){CRect rect;GetClientRect (&rect);CPaintDC dc (this);dc.SetMapMode (MM_ISOTROPIC);dc.SetWindowExt (1000, 1000);dc.SetViewportExt (rect.Width (), -rect.Height ());dc.SetViewportOrg (rect.Width () / 2, rect.Height () / 2);DrawClockFace (&dc);DrawHand (&dc, 200, 4, (m_nPrevHour * 30) +(m_nPrevMinute / 2), RGB (0, 0, 0));DrawHand (&dc, 400, 8, m_nPrevMinute * 6, RGB (0, 0, 0));DrawSecondHand (&dc, 400, 8, m_nPrevSecond * 6, RGB (0, 0, 0)); }void CMainWindow::DrawClockFace (CDC* pDC){static CPoint point[12] = {CPoint ( 0, 450), // 12 o'clockCPoint ( 225, 390), // 1 o'clockCPoint ( 390, 225), // 2 o'clockCPoint ( 450, 0), // 3 o'clockCPoint ( 390, -225), // 4 o'clockCPoint ( 225, -390), // 5 o'clockCPoint ( 0, -450), // 6 o'clockCPoint (-225, -390), // 7 o'clockCPoint (-390, -225), // 8 o'clockCPoint (-450, 0), // 9 o'clockCPoint (-390, 225), // 10 o'clockCPoint (-225, 390), // 11 o'clock};pDC->SelectStockObject (NULL_BRUSH);for (int i=0; i<12; i++)pDC->Rectangle (point[i].x - SQUARESIZE,point[i].y + SQUARESIZE, point[i].x + SQUARESIZE,point[i].y - SQUARESIZE);}void CMainWindow::DrawHand (CDC* pDC, int nLength, int nScale, int nDegrees, COLORREF clrColor){CPoint point[4];double nRadians = (double) nDegrees * 0.017453292;point[0].x = (int) (nLength * sin (nRadians));point[0].y = (int) (nLength * cos (nRadians));point[2].x = -point[0].x / nScale;point[2].y = -point[0].y / nScale;point[1].x = -point[2].y;point[1].y = point[2].x;point[3].x = -point[1].x;point[3].y = -point[1].y;CPen pen (PS_SOLID, 0, clrColor);CPen* pOldPen = pDC->SelectObject (&pen);pDC->MoveTo (point[0]);pDC->LineTo (point[1]);pDC->LineTo (point[2]);pDC->LineTo (point[3]);pDC->LineTo (point[0]);pDC->SelectObject (pOldPen);}void CMainWindow::DrawSecondHand (CDC* pDC, int nLength, int nScale, int nDegrees, COLORREF clrColor){CPoint point[2];double nRadians = (double) nDegrees * 0.017453292;point[0].x = (int) (nLength * sin (nRadians));point[0].y = (int) (nLength * cos (nRadians));point[1].x = -point[0].x / nScale;point[1].y = -point[0].y / nScale;CPen pen (PS_SOLID, 0, clrColor);CPen* pOldPen = pDC->SelectObject (&pen);pDC->MoveTo (point[0]);pDC->LineTo (point[1]);pDC->SelectObject (pOldPen);}void CMainWindow::SetTitleBarState (){CMenu* pMenu = GetSystemMenu (FALSE);if (m_bFullWindow ) {ModifyStyle (WS_CAPTION, 0);pMenu->ModifyMenu (IDM_SYSMENU_FULL_WINDOW, MF_STRING,IDM_SYSMENU_FULL_WINDOW, _T ("Restore &Title"));}else {ModifyStyle (0, WS_CAPTION);pMenu->ModifyMenu (IDM_SYSMENU_FULL_WINDOW, MF_STRING,IDM_SYSMENU_FULL_WINDOW, _T ("Remove &Title"));}SetWindowPos (NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE |SWP_NOZORDER | SWP_DRAWFRAME);}void CMainWindow::SetTopMostState (){CMenu* pMenu = GetSystemMenu (FALSE);if (m_bStayOnTop) {SetWindowPos (&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);pMenu->CheckMenuItem (IDM_SYSMENU_STAY_ON_TOP, MF_CHECKED);}else {SetWindowPos (&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);pMenu->CheckMenuItem (IDM_SYSMENU_STAY_ON_TOP, MF_UNCHECKED);}}BOOL CMainWindow::RestoreWindowState (){CString version = _T ("Version 1.0");m_bFullWindow = myApp.GetProfileInt (version, _T ("FullWindow"), 0);SetTitleBarState ();m_bStayOnTop = myApp.GetProfileInt (version, _T ("StayOnTop"), 0);SetTopMostState ();WINDOWPLACEMENT wp;wp.length = sizeof (WINDOWPLACEMENT);GetWindowPlacement (&wp);if (((wp.flags =myApp.GetProfileInt (version, _T ("flags"), -1)) != -1) && ((wp.showCmd =myApp.GetProfileInt (version, _T ("showCmd"), -1)) != -1) && ((wp.rcNormalPosition.left =myApp.GetProfileInt (version, _T ("x1"), -1)) != -1) && ((wp.rcNormalPosition.top =myApp.GetProfileInt (version, _T ("y1"), -1)) != -1) && ((wp.rcNormalPosition.right =myApp.GetProfileInt (version, _T ("x2"), -1)) != -1) && ((wp.rcNormalPosition.bottom =myApp.GetProfileInt (version, _T ("y2"), -1)) != -1)) {wp.rcNormalPosition.left = min (wp.rcNormalPosition.left,::GetSystemMetrics (SM_CXSCREEN) -::GetSystemMetrics (SM_CXICON));wp.rcNormalPosition.top = min (wp.rcNormalPosition.top,::GetSystemMetrics (SM_CYSCREEN) -::GetSystemMetrics (SM_CYICON));SetWindowPlacement (&wp);return TRUE;}return FALSE;}void CMainWindow::SaveWindowState (){CString version = _T ("Version 1.0");myApp.WriteProfileInt (version, _T ("FullWindow"), m_bFullWindow);myApp.WriteProfileInt (version, _T ("StayOnTop"), m_bStayOnTop);WINDOWPLACEMENT wp;wp.length = sizeof (WINDOWPLACEMENT);GetWindowPlacement (&wp);myApp.WriteProfileInt (version, _T ("flags"), wp.flags);myApp.WriteProfileInt (version, _T ("showCmd"), wp.showCmd);myApp.WriteProfileInt (version, _T ("x1"), wp.rcNormalPosition.left);myApp.WriteProfileInt (version, _T ("y1"), wp.rcNormalPosition.top);myApp.WriteProfileInt (version, _T ("x2"), wp.rcNormalPosition.right);myApp.WriteProfileInt (version, _T ("y2"), wp.rcNormalPosition.bottom);}void CMainWindow::UpdateSystemMenu (CMenu* pMenu){static UINT nState[2][5] = {{ MFS_GRAYED, MFS_ENABLED, MFS_ENABLED,MFS_ENABLED, MFS_DEFAULT },{ MFS_DEFAULT, MFS_GRAYED, MFS_GRAYED,MFS_ENABLED, MFS_GRAYED }};if (IsIconic ()) // Shouldn't happen, but let's be safereturn;int i = 0;if (IsZoomed ())i = 1;CString strMenuText;pMenu->GetMenuString (SC_RESTORE, strMenuText, MF_BYCOMMAND);pMenu->ModifyMenu (SC_RESTORE, MF_STRING | nState[i][0], SC_RESTORE, strMenuText);pMenu->GetMenuString (SC_MOVE, strMenuText, MF_BYCOMMAND);pMenu->ModifyMenu (SC_MOVE, MF_STRING | nState[i][1], SC_MOVE, strMenuText);pMenu->GetMenuString (SC_SIZE, strMenuText, MF_BYCOMMAND);pMenu->ModifyMenu (SC_SIZE, MF_STRING | nState[i][2], SC_SIZE,strMenuText);pMenu->GetMenuString (SC_MINIMIZE, strMenuText, MF_BYCOMMAND);pMenu->ModifyMenu (SC_MINIMIZE, MF_STRING | nState[i][3], SC_MINIMIZE, strMenuText);pMenu->GetMenuString (SC_MAXIMIZE, strMenuText, MF_BYCOMMAND);pMenu->ModifyMenu (SC_MAXIMIZE, MF_STRING | nState[i][4], SC_MAXIMIZE, strMenuText);SetMenuDefaultItem (pMenu->m_hMenu, i ? SC_RESTORE :SC_MAXIMIZE, FALSE);}。