📄 z1602.lst
字号:
C51 COMPILER V6.20c Z1602 11/30/2001 16:58:17 PAGE 1
C51 COMPILER V6.20c, COMPILATION OF MODULE Z1602
OBJECT MODULE PLACED IN Z1602.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE Z1602.c DEBUG OBJECTEXTEND CODE
stmt level source
1 /*===================================================================
2
3 KS0070(44780) 16x2 字符液晶屏驱动演示程序 晓奇
4 =====================================================================
5 连接线图: LCM-------51 LCM-------51 LCM--------51
6 DB0-----P0.0 DB4-----P0.4 RS-------P2.0
7 DB1-----P0.1 DB5-----P0.5 RW-------P2.1
8 DB2-----P0.2 DB6-----P0.6 E--------P2.7
9 DB3-----P0.3 DB7-----P0.7 VLCD接1K2电阻到GND
10
11 [注]:AT89C51的晶振频率为12MHz
12 ====================================================================*/
13
14 #include <reg51.h>
15 #include<intrins.h>
16
17 //变量类型标识的宏定义,大家都喜欢这么做
18 #define Uchar unsigned char
19 #define Uint unsigned int
20
21 // 控制引脚定义,不同的连接必须修改的部分
22 sbit RS = P2^0;
23 sbit RW = P2^1;
24 sbit Elcm = P2^7;
25 #define DataPort P0 // 数据端口
26
27 #define Busy 0x80
28
29
30 code char exampl[]="For an example. - By xiaoqi\n";
31
32 void Delay400Ms(void);
33 void Delay5Ms(void);
34 void WaitForEnable( void );
35 void LcdWriteData( char dataW );
36 void LcdWriteCommand( Uchar CMD,Uchar AttribC );
37 void LcdReset( void );
38 void Display( Uchar dd );
39 void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
40 void ePutstr(Uchar x,Uchar y, Uchar code *ptr);
41
42 //测试主程序
43 void main(void)
44 {
45 1 Uchar temp;
46 1
47 1 Delay400Ms();
48 1
49 1 LcdReset();
50 1 temp = 32;
51 1 ePutstr(0,0,exampl); // 上面一行显示一个预定字符串
52 1
53 1 Delay400Ms();
54 1 Delay400Ms();
55 1 Delay400Ms();
C51 COMPILER V6.20c Z1602 11/30/2001 16:58:17 PAGE 2
56 1 Delay400Ms();
57 1 Delay400Ms();
58 1 Delay400Ms();
59 1 Delay400Ms();
60 1 Delay400Ms();
61 1
62 1 while(1)
63 1 {
64 2 temp &= 0x7f; // 只显示ASCII字符
65 2 if (temp<32)temp=32; // 屏蔽控制字符,不予显示
66 2 Display( temp++ );
67 2 Delay400Ms();
68 2 }
69 1 }
70
71 /*=======================================================
72 显示字符串
73 =======================================================*/
74 void ePutstr(Uchar x,Uchar y, Uchar code *ptr) {
75 1 Uchar i,l=0;
76 1 while (ptr[l] >31){l++;};
77 1 for (i=0;i<l;i++) {
78 2 DispOneChar(x++,y,ptr[i]);
79 2 if ( x == 16 ){
80 3 x = 0; y ^= 1;
81 3 }
82 2 }
83 1 }
84
85 /*=======================================================
86 演示一行连续字符串,配合上位程序演示移动字串
87 =======================================================*/
88 void Display( Uchar dd ) {
89 1
90 1 Uchar i;
91 1
92 1 for (i=0;i<16;i++) {
93 2 DispOneChar(i,1,dd++);
94 2 dd &= 0x7f;
95 2 if (dd<32) dd=32;
96 2 }
97 1 }
98
99 /*=======================================================
100 显示光标定位
101 =======================================================*/
102 void LocateXY( char posx,char posy) {
103 1
104 1 Uchar temp;
105 1
106 1 temp = posx & 0xf;
107 1 posy &= 0x1;
108 1 if ( posy )temp |= 0x40;
109 1 temp |= 0x80;
110 1 LcdWriteCommand(temp,0);
111 1 }
112
113 /*=======================================================
114 按指定位置显示数出一个字符
115 =======================================================*/
116 void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {
117 1
C51 COMPILER V6.20c Z1602 11/30/2001 16:58:17 PAGE 3
118 1 LocateXY( x, y ); // 定位显示地址
119 1 LcdWriteData( Wdata ); // 写字符
120 1 }
121
122 /*=======================================================
123 初始化程序, 必须按照产品资料介绍的初始化过程进行
124 =======================================================*/
125 void LcdReset( void ) {
126 1
127 1 LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
128 1 Delay5Ms();
129 1 LcdWriteCommand( 0x38, 0); // 共三次
130 1 Delay5Ms();
131 1 LcdWriteCommand( 0x38, 0);
132 1 Delay5Ms();
133 1
134 1 LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
135 1 LcdWriteCommand( 0x08, 1); // 显示关闭
136 1 LcdWriteCommand( 0x01, 1); // 显示清屏
137 1 LcdWriteCommand( 0x06, 1); // 显示光标移动设置
138 1 LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
139 1 }
140
141 /*=======================================================
142 写控制字符子程序: E=1 RS=0 RW=0
143 =======================================================*/
144 void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
145 1
146 1 if (AttribC) WaitForEnable(); // 检测忙信号?
147 1
148 1 RS = 0; RW = 0; _nop_();
149 1
150 1 DataPort = CMD; _nop_(); // 送控制字子程序
151 1
152 1 Elcm = 1;_nop_();_nop_();Elcm = 0; // 操作允许脉冲信号
153 1 }
154
155 /*=======================================================
156 当前位置写字符子程序: E =1 RS=1 RW=0
157 =======================================================*/
158 void LcdWriteData( char dataW ) {
159 1
160 1 WaitForEnable(); // 检测忙信号
161 1
162 1 RS = 1; RW = 0; _nop_();
163 1
164 1 DataPort = dataW; _nop_();
165 1
166 1 Elcm = 1; _nop_(); _nop_(); Elcm = 0; // 操作允许脉冲信号
167 1
168 1 }
169
170 /*=======================================================
171 正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
172 DB7: 0 LCD控制器空闲; 1 LCD控制器忙
173 ========================================================*/
174 void WaitForEnable( void ) {
175 1
176 1 DataPort = 0xff;
177 1
178 1 RS =0; RW = 1; _nop_(); Elcm = 1; _nop_(); _nop_();
179 1
C51 COMPILER V6.20c Z1602 11/30/2001 16:58:17 PAGE 4
180 1 while( DataPort & Busy );
181 1
182 1 Elcm = 0;
183 1 }
184
185
186 // 短延时
187 void Delay5Ms(void)
188 {
189 1 Uint i = 5552;
190 1 while(i--);
191 1 }
192
193 //长延时
194 void Delay400Ms(void)
195 {
196 1 Uchar i = 5;
197 1 Uint j;
198 1 while(i--)
199 1 {
200 2 j=7269;
201 2 while(j--);
202 2 };
203 1 }
204
C51 COMPILER V6.20c Z1602 11/30/2001 16:58:17 PAGE 5
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION main (BEGIN)
; SOURCE LINE # 43
; SOURCE LINE # 44
; SOURCE LINE # 47
0000 120000 R LCALL Delay400Ms
; SOURCE LINE # 49
0003 120000 R LCALL LcdReset
; SOURCE LINE # 50
0006 750020 R MOV temp,#020H
; SOURCE LINE # 51
0009 7A00 R MOV R2,#HIGH exampl
000B 7B00 R MOV R3,#LOW exampl
000D E4 CLR A
000E FD MOV R5,A
000F FF MOV R7,A
0010 120000 R LCALL _ePutstr
; SOURCE LINE # 53
0013 120000 R LCALL Delay400Ms
; SOURCE LINE # 54
0016 120000 R LCALL Delay400Ms
; SOURCE LINE # 55
0019 120000 R LCALL Delay400Ms
; SOURCE LINE # 56
001C 120000 R LCALL Delay400Ms
; SOURCE LINE # 57
001F 120000 R LCALL Delay400Ms
; SOURCE LINE # 58
0022 120000 R LCALL Delay400Ms
; SOURCE LINE # 59
0025 120000 R LCALL Delay400Ms
; SOURCE LINE # 60
0028 120000 R LCALL Delay400Ms
002B ?C0001:
; SOURCE LINE # 62
; SOURCE LINE # 63
; SOURCE LINE # 64
002B 53007F R ANL temp,#07FH
; SOURCE LINE # 65
002E E500 R MOV A,temp
0030 C3 CLR C
0031 9420 SUBB A,#020H
0033 5003 JNC ?C0003
0035 750020 R MOV temp,#020H
0038 ?C0003:
; SOURCE LINE # 66
0038 AF00 R MOV R7,temp
003A 0500 R INC temp
003C 120000 R LCALL _Display
; SOURCE LINE # 67
003F 120000 R LCALL Delay400Ms
; SOURCE LINE # 68
0042 80E7 SJMP ?C0001
; FUNCTION main (END)
; FUNCTION _ePutstr (BEGIN)
; SOURCE LINE # 74
0000 8F00 R MOV x,R7
0002 8D00 R MOV y,R5
0004 8A00 R MOV ptr,R2
C51 COMPILER V6.20c Z1602 11/30/2001 16:58:17 PAGE 6
0006 8B00 R MOV ptr+01H,R3
; SOURCE LINE # 75
0008 E4 CLR A
0009 F500 R MOV l,A
000B ?C0005:
; SOURCE LINE # 76
000B E500 R MOV A,ptr+01H
000D 2500 R ADD A,l
000F F582 MOV DPL,A
0011 E4 CLR A
0012 3500 R ADDC A,ptr
0014 F583 MOV DPH,A
0016 E4 CLR A
0017 93 MOVC A,@A+DPTR
0018 D3 SETB C
0019 941F SUBB A,#01FH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -