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

📄 lcd_main.src

📁 LCD显示温控器制作成功 参考了明浩的温度控制器V1.5和使用1602液晶显示和PS/2键盘的示例
💻 SRC
📖 第 1 页 / 共 4 页
字号:
			; SOURCE LINE # 329
; 			if (LCD_Two == 0)
			; SOURCE LINE # 330
	MOV  	A,LCD_Two
	JNZ  	?C0052
; 				LCD_Two = LCDDis[10];
			; SOURCE LINE # 331
	MOV  	DPTR,#LCDDis+0AH
	SJMP 	?C0112
?C0052:
; 			else
; 				LCD_Two = LCDDis[LCD_Two];
			; SOURCE LINE # 333
?C0111:
	MOV  	R7,LCD_Two
	MOV  	A,R7
	RLC  	A
	SUBB 	A,ACC
	MOV  	R6,A
	MOV  	A,#LOW (LCDDis)
	ADD  	A,R7
	MOV  	DPL,A
	MOV  	A,#HIGH (LCDDis)
	ADDC 	A,R6
	MOV  	DPH,A
	CLR  	A
?C0112:
	MOVC 	A,@A+DPTR
	MOV  	LCD_Two,A
; 		}
			; SOURCE LINE # 334
?C0051:
; 	if (Sign)
			; SOURCE LINE # 335
	MOV  	A,Sign
	JZ   	?C0054
; 		LCD_One = LCDDis[11];
			; SOURCE LINE # 336
	MOV  	DPTR,#LCDDis+0BH
	SJMP 	?C0113
?C0054:
; 	else
; 		{
			; SOURCE LINE # 338
; 			if (LCD_One == 0)
			; SOURCE LINE # 339
	MOV  	A,LCD_One
	JNZ  	?C0056
; 				LCD_One = LCDDis[10];
			; SOURCE LINE # 340
	MOV  	DPTR,#LCDDis+0AH
	SJMP 	?C0114
?C0056:
; 			else
; 				LCD_One = LCDDis[LCD_One];
			; SOURCE LINE # 342
	MOV  	R7,LCD_One
	MOV  	A,R7
	RLC  	A
	SUBB 	A,ACC
	MOV  	R6,A
	MOV  	A,#LOW (LCDDis)
	ADD  	A,R7
	MOV  	DPL,A
	MOV  	A,#HIGH (LCDDis)
	ADDC 	A,R6
	MOV  	DPH,A
?C0113:
	CLR  	A
?C0114:
	MOVC 	A,@A+DPTR
	MOV  	LCD_One,A
; 		}
			; SOURCE LINE # 343
?C0055:
; 	LCD_Three = LCDDis[LCD_Three];
			; SOURCE LINE # 344
	MOV  	R7,LCD_Three
	MOV  	A,R7
	RLC  	A
	SUBB 	A,ACC
	MOV  	R6,A
	MOV  	A,#LOW (LCDDis)
	ADD  	A,R7
	MOV  	DPL,A
	MOV  	A,#HIGH (LCDDis)
	ADDC 	A,R6
	MOV  	DPH,A
	CLR  	A
	MOVC 	A,@A+DPTR
	MOV  	LCD_Three,A
; 
; 
; 				cur_temper[13]=LCD_One;		//把温度值的ASCII码放入cur_temper的13,14,15位
			; SOURCE LINE # 347
	MOV  	cur_temper+0DH,LCD_One
; 				cur_temper[14]=LCD_Two;		
			; SOURCE LINE # 348
	MOV  	cur_temper+0EH,LCD_Two
; 				cur_temper[15]=LCD_Three;	
			; SOURCE LINE # 349
	MOV  	cur_temper+0FH,A
; 
; 
; //转LCD字段  设置值	
; 	if (LCD_One_set) //超过百时十位的处理
			; SOURCE LINE # 353
	MOV  	A,LCD_One_set
	JZ   	?C0058
; 		LCD_Two_set = LCDDis[LCD_Two_set];		
			; SOURCE LINE # 354
	SJMP 	?C0115
?C0058:
; 	else
; 		{
			; SOURCE LINE # 356
; 			if (LCD_Two_set == 0)
			; SOURCE LINE # 357
	MOV  	A,LCD_Two_set
	JNZ  	?C0060
; 				LCD_Two_set = LCDDis[10];
			; SOURCE LINE # 358
	MOV  	DPTR,#LCDDis+0AH
	SJMP 	?C0116
?C0060:
; 			else
; 				LCD_Two_set = LCDDis[LCD_Two_set];
			; SOURCE LINE # 360
?C0115:
	MOV  	R7,LCD_Two_set
	MOV  	A,R7
	RLC  	A
	SUBB 	A,ACC
	MOV  	R6,A
	MOV  	A,#LOW (LCDDis)
	ADD  	A,R7
	MOV  	DPL,A
	MOV  	A,#HIGH (LCDDis)
	ADDC 	A,R6
	MOV  	DPH,A
	CLR  	A
?C0116:
	MOVC 	A,@A+DPTR
	MOV  	LCD_Two_set,A
; 		}
			; SOURCE LINE # 361
?C0059:
; 	if (Sign_Set)
			; SOURCE LINE # 362
	MOV  	A,Sign_Set
	JZ   	?C0062
; 		LCD_One_set = LCDDis[11];
			; SOURCE LINE # 363
	MOV  	DPTR,#LCDDis+0BH
	SJMP 	?C0117
?C0062:
; 	else
; 		{
			; SOURCE LINE # 365
; 			if (LCD_One_set == 0)
			; SOURCE LINE # 366
	MOV  	A,LCD_One_set
	JNZ  	?C0064
; 				LCD_One_set = LCDDis[10];
			; SOURCE LINE # 367
	MOV  	DPTR,#LCDDis+0AH
	SJMP 	?C0118
?C0064:
; 			else
; 				LCD_One_set = LCDDis[LCD_One_set];
			; SOURCE LINE # 369
	MOV  	R7,LCD_One_set
	MOV  	A,R7
	RLC  	A
	SUBB 	A,ACC
	MOV  	R6,A
	MOV  	A,#LOW (LCDDis)
	ADD  	A,R7
	MOV  	DPL,A
	MOV  	A,#HIGH (LCDDis)
	ADDC 	A,R6
	MOV  	DPH,A
?C0117:
	CLR  	A
?C0118:
	MOVC 	A,@A+DPTR
	MOV  	LCD_One_set,A
; 		}
			; SOURCE LINE # 370
?C0063:
; 	LCD_Three_set = LCDDis[LCD_Three_set];
			; SOURCE LINE # 371
	MOV  	R7,LCD_Three_set
	MOV  	A,R7
	RLC  	A
	SUBB 	A,ACC
	MOV  	R6,A
	MOV  	A,#LOW (LCDDis)
	ADD  	A,R7
	MOV  	DPL,A
	MOV  	A,#HIGH (LCDDis)
	ADDC 	A,R6
	MOV  	DPH,A
	CLR  	A
	MOVC 	A,@A+DPTR
	MOV  	LCD_Three_set,A
; 
; 
; 				cur_temper_set[6]=LCD_One_set;		//把温度值的ASCII码放入cur_temper_set的6,7,8位
			; SOURCE LINE # 374
	MOV  	cur_temper_set+06H,LCD_One_set
; 				cur_temper_set[7]=LCD_Two_set;		
			; SOURCE LINE # 375
	MOV  	cur_temper_set+07H,LCD_Two_set
; 				cur_temper_set[8]=LCD_Three_set;	
			; SOURCE LINE # 376
	MOV  	cur_temper_set+08H,A
; 
; }
			; SOURCE LINE # 378
	RET  	
; END OF V2ToV

; 
; //写数据
; void WriteDataLCM(unsigned char WDLCM)

	RSEG  ?PR?_WriteDataLCM?LCD_MAIN
_WriteDataLCM:
	USING	0
			; SOURCE LINE # 381
	MOV  	WDLCM?340,R7
; {
			; SOURCE LINE # 382
; ReadStatusLCM(); //检测忙
			; SOURCE LINE # 383
	LCALL	ReadStatusLCM
; LCM_Data = WDLCM;
			; SOURCE LINE # 384
	MOV  	P1,WDLCM?340
; LCM_RS = 1;
			; SOURCE LINE # 385
	SETB 	P2_1
; LCM_RW = 0;
			; SOURCE LINE # 386
	CLR  	P2_0
; LCM_E = 0; //若晶振速度太高可以在这后加小的延时
			; SOURCE LINE # 387
	CLR  	P2_2
; LCM_E = 0; //延时
			; SOURCE LINE # 388
	CLR  	P2_2
; LCM_E = 1;
			; SOURCE LINE # 389
	SETB 	P2_2
; }
			; SOURCE LINE # 390
	RET  	
; END OF _WriteDataLCM

; 
; //写指令
; void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测

	RSEG  ?PR?_WriteCommandLCM?LCD_MAIN
L?0119:
	USING	0
	MOV  	R5,#01H
	MOV  	R4,#00H
_WriteCommandLCM:
	USING	0
			; SOURCE LINE # 393
	MOV  	WCLCM?441,R7
;---- Variable 'BuysC?442' assigned to Register 'R4/R5' ----
; {
			; SOURCE LINE # 394
; if (BuysC) ReadStatusLCM(); //根据需要检测忙
			; SOURCE LINE # 395
	MOV  	A,R5
	ORL  	A,R4
	JZ   	?C0068
	LCALL	ReadStatusLCM
?C0068:
; LCM_Data = WCLCM;
			; SOURCE LINE # 396
	MOV  	P1,WCLCM?441
; LCM_RS = 0;
			; SOURCE LINE # 397
	CLR  	P2_1
; LCM_RW = 0; 
			; SOURCE LINE # 398
	CLR  	P2_0
; LCM_E = 0;
			; SOURCE LINE # 399
	CLR  	P2_2
; LCM_E = 0;
			; SOURCE LINE # 400
	CLR  	P2_2
; LCM_E = 1; 
			; SOURCE LINE # 401
	SETB 	P2_2
; }
			; SOURCE LINE # 402
	RET  	
; END OF _WriteCommandLCM

; 
; //读数据
; unsigned char ReadDataLCM(void)

	RSEG  ?PR?ReadDataLCM?LCD_MAIN
ReadDataLCM:
	USING	0
			; SOURCE LINE # 405
; {
			; SOURCE LINE # 406
; LCM_RS = 1; 
			; SOURCE LINE # 407
	SETB 	P2_1
; LCM_RW = 1;
			; SOURCE LINE # 408
	SETB 	P2_0
; LCM_E = 0;
			; SOURCE LINE # 409
	CLR  	P2_2
; LCM_E = 0;
			; SOURCE LINE # 410
	CLR  	P2_2
; LCM_E = 1;
			; SOURCE LINE # 411
	SETB 	P2_2
; return(LCM_Data);
			; SOURCE LINE # 412
	MOV  	R7,P1
; }
			; SOURCE LINE # 413
?C0070:
	RET  	
; END OF ReadDataLCM

; 
; //读状态
; unsigned char ReadStatusLCM(void)

	RSEG  ?PR?ReadStatusLCM?LCD_MAIN
ReadStatusLCM:
	USING	0
			; SOURCE LINE # 416
; {
			; SOURCE LINE # 417
; LCM_Data = 0xFF; 
			; SOURCE LINE # 418
	MOV  	P1,#0FFH
; LCM_RS = 0;
			; SOURCE LINE # 419
	CLR  	P2_1
; LCM_RW = 1;
			; SOURCE LINE # 420
	SETB 	P2_0
; LCM_E = 0;
			; SOURCE LINE # 421
	CLR  	P2_2
; LCM_E = 0;
			; SOURCE LINE # 422
	CLR  	P2_2
; LCM_E = 1;
			; SOURCE LINE # 423
	SETB 	P2_2
?C0071:
; while (LCM_Data & Busy); //检测忙信号
			; SOURCE LINE # 424
	MOV  	A,P1
	JB   	ACC.7,?C0071
?C0072:
; return(LCM_Data);
			; SOURCE LINE # 425
	MOV  	R7,P1
; }
			; SOURCE LINE # 426
?C0073:
	RET  	
; END OF ReadStatusLCM

; 
; void LCMInit(void) //LCM初始化

	RSEG  ?PR?LCMInit?LCD_MAIN
LCMInit:
	USING	0
			; SOURCE LINE # 428
; {
			; SOURCE LINE # 429
; LCM_Data = 0;
			; SOURCE LINE # 430
	CLR  	A
	MOV  	P1,A
; WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
			; SOURCE LINE # 431
	MOV  	R5,A
	MOV  	R4,A
	MOV  	R7,#038H
	LCALL	_WriteCommandLCM
; Delay5Ms(); 
			; SOURCE LINE # 432
	LCALL	Delay5Ms
; WriteCommandLCM(0x38,0);
			; SOURCE LINE # 433
	CLR  	A
	MOV  	R5,A
	MOV  	R4,A
	MOV  	R7,#038H
	LCALL	_WriteCommandLCM
; Delay5Ms(); 
			; SOURCE LINE # 434
	LCALL	Delay5Ms
; WriteCommandLCM(0x38,0);
			; SOURCE LINE # 435
	CLR  	A
	MOV  	R5,A
	MOV  	R4,A
	MOV  	R7,#038H
	LCALL	_WriteCommandLCM
; Delay5Ms(); 
			; SOURCE LINE # 436
	LCALL	Delay5Ms
; 
; WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
			; SOURCE LINE # 438
	MOV  	R7,#038H
	LCALL	L?0119
; WriteCommandLCM(0x08,1); //关闭显示
			; SOURCE LINE # 439
	MOV  	R7,#08H
	LCALL	L?0119
; WriteCommandLCM(0x01,1); //显示清屏
			; SOURCE LINE # 440
	MOV  	R5,#01H
	MOV  	R4,#00H
	MOV  	R7,#01H
	LCALL	_WriteCommandLCM
; WriteCommandLCM(0x06,1); // 显示光标移动设置
			; SOURCE LINE # 441
	MOV  	R5,#01H
	MOV  	R4,#00H
	MOV  	R7,#06H
	LCALL	_WriteCommandLCM
; WriteCommandLCM(0x0C,1); // 显示开及光标设置
			; SOURCE LINE # 442
	MOV  	R5,#01H
	MOV  	R4,#00H
	MOV  	R7,#0CH
	LJMP 	_WriteCommandLCM
; END OF LCMInit

; }
; 
; //按指定位置显示一个字符
; void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)

	RSEG  ?PR?_DisplayOneChar?LCD_MAIN
_DisplayOneChar:
	USING	0
			; SOURCE LINE # 446
	MOV  	DData?845,R3
;---- Variable 'X?843' assigned to Register 'R7' ----
;---- Variable 'Y?844' assigned to Register 'R5' ----
; {
			; SOURCE LINE # 447
; Y &= 0x1;
			; SOURCE LINE # 448
	ANL  	AR5,#01H
; X &= 0xF; //限制X不能大于15,Y不能大于1
			; SOURCE LINE # 449
	ANL  	AR7,#0FH
; if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
			; SOURCE LINE # 450
	MOV  	A,R5
	JZ   	?C0075
	ORL  	AR7,#040H
?C0075:
; X |= 0x80; //算出指令码
			; SOURCE LINE # 451
	ORL  	AR7,#080H
; WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
			; SOURCE LINE # 452
	CLR  	A
	MOV  	R5,A
	MOV  	R4,A
	LCALL	_WriteCommandLCM
; WriteDataLCM(DData);
			; SOURCE LINE # 453
	MOV  	R7,DData?845
	LJMP 	_WriteDataLCM
; END OF _DisplayOneChar

; }
; 
; //按指定位置显示一串字符 (***原来的遇到空格0x20就不显示***)
; void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)

	RSEG  ?PR?_DisplayListChar?LCD_MAIN
_DisplayListChar:
	USING	0
			; SOURCE LINE # 457
	MOV  	X?946,R7
	MOV  	Y?947,R5
	MOV  	DData?948,R2
	MOV  	DData?948+01H,R3
; {
			; SOURCE LINE # 458
; 	unsigned char ListLength, j;
; 	ListLength = strlen(DData);	//计算要显示的字符串长度
			; SOURCE LINE # 460
	MOV  	R1,DData?948+01H
	MOV  	R3,#0FFH
	LCALL	_strlen
	MOV  	ListLength?949,R7
; 	Y &= 0x1;
			; SOURCE LINE # 461
	ANL  	Y?947,#01H
; 	X &= 0xF; //限制X不能大于15,Y不能大于1
			; SOURCE LINE # 462
	ANL  	X?946,#0FH
; 			if (X <= 0xF) //X坐标应小于0xF
			; SOURCE LINE # 463
	MOV  	A,X?946
	SETB 	C
	SUBB 	A,#0FH
	JNC  	?C0081
; 				{
			; SOURCE LINE # 464
; 					for (j=0;j<ListLength;j++)
			; SOURCE LINE # 465
	CLR  	A
	MOV  	j?950,A
?C0078:
	MOV  	A,j?950
	CLR  	C
	SUBB 	A,ListLength?949
	JNC  	?C0081
; 						{
			; SOURCE LINE # 466
; 							DisplayOneChar(X, Y, DData[j]); //显示单个字符
			; SOURCE LINE # 467
	MOV  	A,DData?948+01H
	ADD  	A,j?950
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,DData?948
	MOV  	DPH,A
	CLR  	A
	MOVC 	A,@A+DPTR
	MOV  	R3,A
	MOV  	R5,Y?947
	MOV  	R7,X?946
	LCALL	_DisplayOneChar
; 							X++;
			; SOURCE LINE # 468
	INC  	X?946
; 						}
			; SOURCE LINE # 469
	INC  	j?950
	SJMP 	?C0078
; 				}
			; SOURCE LINE # 470
; }
			; SOURCE LINE # 471
?C0081:
	RET  	
; END OF _DisplayListChar

; 
; //5ms延时
; void Delay5Ms(void)

	RSEG  ?PR?Delay5Ms?LCD_MAIN
Delay5Ms:
	USING	0
			; SOURCE LINE # 474
; {
			; SOURCE LINE # 475
; unsigned int TempCyc = 5552;
			; SOURCE LINE # 476
;---- Variable 'TempCyc?1051' assigned to Register 'R6/R7' ----
	MOV  	R7,#0B0H
	MOV  	R6,#015H
?C0082:
; while(TempCyc--);
			; SOURCE LINE # 477
	MOV  	A,R7
	DEC  	R7
	MOV  	R4,AR6
	JNZ  	?C0107
	DEC  	R6
?C0107:
	ORL  	A,R4
	JNZ  	?C0082
; }
			; SOURCE LINE # 478
?C0084:
	RET  	
; END OF Delay5Ms

; 
; //400ms延时
; void Delay400Ms(void)

	RSEG  ?PR?Delay400Ms?LCD_MAIN
Delay400Ms:

⌨️ 快捷键说明

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