?? wendu.c
字號:
//////////////////////////////////////////////////////////////
//
// 1602子程序
//函數說明:delay(uchar d) 延時2us程序
// lcd_wrcmd(uchar cmd) 寫命令子程序
// lcd_wrdata(uchar lcddata) 寫數據子程序
// lcd_h() 建立自定義字符庫
//Version: 4.11
//說明 : 在Menu的界面支持OK鍵和快捷鍵
//Version: 4.2
// 說明 : 加入了TLC5620,當電壓大于5V時出現Warning界面
//Time : 7/10 18:30
//////////////////////////////////////////////////////////////
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define lcd_bus P1
#define key_bus P2
uchar offset=0x80;
uchar d[2]={0x30,0x30};
uchar tem1[3];
uchar tem2[4];
uchar tplsb,tpmsb;
uchar temp1,temp2;
sbit rs=P0^5;
sbit rw=P0^6;
sbit e =P0^7;
sbit DQ=P3^3;
sbit alert=P0^0;
//sbit rs=P3^2;
//sbit rw=P3^3;
//sbit e =P3^4;
//sbit beep=P3^5;
sbit load=P2^0;
sbit sclk=P2^1;
sbit sdata=P2^2;
//年月攝氏度
uchar code hanzi[]={0x80,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,
0xf,0x9,0xf,0x9,0xf,0x9,0x11,0,
0x1C,0x14,0x1C,0x0,0x0,0x0,0x00,0x00,
0x06,0x08,0x10,0x10,0x10,0x08,0x06,0x00};
uchar code table[15]={0,0x30,0,0x2e,0x37,0x38,0x39,0,0x34,0x35,0x36,0,0x31,0x32,0x33};
uchar code num[11]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar code str1[]="THE MIN SYSTEM";
uchar code str2[]="the tempreture:";
//uchar code str3[]="INPUT PHASE:";
uchar code str4[]="A: voltage"; //電壓
uchar code str5[]="B: tempreture"; //溫度
uchar code str6[]="C: input"; //標定
uchar code str7[]="D: help";
uchar code he[]="*:OK #:UP(clear)";
uchar code am[]="please input:";
//uchar code warn[]="WARNING!!VOLTAGE < 5V";
uchar state=0;
/*dac_tlc5620(uchar send_char)
{
uchar i;
load=1;
sclk=1;sdata=0;sclk=0;
sclk=1;sdata=0;sclk=0;
sclk=1;sdata=1;sclk=0;
for(i=0;i<8;i++)
{
sclk=1;
if(send_char&0x80) sdata=1;
else sdata=0;
sclk=0;
send_char=send_char<<1;
}
load=0;
load=1;
}
*/
//////////////////////////////////////////
delay(uchar d)
{
while(--d);
}
/**********判斷忙標志,返回的是一個位BF**********/
bit lcd_busy(void)
{
uchar bflag;
rs=0;
rw=1;
_nop_();
e=1;
_nop_();
lcd_bus=0xff;
bflag=lcd_bus;
e=0;
return(bit)(bflag&0x80); //BF=1 busy
}
/*********寫命令,有兩個參數,第一個是要寫的命令控制字,
第二個是用來控制是否進行忙標志的判斷。
busyflag=1:判斷;為 0:不判斷****************/
void lcd_wrcmd(uchar cmd)
{
while(lcd_busy());
lcd_bus=cmd;
rs=0;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0;
}
/************向液晶片寫數據***************/
void lcd_wrdata( uchar lcddata)
{
while(lcd_busy());
lcd_bus=lcddata;
rs=1;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0;
}
/****************初始化***************/
void lcd_ini(void)
{
lcd_wrcmd(0x38);
delay(100);
lcd_wrcmd(0x0c);
delay(100);
lcd_wrcmd(0x06);
delay(100);
lcd_wrcmd(0x01);
delay(100);
}
//////////////////////////////////////////////
//
// 生成漢字子模函數
// 當lcd_wrdata(0);顯示第一個漢字
// 當lcd_wrdata(1);顯示第二個漢字
//
//////////////////////////////////////////////
lcd_h()
{
uchar i;
lcd_wrcmd(0x40);
for(i=0;i<32;i++) lcd_wrdata(hanzi[i]);
}
/*****************讀按鍵***************/
uchar getkey()
{
uchar keycode=0xff,temp,i;
key_bus=0x0f;
temp=key_bus&0x0f;
if(temp!=0x0f) //有鍵按下
{
// beep=0;
key_bus=0x7f;
for(i=0;i<4;i++)
{
temp=key_bus&0x0f;
if(temp==0x07)
{
keycode=i*4;
break;
}
else if(temp==0x0b)
{
keycode=i*4+1;
break;
}
else if(temp==0x0d)
{
keycode=i*4+2;
break;
}
else if(temp==0x0e)
{
keycode=i*4+3;
break;
}
key_bus=(key_bus>>1)|0x80;
}
while((key_bus&0x0f)!=0x0f) //等待釋放
{
key_bus=0x0f;
}
// beep=1;
}
return keycode;
}
welcome()
{
uchar temp,i;
lcd_wrcmd(0x0c);
lcd_wrcmd(0x82);
for(i=0;i<14;i++)
lcd_wrdata(str1[i]);
lcd_h();
lcd_wrcmd(0xc4);
lcd_wrdata('2'); lcd_wrdata('0');lcd_wrdata('0');lcd_wrdata('7');
lcd_wrdata(0);
lcd_wrdata('0');lcd_wrdata('7');
lcd_wrdata(1);
while(1)
{
temp=getkey();
if(temp!=0xff) //按任意鍵跳轉
{
state=1;
lcd_wrcmd(1);
break;
}
}
}
/*phase()
{
uchar i,j,cnt=0;
lcd_wrcmd(0x0f);
lcd_wrcmd(0xc9);
lcd_wrdata(2);
lcd_wrcmd(0x83);
for(i=0;i<12;i++)lcd_wrdata(str3[i]);
lcd_wrcmd(0xc5);
while(1) //按鍵處理
{
i=getkey();
if(i<10)
{ cnt++;
if(cnt<=3)
{
lcd_wrcmd(0xc5+cnt-1);
lcd_wrdata(0x30+i);
}
else
{
cnt=0;
lcd_wrcmd(0xc5);
for(j=0;j<=3;j++)
lcd_wrdata(' ');
lcd_wrcmd(0xc5);
}
}
else if(i==10)
{
state=1;
lcd_wrcmd(0x0c);
lcd_wrcmd(1);
lcd_wrcmd(0x80);
break;
}
else if(i==11)
{
cnt=0;
lcd_wrcmd(0xc5);
for(j=0;j<=3;j++)
lcd_wrdata(' ');
lcd_wrcmd(0xc5);
}
}
}
frequency()
{
uchar i,j,cnt=0; // 假如將cnt定義成全局變量,當退出這個界面時,cnt仍然保存原來的值
lcd_wrcmd(0x80); //會出現光標亂跳的錯誤
lcd_wrcmd(0xce);
lcd_wrdata('H');
lcd_wrdata('Z');
lcd_wrcmd(0x81);
for(i=0;i<15;i++)lcd_wrdata(str2[i]);
lcd_wrcmd(0x0f);
lcd_wrcmd(0xc0);
while(1) //按鍵處理
{
i=getkey();
if(i<10)
{ cnt++;
if(cnt<=10)
{
lcd_wrcmd(0xc0+cnt-1);
lcd_wrdata(0x30+i);
}
else
{
cnt=0;
lcd_wrcmd(0xc0);
for(j=0;j<=10;j++)
lcd_wrdata(' ');
lcd_wrcmd(0xc0);
}
}
else if(i==10)
{
state=1;
lcd_wrcmd(0x0c);
lcd_wrcmd(1);
lcd_wrcmd(0x80);
break;
}
else if(i==11)
{
cnt=0;
lcd_wrcmd(0xc0);
for(j=0;j<=10;j++)
lcd_wrdata(' ');
lcd_wrcmd(0xc0);
}
}
}
warning()
{
uchar i,ii;
lcd_wrcmd(1);
lcd_wrcmd(0x0c);
lcd_wrcmd(0x83);
for(i=0;i<9;i++)
lcd_wrdata(warn[i]);
lcd_wrcmd(0xc1);
for(i=0;i<12;i++)
lcd_wrdata(warn[i+9]);
while(1)
{
ii=getkey();
if(ii!=0xff)
{
lcd_wrcmd(1);
break;
}
}
}
uchar dac_convert(uchar *amp)
{
uint v;
v=amp[2]*100+amp[1]*10+amp[0];
if(v<500)
{
v=32*v;
dac_tlc5620(v/100);
return 0;
}
else
{
return 1;
}
}
amplitude()
{
uchar i,ii;
uchar amp[3],t=0;
lcd_wrcmd(0x80);
for(i=0;i<16;i++)
lcd_wrdata(am[i]);
lcd_wrcmd(0xcc);
lcd_wrdata('V');
lcd_wrcmd(0xc8);
lcd_wrdata('.');
lcd_wrcmd(0x0f); //開光標
lcd_wrcmd(0xc7);
while(1)
{
ii=getkey();
if(ii==10)
{
if(t==4)
{
if(dac_convert(amp))
{
warning();
break;
}
}
lcd_wrcmd(0x0c);
state=1;
lcd_wrcmd(1);
break;
}
if(ii<10)
{
t++;
if(t==1)
{
lcd_wrcmd(0xc9);
}
if(t==2)t++;
if(t==1)amp[2]=ii;
else if(t==3)amp[1]=ii;
else if(t==4)amp[0]=ii;
if(t==5)
{
t=0;
lcd_wrcmd(0xc7);
lcd_wrdata(' '); lcd_wrdata('.');lcd_wrdata(' ');lcd_wrdata(' ');
lcd_wrcmd(0xc7);
}
else
{
lcd_wrcmd(0xc6+t);
lcd_wrdata(0x30+ii);
}
}
}
}
*/
///////////////////////////////////輸入函數////////////////////////////////////
/*****************************************/
/*****************************************/
/* 延時t毫秒 */
void delay2(uint t)
{
uint i;
while(t--)
{
/* 對于11.0592M時鐘,約延時1ms */
for (i=0;i<125;i++)
{}
}
}
/* 產生復位脈沖初始化DS18B20 */
void TxReset(void)
{
uint i;
DQ = 0;
/* 拉低約900us */
i = 100;
while (i>0) i--;
DQ = 1; // 產生上升沿
i = 4;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -