📄 lcd_main.src
字号:
; .\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 + -