📄 lcd1602func.lst
字号:
C51 COMPILER V8.08 LCD1602FUNC 06/02/2007 17:59:29 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE LCD1602FUNC
OBJECT MODULE PLACED IN lcd1602func.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd1602func.c DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************
2 **函数功能:LCD的驱动函数 **
3 **创建人:xingyuegu **
4 **创建日期:2006-7-12 **
5 **版本:1.0 **
6 **修改日期:2006-10-30 **
7 **版本:2.0 **
8 1602液晶仿真的一些发现
9
10
11 看了JJJ的例子:字符液晶1602仿真测试
12 按自己习惯也写了个,发现些问题
13 一、
14 JJJ说仿真时要屏蔽掉检查LCD忙的代码,否则会死循环
15 while(DBPort&0x80); //这句要屏蔽
16
17 我写的程序总是无法正确仿真,因为不检查LCD忙,就不能保证LCD已经空闲
18 查资料LCD清屏命令要1.64ms才完成,一般命令也要40us,最后加上足够的延时后才仿真通过
19
20 后来又试了下其它LCD资料上的例程,仿真发现检查LCD忙标志也不会死循环
21 分析了下,区别是:它不是一直在使能的情况下读忙信号,而是每次都有EN=0,再EN=1重新读取忙标志
22 我还没做好实际实验电路板,没试过实际电路
23 根据JJJ的描述和我的仿真实验,我猜仿真和实际硬件的区别是:
24 实际硬件在EN=1的情况下,LCD执行完指令会更新LCD忙标志为0;
25 而仿真需要EN=0,EN=1来重新读取忙信号,否则就不会更新,而一直以为是忙
26
27 在JJJ的LCD1602.h加了几句,变成
28 while(DBPort&0x80)
29 { LcdEn=0; _nop_();
30 LcdEn=1; _nop_();
31 }
32 仿真就可以检查忙标志了
33
34 自己的代码也做相应改动,都可以成功检查忙标志,也无需多加延时了
35
36 *******************************************************************/
37
38 #include <lcd1602.h>
39 #include <reg52.h>
40
41 sbit LcdRs =P2^0;
42 sbit LcdRw =P2^1;
43 sbit LcdEn =P2^2;
44 sfr DBPort =0x80;
45
46 /*************************************************************
47 **功能:延时1.64ms **
48 **参数:无 **
49 *************************************************************/
50
51 void delay1_64ms(void)
52 {
53 1 uchar i;
54 1 for(i = 0;i < 250;i++)
55 1 {
C51 COMPILER V8.08 LCD1602FUNC 06/02/2007 17:59:29 PAGE 2
56 2 _nop_();
57 2 _nop_();
58 2 _nop_();
59 2 _nop_();
60 2 }
61 1 }
62 /*************************************************************
63 **功能:延时40us **
64 **参数:无 **
65 *************************************************************/
66
67 void delay40us(void)
68 {
69 1 uchar i;
70 1 for(i = 0;i < 20;i++)
71 1 {
72 2 ;
73 2 }
74 1 }
75 /*************************************************************
76 **功能:判断LCD忙 **
77 **参数:无 **
78 *************************************************************/
79
80 unsigned char Lcd_Wait(void)
81 {
82 1
83 1 while(1)
84 1 {
85 2 DBPort=0xff;
86 2 LcdEn=0;
87 2 _nop_();
88 2 LcdRs=0;
89 2 _nop_();
90 2 _nop_();
91 2 LcdRw=1;
92 2 _nop_();
93 2 _nop_();
94 2 LcdEn=1;
95 2 _nop_();
96 2 _nop_();
97 2
98 2 _nop_();
99 2 _nop_();
100 2 if((DBPort&0x80)==0)
101 2 {
102 3 break;
103 3
104 3 }
105 2 LcdEn=0;
106 2 }
107 1 //delay40us();
108 1 return DBPort;
109 1 }
110 /**************************************************************
111 **功能:写LCD函数 **
112 **参数:style为写命令/数据,0-命令,1-数据;input为写入的8位 **
113 ** 命令/数据 **
114 **************************************************************/
115
116
117 void Lcd_Write(bit style,unsigned char input)
C51 COMPILER V8.08 LCD1602FUNC 06/02/2007 17:59:29 PAGE 3
118 {
119 1 LcdEn=0;
120 1 _nop_();
121 1 _nop_();
122 1 LcdRs=style;
123 1 _nop_();
124 1 _nop_();
125 1 LcdRw=0;
126 1 DBPort=input;
127 1 _nop_();
128 1 _nop_();
129 1 LcdEn=1;
130 1 _nop_();
131 1 _nop_();
132 1 LcdEn=0;
133 1 _nop_();
134 1 Lcd_Wait();
135 1
136 1 }
137 /****************************************************************
138 **功能:LCD清屏函数 **
139 **参数:无 **
140 ****************************************************************/
141 void ClrScreen(void)
142 {
143 1 Lcd_Write(Lcd_Command,Lcd_Clear_Screen);
144 1 delay1_64ms();
145 1 }
146
147 /****************************************************************
148 **功能:LCD归位函数 **
149 **参数:无 **
150 ****************************************************************/
151 void Screen_home(void)
152 {
153 1
154 1 Lcd_Write(Lcd_Command,Lcd_Home);
155 1 delay1_64ms();
156 1
157 1 }
158 /***************************************************************
159 **功能:设置显示模式 **
160 **参数: **
161 ***************************************************************/
162
163 void Lcd_SetDisplay(unsigned char DisplayMode)
164 {
165 1 Lcd_Write(Lcd_Command,0x08|DisplayMode);
166 1
167 1 }
168 /***************************************************************
169 **功能:LCD移动设置 **
170 **参数:取值如下 **
171 ***************************************************************/
172
173
174 void Lcd_Move(unsigned char MoveMode)
175 {
176 1 Lcd_Write(Lcd_Command,0x10|MoveMode);
177 1
178 1 }
179
C51 COMPILER V8.08 LCD1602FUNC 06/02/2007 17:59:29 PAGE 4
180 /****************************************************************
181 **功能:LCD输入设置 **
182 **参数:取值如下 **
183 ****************************************************************/
184 //
185 void Lcd_SetInput(unsigned char InputMode)
186 {
187 1 Lcd_Write(Lcd_Command,0x04|InputMode);
188 1
189 1 }
190 /****************************************************************
191 **功能:LCD初始化 **
192 **参数:取值如下 **
193 ****************************************************************/
194 void Lcd_Init(void)
195 {
196 1 delay1_64ms();
197 1 Lcd_Write(Lcd_Command,0x38); //8位数据端口,2行显示,5*7点阵
198 1
199 1 Lcd_Write(Lcd_Command,0x38);
200 1 Lcd_Write(Lcd_Command,0x38);
201 1 Lcd_SetDisplay(Lcd_Display_On); //开启显示, 无光标 |Lcd_Cursor|Lcd_Flash
202 1 //Lcd_Move(Lcd_CursorMove|Lcd_Left);
203 1
204 1 Lcd_SetInput(Lcd_Ac_Up|Lcd_No_Move); //AC递增, 画面不动_To
205 1
206 1
207 1 }
208
209 /****************************************************************
210 **功能:显示位置设置 **
211 **参数:x-行;y-列 **
212 ****************************************************************/
213 void GotoXY(unsigned char x,unsigned char y)
214 {
215 1 if(y==0)
216 1 {Lcd_Write(Lcd_Command,0x80|x);
217 2 }
218 1 if(y==1)
219 1 {Lcd_Write(Lcd_Command,0x80|(x+0x40));
220 2 }
221 1
222 1 }
223
224 /****************************************************************
225 **功能:LCD显示函数 **
226 **参数:str-要显示的字符串指针 **
227 ****************************************************************/
228 void Print(unsigned char *str)
229 {
230 1 while(*str!='\0')
231 1 {
232 2
233 2 Lcd_Write(Lcd_Data,*str);
234 2
235 2 str++;
236 2
237 2 }
238 1 }
239
240 void print_char(uchar a)
241 {
C51 COMPILER V8.08 LCD1602FUNC 06/02/2007 17:59:29 PAGE 5
242 1 Lcd_Write(Lcd_Data,a);
243 1 //Lcd_Wait();
244 1 }
245
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 217 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 1
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -