📄 testad.c
字号:
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;
sbit rw=P1^1;
sbit en=P1^2;
sbit SDA=P3^7;
sbit SCL=P3^6;
bit bdata IIC_ERROR;
uchar code a[]="AD=0.00V";
uchar Recv_Buffer[4];//数据接收缓冲
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delayus(uint k)
{
for(;k>0;k--);
}
void write_com(uchar command)//写指令子函数
{
rs=0;
rw=0;
P2=command;
delayms(1);
en=1;
delayms(3);
en=0;
}
void write_data(uchar date)//写数据子函数
{
rs=1;
rw=0;
P2=date;
delayms(1);
en=1;
delayms(3);
en=0;
}
void init()
{
en=0;
rw=0;
write_com(0x38);
write_com(0x01);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
}
void display(uchar aa,uint da)
{
write_com(0x80+aa);
write_data(da%10000/1000+0x30);
write_data(a[4]);
write_data(da%1000/100+0x30);
write_data(da%100/10+0x30);
}
void I2C_write(unsigned char tmp)//I2C写入一个8位二进制数,高位在前低位在后
{
unsigned char i;
for(i=0;i<8;i++){
SCL=0;
_nop_();
_nop_();
_nop_();
SDA=(bit)(tmp&0x80);
tmp<<=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
SCL=0;
}
unsigned char I2C_read(void)////I2C读取一个8位二进制数,也是高位在前低位在后
{
unsigned char i,tmp;
tmp=0;
for(i=0;i<8;i++){
SCL=0;
_nop_();
_nop_();
_nop_(); //加入空指令增加稳定性,这关系到频率问题
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
tmp<<=1;
if(SDA==1)
tmp++;
}
SCL=0;
return tmp;
}
/*void I2C_ACK(bit tmp) //根据tmp的1、0来决定应答信号
{
SDA=tmp;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
} */
void respons()//应答信号
{
uchar i=0;
SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();
while((SDA==1)&&(i<255)) i++;
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
void I2C_start(void) //看看I2C开始的波形,再对应SDA、SCL的输出
{
SDA=1;
_nop_();
SCL=1;
_nop_();
SDA=0;
_nop_();
SCL=0;
_nop_();
}
/*********/
void I2C_stop(void) //I2C结束
{
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1;
_nop_();
SCL=0;
_nop_();
}
uchar read_ad()
{
uchar dat;
I2C_start();
I2C_write(0x90);
respons();
I2C_write(0x00);
respons();
I2C_start();
I2C_write(0x91);
respons();
dat=I2C_read();
//I2C_ACK(1);
respons();
I2C_stop();
return dat;
}
void write(uchar d)
{
I2C_start();
I2C_write(0x90);
//I2C_ACK(0);
respons();
I2C_write(0x40);
//I2C_ACK(0);
respons();
I2C_write(d);
//I2C_ACK(0);
respons();
I2C_stop();
delayms(5);
}
void main()
{ uchar i,datt;
float d;
uint dattt;
init();
for(i=0;a[i]!='\0';i++)
{
write_data(a[i]);
delayus(600);
}
while(1)
{
for(i=255;i>0;i--)
{write(i);
datt=read_ad();
d=(float)datt*16.875;
//d=(float)datt*19.537;
dattt=(uint)d;
display(3,dattt);
delayms(100);
delayms(400);}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -