?? 智能桑拿浴干蒸顯示控制器源程序.txt
字號:
程序代碼
//液晶顯示桑拿控制源程序
#include <REGX51.H> //器件配置文件
#include <intrins.h>
sbit LCM_RS=P3^3; //引腳定義
sbit LCM_RW=P2^6; //引腳定義
#include <REGX51.H>
sbit LCM_EN=P3^5; //引腳定義
sbit JROUT=P3^6; //控制加熱繼電器
sbit LAMPOUT=P3^7; //控制照明燈繼電器
sbit TSOR=P2^7; //溫度測試端
#define Busy 0x80 //常量定義
#define uchar unsigned char
#define uint unsigned int
#define DATAPORT P0
#define reset() {WDT=0x1e;WDT=0xe1;}//看門狗啟動/復(fù)位宏定義
sfr WDT=0xa6;//看門狗寄存器定義
bit ON_OFF;
bit JROUTflag;
bit Lampon_off;
bit nf;
//==============================================
uchar temp0,temp1;
uchar cnt;
uchar xx;
uchar deda,sec; //時間變量
char min,hour, Dshour, Dsmin;
char set,T;
uchar data buff[10];
uchar ReadStatusLCM(void);//讀數(shù)據(jù)到MCU子函數(shù)聲明
uchar code str0[]={"--- : : --- "};//待顯字符串
uchar code str1[]={"SET: C SA: . C"};
uchar code str2[]={"WELCOME "};//待顯字符串
uchar code str3[]={"HEALTHY BODY "};//待顯字符串
//====================函數(shù)聲明=======================
void fun0(void);
void fun1(void);
void fun2(void);
void fun3(void);
void fun4(void);
void fun5(void);
void set_adj(void);
void key(void);
void gettempTS(void);
void initTS(void);
uchar readBTS(void);
void writeBTS(uchar byte);
void resetTS(void);
bit readTS(void);
void write1TS(void);
void write0TS(void);
void delay15us(void);
void delay60us(void);
//********延時K*1mS,12.000MHz*********
void delay(uint k)//函數(shù)名為delay的延時子函數(shù)。定義k為無符號整型變量
{ //delay函數(shù)開始
uint i,j; //定義i、j為無符號整型變量
for(i=0;i<k;i++)
{ //for循環(huán)語句開始
for(j=0;j<60;j++) // for循環(huán)語句開始
{;}
reset()} //兩個for循環(huán)體
} //delay函數(shù)結(jié)束
/*-----------------------------寫指令到LCM子函數(shù)-------------------------------*/
void WriteCommandLCM(uchar WCLCM, uchar BusyC) /*函數(shù)名為WriteCommandLCM 的寫指令到LCM子函數(shù)。定義WCLCM、BusyC 為無符號字符型變量*/
{ //WriteCommandLCM函數(shù)開始
if(BusyC)ReadStatusLCM(); /*若BusyC為"1",則調(diào)用ReadStatusLCM子函數(shù)進(jìn)行忙檢測*/
DATAPORT=WCLCM; //將變量WCLCM中的指令傳送至P0口
LCM_RS=0; //選中指令寄存器
LCM_RW=0; //寫模式
LCM_EN=0; //置LCM_EN端為低電平
LCM_EN=0; //置LCM_EN端為低電平,延時一會兒
LCM_EN=1; //置LCM_EN端為高電平,寫入使能
} // WriteCommandLCM函數(shù)結(jié)束
/*----------------------------寫數(shù)據(jù)到LCM子函數(shù)-------------------------------*/
void WriteDataLCM(uchar WDLCM) /*函數(shù)名為WriteDataLCM 的寫數(shù)據(jù)到LCM子函數(shù)。定義WDLCM 為無符號字符型變量*/
{ // WriteDataLCM函數(shù)開始
ReadStatusLCM(); //調(diào)用ReadStatusLCM子函數(shù)檢測忙信號
DATAPORT=WDLCM; //將變量WDLCM中數(shù)據(jù)傳送至P0口
LCM_RS=1; //選中數(shù)據(jù)寄存器
LCM_RW=0; //寫模式
LCM_EN=0; //置LCM_EN端為低電平
LCM_EN=0; //置LCM_EN端為低電平,延時一會兒
LCM_EN=1; //置LCM_EN端為高電平,寫入使能
} // WriteDataLCM函數(shù)結(jié)束
/*--------------------------------讀數(shù)據(jù)到MCU子函數(shù)---------------------------*/
/*uchar ReadDataLCM(void) //函數(shù)名為ReadDataLCM的讀數(shù)據(jù)到MCU子函數(shù)
{ // ReadDataLCM函數(shù)開始
LCM_RS=1; //選中數(shù)據(jù)寄存器
LCM_RW=1; //讀模式
LCM_EN=0; //置LCM_EN端為低電平
LCM_EN=0; //置LCM_EN端為低電平,延時一會兒
LCM_EN=1; //置LCM_EN端為高電平,讀使能
return(DATAPORT); //返回P0口的內(nèi)容
}*/ // ReadDataLCM函數(shù)結(jié)束
/*--------------------------------讀狀態(tài)到MCU子函數(shù)-----------------------------*/
uchar ReadStatusLCM(void) //函數(shù)名為ReadStatusLCM的讀狀態(tài)到MCU子函數(shù)
{ //ReadStatusLCM函數(shù)開始
DATAPORT=0xFF; //置P0口為全1
LCM_RS=0; //選中指令寄存器
LCM_RW=1; //讀模式
LCM_EN=0; //置LCM_EN端為低電平
LCM_EN=0; //置LCM_EN端為低電平,延時一會兒
LCM_EN=1; //置LCM_EN端為高電平,讀使能
while(P0&Busy); /*檢測忙信號。當(dāng)P0口內(nèi)容與Busy(80H)相與后不為零時,程序原地踏步*/
return(DATAPORT); //返回P0口的內(nèi)容
} // ReadStatusLCM函數(shù)結(jié)束
/*--------------------------LCM初始化子函數(shù)----------------------------*/
void InitLcd() //函數(shù)名為InitLcd 的LCM初始化子函數(shù)
{ // InitLcd函數(shù)開始
WriteCommandLCM(0x38,1);//8位數(shù)據(jù)傳送,2行顯示,5*7字形,檢測忙信號
WriteCommandLCM(0x08,1);//關(guān)閉顯示,檢測忙信號
WriteCommandLCM(0x01,1);//清屏,檢測忙信號
WriteCommandLCM(0x06,1);//顯示光標(biāo)右移設(shè)置,檢測忙信號
WriteCommandLCM(0x0c,1);//顯示屏打開,光標(biāo)不顯示、不閃爍,檢測忙信號
} // InitLcd函數(shù)結(jié)束
/*-------------------顯示指定坐標(biāo)的一個字符子函數(shù)---------------------------*/
/*顯示指定坐標(biāo)的一個字符(X=0~15,Y=0~1)子函數(shù),函數(shù)名為DisplayOneChar,定義X、Y、DData為無符號字符型變量*/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{ // DisplayOneChar 函數(shù)開始
Y&=0X01; //Y的變化范圍0~1
X&=0X0F; // X的變化范圍0~15
if(Y)X|=0x40; //若Y為1(顯示第二行),地址碼+0x40
X|=0x80; //指令碼為地址碼+0x80
WriteCommandLCM(X,0); //將指令X寫入LCM,忽略忙信號檢測
WriteDataLCM(DData); //再將數(shù)據(jù)Ddata寫入LCM
} // DisplayOneChar 函數(shù)結(jié)束
/*--------------------顯示指定坐標(biāo)的一串字符子函數(shù)----------------------*/
/*顯示指定坐標(biāo)的一串字符(X=0~15,Y=0~1)子函數(shù),函數(shù)名為DisplayListChar ,定義X、Y為無符號字符型變量,DData 為指向code區(qū)的無符號字符型指針變量*/
void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{ // DisplayListChar 函數(shù)開始
uchar ListLength=0; //定義ListLength 為無符號字符型變量,并賦初值為0
Y&=0x1; // Y的變化范圍0~1
X&=0xF; // X的變化范圍0~15
while(X<=15) //X<=15時進(jìn)入while語句循環(huán)
{ //while語句開始
DisplayOneChar(X,Y,DData[ListLength]);//顯示單個字符
ListLength++; //數(shù)組指針遞增
X++; //X軸坐標(biāo)遞增
} //while語句結(jié)束
} //DisplayListChar 函數(shù)結(jié)束
//=================================================
void init_timer0(void) //定時器T0初始化
{
TMOD=0x01;
TH0=-(50235/256);
TL0=-(50235%256);
TR0=1;
ET0=1;EA=1;
}
//==================================================
void time_zd0(void) interrupt 1 using 1 //定時器T0中斷子函數(shù)
{
TH0=-(50235/256);
TL0=-(50235%256);
deda++;cnt++;
if(deda>=20){sec++;deda=0;}
if(sec>=60){min++;sec=0;}
if(min>=60){hour++;min=0;}
if(hour>=24){hour=0;}
if(cnt>=6)cnt=0;
key(); //掃描鍵盤
}
//==================================
void fun0(void) //液晶顯示子函數(shù)0
{
WriteCommandLCM(0x0c,1);//顯示屏打開,光標(biāo)不顯示、不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//===============================
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
//=========================
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
//==============================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp0/10+0x30);
DisplayOneChar(12,1,temp0%10+0x30);
DisplayOneChar(14,1,temp1+0x30);
//================================
if(ON_OFF==0)
{
DisplayOneChar(14,0,0x4f);
DisplayOneChar(15,0,0x46);
}
else
{
DisplayOneChar(14,0,0x4f);
DisplayOneChar(15,0,0x4e);
if(JROUTflag==1)DisplayOneChar(0,0,0x7c);
else DisplayOneChar(0,0,0xef);
}
//============================
}
/*******************************************/
void fun1(void) //液晶顯示子函數(shù)1
{
WriteCommandLCM(0x0c,1);//顯示屏打開,光標(biāo)不顯示、不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//=========================
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
//==============================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp0/10+0x30);
DisplayOneChar(12,1,temp0%10+0x30);
DisplayOneChar(14,1,temp1+0x30);
//=================================
WriteCommandLCM(0x0f,1);//顯示屏打開,光標(biāo)顯示、閃爍,檢測忙信號
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
}
/********************************************/
void fun2(void) //液晶顯示子函數(shù)2
{
WriteCommandLCM(0x0c,1);//顯示屏打開,光標(biāo)不顯示、不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//=========================
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
//=================================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp0/10+0x30);
DisplayOneChar(12,1,temp0%10+0x30);
DisplayOneChar(14,1,temp1+0x30);
//===================================
WriteCommandLCM(0x0f,1);//顯示屏打開,光標(biāo)顯示、閃爍,檢測忙信號
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
}
/***************************************/
void fun3(void) //液晶顯示子函數(shù)3
{
WriteCommandLCM(0x0c,1);//顯示屏打開,光標(biāo)不顯示、不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//=========================
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
//===============================
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
//=================================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(11,1,temp0/10+0x30);
DisplayOneChar(12,1,temp0%10+0x30);
DisplayOneChar(14,1,temp1+0x30);
//=================================
WriteCommandLCM(0x0f,1);//顯示屏打開,光標(biāo)顯示、閃爍,檢測忙信號
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
}
/***************************************/
void fun4(void) //液晶顯示子函數(shù)4
{
WriteCommandLCM(0x0c,1);//顯示屏打開,光標(biāo)不顯示、不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//=========================
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
//==============================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp0/10+0x30);
DisplayOneChar(12,1,temp0%10+0x30);
DisplayOneChar(14,1,temp1+0x30);
//=================================
WriteCommandLCM(0x0f,1);//顯示屏打開,光標(biāo)顯示、閃爍,檢測忙信號
DisplayOneChar(3,0,Dshour/10+0x30);
DisplayOneChar(4,0,Dshour%10+0x30);
}
/***************************************/
void fun5(void) //液晶顯示子函數(shù)5
{
WriteCommandLCM(0x0c,1);//顯示屏打開,光標(biāo)不顯示、不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//=========================
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
//=================================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp0/10+0x30);
DisplayOneChar(12,1,temp0%10+0x30);
DisplayOneChar(14,1,temp1+0x30);
//===================================
WriteCommandLCM(0x0f,1);//顯示屏打開,光標(biāo)顯示、閃爍,檢測忙信號
DisplayOneChar(6,0,Dsmin/10+0x30);
DisplayOneChar(7,0,Dsmin%10+0x30);
}
/************************************/
void key(void) //掃描鍵盤
{
P1=0xff;
if(P1!=0xff)
{delay(10);
if(P1!=0xff)
{xx=P1;
if(xx==0xfe) {set_adj(); }
if(xx==0xf7){ON_OFF=!ON_OFF; } //照明燈開關(guān)
}
}
}
/************************************/
void set_adj(void) //設(shè)定工作模式子函數(shù)
{
if(cnt==5)
{set++; if(set>=9)set=0; }
if(cnt==5)
{
switch(set)
{
case 1: if(nf==1){nf =0;};
if(nf==0){nf =1;}; break;
case 2: if(xx==0xfd) {hour++;if(hour>=23)hour=23; }; delay(50);break;
if(xx==0xfb){ hour--;if(hour<=0)hour=0;} ; delay(50);break;
case 3: if(xx==0xfd){min++;if(min>=59)min=59;}; delay(50);break;
if(xx==0xfb){ min--;if(min<=0)min=0; }; delay(50);break;
case 4: if(xx==0xfd){T++;if(T>=200)T=200;}; delay(50);break;
if(xx==0xfb){ T--;if(T<=1)T=1; } ; delay(50);break;
case 5: if(xx==0xfd){Dshour++;if(Dshour>=23)Dshour=23;};delay(50); break;
if(xx==0xfb){Dshour --;if(Dshour <=0) Dshour =0; }; delay(50); break;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -