📄 lcd1602.lst
字号:
C51 COMPILER V8.02 LCD1602 07/13/2006 21:12:22 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN LCD1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LCD1602.c DEBUG OBJECTEXTEND CODE
line level source
1 //这是一个DEMO程序,可以很方便地嵌入到其它程序中,只需要进行相关的函数调用。
2 //晶振为11.0592MHz
3
4 #include <at89s52.h>
5 #include<intrins.h>
6
7 //变量类型定义,
8 #define uchar unsigned char
9 #define uint unsigned int
10
11 // 控制引脚定义
12 sbit LCD_RS=P3^3;
13 sbit LCD_RW=P3^4;
14 sbit LCD_E=P3^5;
15 sbit BUZ=P1^3;
16
17 #define DataPort P0 // 数据端口
18
19 #define Busy 0x80 // 总线定义
20
21 //EXAMPLE
22
23 code char exampl[]="Hello RFID World";
24 code char sn[]="www.ehuoyan.com";
25
26 void Delay400Ms(void);
27 void Delay5Ms(void);
28 void WaitForEnable( void );
29 void LocateXY( char posx,char posy);
30 void LcdWriteData( char dataW );
31 void LcdWriteCommand( uchar CMD,uchar AttribC );
32 void LcdReset( void );
33 void Display( uchar dd );
34 void DispOneChar(uchar x,uchar y,uchar Wdata);
35 void ePutstr(uchar x,uchar y, uchar code *ptr);
36
37 //测试主程序
38 void main(void)
39 {
40 1 uchar temp;
41 1
42 1 Delay400Ms();
43 1 BUZ=0;
44 1 LcdReset();
45 1 temp = 32;
46 1 ePutstr(0,0,exampl); // 上面一行显示一个预定字符串
47 1 Delay400Ms();
48 1
49 1 while(1)
50 1 {
51 2 // DispOneChar(0,1,'s');
52 2 // DispOneChar(1,1,'n');
53 2 // DispOneChar(2,1,':');
54 2 ePutstr(0,1,sn);
55 2 }
C51 COMPILER V8.02 LCD1602 07/13/2006 21:12:22 PAGE 2
56 1 }
57
58 /*=======================================================
59 显示字符串
60 =======================================================*/
61 void ePutstr(uchar x,uchar y, uchar code *ptr) {
62 1 uchar i,l=0;
63 1 while (ptr[l] >31){l++;};
64 1 for (i=0;i<l;i++) {
65 2 DispOneChar(x++,y,ptr[i]);
66 2 if ( x == 16 ){
67 3 x = 0; y ^= 1;
68 3 }
69 2 }
70 1 }
71
72 /*=======================================================
73 演示一行连续字符串,配合上位程序演示移动字串
74 =======================================================*/
75 void Display( uchar dd ) {
76 1
77 1 uchar i;
78 1
79 1 for (i=0;i<16;i++) {
80 2 DispOneChar(i,1,dd++); //第二行移动显示
81 2 dd &= 0x7f;
82 2 if (dd<32) dd=32;
83 2 }
84 1 }
85
86 /*=======================================================
87 显示光标定位
88 =======================================================*/
89 void LocateXY( char posx,char posy) {
90 1
91 1 uchar temp;
92 1
93 1 temp = posx & 0xf;
94 1 posy &= 0x1;
95 1 if ( posy )temp |= 0x40;
96 1 temp |= 0x80;
97 1 LcdWriteCommand(temp,0);
98 1 }
99
100 /*=======================================================
101 按指定位置显示数出一个字符
102 =======================================================*/
103 void DispOneChar(uchar x,uchar y,uchar Wdata) {
104 1
105 1 LocateXY( x, y ); // 定位显示地址
106 1 LcdWriteData( Wdata ); // 写字符
107 1 }
108
109 /*=======================================================
110 初始化程序, 必须按照产品资料介绍的初始化过程进行
111 =======================================================*/
112 void LcdReset( void ) {
113 1
114 1 LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
115 1 Delay5Ms();
116 1 LcdWriteCommand( 0x38, 0); // 共三次
117 1 Delay5Ms();
C51 COMPILER V8.02 LCD1602 07/13/2006 21:12:22 PAGE 3
118 1 LcdWriteCommand( 0x38, 0);
119 1 Delay5Ms();
120 1
121 1 LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
122 1 LcdWriteCommand( 0x08, 1); // 显示关闭
123 1 LcdWriteCommand( 0x01, 1); // 显示清屏
124 1 LcdWriteCommand( 0x06, 1); // 显示光标移动设置
125 1 LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
126 1 }
127
128 /*=======================================================
129 写控制字符子程序: E=1 LCD_RS=0 LCD_RW=0
130 =======================================================*/
131 void LcdWriteCommand( uchar CMD,uchar AttribC ) {
132 1
133 1 if (AttribC) WaitForEnable(); // 检测忙信号?
134 1
135 1 LCD_RS = 0; LCD_RW = 0; _nop_();
136 1
137 1 DataPort = CMD; _nop_(); // 送控制字子程序
138 1
139 1 LCD_E = 1;_nop_();_nop_();LCD_E = 0; // 操作允许脉冲信号
140 1 }
141
142 /*=======================================================
143 当前位置写字符子程序: E =1 LCD_RS=1 LCD_RW=0
144 =======================================================*/
145 void LcdWriteData( char dataW ) {
146 1
147 1 WaitForEnable(); // 检测忙信号
148 1
149 1 LCD_RS = 1; LCD_RW = 0; _nop_();
150 1
151 1 DataPort = dataW; _nop_();
152 1
153 1 LCD_E = 1; _nop_(); _nop_(); LCD_E = 0; // 操作允许脉冲信号
154 1
155 1 }
156
157 /*=======================================================
158 正常读写操作之前必须检测LCD控制器状态: CS=1 LCD_RS=0 LCD_RW=1
159 DB7: 0 LCD控制器空闲; 1 LCD控制器忙
160 ========================================================*/
161 void WaitForEnable( void ) {
162 1
163 1 DataPort = 0xff;
164 1
165 1 LCD_RS =0; LCD_RW = 1; _nop_(); LCD_E = 1; _nop_(); _nop_();
166 1
167 1 while( DataPort & Busy );
168 1
169 1 LCD_E = 0;
170 1 }
171
172
173 // 短延时
174 void Delay5Ms(void)
175 {
176 1 uint i = 5552;
177 1 while(i--);
178 1 }
179
C51 COMPILER V8.02 LCD1602 07/13/2006 21:12:22 PAGE 4
180 //长延时
181 void Delay400Ms(void)
182 {
183 1 uchar i = 5;
184 1 uint j;
185 1 while(i--)
186 1 {
187 2 j=7269;
188 2 while(j--);
189 2 };
190 1 }
191
C51 COMPILER V8.02 LCD1602 07/13/2006 21:12:22 PAGE 5
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION main (BEGIN)
; SOURCE LINE # 38
; SOURCE LINE # 39
; SOURCE LINE # 42
0000 120000 R LCALL Delay400Ms
; SOURCE LINE # 43
0003 C293 CLR BUZ
; SOURCE LINE # 44
0005 120000 R LCALL LcdReset
; SOURCE LINE # 45
0008 750020 R MOV temp,#020H
; SOURCE LINE # 46
000B 7A00 R MOV R2,#HIGH exampl
000D 7B00 R MOV R3,#LOW exampl
000F E4 CLR A
0010 FD MOV R5,A
0011 FF MOV R7,A
0012 120000 R LCALL _ePutstr
; SOURCE LINE # 47
0015 120000 R LCALL Delay400Ms
0018 ?C0001:
; SOURCE LINE # 49
; SOURCE LINE # 50
; SOURCE LINE # 54
0018 7A00 R MOV R2,#HIGH sn
001A 7B00 R MOV R3,#LOW sn
001C 7D01 MOV R5,#01H
001E E4 CLR A
001F FF MOV R7,A
0020 120000 R LCALL _ePutstr
; SOURCE LINE # 55
0023 80F3 SJMP ?C0001
; FUNCTION main (END)
; FUNCTION _ePutstr (BEGIN)
; SOURCE LINE # 61
0000 8F00 R MOV x,R7
0002 8D00 R MOV y,R5
0004 8A00 R MOV ptr,R2
0006 8B00 R MOV ptr+01H,R3
; SOURCE LINE # 62
0008 E4 CLR A
0009 F500 R MOV l,A
000B ?C0004:
; SOURCE LINE # 63
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
001B 4004 JC ?C0005
001D 0500 R INC l
001F 80EA SJMP ?C0004
0021 ?C0005:
C51 COMPILER V8.02 LCD1602 07/13/2006 21:12:22 PAGE 6
; SOURCE LINE # 64
0021 E4 CLR A
0022 F500 R MOV i,A
0024 ?C0006:
0024 E500 R MOV A,i
0026 C3 CLR C
0027 9500 R SUBB A,l
0029 5026 JNC ?C0010
; SOURCE LINE # 65
002B AF00 R MOV R7,x
002D 0500 R INC x
002F E500 R MOV A,ptr+01H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -