سلام خدمت دوستان گلم
کسی میدونه این برنامه چشه ؟
اصلا کار نمیکنه
کسی میدونه این برنامه چشه ؟
اصلا کار نمیکنه
کد:
#include <LPC13xx.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*************************************************
LIB
*************************************************/
#include "mylib\sysclk.h"
#include "mylib\iodef.h"
#include "mylib\delay.h"
#include "mylib\type.h"
#include "mylib\i2c.h"
/*************************************************
DEFINE
*************************************************/
#define BV(BIT) (1UL<<BIT)
#define SBI(BYTE,BIT) (BYTE|=BV(BIT))
#define CBI(BYTE,BIT) (BYTE&=~BV(BIT))
#define RBI(BYTE,BIT) ((BYTE&BV(BIT))>>BIT)
#define BIS(BYTE,BIT) (while(!RBI(BYTE,BIT)))
#define BIC(BYTE,BIT) (while(RBI(BYTE,BIT)))
#define STROBE SBI(LPC_GPIO0->DATA,IO6),CBI(LPC_GPIO0->DATA,IO6)
#define CLOCK SBI(LPC_GPIO0->DATA,IO7),CBI(LPC_GPIO0->DATA,IO7)
#define DATAH SBI(LPC_GPIO0->DATA,IO8)
#define DATAL CBI(LPC_GPIO0->DATA,IO8)
#define LOAD_DATA CLOCK,STROBE
#define COL_START DATAH,LOAD_DATA,DATAL
typedef struct {
unsigned int year; /* 2000..2099 */
unsigned char month; /* 1..12 */
unsigned char mday; /* 1.. 31 */
unsigned char wday; /* 1..7 */
unsigned char hour; /* 0..23 */
unsigned char min; /* 0..59 */
unsigned char sec; /* 0..59 */
} RTC;
int rtc_settime (RTC rtc);
int rtc_gettime (RTC *rtc);
void rtc_start(void);
void rtc_set_irq(char prescale);
void write_uln(unsigned char data);
const char segment_data[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98,0xff};
RTC rtc;
char segbuff[15];
int main(void)
{
int i=0,j=0;
sys_clk_freq=12000000;//Mhz
LPC_SYSCON->SYSAHBCLKCTRL |= 1UL<<6|1UL<<16;
LPC_GPIO1->DIR=0xff;
LPC_GPIO0->DIR|=BV(6)|BV(7)|BV(8);
LPC_GPIO2->DIR&=~BV(0)|~BV(1)|~BV(2);
P1_0CFG=0xd1;
P1_1CFG=0xd1;
P1_2CFG=0xd1;
P1_3CFG=0xd1;
P1_4CFG=0xd0;
P1_5CFG=0xd0;
P1_6CFG=0xd0;
P1_7CFG=0xd0;
COL_START;
for(i=0;i<14;i++)
LOAD_DATA;
if ( I2CInit( (uint32_t)I2CMASTER ) == FALSE ) /* initialize I2c */
{
while ( 1 ); /* Fatal error */
}
rtc.sec = 10;
rtc.min = 5;
rtc.hour = 12;
rtc.wday = 2;
rtc.mday = 12;
rtc.month = 3;
rtc.year = 2015;
rtc_settime(rtc);
rtc_start();
rtc_set_irq(8);
while(1)
{
rtc_gettime(&rtc);
sprintf(segbuff,"%02d%02d%02d%04d%02d%02d",rtc.hour,rtc.min,rtc.sec,rtc.year,rtc.month,rtc.mday);
COL_START;
for(i=0;i<15;i++)
{
for(j=0;j<30;j++)
write_uln(segment_data[segbuff[i]-48]);
LOAD_DATA;
};
}
}
void write_uln(unsigned char data)
{
LPC_GPIO1->DATA=data;
}
void rtc_set_irq(char prescale)
{
I2CWriteLength=3;
I2CReadLength=0;
I2CMasterBuffer[0]=DS_W;
I2CMasterBuffer[1]=0x07;
if(prescale==8)
I2CMasterBuffer[2]=0x90;
if(prescale==4)
I2CMasterBuffer[2]=0x91;
if(prescale==2)
I2CMasterBuffer[2]=0x92;
if(prescale==1)
I2CMasterBuffer[2]=0x93;
I2CEngine();
}
void rtc_start(void)
{
I2CWriteLength=3;
I2CReadLength=0;
I2CMasterBuffer[0]=DS_W;
I2CMasterBuffer[1]=0x00;
I2CMasterBuffer[2]=0x00;
I2CEngine();
}
int rtc_gettime (RTC *rtc)
{
int i=0;
I2CWriteLength=2;
I2CReadLength=7;
I2CMasterBuffer[0]=DS_W;
I2CMasterBuffer[1]=0x00;
I2CEngine();
//while (I2CEngine() == I2CSTATE_SLA_NACK)
//i++;
rtc->sec = (I2CSlaveBuffer[0] & 0x0F) + ((I2CSlaveBuffer[0] >> 4) & 7) * 10;
rtc->min = (I2CSlaveBuffer[1] & 0x0F) + (I2CSlaveBuffer[1] >> 4) * 10;
rtc->hour = (I2CSlaveBuffer[2] & 0x0F) + ((I2CSlaveBuffer[2] >> 4) & 3) * 10;
rtc->wday = (I2CSlaveBuffer[2] & 0x07);
rtc->mday = (I2CSlaveBuffer[4] & 0x0F) + ((I2CSlaveBuffer[4] >> 4) & 3) * 10;
rtc->month = (I2CSlaveBuffer[5] & 0x0F) + ((I2CSlaveBuffer[5] >> 4) & 1) * 10;
rtc->year = 2000 + (I2CSlaveBuffer[6] & 0x0F) + (I2CSlaveBuffer[6] >> 4) * 10;
return i;
}
int rtc_settime (RTC rtc)
{
I2CWriteLength=9;
I2CReadLength=0;
I2CMasterBuffer[0]=DS_W;
I2CMasterBuffer[1]=0x00;
I2CMasterBuffer[2] = rtc.sec / 10 * 16 + rtc.sec % 10;
I2CMasterBuffer[3] = rtc.min / 10 * 16 + rtc.min % 10;
I2CMasterBuffer[4] = rtc.hour / 10 * 16 + rtc.hour % 10;
I2CMasterBuffer[5] = rtc.wday & 7;
I2CMasterBuffer[6] = rtc.mday / 10 * 16 + rtc.mday % 10;
I2CMasterBuffer[7] = rtc.month / 10 * 16 + rtc.month % 10;
I2CMasterBuffer[8] = (rtc.year - 2000) / 10 * 16 + (rtc.year - 2000) % 10;
I2CEngine();
return 1;
}


دیدگاه