// File Name : main.c // Programmed by Jimmy Seo // Program Date : Mon., May 10, 2004 // #include #include "timer.h" // Declaration of the Variables xdata unsigned char *pcode; // for External Memory data unsigned char temp1; // for Temporary Data data unsigned char temp; data unsigned char i; // for Loop Parameters data unsigned char p; // for Loop Parameters data unsigned char port_change; // for PORT Display Delection data unsigned char port_value_change; // for PORT Value Update Change data unsigned char port_display_change; // for PORT Display Selection unsigned int loop_cnt; // for Loop Parameter @ timer0 unsigned char display_count; // for Display Parameter @timer0 // Prototype Functions // 1. System Initialization void initialize(void); // 2. Led Output //void output_led(void); // Sub Function : 8. void msec(int) { /* delay function for m seconds */ void msec(int Delay) { int i, j; for(j=0; j TH0 = 0x06; // TH0 for Auto-reload // (Fosc/12)^-1*(256-TH0) = Timing Duty // When Fosc = 12MHz and TH0 = 0x06, // Timing Duty is 0.25msec (250 usec) pcode = (unsigned char xdata *)0x0000; ET0 = 1; // Timer 0 Interrupt Enable EA = 1; // All Interrupts Enable display_count = 0; loop_cnt = 0; } // End: void initialize(void) void print_char_lcd(unsigned char c) { // pcode = 0xFFXX : PORTA (and Character LCD Display Databus) // pcode = 0xF9XX : LCD_CON[0] (LCD_RW) // pcode = 0xF8XX : LCD_CON[1] (LCD_EN) // pcode = 0xF7XX : LCD_CON[2] (LCD_RS) pcode = (unsigned char xdata *)0xF000; *(pcode) = 0x01; // LCD_RS = 1; pcode = (unsigned char xdata *)0xF300; *(pcode) = c; pcode = (unsigned char xdata *)0xF100; *(pcode) = 0x01; // LCD_EN = 1; *(pcode) = 0x00; // LCD_EN = 0; pcode = (unsigned char xdata *)0xF000; *(pcode) = 0x00; // LCD_RS = 0; delay_lcd(45); } // End: void print_char_lcd(BYTE c) // Sub Function : 6. void print_string_lcd(const char *) void print_string_lcd(const char *s) { // pcode = 0xFFXX : PORTA (and Character LCD Display Databus) // pcode = 0xF9XX : LCD_CON[0] (LCD_RW) // pcode = 0xF8XX : LCD_CON[1] (LCD_EN) // pcode = 0xF7XX : LCD_CON[2] (LCD_RS) while (*s) { print_char_lcd(*s++); } delay_lcd(225); } // End: void print_string_lcd(const char *s) // Sub Function - 3. void address_lcd(BYTE) void address_lcd(unsigned char addr) { // pcode = 0xFFXX : PORTA (and Character LCD Display Databus) // pcode = 0xF9XX : LCD_CON[0] (LCD_RW) // pcode = 0xF8XX : LCD_CON[1] (LCD_EN) // pcode = 0xF7XX : LCD_CON[2] (LCD_RS) pcode = (unsigned char xdata *)0xF000; *(pcode) = 0x00; // LCD_RS = 0; pcode = (unsigned char xdata *)0xF300; *(pcode) = addr; pcode = (unsigned char xdata *)0xF100; *(pcode) = 0x01; // LCD_EN = 1; *(pcode) = 0x00; // LCD_EN = 0; pcode = (unsigned char xdata *)0xF000; *(pcode) = 0x01; // LCD_RS = 1; delay_lcd(255); delay_lcd(255); delay_lcd(255); } // End: void address_lcd(unsigned char addr) // Sub Function : 6. void PutChar(unsigned char) { void PutChar(unsigned char c) { pcode = (unsigned char xdata *)0xF000; *(pcode) = 0x01; // LCD_RS = 1; pcode = (unsigned char xdata *)0xF300; *(pcode) = c; pcode = (unsigned char xdata *)0xF100; *(pcode) = 0x01; // LCD_EN = 1; *(pcode) = 0x00; // LCD_EN = 0; pcode = (unsigned char xdata *)0xF000; *(pcode) = 0x00; // LCD_RS = 0; delay_lcd(45); delay_lcd(45); delay_lcd(45); delay_lcd(45); } /* Function to output the decimal value of the count on the LCD */ void Print_INT(unsigned short* d) { unsigned char hund,ten,one; unsigned char poly, temp; unsigned short value; value = *d; ten = value/10; one = (value-ten*10); for (poly = 0; poly < 2; poly++) { if (poly == 0) temp = ten; else temp = one; switch (temp) { case 0 : PutChar('0'); break; case 1 : PutChar('1'); break; case 2 : PutChar('2'); break; case 3 : PutChar('3'); break; case 4 : PutChar('4'); break; case 5 : PutChar('5'); break; case 6 : PutChar('6'); break; case 7 : PutChar('7'); break; case 8 : PutChar('8'); break; case 9 : PutChar('9'); break; } } } // Sub Function : Timer 0 Interrupt void timer0_int(void) interrupt TF0_VECTOR { static int seconds; static unsigned short hour, min, sec; // 7-segment Display if (loop_cnt == 4000) { // 2000 : 0.5sec seconds++; hour = seconds / 3600; min = (seconds - hour * 3600) / 60; sec = (seconds - hour * 3600 - min * 60); address_lcd(DDRAM_ADDR_EVEN); print_string_lcd(" Digital Clock"); address_lcd(DDRAM_ADDR_EVEN+0x14); Print_INT(&hour); PutChar(':'); Print_INT(&min); PutChar(':'); Print_INT(&sec); loop_cnt = 0; switch (display_count) { case 0 : pcode = (unsigned char xdata *) 0xF600; // Port B (7-segment Display) *(pcode) = D0; // Refer to timer.h file about MACRO "D0". display_count++; break; case 1 : pcode = (unsigned char xdata *) 0xF600; // Port B (7-segment Display) *(pcode) = D1; // Refer to timer.h file about MACRO "D0". display_count++; break; case 2 : pcode = (unsigned char xdata *) 0xF600; // Port B (7-segment Display) *(pcode) = D2; // Refer to timer.h file about MACRO "D0". display_count++; break; case 3 : pcode = (unsigned char xdata *) 0xF600; // Port B (7-segment Display) *(pcode) = D3; // Refer to timer.h file about MACRO "D0". display_count++; break; case 4 : pcode = (unsigned char xdata *) 0xF600; // Port B (7-segment Display) *(pcode) = D4; // Refer to timer.h file about MACRO "D0". display_count++; break; case 5 : pcode = (unsigned char xdata *) 0xF600; // Port B (7-segment Display) *(pcode) = D5; // Refer to timer.h file about MACRO "D0". display_count++; break; case 6 : pcode = (unsigned char xdata *) 0xF600; // Port B (7-segment Display) *(pcode) = D6; // Refer to timer.h file about MACRO "D0". display_count++; break; case 7 : pcode = (unsigned char xdata *) 0xF600; // Port B (7-segment Display) *(pcode) = D7; // Refer to timer.h file about MACRO "D0". display_count++; break; case 8 : pcode = (unsigned char xdata *) 0xF600; // Port B (7-segment Display) *(pcode) = D8; // Refer to timer.h file about MACRO "D0". display_count++; break; case 9 : pcode = (unsigned char xdata *) 0xF600; // Port B (7-segment Display) *(pcode) = D9; // Refer to timer.h file about MACRO "D0". display_count = 0; break; } } loop_cnt++; TF0 = 0; // Timer 0 Overflow Falg Clear } // End : Sub Function - void timer0_int(void) interrupt TF0_VECTOR