/* 7Segments 3LED with I2C-Master type Timer BY M.K AT90S2313 4MHzOSC(ceramic resonator) Last Mod 2012/4/24 Used ROM (bytes): 1438 (70%):in I2C Contlor 750Byte */ // Software I2C connections sbit Soft_I2C_Scl_Output at PORTD0_bit; sbit Soft_I2C_Sda_Output at PORTD1_bit; sbit Soft_I2C_Scl_Input at PIND0_bit; sbit Soft_I2C_Sda_Input at PIND1_bit; sbit Soft_I2C_Scl_Direction at DDD0_bit; sbit Soft_I2C_Sda_Direction at DDD1_bit; sbit Beep at PORTD2_bit; //Sound //sbit SW at PIND3_bit; //SW in sbit LED_0 at PORTD4_bit; sbit LED_1 at PORTD5_bit; sbit LED_2 at PORTD6_bit; sbit dp at PORTB7_bit; //Decimal point char LED_Cunt,I2C_Cunt; char Cps,Csec,Cmin,Chour; char LED_0Data,LED_1Data; void To_7SegLED (char S_Data) { switch(S_Data & 0x0f){ case 0: PORTB=0x3f; break; case 1: PORTB=0x06; break; case 2: PORTB=0x5b; break; case 3: PORTB=0x4f; break; case 4: PORTB=0x66; break; case 5: PORTB=0x6d; break; case 6: PORTB=0x7d; break; case 7: PORTB=0x07; break; case 8: PORTB=0x7f; break; case 9: PORTB=0x6f; break; default: PORTB=0x08; } } void Read_Time(){ Soft_I2C_Start(); // Issue start signal Soft_I2C_Write(0xA2); // Address datasheet Soft_I2C_Write(2); // Start from address 2 Soft_I2C_Start(); // Issue repeated start signal Soft_I2C_Write(0xA3); // read Csec = Soft_I2C_Read(1); // Read seconds byte Cmin = Soft_I2C_Read(1); Chour= Soft_I2C_Read(0); Soft_I2C_Stop(); } void Timer0_Interrupt() iv IVT_ADDR_TIMER0_OVF0 { LED_Cunt++; // if (LED_Cunt==1){ // **1 LED_2=1; //OFF To_7SegLED(LED_0Data); LED_0=0; //ON // Timer I2C_Cunt++; if(I2C_Cunt >= 10){ // 4mSec*3*10 = 120mS I2C_Cunt=0; Read_Time(); } } if (LED_Cunt==2){ // *1* LED_0=1; // OFF To_7SegLED(LED_0Data >>4); LED_1=0; // ON // if (Csec==0){ // data in LED_0Data=Cmin; LED_1Data=Chour; } } if (LED_Cunt==3){ // 1** LED_Cunt=0; LED_1=1; //OFF To_7SegLED(LED_1Data); if ((Csec & 1)==1) dp=1; LED_2=0; //ON } } void main() { char ic; DDRB = 0xFF; // 1=out PORTB= 0; DDRD = 0b11110100; // 1=out 0=input 4.5.6=LED PORTD= 0b11111100; // bit3=Pull UP * // LED_Cunt= 0; //I_Cunter Reset TCCR0 = 0x03; // 1/64=16uec TCNT0 = 0; // 16*256=4.096mSec TOIE0_bit=1; // Timer0 TIMSK = 2; // Cps=0; //clear register Csec=0; Cmin=0; Chour=0; LED_0Data=Cmin; LED_1Data=Chour; Delay_ms(100); Soft_I2C_Init(); // Initialize Soft I2C communication // SREG_I_bit = 1; // Interrupt on asm sei; // while(1){ // Beep check if ((Cmin==0)||(Cmin==0X30)){ // 30 minute if (Csec==1){ // 1Sec for (ic=0;ic<250;ic++){ Beep=~Beep; Delay_us(200); //2.5KHz } Beep=0; Delay_ms(220); } } } }