I2C不动,不晓得哪里错了..我是用I2C来写BU9793段码管驱动芯片的数据.但是调不出来了.先前的时候,可能优化等级较高,优化掉了我发送数据的一部分程序.
说到底芯片的I2C还是有些迷糊,先帮我看下这个程序,看是哪里出了错,茫茫然看DATASHEET有点迷糊,弄出来一次,就有直观的认识了.谢谢各位喽.
噢,对了,CPU是C8051F310
//LCD.c
#include <C8051F310.h>
#include <intrins.h>
#include <STRING.h>
///////////////////////////////////////
//位声明.
//////////////////////////////////////
bit ack;
sbit sda = P0^5;
sbit scl = P0^4;
int i;
///////////////////////////////////////
//字
////////////////////////////////////////
static WORD_0[] = {0X7D,0X60,0X5B,0X7A,0X66,0X3E,0X3F,0X68,0X7F,0X7E};
/////////////////////////////////////
//函数声明
////////////////////////////////////
void delay4(void);
void delay2(void);
void start(void);
void stop(void);
void slave_add(void);
void send_data(int);
void send1(int);
bit test_ack(void);
////////////////////////////////////
//函数
///////////////////////////////////
void main(void)
{
///////////////////////////////////
//初始设置
//////////////////////////////////
int a[11],q=0,c;
OSCICN = 0xc3; /*8分频*/
OSCXCN = 0x07; /*选用外部晶振参数*/
CLKSEL = 0x00; /*选取用内部晶振*/
RSTSRC = 0x02; /*上电复位*/
XBR0 = 0x00;
XBR1 = 0x70; /*交叉开关1*/
P0SKIP = 0x18;
P0MDIN = 0xFF;
P0MDOUT = 0x02;
P1SKIP = 0x00; /*1为跳,0为数字口*/
P1MDIN =0xFF; /*0为模拟输入,1为数字输入*/
P1MDOUT = 0xFF; /*0为漏极开路输出,1为推挽式输出.*/
TCON = 0x10; //定时器0允许,/INT0边沿触发。
TMOD = 0x02; //0x00000010;定时器/计数器工作方式。选为0。CKCON。3定义的时钟加1。
CKCON = 0x01; //00000101 T3=FC/12----T2定时器为内部时钟;T1,T0时钟为系统频率分频数4----T0为系统时钟。
PCA0MD = 0x00; //禁止WDT和PCA时钟源
for(i=0;i<12;i++)
a[i] = 8;
/////////////////////////////////
//数据发送等调用
/////////////////////////////////
for(i=0;i<10;i++)
{
q = a[i];
sda = 1;
delay4();
delay2();
scl = 1;
for(c=0;c<100;c++)
_nop_();
stop();
start();
slave_add();
send_data(q);
send1(q);
while(test_ack());
stop();
}
}
/////////////////////////////////
//开始
/////////////////////////////////
void start(void)
{
sda = 1;
delay4();
scl = 1;
delay4();
delay4();
sda = 0;
delay4();
delay4();
scl = 0;
delay2();
delay4();
}
void delay2()
{
_nop_();
_nop_();
}
void delay4()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/////////////////////////////////
//从地址
/////////////////////////////////
void slave_add(void)
{
unsigned char p;
p = 0x7C;
send1(p);
while(test_ack());
p = 0xEA;
send1(p);
while(test_ack());
p = 0xF0;
send1(p);
while(test_ack());
p = 0xA2;
send1(p);
while(test_ack());
p = 0xE8;
send1(p);
while(test_ack());
p = 0x00;
send1(p);
while(test_ack());
}
////////////////////////////////
//显示数据发送
/////////////////////////////////
void send1(q)
{
int d;
unsigned char a;
b;
a = q;
for(d=0;d<=7;d++)
{
b = a&01;
if(b==1)
{
delay4();
delay2();
sda = 1;
delay4();
delay4();
_nop_();
scl = 1;
delay4();
delay4();
scl = 0;
delay4();
delay2();
sda = 0;
delay4();
delay2();
}
if(b==0)
{
delay4();
delay2();
sda = 0;
delay4();
scl = 1;
delay4();
delay4();
scl = 0;
delay4();
delay2();
sda = 0;
delay4();
delay2();
}
a >>= 1;
}
}
///////////////////////////////
//结束
///////////////////////////////
void stop()
{
delay4();
delay2();
scl = 0;
delay4();
sda = 0;
delay4();
scl = 1;
delay4();
sda = 0;
delay4();
}
bit test_ack(void)
{
bit errorbit;
sda = 0;
delay4();
scl = 1;
delay4();
errorbit = sda;
scl = 0;
delay4();
return(errorbit);
} |