IIC 程序调试成功代码

这是一个很简单的IIC程序实现的主要功能为向IIC写一个数据,然后把这个数据给读出来,在这个过程中遇见的主要问题是1.写好程序编译成功但是程序的单步调试的结果是乱跳,解决的办法是调低keil4的优化级别 2.在用到CY这个位寄存器时,如果你的延时够长的话,就会莫名其妙的把CY给清零,还不知道其中的原因,但是我猜想是单片机的工作周期有关吧,解决的办法是:用ES位来代替暂时保存CY值。就是说在你循环移位后立即把CY值赋给ES保存这样你就不会出现CY清零的情况。3.在写IIC的时候感觉时序是很麻烦的,关键是要能够有逻辑分析仪,如果没有的话,可以借助KEIL里面的简单的逻辑分析仪来测试自己写的时序是否正确。

 

code

 

#include

#include

 

#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;

}

 

 

 

 

 

你可能感兴趣的:(单片机)