📄 6 wendu.c
字号:
/* 等待应答脉冲 */
void RxWait(void)
{
uint i;
while(DQ);
while(~DQ); // 检测到应答脉冲
i = 4;
while (i>0) i--;
}
/* 读取数据的一位,满足读时隙要求 */
bit RdBit(void)
{
uint i;
bit b;
DQ = 0;
i++;
DQ = 1;
i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
b = DQ;
i = 8;
while(i>0) i--;
return (b);
}
/* 读取数据的一个字节 */
uchar RdByte(void)
{
uchar i,j,b;
b = 0;
for (i=1;i<=8;i++)
{
j = RdBit();
b = (j<<7)|(b>>1);
}
return(b);
}
/* 写数据的一个字节,满足写1和写0的时隙要求 */
void WrByte(uchar b)
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp = b&0x01;
b = b>>1; // 取下一位(由低位向高位)
if (btmp)
{
/* 写1 */
DQ = 0;
i++;
i++; // 延时,使得15us以内拉高
DQ = 1;
i = 8;
while(i>0) i--; // 整个写1时隙不低于60us
}
else
{
/* 写0 */
DQ = 0;
i = 8;
while(i>0) i--; // 保持低在60us到120us之间
DQ = 1;
i++;
i++;
}
}
}
/* 启动温度转换 */
void convert(void)
{
TxReset(); // 产生复位脉冲,初始化DS18B20
RxWait(); // 等待DS18B20给出应答脉冲
delay2(1); // 延时
WrByte(0xcc); // skip rom 命令
WrByte(0x44); // convert T 命令
}
/* 读取温度值 */
void RdTemp(void)
{
TxReset(); // 产生复位脉冲,初始化DS18B20
RxWait(); // 等待DS18B20给出应答脉冲
delay2(1); // 延时
WrByte(0xcc); // skip rom 命令
WrByte(0xbe); // read scratchpad 命令
tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
tpmsb = RdByte(); // 高位值高位字节(其中高5位为符号位)
}
void cmpare(void)
{
alert=0;
if(num[tem1[1]]>d[0]) alert=1;
else if(num[tem1[1]]==d[0])
{if(num[tem1[2]]>=d[1]) alert=1;
else alert=0;
}
else alert=0;
}
tempreture()
{
uchar i,j;
lcd_wrcmd(0x80);
for(i=0;i<15;i++)
lcd_wrdata(str2[i]);
while(1)
{
delay2(1);
convert();
delay2(500);
RdTemp();
temp1=(tpmsb<<4)|(tplsb>>4);
temp2=tplsb&0x0f;
/* for(i=0;i<3;i++)
{ k=10^(2-i);
tem1[i]=temp1/k;
temp1=temp1%k;
lcd_wrcmd(0xc0+i);
lcd_wrdata(num[tem1[i]]);
}
lcd_wrdata('.');
temp2=temp2*625;
for(i=0;i<4;i++)
{ tem2[i]=temp2/(10^(3-i));
temp2=temp2%(10^(3-i));
lcd_wrcmd(0xc4+i);
lcd_wrdata(num[tem2[i]]);
}
lcd_wrdata(2);
lcd_wrdata(3);
*/
j=getkey(); //返回
if(j==0)
{ lcd_wrcmd(1);
state=1;
break;
}
tem1[0]=temp1/100;
temp1=temp1%100;
tem1[1]=temp1/10;
temp1=temp1%10;
tem1[2]=temp1;
temp2=temp2*625;
tem2[0]=temp2/1000;
temp2=temp2%1000;
tem2[1]=temp2/100;
temp2=temp2%100;
tem2[2]=temp2/10;
temp2=temp2%10;
tem2[3]=temp2;
lcd_wrcmd(0xc0); //显示当前温度
for(i=0;i<3;i++)
lcd_wrdata(num[tem1[i]]);
lcd_wrdata('.');
lcd_wrcmd(0xc4);
for(i=0;i<4;i++)
lcd_wrdata(num[tem2[i]]);
lcd_wrdata(2);
lcd_wrdata('C');
lcd_wrcmd(0xcc); //显示比较温度
for(i=0;i<2;i++)
lcd_wrdata(d[i]);
lcd_wrdata(2);
lcd_wrdata('C');
cmpare(); //比较
}
}
/*tempreture()
{ uchar i;
lcd_wrcmd(offset+0x00);
for(i=0;i<4;i++)
{
lcd_wrdata(d[i]);
}
} */
input()
{
uchar i,j,cnt=0; // 假如将cnt定义成全局变量,当退出这个界面时,cnt仍然保存原来的值
lcd_wrcmd(0x80); //会出现光标乱跳的错误
lcd_wrcmd(0xce);
lcd_wrdata(2);
lcd_wrdata('C');
lcd_wrcmd(0x81);
for(i=0;i<13;i++)lcd_wrdata(am[i]);
lcd_wrcmd(0x0f);
lcd_wrcmd(0xc0);
while(1) //按键处理
{
i=getkey();
if(i==0)
{
state=1;
lcd_wrcmd(0x0c);
lcd_wrcmd(1);
lcd_wrcmd(0x80);
break;
}
else if(i==2)
{
cnt=0;
lcd_wrcmd(0xc0);
for(j=0;j<=10;j++)
lcd_wrdata(' ');
lcd_wrcmd(0xc0);
}
else if(i<16)
{ cnt++;
if(cnt<=2)
{ lcd_wrcmd(0xc0+cnt-1);
lcd_wrdata(table[i]);
d[cnt-1]=table[i];
}
else
{
cnt=0;
lcd_wrcmd(0xc0);
for(j=0;j<=3;j++)
lcd_wrdata(' ');
lcd_wrcmd(0xc0);
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////
menu()
{
uchar i,ii,cnt=1;
lcd_wrcmd(0x83);
for(i=0;i<10;i++)
lcd_wrdata(str4[i]);
lcd_wrcmd(0xc3);
i=0;
while(str5[i]!='\0')
{
lcd_wrdata(str5[i]);
i++;
}
lcd_wrcmd(0x80);
lcd_wrdata('-');
lcd_wrdata('>');
while(1)
{
ii=getkey();
///////////////////////////翻屏///////////////////////////////
if(ii==2)
{ cnt++;
if(cnt==5) cnt=1;
if(cnt==1)
{
//////////////////////
// ->1: FREQENCY
// 2: PHASE
/////////////////////
lcd_wrcmd(1);//clear
lcd_wrcmd(0x83); //frequency
for(i=0;i<10;i++)
lcd_wrdata(str4[i]);
lcd_wrcmd(0xc3); //phase
i=0;
while(str5[i]!='\0')
{
lcd_wrdata(str5[i]);
i++;
}
lcd_wrcmd(0x80);
lcd_wrdata('-');
lcd_wrdata('>');
}
else if(cnt==2)
{
//////////////////////
// 1: FREQENCY
// ->2: PHASE
/////////////////////
lcd_wrcmd(1);//clear
lcd_wrcmd(0x83); //frequency
for(i=0;i<10;i++)
lcd_wrdata(str4[i]);
lcd_wrcmd(0xc3); //phase
i=0;
while(str5[i]!='\0')
{
lcd_wrdata(str5[i]);
i++;
}
lcd_wrcmd(0xc0);
lcd_wrdata('-');
lcd_wrdata('>');
}
else if(cnt==3)
{
//////////////////////
// 2: PHASE
// -> 3: Amplitude
/////////////////////
lcd_wrcmd(1);
lcd_wrcmd(0xc3); //Amplitude
for(i=0;i<8;i++)
lcd_wrdata(str6[i]);
lcd_wrcmd(0x83);
i=0;
while(str5[i]!='\0') //phase
{
lcd_wrdata(str5[i]);
i++;
}
lcd_wrcmd(0xc0);
lcd_wrdata('-');
lcd_wrdata('>');
}
else if(cnt==4)
{
//////////////////////
// 3: Amplitude
// -> 4: HELP
/////////////////////
lcd_wrcmd(1);
lcd_wrcmd(0x83); //setting
for(i=0;i<8;i++)
lcd_wrdata(str6[i]);
lcd_wrcmd(0xc3);
for(i=0;i<7;i++)
lcd_wrdata(str7[i]); //help
lcd_wrcmd(0xc0);
lcd_wrdata('-');
lcd_wrdata('>');
}
}
/////////////////////////OK进入///////////////////////////////////////
else if(ii==0)
{
if(cnt==1)
{
state=2;
lcd_wrcmd(1);
break;
}
else if(cnt==2)
{
state=3;
lcd_wrcmd(1);
break;
}
else if(cnt==3)
{
state=4;
lcd_wrcmd(1);
break;
}
else if(cnt==4) //help
{
state=5;
lcd_wrcmd(1);
break;
}
}
////////////////////////快捷键///////////////////////////////////////////
else if(ii==15)
{
state=2;
lcd_wrcmd(1);
break;
}
else if(ii==11)
{
state=3;
lcd_wrcmd(1);
break;
}
else if(ii==7)
{
state=4;
lcd_wrcmd(1);
break;
}
else if(ii==3)
{
state=5;
lcd_wrcmd(1);
break;
}
}
}
help()
{
uchar i,ii;
lcd_wrcmd(0x80);
for(i=0;i<16;i++)
{
lcd_wrdata(he[i]);
}
while(1)
{
ii=getkey();
if(ii!=0xff)
{
lcd_wrcmd(1);
state=1;
break;
}
}
}
main()
{
lcd_bus=0xff;
lcd_ini();
while(1)
{
if(state==0)welcome();
else if(state==1)menu();
else if(state==2)voltage();
else if(state==3)tempreture();
else if(state==4)input();
else if(state==5)help();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -