?? wendu.c
字號:
while (i>0) i--;
}
/* 等待應答脈沖 */
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 + -