www.pudn.com > clock.rar.rar > clock.rar.c
//Clock.c // //Body: HT48C50-1 //Mask option //BZ/BZB : All Disable //SysFreq: 400KHz //the others use the default value #include#define _tmr1c4 _11_4 //timer4 enable bit #define min_adj_button _pb0 #define hour_adj_button _pb1 #pragma vector isr_4 @ 0x4 #pragma vector isr_8 @ 0x8 #pragma vector isr_c @ 0xc //ISR for safequard void isr_4(){} // external ISR void isr_8(){} // timer/event 0 //initialize registers for safeguard void safeguard_init(){ _intc = 0; _tmr0c = 0; _tmr0 = 0; _tmr1c = 0; _tmr1h = 0; _tmr1l = 0; _pac = 0xff; _pbc = 0xff; _pcc = 0xff; _pdc = 0xff; } void initial(); void check_time(); void show_clock(); unsigned char min_adj_pressed(); unsigned char hour_adj_pressed(); void min_adjust(); void hour_adjust(); void arrange_hour(); void set_timer(); unsigned char half_second; unsigned char min_l, min_h; unsigned char hour_l, hour_h; void main(){ safeguard_init(); initial(); while(1){ check_time(); show_clock(); if (min_adj_pressed()) min_adjust(); if (hour_adj_pressed()) hour_adjust(); } } void isr_c(){ //timer1 half_second++; _pb = ~_pb; //flash 'dot' every 0.5 second } void initial(){ _pac = 0; //set port A to output port _pbc = 0x7f; //set port B to input port exclude pb7 _pb = 0; _pa = 0; min_l = 0; min_h = 0; hour_l = 0; hour_h = 0; half_second = 0; _intc = 0x9; //enable timer1 _tmr1c = 0x80; //timer1 mode (internal clock) set_timer(); } //check if the min_adj_button is pressed or not //return 1: if the min_adj_button is pressed // 0: otherwise unsigned char min_adj_pressed(){ if (min_adj_button == 0){//pressed _delay(2000); //debounce if (min_adj_button == 0) return 1; //still pressed, recognize it } return 0; } //check if the hour_adj_button is pressed or not //return 1: if the hour_adj_button is pressed // 0: otherwise unsigned char hour_adj_pressed(){ if (hour_adj_button == 0){//pressed _delay(2000); //debounce if (hour_adj_button == 0) return 1; //still pressed, recognize it } return 0; } void check_time(){ if (half_second >= 120){ half_second -= 120; min_l++; if (min_l >= 10){ min_l = 0; min_h++; if (min_h >= 6){ min_h = 0; hour_l++; arrange_hour(); } } } } //This function is to arrange the hour value void arrange_hour(){ if (hour_h == 2 && hour_l == 4){ hour_h = 0; hour_l = 0; } else if (hour_l == 10){ hour_l = 0; hour_h++; } } void show_clock(){ _pa = min_l | 0x10; _pa = min_h | 0x20; _pa = hour_l | 0x40; _pa = hour_h | 0x80; } //This function is to adjust the minute. //The minute will increase 1 when the min_adj_button is pressed . //If the button is held longer than 1.5 seconds, the minute will //increase 1 every 0.5 second void min_adjust(){ bit held_long_time = 0; repeat_inc: min_l++; if (min_l >= 10){ min_l = 0; min_h++; if (min_h >= 6) //don't care hour min_h = 0; } half_second = 0; while(min_adj_button == 0){//while min_adj_button is held show_clock(); if (!held_long_time){ if (half_second>2){ //longer than 1.5 seconds held_long_time = 1; //set flag goto repeat_inc; //increase minute } //less than 1.5 seconds, do nothing } else{ if (half_second) goto repeat_inc; //add 1 every 0.5 second //less than 0.5 second, do nothing } } half_second = 0; set_timer(); } //This function is to adjust the hour. //The hour will increase 1 when the hour_adj_button is pressed . //If the button is held longer than 1.5 seconds, the hour will //increase 1 every 0.5 second void hour_adjust(){ bit held_long_time = 0; repeat_inc: hour_l++; arrange_hour(); half_second = 0; while(hour_adj_button == 0){ show_clock(); if (!held_long_time){ if (half_second>2){ //longer than 1.5 seconds held_long_time = 1; //set flag goto repeat_inc; //increase hour } //less than 1.5 seconds, do nothing } else{ if (half_second) goto repeat_inc; //add 1 every 0.5 second //less than 0.5 second, do nothing } } half_second = 0; set_timer(); } void set_timer(){ _tmr1c4 = 0; _tmr1l = 0xb0; _tmr1h = 0x3c; _tmr1c4 = 1; //start timer1 }