0
Καλησπέρα παιδιά, έχω έναν Mega16 ένα ds1307 και μια lcd και προσπαθώ να εμφανίσω την ηεμρωμηνία και την ώρα στην lcd.
Ο κώδικάς:
Το πρόβλημά μου είναι πως ενώ την ώρα τη βγάζει σωστή στην ημερωμηνία μου βγάζει 165,Κώδικας:#include <avr/io.h> #include <util/delay.h> #include "lcd_drv.h" #include "i2cmaster.h" #define DS1307 0b11010000 #include <stdlib.h> //////////////////////////////////////////VOIDS //////////////////////////LCD VOIDS START static void lcd_nibble( uint8_t d ) { LCD_D4 = 0; if( d & 1<<4 ) LCD_D4 = 1; LCD_D5 = 0; if( d & 1<<5 ) LCD_D5 = 1; LCD_D6 = 0; if( d & 1<<6 ) LCD_D6 = 1; LCD_D7 = 0; if( d & 1<<7 ) LCD_D7 = 1; LCD_E0 = 1; _delay_us( 1 ); // 1us LCD_E0 = 0; } static void lcd_byte( uint8_t d ) { lcd_nibble( d ); lcd_nibble( d<<4 ); _delay_us( 50 ); // 50us } void lcd_command( uint8_t d ) { LCD_RS = 0; lcd_byte( d ); if( d <= 3 ) _delay_ms( 2 ); // wait 2ms } void lcd_putchar( uint8_t d ) { LCD_RS = 1; lcd_byte( d ); } void lcd_puts(void *vp) { char *p = (char*)vp; while (*p) lcd_putchar(*p++); } /////////////////////////////////LCD VOIDS END ////////////////////////////////BCD/DEC START // Convert Decimal to Binary Coded Decimal (BCD) char dec2bcd(char num) { return ((num/10 * 16) + (num % 10)); } // Convert Binary Coded Decimal (BCD) to Decimal char bcd2dec(char num) { return ((num/16 * 10) + (num % 16)); } /////////////////////////////////////BCD/DEC END //////////////////////////////////////RTC VOIDS START // Variable Declaration char ds1307_sec[7];///00-59 char ds1307_min[7];//00-59 char ds1307_hour[7];//00-23 char ds1307_day[7];//////mon-sut char ds1307_dayy[7];////////0-31 char ds1307_month[7];///////1-12 char ds1307_year[7];//00-99 volatile uint8_t min,hour, Seconds; void WriteDS1307(void) { // Start the I2C Write Transmission i2c_start(DS1307+I2C_WRITE); // Start from Address 0x00 // Start from Address 0x00 i2c_write(0x00); i2c_write(0x50); // Set second i2c_write(0x59); // Set minute i2c_write(0x23); // Set hour //date i2c_write(0x06); // Set day mon-sut i2c_write(0x29); // Set day1-31 i2c_write(0x09); // Set month i2c_write(0x13); // Set year //date // Stop I2C Write i2c_stop(); } void ReadDS1307(void) { uint8_t TempData; i2c_start(DS1307+I2C_WRITE); i2c_write(0x00); // Start I2C Read i2c_start(DS1307+I2C_READ); // Read the Second Register, TempData = i2c_readAck(); TempData = bcd2dec(TempData); Seconds = TempData; // Convert number to string itoa(TempData,ds1307_sec,10); ///sec0-59 // Read the Minute Register, TempData = i2c_readAck(); TempData = bcd2dec(TempData); min=TempData; // Convert number to string itoa(TempData,ds1307_min,10); ///min0-59 // Read the Hour Register, TempData = i2c_readNak(); TempData = bcd2dec(TempData); hour=TempData; // Convert number to string itoa(TempData,ds1307_hour,10); //hour0-59 // Stop I2C Read ///////////////////////date // Read the day mon-sut 1-7 Register, TempData = i2c_readNak(); TempData = bcd2dec(TempData); itoa(TempData,ds1307_day,10); ///day0-7 mon-su // Read the dayy 1-31 Register, TempData = i2c_readNak(); TempData = bcd2dec(TempData); itoa(TempData,ds1307_dayy,10); //dayy0-31 // Read the day month Register, TempData = i2c_readNak(); TempData = bcd2dec(TempData); itoa(TempData,ds1307_month,10); //month0-12 // Read the day mon-sut Register, TempData = i2c_readNak(); TempData = bcd2dec(TempData); itoa(TempData,ds1307_year,10); year0-99 ///////////////////////date // Stop I2C Read i2c_stop(); } /////////////////////////////////////////////////////RTC VOIDS END //////////////////////////////////////////////////////////////////VOIDS END int main( void ) { MCUCSR |=(1<<JTD); //disable jtd MCUCSR |=(1<<JTD); lcd_init(); lcd_xy( 3, 0 ); lcd_puts( "DATE" ); lcd_xy( 0, 1 ); lcd_puts( "DS1307" ); _delay_ms(200); _delay_ms(200); _delay_ms(200); _delay_ms(200); uint8_t i=255; char j[5]; /////RTC i2c_init(); WriteDS1307(); for(;;){ ReadDS1307(); lcd_xy( 0, 0 ); if(hour<10){lcd_puts("0");} lcd_puts(ds1307_hour); lcd_puts(":"); if(min<10){lcd_puts("0");} lcd_puts(ds1307_min); lcd_puts(":"); if(Seconds<10){lcd_puts("0");} lcd_puts(ds1307_sec); lcd_xy( 0, 1 ); lcd_puts(ds1307_day); lcd_puts(ds1307_dayy); lcd_puts(ds1307_month); lcd_puts(ds1307_year); _delay_ms(200); _delay_ms(200); _delay_ms(200); _delay_ms(200); _delay_ms(200); _delay_ms(200); } }
πιό συγκεκριμένα
LCD16X2:
|--------------------- |
|HH:MM:SS########|
|165165165165##### |
|--------------------- |
Το λάθος μου πρέπει να είναι μάλλων στο πως γράφω την ημερωμηνία ή στο πως την καλώ
Καμία ιδέα;