im using rtc in lpc2148. i got the output.im facing problem with secs displaying in lcd.the problem is the secs are not varying but every 60 secs the minute is changing.im not able to see the secs counting from 0-59 in lcd.it showing sometimes (2,0,10,8).but the time is working properly.
here is my code .
---------------------------------------------------------------------------------------------
#include <lpc21xx.h> /* LPC2200 definitions */ #include <stdio.h> /* standard I/O .h-file */
#define pin_rs 1<<24 /*lcd rs pin*/ #define pin_rw 1<<23 /*lcd rw pin*/ #define pin_en 1<<22 /*lcd en pin*/
#define pin_ctrl pin_rs|pin_rw|pin_en /*lcd control pins*/
#define lcd_d4 1<<10 /*lcd data pins D4,D5,D6,D7*/ #define lcd_d5 1<<11 #define lcd_d6 1<<12 #define lcd_d7 1<<13
#define lcd_data lcd_d4|lcd_d5|lcd_d6|lcd_d7 #define lcd_rs(x) ((x)?(IOSET1=pin_rs):(IOCLR1=pin_rs));/*lcd_rs(x) if x=1 will set the lcd_rs pin will clear if x=0*/ #define lcd_rw(x) ((x)?(IOSET1=pin_rw):(IOCLR1=pin_rw)); #define lcd_en(x) ((x)?(IOSET1=pin_en):(IOCLR1=pin_en)); #define data_in ((IOPIN0>>10)&(0x0F))
/*direction of the data pins as input*/ #define data_out(x) IOCLR0=lcd_data; IOSET0=(x & 0x0F)<<10; /*direction of the data pins and control pins as output*/ #define lcd_all_dir_out IODIR0 |= lcd_data; IODIR1 |= pin_ctrl; /*setting as output for both data and control pins*/ #define lcd_dir_data_out IODIR0 |= lcd_data #define lcd_dir_data_in IODIR0 &= ~(lcd_data) #define delay_2n 4 //long ioscan=0;
void lcd_putchar(unsigned char f); void RTC_init(void);
static void delay(int); static unsigned char busy_wait(void);
static void delay(int cnt) { cnt <<= delay_2n; while(cnt--); }
void data(void); void lcddata(unsigned char c); void lcdcmd(unsigned char c); void lcdinit(void); void lcddisplay(unsigned char *ptr); void message(unsigned char k,unsigned char *ptr1);
static unsigned char busy_wait() { delay(500); return 1;
}
void lcd_write_4bit(unsigned char c) { lcd_rw(0); delay(10); lcd_en(1); delay(10); data_out(c & 0x0F); delay(10); lcd_en(0); delay(10); }
void lcdcmd(unsigned char c) {
busy_wait(); lcd_rs(0); delay(10); lcd_write_4bit(c>>4); lcd_write_4bit(c); }
void lcddata(unsigned char c) { busy_wait(); lcd_rs(1); delay(10); lcd_write_4bit(c>>4); lcd_write_4bit(c); }
void lcddisplay(unsigned char *ptr) { while(*ptr) { lcddata(*ptr); ptr++; } }
void lcdinit() { lcd_all_dir_out; delay(10); lcd_rs(0); lcd_write_4bit(0x3); delay(10); lcd_write_4bit(0x3); delay(10); lcd_write_4bit(0x3); lcd_write_4bit(0x2); lcdcmd(0x28); lcdcmd(0x0C); }
void lcd_clear() { lcdcmd(0x01);
void message(unsigned char k,unsigned char *ptr1) { lcdcmd(k); delay(10); lcddisplay(ptr1); }
void lcd_putchar(unsigned char f) { unsigned int d1,d2,byte,x;
byte = f; x = byte/10; d1 = byte%10; d2 = x % 10;
lcddata(d2+0x30); lcddata(d1+0x30);
void RTC_init(void) {
PREINT = 0x00000392; //Set RTC prescaler for 12.000Mhz Xtal PREFRAC = 0x00004380;
SEC = 0x00; MIN = 0x08; HOUR = 0x10;
DOM = 0x0C; MONTH = 0x02; YEAR = 0x0D;
CIIR = 0x01; // Enable seconds counter interrupt CCR = 0x01; //Start the RTC
int main(void) { VPBDIV = 0x02; // Seting the PCLK to 30 MHz lcdinit(); delay(100); message(0x80,"time:"); message(0xc0,"date:"); RTC_init();
while(1) {
lcdcmd(0x85); lcd_putchar(HOUR); lcddata(':');
lcdcmd(0x88); lcd_putchar(MIN); lcddata(':');
lcdcmd(0x8B); lcd_putchar(SEC);
lcdcmd(0xC5); lcd_putchar(DOM); lcddata('/');
lcdcmd(0xC8); lcd_putchar(MONTH); lcddata('/');
lcdcmd(0xCB); lcd_putchar(YEAR);