📄 lcd1602.lst
字号:
C51 COMPILER V7.06 LCD1602 06/08/2006 23:56:17 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN LCD1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LCD1602.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 #include "main.h"
3 sbit LCM_RW = P2^1 ;//定义引脚
4 sbit LCM_RS = P2^0 ;
5 sbit LCM_E = P2^2 ;
6 #define LCM_Data P0 //定义液晶数据口
7 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
8 #include "1602.h"
9
10
11 void WriteDataLCM(unsigned char WDLCM);
12 void WriteCommandLCM(unsigned char WCLCM,BuysC);
13 unsigned char ReadDataLCM(void);
14 unsigned char ReadStatusLCM(void);
15 void LCMInit(void);
16 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
17 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
18 void Delay5Ms(void);
19 void Delay400Ms(void);
20
21 //写数据
22 void WriteDataLCM(unsigned char WDLCM)
23 {
24 1 ReadStatusLCM(); //检测忙
25 1 LCM_Data = WDLCM;
26 1 LCM_RS = 1;
27 1 LCM_RW = 0;
28 1 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
29 1 LCM_E = 0; //延时
30 1 LCM_E = 1;
31 1 }
32
33 //写指令
34 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
35 {
36 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
37 1 LCM_Data = WCLCM;
38 1 LCM_RS = 0;
39 1 LCM_RW = 0;
40 1 LCM_E = 0;
41 1 LCM_E = 0;
42 1 LCM_E = 1;
43 1 }
44
45 //读数据
46 /*
47 unsigned char ReadDataLCM(void)
48 {
49 LCM_RS = 1;
50 LCM_RW = 1;
51 LCM_E = 0;
52 LCM_E = 0;
53 LCM_E = 1;
54 return(LCM_Data);
55 }
C51 COMPILER V7.06 LCD1602 06/08/2006 23:56:17 PAGE 2
56 */
57 //读状态
58 unsigned char ReadStatusLCM(void)
59 {
60 1 LCM_Data = 0xFF;
61 1 LCM_RS = 0;
62 1 LCM_RW = 1;
63 1 LCM_E = 0;
64 1 LCM_E = 0;
65 1 LCM_E = 1;
66 1 while (LCM_Data & Busy); //检测忙信号
67 1 return(LCM_Data);
68 1 }
69
70 void LCMInit(void) //LCM初始化
71 {
72 1 LCM_Data = 0;
73 1 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
74 1 Delay5Ms();
75 1 WriteCommandLCM(0x38,0);
76 1 Delay5Ms();
77 1 WriteCommandLCM(0x38,0);
78 1 Delay5Ms();
79 1
80 1 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
81 1 WriteCommandLCM(0x08,1); //关闭显示
82 1 WriteCommandLCM(0x01,1); //显示清屏
83 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
84 1 WriteCommandLCM(0x0C,1); // 显示开及光标设置
85 1 }
86
87 //按指定位置显示一个字符
88 /*
89 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
90 {
91 Y &= 0x1;
92 X &= 0xF; //限制X不能大于15,Y不能大于1
93 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
94 X |= 0x80; // 算出指令码
95 WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
96 WriteDataLCM(DData);
97 } */
98
99 //按指定位置显示一串字符
100 /*
101 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
102 {
103 unsigned char ListLength;
104
105 ListLength = 0;
106 Y &= 0x1;
107 X &= 0xF; //限制X不能大于15,Y不能大于1
108 while (DData[ListLength]>0x20) //若到达字串尾则退出
109 {
110 if (X <= 0xF) //X坐标应小于0xF
111 {
112 DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
113 ListLength++;
114 X++;
115 }
116 }
117 }
C51 COMPILER V7.06 LCD1602 06/08/2006 23:56:17 PAGE 3
118 */
119 //5ms延时
120 void Delay5Ms(void)
121 {
122 1 unsigned int TempCyc = 5552;
123 1 while(TempCyc--);
124 1 }
125
126 //400ms延时
127 /*
128 void Delay400Ms(void)
129 {
130 unsigned char TempCycA = 5;
131 unsigned int TempCycB;
132 while(TempCycA--)
133 {
134 TempCycB=7269;
135 while(TempCycB--);
136 };
137 }
138 */
139
140
141 void LCD_printc(unsigned char lcd_data) //输出一个字符到LCD
142 {
143 1 WriteDataLCM(lcd_data);
144 1 }
145
146 void LCD_prints(unsigned char *lcd_string) //输出一个字符串到LCD
147 {
148 1 unsigned char i=0;
149 1 while(lcd_string[i]!=0x00)
150 1 {
151 2 WriteDataLCM(lcd_string[i]);
152 2 i++;
153 2 }
154 1 }
155
156
157
158
159
160
161 /*
162 如果上述代码不能初始化1602液晶,则尝试以下代码,我发现目前1602至少有两种驱动,以下代码基于SED1520驱动
163 #include "main.h"
164 #define LCD_DATA P0 //LCD的数据口
165
166 sbit LCD_BUSY=LCD_DATA^7; //LCD忙信号位
167
168 sbit LCD_RW=P1^2; //LCD读写控制
169 sbit LCD_RS=P1^3; //LCD寄存器选择
170 sbit LCD_EN=P1^1; //LCD使能信号
171
172 #include "1602.h"
173
174 void LCD_check_busy(void) //检测LCD状态,看它是不是还在忙呢
175 {
176 while(1)
177 {
178 LCD_EN=0;
179 LCD_RS=0;
C51 COMPILER V7.06 LCD1602 06/08/2006 23:56:17 PAGE 4
180 LCD_RW=1;
181 LCD_DATA=0xff;
182 LCD_EN=1;
183 if(!LCD_BUSY)break;
184 }
185 LCD_EN=0;
186 }
187
188 void LCD_cls(void) //LCD清屏
189 {
190 ET2=0;
191 LCD_check_busy();
192 LCD_RS=0;
193 LCD_RW=0;
194 LCD_EN=1;
195 LCD_DATA=1;
196 LCD_EN=0;
197 ET2=1;
198 }
199
200 void LCD_write_instruction(unsigned char LCD_instruction) //写指令到LCD
201 {
202 ET2=0;
203 LCD_check_busy();
204 LCD_RS=0;
205 LCD_RW=0;
206 LCD_EN=1;
207 LCD_DATA=LCD_instruction;
208 LCD_EN=0;
209 ET2=1;
210 }
211
212 void LCD_write_data(unsigned char LCD_data) //输出一个字节数据到LCD
213 {
214 ET2=0;
215 LCD_check_busy();
216 LCD_RS=1;
217 LCD_RW=0;
218 LCD_EN=1;
219 LCD_DATA=LCD_data;
220 LCD_EN=0;
221 ET2=1;
222 }
223
224 void LCD_set_position(unsigned char x) //LCD光标定位到x处
225 {
226 LCD_write_instruction(0x80+x);
227 }
228
229 /*
230 void LCD_go_home(void) //LCD光标归位
231 {
232 LCD_write_instruction(LCD_GO_HOME);
233 }
234 */
235 /*
236 void LCD_printc(unsigned char lcd_data) //输出一个字符到LCD
237 {
238 LCD_write_data(lcd_data);
239 }
240
241 void LCD_prints(unsigned char *lcd_string) //输出一个字符串到LCD
C51 COMPILER V7.06 LCD1602 06/08/2006 23:56:17 PAGE 5
242 {
243 unsigned char i=0;
244 while(lcd_string[i]!=0x00)
245 {
246 LCD_write_data(lcd_string[i]);
247 i++;
248 }
249 }
250
251 void LCD_initial(void) //初始化LCD
252 {
253 LCD_write_instruction(0x38);delayXms(100);
254 LCD_write_instruction(0x38);delayXms(100);
255 LCD_write_instruction(0x38);delayXms(100);
256 LCD_write_instruction(0x08);delayXms(100);
257 LCD_write_instruction(0x01);delayXms(100);
258 LCD_write_instruction(0x06);delayXms(100);
259 LCD_write_instruction(0x0c);delayXms(100);
260 //LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
261 //LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
262
263 LCD_cls();
264 LCD_write_instruction(0x90);
265 LCD_prints("our timer");
266 }*/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 192 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 6
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -