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

📄 lcd_main.src

📁 LCD显示温控器制作成功 参考了明浩的温度控制器V1.5和使用1602液晶显示和PS/2键盘的示例
💻 SRC
📖 第 1 页 / 共 4 页
字号:
; .\lcd_main.SRC generated from: lcd_main.c
; COMPILER INVOKED BY:
;        e:\Keil\C51\BIN\C51.EXE lcd_main.c BROWSE DEBUG OBJECTEXTEND SRC(.\lcd_main.SRC)

$NOMOD51

NAME	LCD_MAIN

P0	DATA	080H
P1	DATA	090H
P2	DATA	0A0H
P3	DATA	0B0H
AC	BIT	0D0H.6
T0	BIT	0B0H.4
T1	BIT	0B0H.5
EA	BIT	0A8H.7
IE	DATA	0A8H
P0_0	BIT	080H.0
P1_0	BIT	090H.0
P0_1	BIT	080H.1
FL	BIT	0D0H.1
P2_0	BIT	0A0H.0
P1_1	BIT	090H.1
P0_2	BIT	080H.2
P3_0	BIT	0B0H.0
P2_1	BIT	0A0H.1
P1_2	BIT	090H.2
P0_3	BIT	080H.3
P3_1	BIT	0B0H.1
P2_2	BIT	0A0H.2
P1_3	BIT	090H.3
P0_4	BIT	080H.4
P3_2	BIT	0B0H.2
P2_3	BIT	0A0H.3
P1_4	BIT	090H.4
P0_5	BIT	080H.5
RD	BIT	0B0H.7
P3_3	BIT	0B0H.3
P2_4	BIT	0A0H.4
P1_5	BIT	090H.5
P0_6	BIT	080H.6
P3_4	BIT	0B0H.4
P2_5	BIT	0A0H.5
P1_6	BIT	090H.6
P0_7	BIT	080H.7
P3_5	BIT	0B0H.5
ES	BIT	0A8H.4
P2_6	BIT	0A0H.6
P1_7	BIT	090H.7
P3_6	BIT	0B0H.6
P2_7	BIT	0A0H.7
IP	DATA	0B8H
P3_7	BIT	0B0H.7
RI	BIT	098H.0
CY	BIT	0D0H.7
INT0	BIT	0B0H.2
INT1	BIT	0B0H.3
TI	BIT	098H.1
PS	BIT	0B8H.4
SP	DATA	081H
OV	BIT	0D0H.2
WR	BIT	0B0H.6
SBUF	DATA	099H
PCON	DATA	087H
SCON	DATA	098H
TMOD	DATA	089H
TCON	DATA	088H
IE0	BIT	088H.1
IE1	BIT	088H.3
B	DATA	0F0H
ACC	DATA	0E0H
ET0	BIT	0A8H.1
ET1	BIT	0A8H.3
TF0	BIT	088H.5
ET2	BIT	0A8H.5
TF1	BIT	088H.7
RB8	BIT	098H.2
TH0	DATA	08CH
EX0	BIT	0A8H.0
IT0	BIT	088H.0
TH1	DATA	08DH
EX1	BIT	0A8H.2
TB8	BIT	098H.3
IT1	BIT	088H.2
P	BIT	0D0H.0
SM0	BIT	098H.7
TL0	DATA	08AH
SM1	BIT	098H.6
TL1	DATA	08BH
SM2	BIT	098H.5
PT0	BIT	0B8H.1
RS0	BIT	0D0H.3
PT1	BIT	0B8H.3
RS1	BIT	0D0H.4
PT2	BIT	0B8H.5
TR0	BIT	088H.4
TR1	BIT	088H.6
PX0	BIT	0B8H.0
PX1	BIT	0B8H.2
DPH	DATA	083H
DPL	DATA	082H
REN	BIT	098H.4
RXD	BIT	0B0H.0
TXD	BIT	0B0H.1
F0	BIT	0D0H.5
PSW	DATA	0D0H
?PR?main?LCD_MAIN    SEGMENT CODE 
?PR?KeyAndDis_Time0?LCD_MAIN             SEGMENT CODE 
?PR?V2ToV?LCD_MAIN   SEGMENT CODE 
?PR?_WriteDataLCM?LCD_MAIN               SEGMENT CODE 
?DT?_WriteDataLCM?LCD_MAIN               SEGMENT DATA OVERLAYABLE 
?PR?_WriteCommandLCM?LCD_MAIN            SEGMENT CODE 
?DT?_WriteCommandLCM?LCD_MAIN            SEGMENT DATA OVERLAYABLE 
?PR?ReadDataLCM?LCD_MAIN                 SEGMENT CODE 
?PR?ReadStatusLCM?LCD_MAIN               SEGMENT CODE 
?PR?LCMInit?LCD_MAIN SEGMENT CODE 
?PR?_DisplayOneChar?LCD_MAIN             SEGMENT CODE 
?DT?_DisplayOneChar?LCD_MAIN             SEGMENT DATA OVERLAYABLE 
?PR?_DisplayListChar?LCD_MAIN            SEGMENT CODE 
?DT?_DisplayListChar?LCD_MAIN            SEGMENT DATA OVERLAYABLE 
?PR?Delay5Ms?LCD_MAIN                    SEGMENT CODE 
?PR?Delay400Ms?LCD_MAIN                  SEGMENT CODE 
?PR?InitDS1820?LCD_MAIN                  SEGMENT CODE 
?PR?ROMDS1820?LCD_MAIN                   SEGMENT CODE 
?PR?TMVDS1820?LCD_MAIN                   SEGMENT CODE 
?PR?TMRDS1820?LCD_MAIN                   SEGMENT CODE 
?PR?TMWDS1820?LCD_MAIN                   SEGMENT CODE 
?PR?TMREDS1820?LCD_MAIN                  SEGMENT CODE 
?PR?TMERDS1820?LCD_MAIN                  SEGMENT CODE 
?PR?WriteDS1820?LCD_MAIN                 SEGMENT CODE 
?PR?ReadDS1820?LCD_MAIN                  SEGMENT CODE 
?PR?Delay_510?LCD_MAIN                   SEGMENT CODE 
?PR?Delay_110?LCD_MAIN                   SEGMENT CODE 
?PR?Delay_10ms?LCD_MAIN                  SEGMENT CODE 
?PR?Delay_4s?LCD_MAIN                    SEGMENT CODE 
?C_INITSEG           SEGMENT CODE 
?CO?LCD_MAIN         SEGMENT CODE 
?DT?LCD_MAIN         SEGMENT DATA 
?BA?LCD_MAIN         SEGMENT DATA BITADDRESSABLE 
	EXTRN	CODE (_strlen)
	EXTRN	CODE (?C_STARTUP)
	EXTRN	CODE (?C?SCDIV)
	PUBLIC	cur_temper_set
	PUBLIC	i
	PUBLIC	PowTF
	PUBLIC	SetTF
	PUBLIC	KeyTF
	PUBLIC	cur_temper
	PUBLIC	KeySETDown
	PUBLIC	BF
	PUBLIC	DS1820ON
	PUBLIC	email
	PUBLIC	cdle_net
	PUBLIC	LCDDis
	PUBLIC	Delay_4s
	PUBLIC	Delay_10ms
	PUBLIC	Delay_110
	PUBLIC	Delay_510
	PUBLIC	ReadDS1820
	PUBLIC	WriteDS1820
	PUBLIC	TMERDS1820
	PUBLIC	TMREDS1820
	PUBLIC	TMWDS1820
	PUBLIC	TMRDS1820
	PUBLIC	TMVDS1820
	PUBLIC	ROMDS1820
	PUBLIC	InitDS1820
	PUBLIC	Delay400Ms
	PUBLIC	Delay5Ms
	PUBLIC	_DisplayListChar
	PUBLIC	_DisplayOneChar
	PUBLIC	LCMInit
	PUBLIC	ReadStatusLCM
	PUBLIC	ReadDataLCM
	PUBLIC	_WriteCommandLCM
	PUBLIC	_WriteDataLCM
	PUBLIC	V2ToV
	PUBLIC	KeyAndDis_Time0
	PUBLIC	main

	DSEG  AT  026H
         TMSetV:   DS   1

	DSEG  AT  027H
         TMRomV:   DS   1

	DSEG  AT  028H
            THV:   DS   1

	DSEG  AT  029H
            TLV:   DS   1

	RSEG  ?DT?_WriteCommandLCM?LCD_MAIN
?_WriteCommandLCM?BYTE:
      WCLCM?441:   DS   1

	RSEG  ?DT?_WriteDataLCM?LCD_MAIN
?_WriteDataLCM?BYTE:
      WDLCM?340:   DS   1

	RSEG  ?DT?_DisplayListChar?LCD_MAIN
?_DisplayListChar?BYTE:
          X?946:   DS   1
          Y?947:   DS   1
      DData?948:   DS   2
	ORG  4
 ListLength?949:   DS   1
          j?950:   DS   1

	RSEG  ?DT?_DisplayOneChar?LCD_MAIN
?_DisplayOneChar?BYTE:
      DData?845:   DS   1

	RSEG  ?DT?LCD_MAIN
           KeyV:   DS   1
    LCD_One_set:   DS   1
             BF:   DS   1
        IntNum2:   DS   1
        IntNum3:   DS   1
           Sign:   DS   1
         KSDNum:   DS   1
       TempKeyV:   DS   1
    LCD_Two_set:   DS   1
       Sign_Set:   DS   1
      LCD_Three:   DS   1
     cur_temper:   DS   17
        LCD_One:   DS   1
  LCD_Three_set:   DS   1
         IntNum:   DS   1
              i:   DS   1
 cur_temper_set:   DS   17
        LCD_Two:   DS   1
            TMV:   DS   1

	RSEG  ?BA?LCD_MAIN
       StateREG:   DS   1
DS1820ON	EQU	(StateREG+0).0
KeySETDown	EQU	(StateREG+0).2
KeyTF	EQU	(StateREG+0).4
SetTF	EQU	(StateREG+0).1
PowTF	EQU	(StateREG+0).3

	RSEG  ?CO?LCD_MAIN
LCDDis:
	DB	030H
	DB	031H
	DB	032H
	DB	033H
	DB	034H
	DB	035H
	DB	036H
	DB	037H
	DB	038H
	DB	039H
	DB	020H
	DB	02DH

cdle_net:
	DB  ' ' ,' ' ,' ' ,' ' ,'W' ,'e' ,'l' ,'l' ,'C' ,'o' 
	DB  'm' ,'e' ,'!' ,' ' ,' ' ,' ' ,000H


email:
	DB  ' ' ,'P' ,'r' ,'e' ,'s' ,'s' ,' ' ,'P' ,'o' ,'w' 
	DB  'e' ,'r' ,' ' ,'K' ,'e' ,'y' ,000H



	RSEG  ?C_INITSEG
	DB	011H
	DB	cur_temper
	DB  'C' ,'u' ,'r' ,'r' ,'e' ,'n' ,'t' ,' ' ,'T' ,'e' 
	DB  'm' ,'p' ,':' ,' ' ,' ' ,' ' ,000H


	DB	011H
	DB	cur_temper_set
	DB  'T' ,'_' ,'S' ,'e' ,'t' ,':' ,' ' ,' ' ,' ' ,' ' 
	DB  ' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,000H


	DB	001H
	DB	BF
	DB	000H

; /*----------------------------------------------------------------
;                 
; 					***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)

	RSEG  ?PR?main?LCD_MAIN
main:
	USING	0
			; SOURCE LINE # 72
; {
			; SOURCE LINE # 73
; 	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;   //初始化变量
			; SOURCE LINE # 89
	CLR  	A
	MOV  	StateREG,A
; 	//SetTF = 1;	
; 	PowTF = 1;			//关电源
			; SOURCE LINE # 91
	SETB 	PowTF
; 	//KeyTF = 1;
; 	THV = 0;
			; SOURCE LINE # 93
	MOV  	THV,A
; 	TLV = 0;
			; SOURCE LINE # 94
	MOV  	TLV,A
; 	TMV = 0;
			; SOURCE LINE # 95
	MOV  	TMV,A
; 	KeyV = 0;
			; SOURCE LINE # 96
	MOV  	KeyV,A
; 	TempKeyV = 0;
			; SOURCE LINE # 97
	MOV  	TempKeyV,A
; 	KSDNum = 0;
			; SOURCE LINE # 98
	MOV  	KSDNum,A
; 	IntNum = 0;
			; SOURCE LINE # 99
	MOV  	IntNum,A
; 	IntNum2 = 0;
			; SOURCE LINE # 100
	MOV  	IntNum2,A
; 	IntNum3 = 0;
			; SOURCE LINE # 101
	MOV  	IntNum3,A
; 
; 
; 	
; 	InitDS1820(); //初始化
			; SOURCE LINE # 105
	LCALL	InitDS1820
; 	ROMDS1820(); 	//跳过ROM
			; SOURCE LINE # 106
	LCALL	ROMDS1820
; 	TMERDS1820();  //E2PRAM中温度上限值调入RAM
			; SOURCE LINE # 107
	LCALL	TMERDS1820
; 	InitDS1820(); //初始化
			; SOURCE LINE # 108
	LCALL	InitDS1820
; 	ROMDS1820(); 	//跳过ROM
			; SOURCE LINE # 109
	LCALL	ROMDS1820
; 	TMRDS1820(); 	//读出温度指令
			; SOURCE LINE # 110
	LCALL	TMRDS1820
; 	ReadDS1820(); //读出温度值和上限值
			; SOURCE LINE # 111
	LCALL	ReadDS1820
; 	TMSetV = TMRomV;  //拷贝保存在DS18B20ROM里的上限值到TMSetV
			; SOURCE LINE # 112
	MOV  	TMSetV,TMRomV
; 
; 	Delay400Ms(); //启动等待,等LCM讲入工作状态
			; SOURCE LINE # 114
	LCALL	Delay400Ms
; 	LCMInit(); //LCM初始化
			; SOURCE LINE # 115
	LCALL	LCMInit
; 	Delay5Ms(); //延时片刻(可不要)
			; SOURCE LINE # 116
	LCALL	Delay5Ms
; 
; 	EA = 1;					//允许CPU中断
			; SOURCE LINE # 118
	SETB 	EA
; 	ET0 = 1; 				//定时器0中断打开
			; SOURCE LINE # 119
	SETB 	ET0
; 	TMOD = 0x1;			//设定时器0为模式1,16位模式
			; SOURCE LINE # 120
	MOV  	TMOD,#01H
; 	TH0=0xB1;
			; SOURCE LINE # 121
	MOV  	TH0,#0B1H
; 	TL0=0xDF;				//设定时值为20000us(20ms)
			; SOURCE LINE # 122
	MOV  	TL0,#0DFH
; 	TR0 = 1;				//开始定时
			; SOURCE LINE # 123
	SETB 	TR0
?C0003:
; 
; 	do
; 		{
			; SOURCE LINE # 126
; 			if (BF==0)
			; SOURCE LINE # 127
	MOV  	A,BF
	JNZ  	?C0004
; 				{
			; SOURCE LINE # 128
; 					DisplayListChar(0, 0, cdle_net);	//显示欢迎信息
			; SOURCE LINE # 129
	MOV  	R2,#HIGH (cdle_net)
	MOV  	R3,#LOW (cdle_net)
	MOV  	R5,A
	MOV  	R7,A
	LCALL	_DisplayListChar
; 					DisplayListChar(0, 1, email);
			; SOURCE LINE # 130
	MOV  	R2,#HIGH (email)
	MOV  	R3,#LOW (email)
	MOV  	R5,#01H
	CLR  	A
	MOV  	R7,A
	LCALL	_DisplayListChar
; 					Delay_4s();
			; SOURCE LINE # 131
	LCALL	Delay_4s
; 					//PowTF = 1;
; 					EA=1;
			; SOURCE LINE # 133
	SETB 	EA
; 				}
			; SOURCE LINE # 134
?C0004:
; 			if (BF==1)
			; SOURCE LINE # 135
	MOV  	A,BF
	CJNE 	A,#01H,?C0003
; 				{
			; SOURCE LINE # 136
; 					for (i=0;i<16;i++)
			; SOURCE LINE # 137
	CLR  	A
	MOV  	i,A
?C0006:
; 						{
			; SOURCE LINE # 138
; 							DisplayOneChar(i,0,cur_temper[i]);//LCD的第1行显示当前温度
			; SOURCE LINE # 139
	MOV  	A,#LOW (cur_temper)
	ADD  	A,i
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	R3,A
	CLR  	A
	MOV  	R5,A
	MOV  	R7,i
	LCALL	_DisplayOneChar
; 						}
			; SOURCE LINE # 140
	INC  	i
	MOV  	A,i
	CLR  	C
	SUBB 	A,#010H
	JC   	?C0006
?C0007:
; 					for (i=0;i<16;i++)
			; SOURCE LINE # 141
	CLR  	A
	MOV  	i,A
?C0009:
; 						{
			; SOURCE LINE # 142
; 							DisplayOneChar(i,1,cur_temper_set[i]);//LCD的第二行显示设置温度和继电器状态
			; SOURCE LINE # 143
	MOV  	A,#LOW (cur_temper_set)
	ADD  	A,i
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	R3,A
	MOV  	R5,#01H
	MOV  	R7,i
	LCALL	_DisplayOneChar
; 						}
			; SOURCE LINE # 144
	INC  	i
	MOV  	A,i
	CLR  	C
	SUBB 	A,#010H
	JC   	?C0009
?C0010:
; 					//ReadDataLCM();//测试用句无意义	
; 					EA=1;
			; SOURCE LINE # 146
	SETB 	EA
; 				}
			; SOURCE LINE # 147
; 		}
			; SOURCE LINE # 148
; 	while(1);
			; SOURCE LINE # 149
	SJMP 	?C0003
; END OF main

CSEG	AT	0000BH
	LJMP	KeyAndDis_Time0

; }
; 
; //定时器0中断外理中键扫描和处理要显示的值
; void KeyAndDis_Time0(void) interrupt 1 using 2

	RSEG  ?PR?KeyAndDis_Time0?LCD_MAIN
	USING	2
KeyAndDis_Time0:
	PUSH 	ACC
	PUSH 	B
	PUSH 	DPH
	PUSH 	DPL
	PUSH 	PSW
	USING	2
	MOV  	PSW,#010H
			; SOURCE LINE # 153
; {
; 	TH0=0xB1;
			; SOURCE LINE # 155
	MOV  	TH0,#0B1H
; 	TL0=0xDF;				//设定时值为20000us(20ms)
			; SOURCE LINE # 156
	MOV  	TL0,#0DFH
; 
; 	if (!Key_UP)	KeyV = 1;
			; SOURCE LINE # 158
	JB   	P2_3,?C0013
	MOV  	KeyV,#01H
?C0013:

⌨️ 快捷键说明

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