static void write45(u32 addr,u8 data) { if(addr < 0x4020) write4(addr,data); else latch_write(addr,data); }
void main() { //initialize data var_init(); //initialize timers and cp1 interrupt setup_timer_1(T1_INTERNAL | T1_DIV_BY_2); //div 2 - 26.2 ms overflow setup_ccp1(CCP_CAPTURE_FE); //with 819.2 us overflow for Timer0, motor's speed must be at least 20 RPS setup_timer_0(T0_INTERNAL | T0_DIV_16); //div 16 - 819.2 us overflow //enable interrupts enable_interrupts(INT_RB2|INT_RB3|INT_RB4|INT_RB5);; enable_interrupts(INT_EXT); enable_interrupts(INT_TIMER1); enable_interrupts(INT_CCP1); enable_interrupts(INT_TIMER0); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); //initialize clock ds1307_init(); //test power on rgb_bits.blue = 0xF00F; rgb_bits.red = 0x0F0F; rgb_bits.green = 0x00FF; latch_write(rgb_bits.blue, rgb_bits.red, rgb_bits.green); //get the first values of date, time ds1307_get_time(hour, min, sec); ds1307_get_date(day, month, year, dow); // calculating hour hand's position for analog clock anal_hour = hour % 12; anal_hour = anal_hour * 5; anal_hour = anal_hour + (int8)(min / 12); // calculating hour, minute, day, month numbers to display in digital clock hour_h = (int8)(hour / 10); hour_l = hour % 10; min_h = (int8)(min / 10); min_l = min % 10; day_h = (int8)(day / 10); day_l = day % 10; month_h = (int8)(month / 10); month_l = month % 10; // main routine while(true) { // rs232 operation if (rs232_status == 11) { //notify the RS232 transmission for date, time update is successful latch_write(0x0000, 0x0FF0, 0x0000); rs232_status = 0; ds1307_set_date_time(day, month, year, dow, hour, min, sec); putc('O'); delay_ms(100); putc('K'); delay_ms(100); latch_ClearAll(); } // get the time value from ds1307 after each 5 minutes if(tick == 300) { ds1307_get_time(hour, min, sec); ds1307_get_date(day, month, year, dow); anal_hour = hour % 12; anal_hour = anal_hour * 5; anal_hour = anal_hour + (int8)(min / 12); tick = 1; } // change values of minute and hour at appropriate value of second and minute if(sec > 59) { sec = 0; min++; if(min > 59) { min = 0; ds1307_get_time(hour, min, sec); anal_hour = hour % 12; anal_hour = anal_hour * 5; anal_hour = anal_hour + (int8)(min / 12); } //refresh value for digital clock after each minute hour_h = (int8)(hour / 10); hour_l = hour % 10; min_h = (int8)(min / 10); min_l = min % 10; } //display routine if(circle_trigger == 1) { circle_trigger = 0; if ((smode % 2) == 1) latch_ClearAll(); digit_sec++; section_trigger = 1; section_count = MAX_SECTION; section_timer = 256 - (int8)(sigHall_timer / (MAX_SECTION * 8)) + tuning; while(circle_trigger == 0 && section_count > 0) { if(section_trigger == 1) { set_timer0(section_timer); section_trigger = 0; //data calculation fetch_data(); //shifting data latch_write(rgb_bits.blue, rgb_bits.red, rgb_bits.green); //smode change between continuous display and discrete display if ((smode % 2) == 1 && section_count > 1) latch_ClearAll(); section_count--; } } }// circle_trigger } // end of while(true) }