|
#include<iom16v.h>
#include<macros.h>
#include"main.h"
#define SDA_H (PORTC|=0x02)
#define SDA_L (PORTC&=0xFD)
#define SCL_H (PORTC|=0x01)
#define SCL_L (PORTC&=0xFE)
#define SDA_OUT (DDRC|=0x02)
#define SDA_IN (DDRC&=0xFD)
#define SCL_OUT (DDRC|=0x01)
#define SDA_CHK (PINC&0x02)
#define DEV_ADDR 0xA0
void init_IIC(void)
{
SDA_OUT;
SCL_OUT;
SDA_H;
delay_us(1);
SCL_H;
delay_us(1);
}
void IIC_start(void)
{
SDA_H;
delay_us(1);
SCL_H;
delay_us(1);
SDA_L;
delay_us(1);
}
void IIC_stop(void)
{
SDA_L;
delay_us(1);
SCL_H;
delay_us(1);
SDA_H;
delay_us(1);
}
void IIC_ack(void)
{
uchar i=0;
SCL_L;
delay_us(1);
SDA_IN;
delay_us(1);
SCL_H;
while((0!=SDA_CHK)&&(i<250))
{
i++;
_NOP();
}
SCL_L;
SDA_OUT;
delay_us(1);
SDA_H;
delay_us(1);
}
void IIC_noack(void)
{
SDA_H;
delay_us(1);
SCL_H;
delay_us(1);
SCL_L;
delay_us(1);
}
void IIC_write_byte(uchar dat)
{
uchar i,tmp;
tmp=dat;
for(i=0;i<8;i++)
{
SCL_L;
delay_us(1);
if(tmp&0x80)
{
SDA_H;
}else
{
SDA_L;
}
tmp<<1;
delay_us(1);
SCL_H;
delay_us(1);
}
SCL_L;
delay_us(1);
SDA_H;
delay_us(1);
}
uchar IIC_read_byte(void)
{
uchar i,dat;
SCL_L;
delay_us(1);
SDA_IN;
delay_us(1);
for(i=0;i<8;i++)
{
SCL_H;
delay_us(1);
dat=dat<<1;
if(0!=SDA_CHK)
{
dat++;
}
SCL_L;
delay_us(1);
}
SDA_OUT;
delay_us(1);
return(dat);
}
void write_IIC(uchar addr,uchar dat)
{
IIC_start();
IIC_write_byte(DEV_ADDR);
IIC_ack();
IIC_write_byte(addr);
IIC_ack();
IIC_write_byte(dat);
IIC_ack();
IIC_stop();
}
uchar read_IIC(uchar addr)
{
uchar tmp=0;
IIC_start();
IIC_write_byte(DEV_ADDR);
IIC_write_byte(addr);
IIC_ack();
IIC_start();
IIC_write_byte(DEV_ADDR+1);
IIC_ack();
tmp=IIC_read_byte();
IIC_noack();
IIC_stop();
return(tmp);
}
#include<iom16v.h>
#include<macros.h>
#include"main.h"
#include"delay.h"
#include"iic.h"
#define DAT_ADDR 0x03
uchar g_ucdat;
void display(uchar dat)
{
PORTA=1;
PORTB=(dat%10);
delay_ms(5);
PORTA=2;
PORTB=(dat/10);
delay_ms(5);
}
#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{
g_ucdat++;
}
void port_init(void)
{
DDRA=0xFF;
PORTA=0xFF;
DDRB=0xFF;
PORTB=0xFF;
DDRC=0xFF;
PORTC=0xFF;
DDRD=0xF0;
PORTD=0xFF;
}
void main(void)
{
uchar tmp=0;
g_ucdat=0;
CLI();
port_init();
init_IIC();
MCUCR=0x02;
GICR=0x40;
TIMSK=0x00;
SEI();
tmp=read_IIC(DAT_ADDR);
if(tmp==0xFF)
{
tmp=1;
write_IIC(DAT_ADDR,tmp);
delay_ms(10);
}
g_ucdat=tmp;
while(1)
{
if(tmp!=g_ucdat)
{
if(g_ucdat>99)
{
g_ucdat=0;
}
tmp=g_ucdat;
write_IIC(DAT_ADDR,tmp);
}
}
display(tmp);
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|