📄 shtxx_self.c
字号:
rs = 0;
rw = 1;
// e = 1;
delay(10);
dat = P0;
// delay(10);
// e = 0;
return(dat&0x7f);
}
void lcd_dis_num(uint dat)
{
uint a=0;
dat =dat%10000;
a =dat/1000;
lcd_wrd(0x30+a);
dat =dat%1000;
a =dat/100;
lcd_wrd(0x30+a);
dat =dat%100;
a=dat/10;
lcd_wrd(0x30+a);
dat =dat%10;
lcd_wrd(0x30+dat);
}
void lcd_dis_num_1(uint dat)
{
dat = dat%10;
lcd_wrd(0x30+dat);
}
void lcd_dis_num_2(uint dat)
{
uint a=0;
dat =dat%100;
a=dat/10;
lcd_wrd(0x30+a);
dat =dat%10;
lcd_wrd(0x30+dat);
}
void lcd_dis_num_3(uint dat)
{
uint a=0;
dat =dat%1000;
a =dat/100;
lcd_wrd(0x30+a);
dat =dat%100;
a=dat/10;
lcd_wrd(0x30+a);
dat =dat%10;
lcd_wrd(0x30+dat);
}
void lcd_dis_num_4(uint dat)
{
uint a=0;
dat =dat%10000;
a =dat/1000;
lcd_wrd(0x30+a);
dat =dat%1000;
a =dat/100;
lcd_wrd(0x30+a);
dat =dat%100;
a=dat/10;
lcd_wrd(0x30+a);
dat =dat%10;
lcd_wrd(0x30+dat);
}
void lcd_dis_num_bit(uint dat,uchar bits)
{
uint a=0;
// uint b=pow(10,bits);
int b=pow(10,3);
float c=pow((float)10,(float)bits);
// int c = pow(10,2);
b = (uint)c;
lcd_dis_num(b);
dat =dat%10000;
dat =dat%b;
b = b/10;
lcd_dis_num(b);
for(;b>5;b=b/10)
{
// b = b/10;
a = dat/b;
lcd_wrd(0x30+a);
dat = dat%b;
}
lcd_wrd(0x30+dat);
/* a =dat/1000;
lcd_wrd(0x30+a);
dat =dat%1000;
a =dat/100;
lcd_wrd(0x30+a);
dat =dat%100;
a=dat/10;
lcd_wrd(0x30+a);
dat =dat%10;
lcd_wrd(0x30+dat);
*/
}
void lcd_dis_ch(uchar h,uchar l)
{
lcd_wrd(h);
lcd_wrd(l);
}
void lcd_add(uchar h,uchar l) //定位地址
{
l--;
switch(h)
{
case 1:
{
lcd_wrc(0x80+l);
break;
}
case 2:
{
lcd_wrc(0x90+l);
break;
}
case 3:
{
lcd_wrc(0x88+l);
break;
}
case 4:
{
lcd_wrc(0x98+l);
break;
}
}
}
unsigned char key_data() //判断键值
{
uchar a=0,b=0,c=0,d=0,i=0;
a = 0xef;
for(i = 0;i<4;i++) //读行
{
P1 = a;
delay(10);
b = P1;
b = b&0x0f;
// b = b>>4;
if(b!=0x0F) //表示有键按下
{
delay(50); //软件延时 确认有键按下
b = P1&0X0F;
// b = b>>4;
if(b != 0x0F)
{
// return b;
c=b;
if(c==0X07)
{
d=i*4+3;
}
else if(c==0X0B)
{
d=i*4+2;
}
else if(c==0X0D)
{
d=i*4+1;
}
else if(c==0X0E)
{
d=i*4;
}
break;
}
}
else
{
a = a<<1;
a = a+0x01;
if(a==0xFF)
{
// return 0x0f;
d = 0x0f+1;
break;
}
}
}
return d;
}
void Start_I2c() //起动总线函数
{
SDA=1; //发送起始条件的数据信号
_Nop();
SCL=1;
_Nop(); //起始条件建立时间大于4.7us,延时
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; //发送起始信号
_Nop(); // 起始条件锁定时间大于4
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; //钳住I2C总线,准备发送或接收数据
_Nop();
_Nop();
}
void Stop_I2c() //结束总线函数
{
SDA=0; /*发送结束条件的数据信号*/
_Nop(); /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; /*发送I2C总线结束信号*/
_Nop();
_Nop();
_Nop();
_Nop();
}
void SendByte(uchar c) //字节数据传送函数send
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
{
if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
else SDA=0;
_Nop();
SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
_Nop();
_Nop(); /*保证时钟高电平周期大于4*/
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; /*判断是否接收到应答信号*/
SCL=0;
_Nop();
_Nop();
}
uchar RcvByte() //字节数据传送函数 receive
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1; /*置数据线为输入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; /*置时钟线为低,准备接收数据位*/
_Nop();
_Nop(); /*时钟低电平周期大于4.7μs*/
_Nop();
_Nop();
_Nop();
SCL=1; /*置时钟线为高使数据线上数据有效*/
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}
void Ack_I2c(bit a) //主控器进行应答信号
{
if(a==0)SDA=0; /*在此发出应答或非应答信号 */
else SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); //时钟低电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
_Nop();
_Nop();
}
//bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) //向有子地址器件发送多字节数据函数
//子地址为8位的数据传送
bit ISendStr_8(uchar add,uchar son_add,uchar dat) //向子地址为8位的器件发送多字节数据函数
{
Start_I2c(); /*启动总线*/
SendByte(add); /*发送器件地址*/
if(ack==0)return(0);
SendByte(son_add); /*发送器件子地址*/
if(ack==0)return(0);
SendByte(dat); /*发送数据*/
if(ack==0)return(0);
Stop_I2c(); /*结束总线*/
return(1);
}
//子地址为16位的数据传送
bit ISendStr_16(uchar add,uint son_add,uchar dat) //向子地址为16位的器件发送多字节数据函数
{
Start_I2c(); /*启动总线*/
SendByte(add); /*发送器件地址*/
if(ack==0)return(0);
SendByte(son_add/256); /*发送器件子地址*/
if(ack==0)return(0);
SendByte(son_add%256); /*发送器件子地址*/
if(ack==0)return(0);
SendByte(dat); /*发送数据*/
if(ack==0)return(0);
Stop_I2c(); /*结束总线*/
return(1);
}
//bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) //向有子地址器件读取多字节数据函数
//子地址为8位的数据传送
uchar IRcvStr_8(uchar add,uchar son_add) //向子地址为8位的器件读取多字节数据函数
{
uchar i;
Start_I2c(); /*启动总线*/
SendByte(add); /*发送器件地址*/
SendByte(son_add); /*发送器件子地址2*/
Start_I2c();
SendByte(add+0x01);
i=RcvByte();
Ack_I2c(1); /*发送非应位*/
Stop_I2c(); /*结束总线*/
return (i);
}
//子地址为16位的数据传送
uchar IRcvStr_16(uchar add,uint son_add) //向子地址为16位的器件读取多字节数据函数
{
uchar i;
Start_I2c(); /*启动总线*/
SendByte(add); /*发送器件地址*/
SendByte(son_add/256); /*发送器件子地址1*/
SendByte(son_add%256); /*发送器件子地址2*/
Start_I2c();
SendByte(add+0x01);
i=RcvByte();
Ack_I2c(1); /*发送非应位*/
Stop_I2c(); /*结束总线*/
return (i);
}
//----------------------------------------------------------------------------------
char s_write_byte(unsigned char value)
//----------------------------------------------------------------------------------
// writes a byte on the Sensibus and checks the acknowledge
{
unsigned char i,error=0;
for (i=0x80;i>0;i/=2) //shift bit for masking
{ if (i & value) DATA=1; //masking value with i , write to SENSI-BUS
else DATA=0;
SCK=1; //clk for SENSI-BUS
_nop_();_nop_();_nop_(); //pulswith approx. 5 us
SCK=0;
}
DATA=1; //release DATA-line
SCK=1; //clk #9 for ack
error=DATA; //check ack (DATA will be pulled down by SHT11)
SCK=0;
return error; //error=1 in case of no acknowledge
}
//----------------------------------------------------------------------------------
char s_read_byte(unsigned char ack)
//----------------------------------------------------------------------------------
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
{
unsigned char i,val=0;
DATA=1; //release DATA-line
for (i=0x80;i>0;i/=2) //shift bit for masking
{ SCK=1; //clk for SENSI-BUS
if (DATA) val=(val | i); //read bit
SCK=0;
}
DATA=!ack; //in case of "ack==1" pull down DATA-Line
SCK=1; //clk #9 for ack
_nop_();_nop_();_nop_(); //pulswith approx. 5 us
SCK=0;
DATA=1; //release DATA-line
return val;
}
//----------------------------------------------------------------------------------
void s_transstart(void)
//----------------------------------------------------------------------------------
// generates a transmission start
// _____ ________
// DATA: |_______|
// ___ ___
// SCK : ___| |___| |______
{
DATA=1; SCK=0; //Initial state
_nop_();
SCK=1;
_nop_();
DATA=0;
_nop_();
SCK=0;
_nop_();_nop_();_nop_();
SCK=1;
_nop_();
DATA=1;
_nop_();
SCK=0;
}
//----------------------------------------------------------------------------------
void s_connectionreset(void)
//----------------------------------------------------------------------------------
// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
// _____________________________________________________ ________
// DATA: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
{
unsigned char i;
DATA=1; SCK=0; //Initial state
for(i=0;i<9;i++) //9 SCK cycles
{ SCK=1;
SCK=0;
}
s_transstart(); //transmission start
}
//----------------------------------------------------------------------------------
char s_softreset(void)
//----------------------------------------------------------------------------------
// resets the sensor by a softreset
{
unsigned char error=0;
s_connectionreset(); //reset communication
error+=s_write_byte(RESET); //send RESET-command to sensor
return error; //error=1 in case of no response form the sensor
}
//----------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -