本帖最后由 tianyazhix 于 2013-4-18 11:58 编辑
最近在使用AD5254数字电位器,数据一直写不进去,下面是程序的代码
#include"1.h"
#define nop() asm("nop")
#define Nop() asm("nop") //空操作
#define ClrWdt() asm("clrwdt") //喂狗
#define SCL RA4
#define SDA RC0
#define SCLIO TRISA4
#define SDAIO TRISC0
#define Delay5us() {nop();nop();nop();nop();nop();}
#define ERITE_RDAC0 0x00 //AD5254写入内容
#define ERITE_RDAC1 0x01
#define ERITE_RDAC2 0x02
#define ERITE_RDAC3 0x03
void port_init(void)
{
OSCCON=0x73; //IRCF2-0:101=2M 110=4M 111=8M SCS=1 由内部时钟作为震荡器
LCDREF=0x0e;
T0CS=0;
CM1CON0=0X00; //关闭比较寄存器
CM2CON0=0X00; //关闭比较寄存器
WDTCON=0x12; //1024分平 2*10/2*5=2*5=32ms
PSA=0; //将欲分频 分配给定时器0
SWDTEN=0; //启动WDT ???
TRISA=0x00;
PORTA=0x00;
TRISB=0x40;
PORTB=0x38;
TRISC=0x00;
PORTC=0x00;
TRISD=0x1f;
PORTD=0xe0;
TRISE=0xff;
PORTE=0x00;
TRISF=0xff;
PORTF=0x00;
TRISG=0xfe;
PORTG=0x00;
}
/**************************************
延时函数
**************************************/
void delay()
{
int i;
for(i=0;i<10000;i++);
}
void start()
{
SDA=1;
nop();
SCL=1;
nop();nop();nop();nop();nop();
SDA=0;
nop();nop();nop();nop();nop();
SCL=0;
nop();nop();
}
void stop()
{
SDA=0;
nop();
SCL=1;
nop();nop();nop();nop();nop();
SDA=1;
nop();nop();nop();nop();nop();
}
void init()
{
SDA=1;
delay();
SCL=1;
delay();
}
void send_ack(unsigned char ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/
unsigned char recv_ack()
{
SCL = 1; //拉高时钟线
Delay5us(); //延时
CARRY = SDA; //读应答信号
SCL = 0; //拉低时钟线
Delay5us(); //延时
return CARRY;
}
unsigned char sendbyte(unsigned char write_data)//写一字节
{
unsigned char i;
for(i=0;i<8;i++)
{
if(write_data&0x80) SDA=1;
else SDA=0;
nop();
SCL=1;
nop();nop();nop();nop();nop();
SCL=0;
nop();
write_data<<=1;
}
recv_ack(); //代码不可以取消
}
unsigned char recbyte() //读一字节
{
unsigned char i,read_data;
SDAIO=1;
SCL=0;
delay();
SDA=1;
delay();
for(i=0;i<8;i++)
{
nop();nop();nop();
SCL=1;
nop();nop();
read_data=(read_data<<1)|SDA;
nop();
SCL=0;
}
SDAIO=0; //sda转换为输出
//以下三条语句可以取消,不影响功能
SDA=1;
SCL=1;
SCL=0;
return(read_data);
}
void write_byte(unsigned char addr,unsigned char instruction,unsigned char dat)//向字节内写入数据
{
start();
sendbyte(addr);
sendbyte(instruction);
SDAIO=0; //写数据前SDA为输出状态
sendbyte(dat);
stop();
delay();
}
void main(void)
{
port_init(); //IC初始化
init();
write_byte(0x58,ERITE_RDAC0,200);
write_byte(0x58,ERITE_RDAC1,200);
write_byte(0x58,ERITE_RDAC2,200);
write_byte(0x58,ERITE_RDAC3,200);
while(1)
{
}
} |