这是一个很简单的IIC程序实现的主要功能为向IIC写一个数据,然后把这个数据给读出来,在这个过程中遇见的主要问题是1.写好程序编译成功但是程序的单步调试的结果是乱跳,解决的办法是调低keil4的优化级别 2.在用到CY这个位寄存器时,如果你的延时够长的话,就会莫名其妙的把CY给清零,还不知道其中的原因,但是我猜想是单片机的工作周期有关吧,解决的办法是:用ES位来代替暂时保存CY值。就是说在你循环移位后立即把CY值赋给ES保存这样你就不会出现CY清零的情况。3.在写IIC的时候感觉时序是很麻烦的,关键是要能够有逻辑分析仪,如果没有的话,可以借助KEIL里面的简单的逻辑分析仪来测试自己写的时序是否正确。
code
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit scl=P3^4;
sbit sda=P3^5;
uchar num ;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void display(uchar,uchar,uchar);
void delayms(uchar xms);
void init();
void start();
void stop();
void respons();
void write_byte(uchar date);
uchar read_byte();
extern void write_add(uchar address,uchar datex);
uchar read_add(uchar address);
void main()
{
init();
write_add(14,0x0f);
delayms(100);
num=read_add(14);
while(1)
{
display((num/100),(num%100/10),(num%10));
}
}
void display(uchar bai,uchar shi,uchar ge)
{
P1=0xe0;
P2=table[bai];
delayms(3);
P1=0xf0;
delayms(3);
P1=0xd0;
P2=table[shi];
delayms(3);
P1=0xf0;
delayms(3);
P1=0xb0;
P2=table[ge];
delayms(3);
P1=0xf0;
delayms(3);
}
void delayms(uchar xms)
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
scl=1;
delayms(4);
sda=1;
delayms(4);
}
void start()
{
sda=1;
delayms(5);
scl=1;
delayms(5);
sda=0;
delayms(5);
}
void stop()
{
sda=0;
delayms(5);
scl=1;
delayms(5);
sda=1;
delayms(5);
}
void respons()
{
sda=0;
delayms(5);
scl=1;
delayms(5);
scl=0;
delayms(5);
sda=1;
delayms(5);
}
void write_byte(uchar date)
{
uchar temp,b;
temp=date;
for(b=0;b<8;b++)
{
temp=temp<<1;
scl=0;
ES=CY;
delayms(5);
sda=ES;
delayms(5);
scl=1;
delayms(5);
}
scl=0;
delayms(5);
sda=1;
delayms(5);
}
uchar read_byte()
{
uchar temp=0,c;
scl=0;
delayms(5);
sda=1;
delayms(5);
for(c=0;c<8;c++)
{
scl=1;
delayms(5);
temp=(temp<<1)|sda ;
scl=0;
delayms(5);
}
return temp ;
}
void write_add(uchar address,uchar datex)
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(datex);
respons();
stop();
}
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
delayms(100);
date=read_byte();
stop();
return date;
}