I have a simple project. I have an ATmega32 connected to a 16x2 LCD and a DS13027 chip. I am using 8-Bit data with the 16x2 LCD. Below is the code.
#define F_CPU 8000000UL #define LCD_DPRT PORTA #define LCD_DDDR DDRA #define LCD_DPIN PINA #define LCD_CPRT PORTB #define LCD_CDDR DDRB #define LCD_CPIN PINB #define LCD_RS 0 #define LCD_RW 1 #define LCD_EN 2 #include <avr/io.h> #include <util/delay.h> void i2c_stop(void); void i2c_write(unsigned char data); void i2c_start(void); void i2c_init(void); unsigned char i2c_read(unsigned char ackVal); void rtc_init(void); void rtc_setTime(unsigned char deviceRegister, unsigned char value); unsigned char *rtc_getTime(unsigned char deviceRegister); void lcdCommand( unsigned char cmnd ); void lcdData( unsigned char data ); void lcd_init(); void lcd_gotoxy(unsigned char x, unsigned char y); void lcd_print( const char * str ); int main(void) { unsigned char *hours; rtc_init(); rtc_setTime(0x02, 0x22); hours = rtc_getTime(0x02); lcd_init(); lcd_gotoxy(1,1); lcd_print(hours[0]); lcd_gotoxy(2,1); lcd_print(hours[1]); while (1); return 0; } void i2c_stop(void){ TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); } void i2c_write(unsigned char data){ TWDR = data; TWCR = (1<<TWINT) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); } void i2c_start(void){ TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); } void i2c_init(void){ TWSR = 0x00; TWBR = 0x47; TWCR = 0x04; } unsigned char i2c_read(unsigned char ackVal){ TWCR = (1<<TWINT) | (1<<TWEN) | (ackVal<<TWEA); while( !( TWCR & (1<<TWINT)) ); return TWDR; } void rtc_init(void){ i2c_init(); i2c_start(); i2c_write(0xD0); i2c_write(0x07); i2c_write(0x00); i2c_stop(); } void rtc_setTime(unsigned char deviceRegister, unsigned char value){ i2c_start(); i2c_write(0xD0); i2c_write(deviceRegister); i2c_write(value); i2c_stop(); } unsigned char *rtc_getTime(unsigned char deviceRegister){ unsigned char *data; i2c_start(); i2c_write(0xD0); i2c_write(deviceRegister); i2c_stop(); i2c_start(); i2c_write(0xD1); *data = i2c_read(0); i2c_stop(); return data; } void lcdCommand( unsigned char cmnd ){ LCD_DPRT = cmnd; LCD_CPRT &= ~ (1<<LCD_RS); LCD_CPRT &= ~ (1<<LCD_RW); LCD_CPRT |= (1<<LCD_EN); _delay_us(1); LCD_CPRT &= ~ (1<<LCD_EN); _delay_us(100); } void lcdData( unsigned char data ){ LCD_DPRT = data; LCD_CPRT |= (1<<LCD_RS); LCD_CPRT &= ~ (1<<LCD_RW); LCD_CPRT |= (1<<LCD_EN); _delay_us(1); LCD_CPRT &= ~ (1<<LCD_EN); _delay_us(100); } void lcd_init(){ LCD_DDDR = 0xFF; LCD_CDDR = 0xFF; LCD_CPRT &=~(1<<LCD_EN); _delay_us(2000); lcdCommand(0x38); lcdCommand(0x0E); lcdCommand(0x01); _delay_us(2000); lcdCommand(0x06); } void lcd_gotoxy(unsigned char x, unsigned char y){ unsigned char firstCharAdr[]={0x80,0xC0,0x94,0xD4};//table 12-5 lcdCommand(firstCharAdr[y-1] + x - 1); _delay_us(100); } void lcd_print( const char * str ){ unsigned char i = 0 ; while(str[i]!=0) { lcdData(str[i]); i++ ; } }
When I run this program I get the following output on the LCD.
- Why isn't the hours appearing on the LCD?
- How can I output the hours on the LCD (code wise)?
When I build the program I get the following warnings.
clock_tester.c: In function 'main': clock_tester.c:48:15: warning: passing argument 1 of 'lcd_print' makes pointer from integer without a cast [-Wint-conversion] lcd_print(hours[0]); ^ clock_tester.c:35:6: note: expected 'const __memx char *' but argument is of type 'unsigned char' void lcd_print( const char * str ); ^ clock_tester.c:50:15: warning: passing argument 1 of 'lcd_print' makes pointer from integer without a cast [-Wint-conversion] lcd_print(hours[1]); ^ clock_tester.c:35:6: note: expected 'const __memx char *' but argument is of type 'unsigned char' void lcd_print( const char * str ); ^ clock_tester.c: In function 'rtc_getTime': clock_tester.c:111:8: warning: 'data' is used uninitialized in this function [-Wuninitialized] *data = i2c_read(0);