Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <reg51.h>
- #define I2C_SPEED_FACTOR 1 // Low value means low i2c frequency
- #define Crystal_Value 12 // MHz
- #define HalfBitDelay (500*Crystal_Value)/(12*I2C_SPEED_FACTOR)
- #define lcddata P1
- sbit SDA= P0^0;
- sbit SCL= P0^1;
- sbit RS = P2^0;
- sbit RW = P2^1;
- sbit EN = P2^2;
- sbit BSY = P1^7;
- /* delay for the clock */
- void I2cdelay(unsigned int d)
- {
- unsigned int i, limit;
- limit = d/15;
- for(i=0;i<limit;i++);
- }
- static void delay(unsigned int);
- /* initialize the i2c */
- static void I2CInit()
- {
- SDA = 1;
- SCL = 1;
- }
- //I2c start
- static void I2CStart()
- {
- SCL = 1;
- SDA = 1;
- I2cdelay(HalfBitDelay);
- SDA = 0;
- I2cdelay(HalfBitDelay);
- }
- /* STOP signal to complete the transmission */
- static void I2CStop()
- {
- SCL = 0;
- I2cdelay(HalfBitDelay/2);
- SDA = 0;
- I2cdelay(HalfBitDelay/2);
- SCL = 1;
- I2cdelay(HalfBitDelay/2);
- SDA = 1;
- I2cdelay(HalfBitDelay/2);
- }
- /* acknowledge after byte has been received */
- static void I2CAck()
- {
- SCL = 0;
- I2cdelay(HalfBitDelay/2);
- SDA = 0;
- I2cdelay(HalfBitDelay/2);
- SCL = 1;
- I2cdelay(HalfBitDelay);
- }
- /* send a no acknowledge to transmitter when all bytes have been received */
- static void I2CNak()
- {
- SCL = 0;
- I2cdelay(HalfBitDelay/2);
- SDA = 1;
- I2cdelay(HalfBitDelay/2);
- SCL = 1;
- I2cdelay(HalfBitDelay);
- }
- static void I2CRestart()
- {
- SCL = 0;
- I2cdelay(HalfBitDelay/2);
- SDA = 1;
- I2cdelay(HalfBitDelay/2);
- SCL = 1;
- I2cdelay(HalfBitDelay/2);
- SDA = 0;
- I2cdelay(HalfBitDelay/2);
- }
- /* write data onto the bus */
- static unsigned char I2CSend(unsigned char Data)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- /* The data should change on the low clock */
- SCL = 0;
- I2cdelay(HalfBitDelay/2);
- if ((Data & 0x80) == 0)
- SDA = 0;
- else
- SDA = 1;
- I2cdelay(HalfBitDelay/2);
- /* keep SCL high for the valid data */
- SCL = 1;
- I2cdelay(HalfBitDelay);
- Data<<=1;
- }
- SCL = 0;
- SDA = 1;
- I2cdelay(HalfBitDelay);
- SCL = 1;
- I2cdelay(HalfBitDelay);
- //return ack_bit;
- return SDA;
- }
- static unsigned char I2CRead()
- {
- unsigned char i, Data=0;
- for(i=0;i<8;i++)
- {
- SCL = 0;
- SDA = 1;
- I2cdelay(HalfBitDelay);
- SCL = 1;
- I2cdelay(HalfBitDelay/2);
- if(SDA)
- Data |=0x01;
- if(i<7)
- Data<<=1;
- I2cdelay(HalfBitDelay/2);
- }
- //SCL = 1;
- return Data;
- }
- static void lcd_ready()
- {
- //make BSY pin as input
- BSY=1;
- //Read out from register
- RS=0;
- //Read
- RW=1;
- while(BSY==1)
- {
- EN=0;
- delay(1);
- EN=1;
- }
- }
- // delay function
- static void delay(unsigned int tme)
- {
- unsigned int i,j;
- for(i=0;i<tme;i++)
- for(j=0;j<1275;j++);
- }
- /*
- unsigned char strlen(char str[])
- {
- unsigned char len=0,i=0;
- while(str[i++]!='\0')
- len++;
- return len;
- }
- */
- static void lcd_cmd(unsigned char val)
- {
- //check for busy flag
- lcd_ready();
- lcddata=val;
- RS=0;
- RW=0;
- EN=1;
- delay(2);
- EN=0;
- }
- static void lcd_init()
- {
- //16x2 lcd
- lcd_cmd(0x38);
- //clear lcd
- lcd_cmd(0x01);
- //force the cursor to line 1
- lcd_cmd(0x80);
- //display on cursor blinking
- lcd_cmd(0x0E);
- }
- static void lcd_data(unsigned char datum)
- {
- lcd_ready();
- lcddata=datum;
- RS=1;
- RW=0;
- EN=1;
- delay(1);
- EN=0;
- }
- static unsigned char convtime(unsigned char hour)
- {
- //check for 12 hour or 24 hour mode
- if(hour&0x40)
- {
- return (hour & 0x1F);
- }
- else
- {
- return (hour & 0x3F);
- }
- }
- static void bcdconv(unsigned char datum)
- {
- unsigned char x=0,y=0;
- x=datum&0x0f;
- x=x|0x30;
- y=datum&0xf0;
- y=y>>4;
- y=y|0x30;
- lcd_data(y);
- lcd_data(x);
- }
- /*
- void lcd_data(unsigned char datum[])
- {
- unsigned char len=0,i;
- len = strlen(datum);
- for(i=0;i<len;i++)
- {
- //check for busy flag
- lcd_ready();
- lcddata=datum[i];
- RS=1;
- RW=0;
- EN=1;
- delay(1);
- EN=0;
- }
- }
- */
- void main()
- {
- unsigned char i, a[7],reg_addr=0;
- unsigned int j;
- I2CInit();
- lcd_init();
- /* Writing on i2c */
- I2CStart();
- I2CSend(0xD0);
- I2CSend(0x00);
- I2CSend(0x00);
- I2CSend(0x10);
- I2CSend(0x52);
- I2CSend(0x07);
- I2CSend(0x29);
- I2CSend(0x03);
- I2CSend(0x14);
- I2CStop();
- while(1)
- {
- I2CInit();
- I2CStart();
- I2CSend(0xD0);
- I2CSend(0x00);
- /* Actual read */
- I2CRestart();
- I2CSend(0xD1);
- for(i=0;i<8;i++)
- {
- a[i]=I2CRead();
- if(i==6)
- I2CNak();
- else
- I2CAck();
- }
- I2CStop();
- //I2CStop();
- lcd_cmd(0x81);
- bcdconv(convtime(a[2]));
- lcd_data(':');
- bcdconv(a[1]);
- lcd_data(':');
- bcdconv(a[0]);
- lcd_cmd(0xC0);
- bcdconv(a[4]);
- lcd_data('-');
- bcdconv(a[5]);
- lcd_data('-');
- bcdconv(a[6]);
- for(j=65535;j>0;j--);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement