您的位置:首页 > 其它

时钟八:用IIC和EEPROM实现时钟

2016-09-22 21:03 309 查看
主函数文件:

#include <reg52.h>
#include "./delay/delay.h"

sbit SCL = P1^0;
sbit SDA = P1^1;
sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;

bit ack = 0;

#define SUCC 1
#define ERR 0
#define LCDPORT P0
#define LCD_WRITE_DATA 1
#define LCD_WRITE_COM 0

unsigned char shi = 0;
unsigned char fen = 0;
unsigned char miao = 0;

void lcd_write1602(unsigned char byte,unsigned char flag);

void lcd1602_write(unsigned char byte,unsigned char flag)
{
if(flag)
{
RS = 1;
}
else
{
RS = 0; //Ñ¡ÔñÊäÈëÊý¾ÝΪÊý¾Ý
}
RW = 0; //д
E = 1; //Ñ¡ÖÐLCD
LCDPORT = byte;
delay_us(5);
E = 0; //ʧÄÜLCD
}

void Timer0_init()
{
EA = 1;
TMOD |= 0x01;
TH0 = (65536 - 20000) / 256;
TL0 = (65536 - 20000) % 256;
ET0 = 1;
TR0 = 1;
}

void timer() interrupt 1
{
static unsigned char i = 0;
TH0 = (65536 - 20000) / 256;
TL0 = (65536 - 20000) % 256;
i++;
if(50 == i)
{
i = 0;
miao++;
if(60 == miao)
{
miao = 0;
fen++;
if(60 == fen)
{
fen = 0;
shi++;
if(24 == shi)
{
shi = 0;
}
}
}
}
}

void lcd_dis_time()
{
lcd1602_write(0x80 + 4,LCD_WRITE_COM);
lcd1602_write((shi / 10) + 0x30,LCD_WRITE_DATA);
lcd1602_write((shi % 10) + 0x30,LCD_WRITE_DATA);
lcd1602_write(':',LCD_WRITE_DATA);
lcd1602_write((fen / 10) + 0x30,LCD_WRITE_DATA);
lcd1602_write((fen % 10) + 0x30,LCD_WRITE_DATA);
lcd1602_write(':',LCD_WRITE_DATA);
lcd1602_write((miao / 10) + 0x30,LCD_WRITE_DATA);
lcd1602_write((miao % 10) + 0x30,LCD_WRITE_DATA);
}

void lcd_init()
{
delay_ms(15);
lcd1602_write(0x38,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x38,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x38,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x38,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x08,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x01,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x06,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x0c,LCD_WRITE_COM);
delay_ms(5);
}

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; //ǯס×ÜÏß
}

bit 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;
delay_us(1);
byte <<= 1;
}
SCL = 1;
SDA = 1;
delay_us(1);
if(0 == SDA)
{
ack = 1;
}
else
{
ack = 0;
}

SCL = 0;

return ack;
}

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_str(unsigned char devaddr,unsigned char romaddr)
{
unsigned char time;
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);
time = iic_rcv_byte();
iic_noack();
iic_stop();
return time;
}

void main()
{
unsigned char test[3] = {0};
unsigned char temp[3] = {0};
lcd_init();
Timer0_init(); //¼Æʱ

delay_us(1);

shi = AT24C02_rcv_str(0xae,80);
delay_ms(1);
fen = AT24C02_rcv_str(0xae,81);
delay_ms(1);
miao = AT24C02_rcv_str(0xae,82);
delay_ms(1);

while(1)
{
test[0] = shi;
test[1] = fen;
test[2] = miao;
lcd_dis_time();
AT24C02_send_str(0xae,80,test,3);
}
}

延时函数文件:

void delay_us(unsigned char t)
{
while(--t);
}

void delay_ms(unsigned char t)
{
while(t--)
{
delay_us(245);
delay_us(245);
}
}

void delay_s(unsigned char t)
{
while(t--)
{
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: