mình đang dùng atmega16, ds1307 và 47hc4094 truyền thông SPI va i2c của ds1307 hiển thị thời gian lên led 7 nhưng chương trình mình k biết mình viết sai ở đâu mà thời gian chạy không đúng với thực tế và led 7 của mình lại hay nhấp nháy liên tục, mình không muốn sử dụng ngắt, mong mọi người chỉ giáo dùm với ạ code của mình đây :
#include <mega16.h>
#include <delay.h>
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=1
.equ __scl_bit=0
#endasm
#include <i2c.h>
#include <ds1307.h>
#include <spi.h>
#define MENU PIND.0
#define UP PIND.1
#define DOWN PIND.2
#define OK PIND.3
unsigned int A;
unsigned char h,m,s,mode=0; //led7 catot chung 0a 1b 2c 3d 4e 5f 6g dot/tat
unsigned char So[10]=
{
//GFEDCBA
0b00111111, //so 0 0x3F tat G
0b00000110, //so 1 0x06 tat A,D,E,F,G
0b01011011, //so 2 0x5B tat C,F
0b01001111, //so 3 0x4F tat E,F
0b01100110, //so 4 0x66 tat A,D,E
0b01101101, //so 5 0x6D tat B,E
0b01111101, //so 6 0x7D tat B
0b00000111, //so 7 0x07 tat D,E,F,G
0b01111111, //so 8 0x7F hien 7 thanh
0b01101111, //so 9 0x6F tat E
};
void hiengio (unsigned int number)
{
unsigned char ng,tr,ch,dv;
ng=number/1000;
tr=(number-ng*1000)/100;
ch=(number-ng*1000-tr*100)/10;
dv=(number-ng*1000-tr*100-ch*10);
//truyen du lieu slave cuoi den dau
spi(So[dv]); //don vi slave 4
spi(So[ch]); //chuc slave 3
spi(So[tr]); //tram slave 2
spi(So[ng]); //nghin slave 1
PORTB.4=0; // du lieu chan SS xuong muc thap, bat dau truyen du lieu qua SPI
delay_us(1);
PORTB.4=1; //chan du lieu SS len muc cao, ngung truyen du lieu qua SPI
};
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x10; //khoi tao PORTB.4=5V PORTB.0=5V
DDRB=0xFF; //PORTB OUTPUT
PORTC=0x00;
DDRC=0x00;
PORTD=0xFF;
DDRD=0x00;
//CAU HINH SPI
SPCR=0x50; // TAO THANH GHI SPCR
//bit SPE=1 cho phep SPI hoat dong
//BIT MSTR=1 CHE DO MATER
//BIT SPE=1 CHO PHEP SPI HOAT DONG
//BIT CPHA=0
SPSR=0x00;
i2c_init();
rtc_init(0,0,0);
rtc_set_time(14,05,00);
while (1)
{
rtc_get_time(&h,&m,&s);
A=(h*100)+m;
hiengio(A);
delay_ms(300);
if(!MENU)
{
delay_ms(400);
while(OK)
{
if(!MENU)
{
delay_ms(300);
mode++;
if(mode>2)mode=0;
}
if(mode==0)
{
hiengio(h);
if(!UP)
{
delay_ms(300);
h++;
if(h==24)h=0;
}
else
if(!DOWN)
{
delay_ms(300);
if(h>0)h--;
else h=23;
}
else
if(mode==1)
{
hiengio(m);
if(!UP)
{
delay_ms(300);
m++;
if(m==60)m=0;
}
else
if(!DOWN)
{
delay_ms(300);
if(m>0)m--;
else m=59;
}
}
else
if(mode==2)
{
hiengio(s);
if(!UP)
{
delay_ms(300);
s++;
if(s==60)s=0;
}
else
if(!DOWN)
{
delay_ms(300);
if(s>0)s--;
else s=59;
}
}
}
};
}
};
}
#include <mega16.h>
#include <delay.h>
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=1
.equ __scl_bit=0
#endasm
#include <i2c.h>
#include <ds1307.h>
#include <spi.h>
#define MENU PIND.0
#define UP PIND.1
#define DOWN PIND.2
#define OK PIND.3
unsigned int A;
unsigned char h,m,s,mode=0; //led7 catot chung 0a 1b 2c 3d 4e 5f 6g dot/tat
unsigned char So[10]=
{
//GFEDCBA
0b00111111, //so 0 0x3F tat G
0b00000110, //so 1 0x06 tat A,D,E,F,G
0b01011011, //so 2 0x5B tat C,F
0b01001111, //so 3 0x4F tat E,F
0b01100110, //so 4 0x66 tat A,D,E
0b01101101, //so 5 0x6D tat B,E
0b01111101, //so 6 0x7D tat B
0b00000111, //so 7 0x07 tat D,E,F,G
0b01111111, //so 8 0x7F hien 7 thanh
0b01101111, //so 9 0x6F tat E
};
void hiengio (unsigned int number)
{
unsigned char ng,tr,ch,dv;
ng=number/1000;
tr=(number-ng*1000)/100;
ch=(number-ng*1000-tr*100)/10;
dv=(number-ng*1000-tr*100-ch*10);
//truyen du lieu slave cuoi den dau
spi(So[dv]); //don vi slave 4
spi(So[ch]); //chuc slave 3
spi(So[tr]); //tram slave 2
spi(So[ng]); //nghin slave 1
PORTB.4=0; // du lieu chan SS xuong muc thap, bat dau truyen du lieu qua SPI
delay_us(1);
PORTB.4=1; //chan du lieu SS len muc cao, ngung truyen du lieu qua SPI
};
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x10; //khoi tao PORTB.4=5V PORTB.0=5V
DDRB=0xFF; //PORTB OUTPUT
PORTC=0x00;
DDRC=0x00;
PORTD=0xFF;
DDRD=0x00;
//CAU HINH SPI
SPCR=0x50; // TAO THANH GHI SPCR
//bit SPE=1 cho phep SPI hoat dong
//BIT MSTR=1 CHE DO MATER
//BIT SPE=1 CHO PHEP SPI HOAT DONG
//BIT CPHA=0
SPSR=0x00;
i2c_init();
rtc_init(0,0,0);
rtc_set_time(14,05,00);
while (1)
{
rtc_get_time(&h,&m,&s);
A=(h*100)+m;
hiengio(A);
delay_ms(300);
if(!MENU)
{
delay_ms(400);
while(OK)
{
if(!MENU)
{
delay_ms(300);
mode++;
if(mode>2)mode=0;
}
if(mode==0)
{
hiengio(h);
if(!UP)
{
delay_ms(300);
h++;
if(h==24)h=0;
}
else
if(!DOWN)
{
delay_ms(300);
if(h>0)h--;
else h=23;
}
else
if(mode==1)
{
hiengio(m);
if(!UP)
{
delay_ms(300);
m++;
if(m==60)m=0;
}
else
if(!DOWN)
{
delay_ms(300);
if(m>0)m--;
else m=59;
}
}
else
if(mode==2)
{
hiengio(s);
if(!UP)
{
delay_ms(300);
s++;
if(s==60)s=0;
}
else
if(!DOWN)
{
delay_ms(300);
if(s>0)s--;
else s=59;
}
}
}
};
}
};
}