iic.c
#include "myhead.h"
xdata unsigned char alarm_hour = 13;
xdata unsigned char alarm_min = 1;
xdata unsigned char alarm_sec = 59;
bit ack = 0;
void iic_start()
{
SDA = 1;
SCL = 1;
delay_us(1);
SDA = 0;
delay_us(1);
SCL = 0;
}
void iic_stop()
{
SDA = 0;
SCL = 1;
delay_us(1);
SDA = 1;
delay_us(1);
SCL = 0;
}
void iic_send_byte(unsigned char byte)
{
unsigned char i;
for(i = 0;i < 8;i++)
{
SDA = byte & 0x80;
SCL = 1;
delay_us(1);
SCL = 0;
byte <<= 1;
}
SCL = 1;
SDA = 1;
delay_us(1);
if(0 == SDA)
{
ack = 1;
}
else
{
ack = 0;
}
SCL = 0;
}
unsigned char iic_rcv_byte()
{
unsigned char i;
unsigned char temp = 0;
unsigned char a;
SDA = 1;
for(i = 0;i < 8;i++)
{
SCL = 0;
delay_us(1);
SCL = 1;
if(SDA)
{
a = 0x01;
}
else
{
a = 0;
}
temp |= a << (7 - i);
delay_us(1);
}
SCL = 0;
return temp;
}
void iic_noack()
{
SDA = 1;
SCL = 1;
delay_us(1);
SCL = 0;
}
unsigned char AT24C02_send_str(unsigned char devaddr,unsigned char romaddr,unsigned char *s,unsigned char num)
{
unsigned char i;
iic_start();
iic_send_byte(devaddr);
if(0 == ack)
{
return ERR;
}
iic_send_byte(romaddr);
if(0 == ack)
{
return ERR;
}
for(i = 0;i < num;i++)
{
iic_send_byte(*s);
if(0 == ack)
{
return ERR;
}
s++;
}
iic_stop();
return SUCC;
}
unsigned char AT24C02_rcv_time(unsigned char devaddr,unsigned char romaddr)
{
unsigned char t;
iic_start();
iic_send_byte(devaddr);
if(0 == ack)
{
return ERR;
}
iic_send_byte(romaddr);
if(0 == ack)
{
return ERR;
}
iic_start();
iic_send_byte(devaddr + 1);
t = iic_rcv_byte();
iic_noack();
iic_stop();
return t;
}
void iic()
{
unsigned char i;
unsigned char time[4] = {0};
unsigned char clock[4] = {0};
unsigned char flag1 = 1;
unsigned char key;
lcd_init();
uart_init();
time0_init();
hour = AT24C02_rcv_time(0xae,16);
min = AT24C02_rcv_time(0xae,17);
sec = AT24C02_rcv_time(0xae,18);
delay_ms(500);
alarm_hour = AT24C02_rcv_time(0xae,24);
alarm_min = AT24C02_rcv_time(0xae,25);
alarm_sec = AT24C02_rcv_time(0xae,26);
while(flag1)
{
if(flag)
{
if(ch[0] == 't')
{
TR0 = 0;
lcd_dis_str(0,1,"change time ");
hour = (ch[1] - '0') * 10 +(ch[2] - '0');
min = (ch[4] - '0') * 10 +(ch[5] - '0');
sec = (ch[7] - '0') * 10 +(ch[8] - '0');
lcd_dis_time();
delay_s(3);
lcd_dis_str(0,1," ");
lcd_dis_time();
lcd_dis_alarm_time();
TR0 = 1;
}
if(ch[0] == 'c')
{
lcd_dis_str(0,0,"change clock ");
alarm_hour = (ch[1] - '0') * 10 +(ch[2] - '0');
alarm_min = (ch[4] - '0') * 10 +(ch[5] - '0');
alarm_sec = (ch[7] - '0') * 10 +(ch[8] - '0');
lcd_dis_alarm_time();
delay_s(5);
lcd_dis_str(0,0," ");
lcd_dis_time();
lcd_dis_alarm_time();
}
uart_send_str(ch);
flag = 0;
}
else
{
lcd_dis_time();
lcd_dis_alarm_time();
}
if(alarm_hour == hour && alarm_min == min)
{
for(i = 0;i < 100;i++)
{
beep = ~beep;
delay_ms(10);
}
}
time[0] = hour;
time[1] = min;
time[2] = sec;
clock[0] = alarm_hour;
clock[1] = alarm_min;
clock[2] = alarm_sec;
AT24C02_send_str(0xae,16,time,3);
delay_ms(500);
AT24C02_send_str(0xae,24,clock,3);
delay_s(1);
key = key_scan();
if(0xe7 == key)
{
lcd_init();
lcd_over();
flag1 = 0;
iic_stop();
}
}
}
iic.h
#ifndef _UART_H
#define _UART_H
extern void uart_init(void);
extern void uart_isr();
extern void uart_send_byte(unsigned char byte);
extern void uart_send_str(unsigned char *str);
extern void uart();
#endif