亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lcd_main.c

?? LCD顯示溫控器制作成功 參考了明浩的溫度控制器V1.5和使用1602液晶顯示和PS/2鍵盤的示例
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*----------------------------------------------------------------
                
					***LCD顯示溫控器***  2004-8-12

參考資料:《溫度控制器V1.5》、《使用1602液晶顯示和PS/2鍵盤的示例》

本軟件僅供學習與參考,引用時請注明版權
本程序源碼只供學習參考,不得應用于商業用途,如有需要請聯系作者。
http://www.cdle.net
明浩 2004/1/2
pnzwzw@cdle.net
----------------------------------------------------------------*/



#include <REGX51.H>
#include <string.h>
#include <intrins.h>

#define LCM_RW P2_0 //定義引腳
#define LCM_RS P2_1
#define LCM_E P2_2
#define LCM_Data P1
#define Busy 0x80 //用于檢測LCM狀態字中的Busy標識

#define Key_UP            P2_3    //上調溫度
#define Key_DOWN          P2_5    //下調溫度
#define Key_SET           P2_4    //設定鍵(溫度設定,長按開電源)
#define RelayOutPort      P2_6    //繼電器輸出
#define TMPort			  P2_7	  //DS1820 DataPort

unsigned char code LCDDis[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20,0x2d}; //0-9的ASCII碼,0x20為空,0x2d為負號

unsigned char i;

static unsigned char bdata StateREG;	//可位尋址的狀態寄存器
sbit DS1820ON = StateREG^0;	          //DS1820是否存在
sbit SetTF = StateREG^1;              //是否是在溫度設置狀態
sbit KeySETDown = StateREG^2;         //是否已按過SET鍵標識
sbit PowTF = StateREG^3;              //電源標識
sbit KeyTF = StateREG^4;		    //鍵盤是否允許

//sbit KeySETDowning = StateREG^5;			//SET是否正在按下
static unsigned char bdata TLV _at_ 0x0029;         //溫度變量高低位
static unsigned char bdata THV _at_ 0x0028;
static signed char TMV;       //轉換后的溫度值
static unsigned char KeyV,TempKeyV;      //鍵值
static signed char TMRomV _at_ 0x0027;    //高溫限制
static signed char TMSetV _at_ 0x0026;    //溫度設定值
static unsigned char KSDNum;    //SET鍵連按時的采集次數
static unsigned char IntNum,IntNum2,IntNum3;    //中斷發生次數,IntNum用于SET長按檢測,IntNum2用于設定狀態時LCD閃爍
static signed char LCD_One,LCD_Two,LCD_Three;  //LCD的顯示位 LCD_One為十位,LCD_Two為個位
static signed char LCD_One_set,LCD_Two_set,LCD_Three_set;	//設置時的LCD值
static unsigned char Sign, Sign_Set; //負號標識

void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);

unsigned char code cdle_net[] = {"    WellCome!   "};
unsigned char code email[] = {" Press Power Key"};
unsigned char cur_temper[]={"Current Temp:   "};
unsigned char cur_temper_set[]={"T_Set:          "};
unsigned char BF = 0;	//定時中斷標志,=1時顯示當前溫度值,=0顯示歡迎

void main(void)
{
	void InitDS1820(void);   //定義函數
	void ROMDS1820(void);
	void TMVDS1820(void);
	void TMRDS1820(void);
	void TMWDS1820(void);
	void TMREDS1820(void);
	void TMERDS1820(void);
	void ReadDS1820(void);
	void WriteDS1820(void);
	void Delay_510(void);
	void Delay_110(void);
	void Delay_10ms(void);
	void Delay_4s(void);
	void V2ToV(void);

	StateREG = 0;   //初始化變量
	//SetTF = 1;	
	PowTF = 1;			//關電源
	//KeyTF = 1;
	THV = 0;
	TLV = 0;
	TMV = 0;
	KeyV = 0;
	TempKeyV = 0;
	KSDNum = 0;
	IntNum = 0;
	IntNum2 = 0;
	IntNum3 = 0;


	
	InitDS1820(); //初始化
	ROMDS1820(); 	//跳過ROM
	TMERDS1820();  //E2PRAM中溫度上限值調入RAM
	InitDS1820(); //初始化
	ROMDS1820(); 	//跳過ROM
	TMRDS1820(); 	//讀出溫度指令
	ReadDS1820(); //讀出溫度值和上限值
	TMSetV = TMRomV;  //拷貝保存在DS18B20ROM里的上限值到TMSetV

	Delay400Ms(); //啟動等待,等LCM講入工作狀態
	LCMInit(); //LCM初始化
	Delay5Ms(); //延時片刻(可不要)

	EA = 1;					//允許CPU中斷
	ET0 = 1; 				//定時器0中斷打開
	TMOD = 0x1;			//設定時器0為模式1,16位模式
	TH0=0xB1;
	TL0=0xDF;				//設定時值為20000us(20ms)
	TR0 = 1;				//開始定時

	do
		{
			if (BF==0)
				{
					DisplayListChar(0, 0, cdle_net);	//顯示歡迎信息
					DisplayListChar(0, 1, email);
					Delay_4s();
					//PowTF = 1;
					EA=1;
				}
			if (BF==1)
				{
					for (i=0;i<16;i++)
						{
							DisplayOneChar(i,0,cur_temper[i]);//LCD的第1行顯示當前溫度
						}
					for (i=0;i<16;i++)
						{
							DisplayOneChar(i,1,cur_temper_set[i]);//LCD的第二行顯示設置溫度和繼電器狀態
						}
					//ReadDataLCM();//測試用句無意義	
					EA=1;
				}
		}
	while(1);
}

//定時器0中斷外理中鍵掃描和處理要顯示的值
void KeyAndDis_Time0(void) interrupt 1 using 2
{
	TH0=0xB1;
	TL0=0xDF;				//設定時值為20000us(20ms)

	if (!Key_UP)	KeyV = 1;
	if (!Key_DOWN)	KeyV = 2;
	if (!Key_SET)	KeyV = 3;
	//KeySETDowning = 0;  //清除
	if (KeyV != 0)      //有鍵按下
		{
			Delay_10ms();   //延時防抖  按下10ms再測
			if (!Key_UP)	TempKeyV = 1;
			if (!Key_DOWN)	TempKeyV = 2;
			if (!Key_SET)	TempKeyV = 3;

			if (KeyV == TempKeyV)   //兩次值相等為確定接下了鍵
				{
					if (KeyV == 3)      //按下SET鍵,如在SET狀態就退出,否則進入
						{
							//KeySETDowning = 1; //表明SET正在按下
							PowTF = 0;      //電源標識開
							if (!KeyTF)		//KeyTF=0,鍵盤允許
								if (SetTF)
									{
										SetTF = 0;    //標識位標識退出設定
										InitDS1820(); //初始化
										ROMDS1820(); 	//跳過ROM
										TMWDS1820(); 	//寫溫度上限指令
										WriteDS1820(); 	//寫溫度上限到DS18B20ROM
										WriteDS1820(); 	//寫溫度上限到DS18B20ROM
										WriteDS1820(); 	//寫溫度上限到DS18B20ROM
										InitDS1820(); //初始化
										ROMDS1820(); 	//跳過ROM
										TMREDS1820(); 	//溫度上限值COPY回E2PRAM
										//	V2ToV();
									}
								else
									SetTF = 1;
							if (!KeySETDown) //沒有第一次按下SET時,KeySETDown標識置1
								KeySETDown = 1;
							else
								KSDNum = KSDNum + 1;  //前一秒內有按過SET則開始計數
						}
					if (SetTF==1)  //在SET狀態下
						{
							cur_temper_set[9]=0x3d;		//"="	顯示set標志
							cur_temper_set[10]=0x73;	//"s"
							cur_temper_set[11]=0x65;	//"e"
							cur_temper_set[12]=0x74;	//"t"
							if ((KeyV == 1) && (!KeyTF))
								TMSetV = TMSetV + 1;    //上調溫度
							if ((KeyV == 2) && (!KeyTF))
								TMSetV = TMSetV - 1;    //下調溫度
							if (TMSetV <= -55)          //限制溫度上下限
								TMSetV = -55;
							if (TMSetV >= 125)
								TMSetV = 125;
						}
					if ((!KeyTF) && (IntNum3 == 0))
						{
							KeyTF = 1; //當鍵盤處于可用時,鎖定
							cur_temper_set[9]=0x20;		//	顯示空白
							cur_temper_set[10]=0x20;
							cur_temper_set[11]=0x20;
							cur_temper_set[12]=0x20;
						}
				}

				if (KeySETDown)         //在2秒內按下了SET則計中斷發生次數用于長按SET時計時用
					IntNum = IntNum + 1;  
				if (IntNum > 55)     //中斷發生了55次時(大約1.2秒)75為1.5秒左右
					{
						IntNum = 0;
						KeySETDown = 0;
						if (KSDNum == 55)      //如一直長按了SET1.2秒左右
							{
								RelayOutPort = 1;  //關閉繼電器輸出
								PowTF = 1;         //電源標識關  
								//Delay_4s();        //延時
								IntNum = 0;
								IntNum2 = 0;
								IntNum3 = 0;
								BF = 0;			//顯示歡迎信息		
								EA=0;
							}
						KSDNum = 0;
					}
		}

		KeyV = 0;
		TempKeyV = 0;   //清空變量準備下次鍵掃描

		if (PowTF==0)
			{
				InitDS1820();	//初始化
				ROMDS1820(); 	//跳過ROM
				TMVDS1820();  //溫度轉換指令
				Delay_510();
				Delay_510();  //延時等待轉換完成
				InitDS1820(); //初始化
				ROMDS1820(); 	//跳過ROM
				TMRDS1820(); 	//讀出溫度指令
				ReadDS1820(); //讀出溫度值
				V2ToV();        //轉換顯示值
				if (TMV > TMSetV)   //根據采集到的溫度值控制繼電器
					{
						RelayOutPort = 0;
						cur_temper_set[13]=0x20;	//" "
						cur_temper_set[14]=0x4f;	//"O"
						cur_temper_set[15]=0x4e;	//"N"
					}
				else
					{
						RelayOutPort = 1;
						cur_temper_set[13]=0x4f;	//"O"
						cur_temper_set[14]=0x46;	//"F"
						cur_temper_set[15]=0x46;	//"F"
					}

				if (SetTF)	IntNum2 = IntNum2 + 1; //用于閃爍計數
				if (IntNum2 > 50 )	IntNum2 = 0;
				if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按鍵連按
				if (IntNum3 > 25) 
					{
						IntNum3 = 0;
						KeyTF = 0;
					}
				if ((SetTF) && (IntNum2 < 25)) goto InitEnd;  //計數在后半段時顯示
				BF=1;	//讓顯示溫度值
				EA=0;	//關中斷
			}
			InitEnd:;
}



void V2ToV(void)	//數值轉換
{
	TLV = TLV >> 4;			
	THV = THV << 4;			//讀出的高低位數值移位
	TMV = TLV | THV;		//合并高低位放入TM為實際溫度值
	Sign = 0; Sign_Set=0;
    Sign_Set = TMSetV >> 7;          //取符號
    Sign = TMV >> 7;

	if (Sign)
		{
    		LCD_One = (~TMV) / 100;							//轉換百位值		
    		LCD_Two = ((~TMV) - LCD_One * 100)/10;
			LCD_Three = (~TMV) - LCD_One * 100 - LCD_Two * 10;
		}
	else
		{
			LCD_One = (TMV) / 100;							//轉換百位值		
    		LCD_Two = (TMV - LCD_One * 100)/10;
			LCD_Three = TMV - LCD_One * 100 - LCD_Two * 10;
		}

	if (Sign_Set)
		{
    		LCD_One_set = (~(TMSetV-1)) / 100;          //SET狀態下顯示設定值
    		LCD_Two_set = ((~(TMSetV-1)) - LCD_One_set * 100)/10;
			LCD_Three_set = (~(TMSetV-1)) - LCD_One_set * 100 - LCD_Two_set * 10;
		}
	else
		{
			LCD_One_set = (TMSetV) / 100;          //SET狀態下顯示設定值
    		LCD_Two_set = (TMSetV - LCD_One_set * 100)/10;
			LCD_Three_set = TMSetV - LCD_One_set * 100 - LCD_Two_set * 10;
		}

//轉LCD字段  溫度值	
	if (LCD_One) //超過百時十位的處理
		LCD_Two = LCDDis[LCD_Two];		
	else
		{
			if (LCD_Two == 0)
				LCD_Two = LCDDis[10];
			else
				LCD_Two = LCDDis[LCD_Two];
		}
	if (Sign)
		LCD_One = LCDDis[11];
	else
		{
			if (LCD_One == 0)
				LCD_One = LCDDis[10];
			else
				LCD_One = LCDDis[LCD_One];
		}
	LCD_Three = LCDDis[LCD_Three];


				cur_temper[13]=LCD_One;		//把溫度值的ASCII碼放入cur_temper的13,14,15位
				cur_temper[14]=LCD_Two;		
				cur_temper[15]=LCD_Three;	


//轉LCD字段  設置值	
	if (LCD_One_set) //超過百時十位的處理
		LCD_Two_set = LCDDis[LCD_Two_set];		
	else
		{
			if (LCD_Two_set == 0)
				LCD_Two_set = LCDDis[10];
			else
				LCD_Two_set = LCDDis[LCD_Two_set];
		}
	if (Sign_Set)
		LCD_One_set = LCDDis[11];
	else
		{
			if (LCD_One_set == 0)
				LCD_One_set = LCDDis[10];
			else
				LCD_One_set = LCDDis[LCD_One_set];
		}
	LCD_Three_set = LCDDis[LCD_Three_set];

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧洲一区二区三区免费视频| 欧美午夜精品久久久久久孕妇| 亚洲电影一区二区三区| 国产精品久久久久久久浪潮网站| 久久精品一区四区| 欧美精品一区二区三区一线天视频| 欧美成人精精品一区二区频| 日韩欧美中文字幕精品| 欧美一区二区精品| 精品国产露脸精彩对白| 久久婷婷国产综合国色天香| 精品久久久三级丝袜| 国产日产亚洲精品系列| 最新久久zyz资源站| 亚洲欧美一区二区三区极速播放| 一级做a爱片久久| 五月天视频一区| 韩国成人在线视频| 99久久精品国产毛片| 欧美影院一区二区| 精品粉嫩超白一线天av| 国产精品国产三级国产专播品爱网| ㊣最新国产の精品bt伙计久久| 亚洲激情欧美激情| 日本va欧美va欧美va精品| 国产一区 二区 三区一级| 成人av免费网站| 69久久夜色精品国产69蝌蚪网| 日韩欧美国产综合一区 | 99久久精品国产一区二区三区| 91浏览器入口在线观看| 91精品久久久久久久99蜜桃| 日本一区二区三区久久久久久久久不| 亚洲欧洲性图库| 青娱乐精品视频| 成人黄色免费短视频| 欧美三级在线视频| 中文字幕乱码亚洲精品一区| 五月激情综合婷婷| 成人精品国产一区二区4080 | 图片区小说区国产精品视频| 国内精品久久久久影院薰衣草| 97超碰欧美中文字幕| 日韩一卡二卡三卡国产欧美| 国产精品久久久久久一区二区三区| 天堂一区二区在线| 91小视频免费看| 久久在线免费观看| 天天免费综合色| 99久久综合精品| 久久只精品国产| 丝袜亚洲精品中文字幕一区| 国产成人在线网站| 欧美一级免费大片| 一卡二卡三卡日韩欧美| 99精品欧美一区| 日本一区二区三区国色天香| 捆绑调教一区二区三区| 欧美日韩一区二区三区四区| 亚洲女女做受ⅹxx高潮| 国产成人h网站| 2020国产精品自拍| 日本美女一区二区三区| 欧美老肥妇做.爰bbww视频| 亚洲视频你懂的| 99久久综合精品| 中文字幕中文在线不卡住| 国产一区二三区| 精品少妇一区二区三区在线播放 | 91亚洲国产成人精品一区二区三| 欧美激情在线看| 国产精品夜夜嗨| 久久精品视频在线看| 麻豆精品国产91久久久久久| 欧美一区二区大片| 午夜国产精品一区| 欧美精品 国产精品| 亚洲自拍偷拍综合| 欧美三级乱人伦电影| 亚洲不卡av一区二区三区| 欧美日韩精品一区二区三区四区 | 久久综合中文字幕| 国产美女av一区二区三区| 国产亚洲综合av| 国产永久精品大片wwwapp| 久久综合九色欧美综合狠狠| 国产精品原创巨作av| 国产精品女人毛片| 一本色道久久综合亚洲aⅴ蜜桃| 亚洲同性同志一二三专区| 色婷婷av一区二区三区gif| 亚洲一区日韩精品中文字幕| 欧美伦理影视网| 麻豆国产精品一区二区三区 | 成人综合在线观看| 国产精品每日更新在线播放网址 | 青青青伊人色综合久久| 精品国产一区二区三区久久久蜜月 | 日本一区二区视频在线| 91在线观看下载| 午夜精品久久久久影视| 欧美一区二区三区在线观看视频| 黑人精品欧美一区二区蜜桃| 中文字幕不卡在线观看| 欧日韩精品视频| 久久91精品国产91久久小草| 国产精品嫩草久久久久| 欧洲视频一区二区| 国产在线精品免费| 亚洲自拍偷拍九九九| 日韩精品一区二区在线| 97aⅴ精品视频一二三区| 免费观看在线色综合| 国产精品午夜在线观看| 欧美日韩中文字幕精品| 国产精品1区2区| 一区二区在线观看免费视频播放| 精品少妇一区二区三区在线播放| 99国产精品久久久久久久久久久| 视频一区视频二区中文| 国产精品久久久久久久久果冻传媒| 欧美日韩黄视频| 成人午夜激情在线| 久久99精品国产| 日韩在线一二三区| 亚洲欧洲日韩综合一区二区| 精品国产一区二区三区久久影院| 在线视频你懂得一区| 国产成人精品影视| 久久er99热精品一区二区| 亚洲精品亚洲人成人网在线播放| 久久亚洲综合av| 欧美一卡2卡3卡4卡| 在线观看免费成人| 懂色一区二区三区免费观看| 美女网站视频久久| 午夜久久久影院| 亚洲一区二区综合| 一区二区三区国产精品| 国产精品电影一区二区| 国产网红主播福利一区二区| 欧美成人国产一区二区| 3d动漫精品啪啪一区二区竹菊| 色综合久久综合| 91色.com| www.亚洲色图.com| 不卡欧美aaaaa| 东方aⅴ免费观看久久av| 国产乱码精品一品二品| 国产成人一区在线| 国产精品一区在线| 国产sm精品调教视频网站| 国产乱码精品一区二区三区忘忧草| 精品无码三级在线观看视频| 青青草原综合久久大伊人精品优势| 图片区小说区区亚洲影院| 奇米影视在线99精品| 免费成人av在线播放| 精品一区二区在线看| 激情深爱一区二区| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 国产精品911| 高清国产一区二区三区| 成人免费看片app下载| 一本大道久久精品懂色aⅴ| 一本大道久久a久久综合婷婷| 欧美专区在线观看一区| 欧美电影影音先锋| 欧美精品一区二区三区高清aⅴ| 久久久一区二区三区| 国产精品乱人伦中文| 亚洲久草在线视频| 亚洲成精国产精品女| 美女精品一区二区| 国产不卡视频在线播放| 色综合久久久久综合体| 欧美日韩精品欧美日韩精品| 精品国产乱码久久久久久久久| 国产日韩精品一区二区三区| 亚洲免费av高清| 麻豆久久一区二区| 97se亚洲国产综合在线| 欧美久久一二区| 久久精品欧美日韩| 亚洲成人午夜电影| 国产凹凸在线观看一区二区| 欧美性一二三区| 精品日韩av一区二区| 一区在线观看视频| 久久国产日韩欧美精品| 99久久er热在这里只有精品15 | 欧美亚洲国产bt| 日韩精品一区在线观看| 亚洲免费观看高清| 国产精品一区二区三区四区 | 欧美一二三区在线观看| 国产精品卡一卡二卡三| 蜜桃视频在线一区| 色8久久精品久久久久久蜜| 精品乱人伦小说|