📄 z1602.src
字号:
; Z1602.SRC generated from: Z1602.c
$NOMOD51
NAME Z1602
P0 DATA 080H
P1 DATA 090H
P2 DATA 0A0H
P3 DATA 0B0H
T0 BIT 0B0H.4
AC BIT 0D0H.6
T1 BIT 0B0H.5
EA BIT 0A8H.7
IE DATA 0A8H
RD BIT 0B0H.7
ES BIT 0A8H.4
IP DATA 0B8H
RI BIT 098H.0
INT0 BIT 0B0H.2
CY BIT 0D0H.7
TI BIT 098H.1
INT1 BIT 0B0H.3
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
TF1 BIT 088H.7
RB8 BIT 098H.2
TH0 DATA 08CH
EX0 BIT 0A8H.0
IT0 BIT 088H.0
TH1 DATA 08DH
TB8 BIT 098H.3
EX1 BIT 0A8H.2
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
PT1 BIT 0B8H.3
RS0 BIT 0D0H.3
TR0 BIT 088H.4
RS1 BIT 0D0H.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?Z1602 SEGMENT CODE
?DT?main?Z1602 SEGMENT DATA OVERLAYABLE
?PR?_ePutstr?Z1602 SEGMENT CODE
?DT?_ePutstr?Z1602 SEGMENT DATA OVERLAYABLE
?PR?_Display?Z1602 SEGMENT CODE
?DT?_Display?Z1602 SEGMENT DATA OVERLAYABLE
?PR?_LocateXY?Z1602 SEGMENT CODE
?PR?_DispOneChar?Z1602 SEGMENT CODE
?DT?_DispOneChar?Z1602 SEGMENT DATA OVERLAYABLE
?PR?LcdReset?Z1602 SEGMENT CODE
?PR?_LcdWriteCommand?Z1602 SEGMENT CODE
?PR?_LcdWriteData?Z1602 SEGMENT CODE
?PR?Delay5Ms?Z1602 SEGMENT CODE
?PR?Delay400Ms?Z1602 SEGMENT CODE
?CO?Z1602 SEGMENT CODE
EXTRN CODE (?C_STARTUP)
PUBLIC Lcd1602WdataPort
PUBLIC Lcd1602CmdPort
PUBLIC Lcd1602StatusPort
PUBLIC exampl
PUBLIC Delay400Ms
PUBLIC Delay5Ms
PUBLIC _LcdWriteData
PUBLIC _LcdWriteCommand
PUBLIC LcdReset
PUBLIC _DispOneChar
PUBLIC _LocateXY
PUBLIC _Display
PUBLIC _ePutstr
PUBLIC main
XSEG AT 07DFFH
Lcd1602StatusPort: DS 1
XSEG AT 07CFFH
Lcd1602CmdPort: DS 1
XSEG AT 07EFFH
Lcd1602WdataPort: DS 1
RSEG ?DT?_DispOneChar?Z1602
?_DispOneChar?BYTE:
Wdata?453: DS 1
RSEG ?DT?main?Z1602
?main?BYTE:
temp?040: DS 1
RSEG ?DT?_Display?Z1602
?_Display?BYTE:
dd?246: DS 1
ORG 1
i?247: DS 1
RSEG ?DT?_ePutstr?Z1602
?_ePutstr?BYTE:
x?141: DS 1
y?142: DS 1
ptr?143: DS 2
ORG 4
i?144: DS 1
l?145: DS 1
RSEG ?CO?Z1602
exampl:
DB 'F' ,'o' ,'r' ,' ' ,'a' ,'n' ,' ' ,'e' ,'x' ,'a'
DB 'm' ,'p' ,'l' ,'e' ,'.' ,' ' ,' ' ,' ' ,' ' ,' '
DB '-' ,' ' ,'B' ,'y' ,' ' ,'x' ,'i' ,'a' ,'o' ,'q'
DB 'i' ,00AH,000H
; /*===========================================================================
;
; KS0070(44780) 16x2 字符液晶屏驱动演示程序总线方式 晓奇
; =============================================================================
; 连接线图: LCM-------51 LCM-------51 LCM--------51
; DB0-----P0.0 DB4-----P0.4 RW-------P2.0
; DB1-----P0.1 DB5-----P0.5 RC-------P2.1
; DB2-----P0.2 DB6-----P0.6 E--------P2.7 =>74ls00+wr+rd
; DB3-----P0.3 DB7-----P0.7 VLCD接1K2电阻到GND
;
; [注]:AT89C51的晶振频率为12MHz
; ============================================================================*/
; #pragma src // 产生汇编文件
; #include <reg51.h>
; #include<intrins.h>
;
; //========= 变量类型标识的宏定义,大家都喜欢这么做 ==============
; #define Uchar unsigned char
; #define Uint unsigned int
;
; // ================= LCM1602A端口地址定义 =======================
; char xdata Lcd1602CmdPort _at_ 0x7cff; //E=1 RS=0 RW=0
; char xdata Lcd1602WdataPort _at_ 0x7eff; //E =1 RS=1 RW=0
; char xdata Lcd1602StatusPort _at_ 0x7dff; //CS=1 RS=0 RW=1
;
; #define Busy 0x80 // 忙判别位
;
;
; code char exampl[]="For an example. - By xiaoqi\n";
;
; void Delay400Ms(void);
; void Delay5Ms(void);
; void LcdWriteData( char dataW );
; void LcdWriteCommand( Uchar CMD,Uchar AttribC );
; void LcdReset( void );
; void Display( Uchar dd );
; void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
; void ePutstr(Uchar x,Uchar y, Uchar code *ptr);
;
; //================ 随便写几句测试主程序 ================
; void main(void)
RSEG ?PR?main?Z1602
main:
USING 0
; SOURCE LINE # 41
; {
; SOURCE LINE # 42
; Uchar temp;
;
; Delay400Ms(); // 启动时必须的延时,等待lcm进入工作状态
; SOURCE LINE # 45
LCALL Delay400Ms
;
; LcdReset(); // 这也是必需的....初始化
; SOURCE LINE # 47
LCALL LcdReset
; temp = 32;
; SOURCE LINE # 48
MOV temp?040,#020H
; ePutstr(0,0,exampl); // 上面一行显示一个预定字符串
; SOURCE LINE # 49
MOV R2,#HIGH (exampl)
MOV R3,#LOW (exampl)
CLR A
MOV R5,A
MOV R7,A
LCALL _ePutstr
;
; Delay400Ms(); // 保留显示内容
; SOURCE LINE # 51
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 52
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 53
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 54
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 55
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 56
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 57
LCALL Delay400Ms
; Delay400Ms();
; SOURCE LINE # 58
LCALL Delay400Ms
?C0001:
;
; while(1)
; SOURCE LINE # 60
; {
; SOURCE LINE # 61
; temp &= 0x7f; // 只显示ASCII字符
; SOURCE LINE # 62
ANL temp?040,#07FH
;
; if (temp<32)temp=32; // 屏蔽控制字符,不予显示
; SOURCE LINE # 64
MOV A,temp?040
CLR C
SUBB A,#020H
JNC ?C0003
MOV temp?040,#020H
?C0003:
; Display( temp++ );
; SOURCE LINE # 65
MOV R7,temp?040
INC temp?040
LCALL _Display
;
; Delay400Ms();
; SOURCE LINE # 67
LCALL Delay400Ms
; }
; SOURCE LINE # 68
SJMP ?C0001
; END OF main
; }
;
; /*=======================================================
; 显示字符串
; =======================================================*/
; void ePutstr(Uchar x,Uchar y, Uchar code *ptr) {
RSEG ?PR?_ePutstr?Z1602
_ePutstr:
USING 0
; SOURCE LINE # 74
MOV x?141,R7
MOV y?142,R5
MOV ptr?143,R2
MOV ptr?143+01H,R3
; Uchar i,l=0;
; SOURCE LINE # 75
CLR A
MOV l?145,A
?C0005:
; while (ptr[l] >31){l++;};
; SOURCE LINE # 76
MOV A,ptr?143+01H
ADD A,l?145
MOV DPL,A
CLR A
ADDC A,ptr?143
MOV DPH,A
CLR A
MOVC A,@A+DPTR
SETB C
SUBB A,#01FH
JC ?C0006
INC l?145
SJMP ?C0005
?C0006:
; for (i=0;i<l;i++) {
; SOURCE LINE # 77
CLR A
MOV i?144,A
?C0007:
MOV A,i?144
CLR C
SUBB A,l?145
JNC ?C0011
; DispOneChar(x++,y,ptr[i]);
; SOURCE LINE # 78
MOV R7,x?141
INC x?141
MOV A,ptr?143+01H
ADD A,i?144
MOV DPL,A
CLR A
ADDC A,ptr?143
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV R3,A
MOV R5,y?142
LCALL _DispOneChar
; if ( x == 16 ){
; SOURCE LINE # 79
MOV A,x?141
CJNE A,#010H,?C0009
; x = 0; y ^= 1;
; SOURCE LINE # 80
CLR A
MOV x?141,A
XRL y?142,#01H
; }
; SOURCE LINE # 81
; }
; SOURCE LINE # 82
?C0009:
INC i?144
SJMP ?C0007
; }
; SOURCE LINE # 83
?C0011:
RET
; END OF _ePutstr
;
; /*=======================================================
; 演示一行连续字符串,配合上位程序演示移动字串
; =======================================================*/
; void Display( Uchar dd ) {
RSEG ?PR?_Display?Z1602
_Display:
USING 0
; SOURCE LINE # 88
MOV dd?246,R7
;
; Uchar i;
;
; for (i=0;i<16;i++) {
; SOURCE LINE # 92
CLR A
MOV i?247,A
?C0012:
;
; DispOneChar(i,1,dd++);
; SOURCE LINE # 94
MOV R3,dd?246
INC dd?246
MOV R5,#01H
MOV R7,i?247
LCALL _DispOneChar
;
; dd &= 0x7f;
; SOURCE LINE # 96
ANL dd?246,#07FH
; if (dd<32) dd=32;
; SOURCE LINE # 97
MOV A,dd?246
CLR C
SUBB A,#020H
JNC ?C0014
MOV dd?246,#020H
; }
; SOURCE LINE # 98
?C0014:
INC i?247
MOV A,i?247
CLR C
SUBB A,#010H
JC ?C0012
; }
; SOURCE LINE # 99
?C0016:
RET
; END OF _Display
;
; /*=======================================================
; 显示光标定位
; =======================================================*/
; void LocateXY( char posx,char posy) {
RSEG ?PR?_LocateXY?Z1602
_LocateXY:
USING 0
; SOURCE LINE # 104
;---- Variable 'posy?349' assigned to Register 'R5' ----
;---- Variable 'posx?348' assigned to Register 'R7' ----
;
; Uchar temp;
;
; temp = posx & 0xf;
; SOURCE LINE # 108
MOV A,R7
ANL A,#0FH
MOV R7,A
;---- Variable 'temp?350' assigned to Register 'R7' ----
; posy &= 0x1;
; SOURCE LINE # 109
ANL AR5,#01H
; if ( posy )temp |= 0x40;
; SOURCE LINE # 110
MOV A,R5
JZ ?C0017
ORL AR7,#040H
?C0017:
; temp |= 0x80;
; SOURCE LINE # 111
ORL AR7,#080H
; LcdWriteCommand(temp,0);
; SOURCE LINE # 112
CLR A
MOV R5,A
LJMP _LcdWriteCommand
; END OF _LocateXY
; }
;
; /*=======================================================
; 按指定位置显示数出一个字符
; =======================================================*/
; void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {
RSEG ?PR?_DispOneChar?Z1602
_DispOneChar:
USING 0
; SOURCE LINE # 118
MOV Wdata?453,R3
;---- Variable 'y?452' assigned to Register 'R5' ----
;---- Variable 'x?451' assigned to Register 'R7' ----
;
; LocateXY( x, y ); // 定位显示地址
; SOURCE LINE # 120
LCALL _LocateXY
; LcdWriteData( Wdata ); // 写字符
; SOURCE LINE # 121
MOV R7,Wdata?453
LJMP _LcdWriteData
; END OF _DispOneChar
; }
;
; /*=======================================================
; 初始化程序, 必须按照产品资料介绍的初始化过程进行
; =======================================================*/
; void LcdReset( void ) {
RSEG ?PR?LcdReset?Z1602
LcdReset:
USING 0
; SOURCE LINE # 127
;
; LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
; SOURCE LINE # 129
LCALL L?0038
; Delay5Ms();
; SOURCE LINE # 130
LCALL Delay5Ms
; LcdWriteCommand( 0x38, 0); // 共三次
; SOURCE LINE # 131
LCALL L?0038
; Delay5Ms();
; SOURCE LINE # 132
LCALL Delay5Ms
; LcdWriteCommand( 0x38, 0);
; SOURCE LINE # 133
LCALL L?0039
; Delay5Ms();
; SOURCE LINE # 134
LCALL Delay5Ms
;
; LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
; SOURCE LINE # 136
MOV R5,#01H
MOV R7,#038H
LCALL _LcdWriteCommand
; LcdWriteCommand( 0x08, 1); // 显示关闭
; SOURCE LINE # 137
MOV R5,#01H
MOV R7,#08H
LCALL _LcdWriteCommand
; LcdWriteCommand( 0x01, 1); // 显示清屏
; SOURCE LINE # 138
MOV R5,#01H
MOV R7,#01H
LCALL _LcdWriteCommand
; LcdWriteCommand( 0x06, 1); // 显示光标移动设置
; SOURCE LINE # 139
MOV R5,#01H
MOV R7,#06H
LCALL _LcdWriteCommand
; LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
; SOURCE LINE # 140
MOV R5,#01H
MOV R7,#0CH
LJMP _LcdWriteCommand
; END OF LcdReset
; }
;
; /*=======================================================
; 写控制字符子程序: E=1 RS=0 RW=0
; =======================================================*/
; void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
RSEG ?PR?_LcdWriteCommand?Z1602
L?0038:
USING 0
L?0039:
CLR A
MOV R5,A
MOV R7,#038H
_LcdWriteCommand:
; SOURCE LINE # 146
;---- Variable 'AttribC?655' assigned to Register 'R5' ----
;---- Variable 'CMD?654' assigned to Register 'R7' ----
;
; if (AttribC) while( Lcd1602StatusPort & Busy ); // 检测忙信号?
; SOURCE LINE # 148
MOV A,R5
JZ ?C0021
?C0022:
MOV DPTR,#Lcd1602StatusPort
MOVX A,@DPTR
JB ACC.7,?C0022
?C0021:
; Lcd1602CmdPort = CMD;
; SOURCE LINE # 149
MOV DPTR,#Lcd1602CmdPort
MOV A,R7
MOVX @DPTR,A
; }
; SOURCE LINE # 150
RET
; END OF _LcdWriteCommand
;
; /*=======================================================
; 当前位置写字符子程序: E =1 RS=1 RW=0
; =======================================================*/
; void LcdWriteData( char dataW ) {
RSEG ?PR?_LcdWriteData?Z1602
_LcdWriteData:
; SOURCE LINE # 155
;---- Variable 'dataW?756' assigned to Register 'R7' ----
?C0025:
;
; while( Lcd1602StatusPort & Busy ); // 检测忙信号
; SOURCE LINE # 157
MOV DPTR,#Lcd1602StatusPort
MOVX A,@DPTR
JB ACC.7,?C0025
?C0026:
; Lcd1602WdataPort = dataW;
; SOURCE LINE # 158
MOV DPTR,#Lcd1602WdataPort
MOV A,R7
MOVX @DPTR,A
; }
; SOURCE LINE # 159
RET
; END OF _LcdWriteData
;
; // 短延时
; void Delay5Ms(void)
RSEG ?PR?Delay5Ms?Z1602
Delay5Ms:
USING 0
; SOURCE LINE # 162
; {
; SOURCE LINE # 163
; Uint i = 5552;
; SOURCE LINE # 164
;---- Variable 'i?857' assigned to Register 'R6/R7' ----
MOV R7,#0B0H
MOV R6,#015H
?C0028:
; while(i--);
; SOURCE LINE # 165
MOV A,R7
DEC R7
MOV R4,AR6
JNZ ?C0036
DEC R6
?C0036:
ORL A,R4
JNZ ?C0028
; }
; SOURCE LINE # 166
?C0030:
RET
; END OF Delay5Ms
;
; //长延时
; void Delay400Ms(void)
RSEG ?PR?Delay400Ms?Z1602
Delay400Ms:
USING 0
; SOURCE LINE # 169
;---- Variable 'j?959' assigned to Register 'R6/R7' ----
;---- Variable 'i?958' assigned to Register 'R5' ----
; {
; SOURCE LINE # 170
; Uchar i = 5;
; SOURCE LINE # 171
MOV R5,#05H
?C0031:
; Uint j;
; while(i--)
; SOURCE LINE # 173
MOV R4,AR5
DEC R5
MOV A,R4
JZ ?C0035
; {
; SOURCE LINE # 174
; j=7269;
; SOURCE LINE # 175
MOV R6,#01CH
MOV R7,#065H
?C0033:
; while(j--);
; SOURCE LINE # 176
MOV A,R7
DEC R7
MOV R2,AR6
JNZ ?C0037
DEC R6
?C0037:
ORL A,R2
JZ ?C0031
SJMP ?C0033
; };
; SOURCE LINE # 177
; }
; SOURCE LINE # 178
?C0035:
RET
; END OF Delay400Ms
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -