IIC 程序调试成功代码
2010-07-18 14:30
218 查看
这是一个很简单的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;
}
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;
}
相关文章推荐
- 到现在为止,成功调试完成我的第一个Java程序,意味着我也要进行Java这一行了,请看我的代码!
- ubuntu下C++如何调用python程序,gdb调试C++代码
- 测试时钟显示程序通过, 点阵显示 碰到一些困难 发现调试比写代码更纠结。代码没错 烧到板子里就是打不到想要的现象
- .Net强名称验证带本机代码混编译程序调试一例--强名去见鬼
- Duilib vs调试程序加载资源失败,但是单独执行exe可以成功
- 第一行代码13.4 调试Android程序
- Windows程序调试----第一部分 调试策略----第2章 编写使于调试的C++代码
- 使用VS Code调试TypeScript游戏程序JsTankGame成功!!!
- (第一行代码笔记)调试Android程序
- iphone ios XCode4如何调试程序忽然崩溃而找不到挂的代码
- 使用GDB调试程序,代码与实例
- STC12C4052部分调试成功的程序
- VB2008控件数组全解(绝对经典,代码为本人自行设计并调试运行成功~~)
- XCode4如何解决调试程序时,忽然崩溃,而找不到崩溃的代码
- xcode反汇编调试iOS模拟器程序(八)反汇编自己的代码来掌握规则
- iphone ios XCode4如何调试程序忽然崩溃而找不到挂的代码
- Eclipse开发调试ARM裸机程序(四)赤裸裸的代码拷贝
- 调试程序时总会提示代码过期的处理办法....
- 如何调试包含共享库代码的程序
- 关于逆向工程程序执行成功但是代码没有生成问题