⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_main.src

📁 LCD显示温控器制作成功 参考了明浩的温度控制器V1.5和使用1602液晶显示和PS/2键盘的示例
💻 SRC
📖 第 1 页 / 共 4 页
字号:
; 	if (!Key_DOWN)	KeyV = 2;
			; SOURCE LINE # 159
	JB   	P2_5,?C0014
	MOV  	KeyV,#02H
?C0014:
; 	if (!Key_SET)	KeyV = 3;
			; SOURCE LINE # 160
	JB   	P2_4,?C0015
	MOV  	KeyV,#03H
?C0015:
; 	//KeySETDowning = 0;  //清除
; 	if (KeyV != 0)      //有键按下
			; SOURCE LINE # 162
	MOV  	A,KeyV
	JNZ  	$ + 5H
	LJMP 	?C0016
; 		{
			; SOURCE LINE # 163
; 			Delay_10ms();   //延时防抖  按下10ms再测
			; SOURCE LINE # 164
	LCALL	Delay_10ms
; 			if (!Key_UP)	TempKeyV = 1;
			; SOURCE LINE # 165
	JB   	P2_3,?C0017
	MOV  	TempKeyV,#01H
?C0017:
; 			if (!Key_DOWN)	TempKeyV = 2;
			; SOURCE LINE # 166
	JB   	P2_5,?C0018
	MOV  	TempKeyV,#02H
?C0018:
; 			if (!Key_SET)	TempKeyV = 3;
			; SOURCE LINE # 167
	JB   	P2_4,?C0019
	MOV  	TempKeyV,#03H
?C0019:
; 
; 			if (KeyV == TempKeyV)   //两次值相等为确定接下了键
			; SOURCE LINE # 169
	MOV  	A,KeyV
	XRL  	A,TempKeyV
	JZ   	$ + 5H
	LJMP 	?C0020
; 				{
			; SOURCE LINE # 170
; 					if (KeyV == 3)      //按下SET键,如在SET状态就退出,否则进入
			; SOURCE LINE # 171
	MOV  	A,KeyV
	XRL  	A,#03H
	JNZ  	?C0021
; 						{
			; SOURCE LINE # 172
; 							//KeySETDowning = 1; //表明SET正在按下
; 							PowTF = 0;      //电源标识开
			; SOURCE LINE # 174
	CLR  	PowTF
; 							if (!KeyTF)		//KeyTF=0,键盘允许
			; SOURCE LINE # 175
	JB   	KeyTF,?C0022
; 								if (SetTF)
			; SOURCE LINE # 176
	JNB  	SetTF,?C0023
; 									{
			; SOURCE LINE # 177
; 										SetTF = 0;    //标识位标识退出设定
			; SOURCE LINE # 178
	CLR  	SetTF
; 										InitDS1820(); //初始化
			; SOURCE LINE # 179
	LCALL	InitDS1820
; 										ROMDS1820(); 	//跳过ROM
			; SOURCE LINE # 180
	LCALL	ROMDS1820
; 										TMWDS1820(); 	//写温度上限指令
			; SOURCE LINE # 181
	LCALL	TMWDS1820
; 										WriteDS1820(); 	//写温度上限到DS18B20ROM
			; SOURCE LINE # 182
	LCALL	WriteDS1820
; 										WriteDS1820(); 	//写温度上限到DS18B20ROM
			; SOURCE LINE # 183
	LCALL	WriteDS1820
; 										WriteDS1820(); 	//写温度上限到DS18B20ROM
			; SOURCE LINE # 184
	LCALL	WriteDS1820
; 										InitDS1820(); //初始化
			; SOURCE LINE # 185
	LCALL	InitDS1820
; 										ROMDS1820(); 	//跳过ROM
			; SOURCE LINE # 186
	LCALL	ROMDS1820
; 										TMREDS1820(); 	//温度上限值COPY回E2PRAM
			; SOURCE LINE # 187
	LCALL	TMREDS1820
; 										//	V2ToV();
; 									}
			; SOURCE LINE # 189
	SJMP 	?C0022
?C0023:
; 								else
; 									SetTF = 1;
			; SOURCE LINE # 191
	SETB 	SetTF
?C0022:
; 							if (!KeySETDown) //没有第一次按下SET时,KeySETDown标识置1
			; SOURCE LINE # 192
	JB   	KeySETDown,?C0025
; 								KeySETDown = 1;
			; SOURCE LINE # 193
	SETB 	KeySETDown
	SJMP 	?C0021
?C0025:
; 							else
; 								KSDNum = KSDNum + 1;  //前一秒内有按过SET则开始计数
			; SOURCE LINE # 195
	INC  	KSDNum
; 						}
			; SOURCE LINE # 196
?C0021:
; 					if (SetTF==1)  //在SET状态下
			; SOURCE LINE # 197
	JNB  	SetTF,?C0027
; 						{
			; SOURCE LINE # 198
; 							cur_temper_set[9]=0x3d;		//"="	显示set标志
			; SOURCE LINE # 199
	MOV  	cur_temper_set+09H,#03DH
; 							cur_temper_set[10]=0x73;	//"s"
			; SOURCE LINE # 200
	MOV  	cur_temper_set+0AH,#073H
; 							cur_temper_set[11]=0x65;	//"e"
			; SOURCE LINE # 201
	MOV  	cur_temper_set+0BH,#065H
; 							cur_temper_set[12]=0x74;	//"t"
			; SOURCE LINE # 202
	MOV  	cur_temper_set+0CH,#074H
; 							if ((KeyV == 1) && (!KeyTF))
			; SOURCE LINE # 203
	MOV  	A,KeyV
	CJNE 	A,#01H,?C0028
	JB   	KeyTF,?C0028
; 								TMSetV = TMSetV + 1;    //上调温度
			; SOURCE LINE # 204
	INC  	TMSetV
?C0028:
; 							if ((KeyV == 2) && (!KeyTF))
			; SOURCE LINE # 205
	MOV  	A,KeyV
	CJNE 	A,#02H,?C0029
	JB   	KeyTF,?C0029
; 								TMSetV = TMSetV - 1;    //下调温度
			; SOURCE LINE # 206
	DEC  	TMSetV
?C0029:
; 							if (TMSetV <= -55)          //限制温度上下限
			; SOURCE LINE # 207
	SETB 	C
	MOV  	A,TMSetV
	XRL  	A,#080H
	SUBB 	A,#049H
	JNC  	?C0030
; 								TMSetV = -55;
			; SOURCE LINE # 208
	MOV  	TMSetV,#0C9H
?C0030:
; 							if (TMSetV >= 125)
			; SOURCE LINE # 209
	CLR  	C
	MOV  	A,TMSetV
	XRL  	A,#080H
	SUBB 	A,#0FDH
	JC   	?C0027
; 								TMSetV = 125;
			; SOURCE LINE # 210
	MOV  	TMSetV,#07DH
; 						}
			; SOURCE LINE # 211
?C0027:
; 					if ((!KeyTF) && (IntNum3 == 0))
			; SOURCE LINE # 212
	JB   	KeyTF,?C0020
	MOV  	A,IntNum3
	JNZ  	?C0020
; 						{
			; SOURCE LINE # 213
; 							KeyTF = 1; //当键盘处于可用时,锁定
			; SOURCE LINE # 214
	SETB 	KeyTF
; 							cur_temper_set[9]=0x20;		//	显示空白
			; SOURCE LINE # 215
	MOV  	cur_temper_set+09H,#020H
; 							cur_temper_set[10]=0x20;
			; SOURCE LINE # 216
	MOV  	cur_temper_set+0AH,#020H
; 							cur_temper_set[11]=0x20;
			; SOURCE LINE # 217
	MOV  	cur_temper_set+0BH,#020H
; 							cur_temper_set[12]=0x20;
			; SOURCE LINE # 218
	MOV  	cur_temper_set+0CH,#020H
; 						}
			; SOURCE LINE # 219
; 				}
			; SOURCE LINE # 220
?C0020:
; 
; 				if (KeySETDown)         //在2秒内按下了SET则计中断发生次数用于长按SET时计时用
			; SOURCE LINE # 222
	JNB  	KeySETDown,?C0033
; 					IntNum = IntNum + 1;  
			; SOURCE LINE # 223
	INC  	IntNum
?C0033:
; 				if (IntNum > 55)     //中断发生了55次时(大约1.2秒)75为1.5秒左右
			; SOURCE LINE # 224
	MOV  	A,IntNum
	SETB 	C
	SUBB 	A,#037H
	JC   	?C0016
; 					{
			; SOURCE LINE # 225
; 						IntNum = 0;
			; SOURCE LINE # 226
	MOV  	IntNum,#00H
; 						KeySETDown = 0;
			; SOURCE LINE # 227
	CLR  	KeySETDown
; 						if (KSDNum == 55)      //如一直长按了SET1.2秒左右
			; SOURCE LINE # 228
	MOV  	A,KSDNum
	CJNE 	A,#037H,?C0035
; 							{
			; SOURCE LINE # 229
; 								RelayOutPort = 1;  //关闭继电器输出
			; SOURCE LINE # 230
	SETB 	P2_6
; 								PowTF = 1;         //电源标识关  
			; SOURCE LINE # 231
	SETB 	PowTF
; 								//Delay_4s();        //延时
; 								IntNum = 0;
			; SOURCE LINE # 233
	MOV  	IntNum,#00H
; 								IntNum2 = 0;
			; SOURCE LINE # 234
	MOV  	IntNum2,#00H
; 								IntNum3 = 0;
			; SOURCE LINE # 235
	MOV  	IntNum3,#00H
; 								BF = 0;			//显示欢迎信息		
			; SOURCE LINE # 236
	MOV  	BF,#00H
; 								EA=0;
			; SOURCE LINE # 237
	CLR  	EA
; 							}
			; SOURCE LINE # 238
?C0035:
; 						KSDNum = 0;
			; SOURCE LINE # 239
	MOV  	KSDNum,#00H
; 					}
			; SOURCE LINE # 240
; 		}
			; SOURCE LINE # 241
?C0016:
; 
; 		KeyV = 0;
			; SOURCE LINE # 243
	MOV  	KeyV,#00H
; 		TempKeyV = 0;   //清空变量准备下次键扫描
			; SOURCE LINE # 244
	MOV  	TempKeyV,#00H
; 
; 		if (PowTF==0)
			; SOURCE LINE # 246
	JB   	PowTF,?C0045
; 			{
			; SOURCE LINE # 247
; 				InitDS1820();	//初始化
			; SOURCE LINE # 248
	LCALL	InitDS1820
; 				ROMDS1820(); 	//跳过ROM
			; SOURCE LINE # 249
	LCALL	ROMDS1820
; 				TMVDS1820();  //温度转换指令
			; SOURCE LINE # 250
	LCALL	TMVDS1820
; 				Delay_510();
			; SOURCE LINE # 251
	LCALL	Delay_510
; 				Delay_510();  //延时等待转换完成
			; SOURCE LINE # 252
	LCALL	Delay_510
; 				InitDS1820(); //初始化
			; SOURCE LINE # 253
	LCALL	InitDS1820
; 				ROMDS1820(); 	//跳过ROM
			; SOURCE LINE # 254
	LCALL	ROMDS1820
; 				TMRDS1820(); 	//读出温度指令
			; SOURCE LINE # 255
	LCALL	TMRDS1820
; 				ReadDS1820(); //读出温度值
			; SOURCE LINE # 256
	LCALL	ReadDS1820
; 				V2ToV();        //转换显示值
			; SOURCE LINE # 257
	LCALL	V2ToV
; 				if (TMV > TMSetV)   //根据采集到的温度值控制继电器
			; SOURCE LINE # 258
	SETB 	C
	MOV  	A,TMSetV
	XRL  	A,#080H
	MOV  	R0,A
	MOV  	A,TMV
	XRL  	A,#080H
	SUBB 	A,R0
	JC   	?C0037
; 					{
			; SOURCE LINE # 259
; 						RelayOutPort = 0;
			; SOURCE LINE # 260
	CLR  	P2_6
; 						cur_temper_set[13]=0x20;	//" "
			; SOURCE LINE # 261
	MOV  	cur_temper_set+0DH,#020H
; 						cur_temper_set[14]=0x4f;	//"O"
			; SOURCE LINE # 262
	MOV  	cur_temper_set+0EH,#04FH
; 						cur_temper_set[15]=0x4e;	//"N"
			; SOURCE LINE # 263
	MOV  	cur_temper_set+0FH,#04EH
; 					}
			; SOURCE LINE # 264
	SJMP 	?C0038
?C0037:
; 				else
; 					{
			; SOURCE LINE # 266
; 						RelayOutPort = 1;
			; SOURCE LINE # 267
	SETB 	P2_6
; 						cur_temper_set[13]=0x4f;	//"O"
			; SOURCE LINE # 268
	MOV  	cur_temper_set+0DH,#04FH
; 						cur_temper_set[14]=0x46;	//"F"
			; SOURCE LINE # 269
	MOV  	cur_temper_set+0EH,#046H
; 						cur_temper_set[15]=0x46;	//"F"
			; SOURCE LINE # 270
	MOV  	cur_temper_set+0FH,#046H
; 					}
			; SOURCE LINE # 271
?C0038:
; 
; 				if (SetTF)	IntNum2 = IntNum2 + 1; //用于闪烁计数
			; SOURCE LINE # 273
	JNB  	SetTF,?C0039
	INC  	IntNum2
?C0039:
; 				if (IntNum2 > 50 )	IntNum2 = 0;
			; SOURCE LINE # 274
	MOV  	A,IntNum2
	SETB 	C
	SUBB 	A,#032H
	JC   	?C0040
	MOV  	IntNum2,#00H
?C0040:
; 				if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按键连按
			; SOURCE LINE # 275
	JNB  	KeyTF,?C0041
	INC  	IntNum3
?C0041:
; 				if (IntNum3 > 25) 
			; SOURCE LINE # 276
	MOV  	A,IntNum3
	SETB 	C
	SUBB 	A,#019H
	JC   	?C0042
; 					{
			; SOURCE LINE # 277
; 						IntNum3 = 0;
			; SOURCE LINE # 278
	MOV  	IntNum3,#00H
; 						KeyTF = 0;
			; SOURCE LINE # 279
	CLR  	KeyTF
; 					}
			; SOURCE LINE # 280
?C0042:
; 				if ((SetTF) && (IntNum2 < 25)) goto InitEnd;  //计数在后半段时显示
			; SOURCE LINE # 281
	JNB  	SetTF,?C0043
	MOV  	A,IntNum2
	CLR  	C
	SUBB 	A,#019H
	JC   	?C0045
?C0043:
; 				BF=1;	//让显示温度值
			; SOURCE LINE # 282
	MOV  	BF,#01H
; 				EA=0;	//关中断
			; SOURCE LINE # 283
	CLR  	EA
; 			}
			; SOURCE LINE # 284
; 			InitEnd:;
			; SOURCE LINE # 285
?KeyAndDis_Time0?InitEnd:
; }
			; SOURCE LINE # 286
?C0045:
	POP  	PSW
	POP  	DPL
	POP  	DPH
	POP  	B
	POP  	ACC
	RETI 	
; END OF KeyAndDis_Time0

; 
; 
; 
; void V2ToV(void)	//数值转换

	RSEG  ?PR?V2ToV?LCD_MAIN
V2ToV:
	USING	0
			; SOURCE LINE # 290
; {
			; SOURCE LINE # 291
; 	TLV = TLV >> 4;			
			; SOURCE LINE # 292
	MOV  	A,TLV
	SWAP 	A
	ANL  	A,#0FH
	MOV  	TLV,A
; 	THV = THV << 4;			//读出的高低位数值移位
			; SOURCE LINE # 293
	MOV  	A,THV
	SWAP 	A
	ANL  	A,#0F0H
	MOV  	THV,A
; 	TMV = TLV | THV;		//合并高低位放入TM为实际温度值
			; SOURCE LINE # 294
	ORL  	A,TLV
	MOV  	TMV,A
; 	Sign = 0; Sign_Set=0;
			; SOURCE LINE # 295
	CLR  	A
	MOV  	Sign,A
	MOV  	Sign_Set,A
;     Sign_Set = TMSetV >> 7;          //取符号
			; SOURCE LINE # 296
	MOV  	A,TMSetV
	MOV  	R0,#07H
?C0105:
	MOV  	C,ACC.7
	RRC  	A
	DJNZ 	R0,?C0105
	MOV  	Sign_Set,A
;     Sign = TMV >> 7;
			; SOURCE LINE # 297
	MOV  	A,TMV
	MOV  	R0,#07H
?C0106:
	MOV  	C,ACC.7
	RRC  	A
	DJNZ 	R0,?C0106
	MOV  	Sign,A
; 
; 	if (Sign)
			; SOURCE LINE # 299
	JZ   	?C0046
; 		{
			; SOURCE LINE # 300
;     		LCD_One = (~TMV) / 100;							//转换百位值		
			; SOURCE LINE # 301
	MOV  	A,TMV
	CPL  	A
	MOV  	R7,A
	MOV  	B,#064H
	LCALL	?C?SCDIV
	MOV  	LCD_One,A
;     		LCD_Two = ((~TMV) - LCD_One * 100)/10;
			; SOURCE LINE # 302
	MOV  	B,#064H
	MUL  	AB
	MOV  	R6,A
	CLR  	C
	MOV  	A,R7
	SUBB 	A,R6
; 			LCD_Three = (~TMV) - LCD_One * 100 - LCD_Two * 10;
			; SOURCE LINE # 303
; 		}
			; SOURCE LINE # 304
	SJMP 	?C0109
?C0046:
; 	else
; 		{
			; SOURCE LINE # 306
; 			LCD_One = (TMV) / 100;							//转换百位值		
			; SOURCE LINE # 307
	MOV  	A,TMV
	MOV  	B,#064H
	LCALL	?C?SCDIV
	MOV  	LCD_One,A
;     		LCD_Two = (TMV - LCD_One * 100)/10;
			; SOURCE LINE # 308
	MOV  	B,#064H
	MUL  	AB
	MOV  	R7,A
	CLR  	C
	MOV  	A,TMV
	SUBB 	A,R7
?C0109:
	MOV  	R7,A
	MOV  	B,#0AH
	LCALL	?C?SCDIV
	MOV  	LCD_Two,A
; 			LCD_Three = TMV - LCD_One * 100 - LCD_Two * 10;
			; SOURCE LINE # 309
	MOV  	B,#0AH
	MUL  	AB
	MOV  	R6,A
	CLR  	C
	MOV  	A,R7
	SUBB 	A,R6
	MOV  	LCD_Three,A
; 		}
			; SOURCE LINE # 310
?C0047:
; 
; 	if (Sign_Set)
			; SOURCE LINE # 312
	MOV  	A,Sign_Set
	JZ   	?C0048
; 		{
			; SOURCE LINE # 313
;     		LCD_One_set = (~(TMSetV-1)) / 100;          //SET状态下显示设定值
			; SOURCE LINE # 314
	MOV  	A,TMSetV
	DEC  	A
	CPL  	A
	MOV  	R7,A
	MOV  	B,#064H
	LCALL	?C?SCDIV
	MOV  	LCD_One_set,A
;     		LCD_Two_set = ((~(TMSetV-1)) - LCD_One_set * 100)/10;
			; SOURCE LINE # 315
	MOV  	B,#064H
	MUL  	AB
	MOV  	R6,A
	CLR  	C
	MOV  	A,R7
	SUBB 	A,R6
; 			LCD_Three_set = (~(TMSetV-1)) - LCD_One_set * 100 - LCD_Two_set * 10;
			; SOURCE LINE # 316
; 		}
			; SOURCE LINE # 317
	SJMP 	?C0110
?C0048:
; 	else
; 		{
			; SOURCE LINE # 319
; 			LCD_One_set = (TMSetV) / 100;          //SET状态下显示设定值
			; SOURCE LINE # 320
	MOV  	A,TMSetV
	MOV  	B,#064H
	LCALL	?C?SCDIV
	MOV  	LCD_One_set,A
;     		LCD_Two_set = (TMSetV - LCD_One_set * 100)/10;
			; SOURCE LINE # 321
	MOV  	B,#064H
	MUL  	AB
	MOV  	R7,A
	CLR  	C
	MOV  	A,TMSetV
	SUBB 	A,R7
?C0110:
	MOV  	R7,A
	MOV  	B,#0AH
	LCALL	?C?SCDIV
	MOV  	LCD_Two_set,A
; 			LCD_Three_set = TMSetV - LCD_One_set * 100 - LCD_Two_set * 10;
			; SOURCE LINE # 322
	MOV  	B,#0AH
	MUL  	AB
	MOV  	R6,A
	CLR  	C
	MOV  	A,R7
	SUBB 	A,R6
	MOV  	LCD_Three_set,A
; 		}
			; SOURCE LINE # 323
?C0049:
; 
; //转LCD字段  温度值	
; 	if (LCD_One) //超过百时十位的处理
			; SOURCE LINE # 326
	MOV  	A,LCD_One
	JZ   	?C0050
; 		LCD_Two = LCDDis[LCD_Two];		
			; SOURCE LINE # 327
	SJMP 	?C0111
?C0050:
; 	else
; 		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -