📄 lcm1602.lst
字号:
C51 COMPILER V8.02 LCM1602 05/15/2009 20:51:21 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCM1602
OBJECT MODULE PLACED IN lcm1602.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE lcm1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2
3 /*
4 定义Lcm1602的接线方式
5 RS: P2.0
6 RW: P2.1
7 E: P2.2
8 D0: P0.0
9 D1: P0.1
10 D2: P0.2
11 D3: P0.3
12 D4: P0.4
13 D5: P0.5
14 D6: P0.6
15 D7: P0.7
16 */
17
18 sbit LCM1602RS = P2^0;
19 sbit LCM1602RW = P2^1;
20 sbit LCM1602E = P2^2;
21
22 /*定义1602的数据模式*/
23 #define LCM1602_8BIT_MODE
24
25 /*在lpc2106下移植成功*/
26 /*1602 IO定义*/
27 //1602 RS脚 PA12
28 #define LCM1602_PIN_RS (0)
29 //1602 RW脚 PA13
30 #define LCM1602_PIN_RW (1)
31 //1602 E脚 PA14
32 #define LCM1602_PIN_E (2)
33 //1602 D0
34 #define LCM1602_PIN_D0 (0)
35 //1602 D1
36 #define LCM1602_PIN_D1 (1)
37 //1602 D2
38 #define LCM1602_PIN_D2 (2)
39 //1602 D3
40 #define LCM1602_PIN_D3 (3)
41 //1602 D4
42 #define LCM1602_PIN_D4 (4)
43 //1602 D5
44 #define LCM1602_PIN_D5 (5)
45 //1602 D6
46 #define LCM1602_PIN_D6 (6)
47 //1602 D7
48 #define LCM1602_PIN_D7 (7)
49
50 /*设置RS为输出*/
51 #define LCM1602_RS_OUT
52 /*设置RS低*/
53 #define LCM1602_RS_LOW (LCM1602RS = 0)
54 /*设置RS高*/
55 #define LCM1602_RS_HIGH (LCM1602RS = 1)
C51 COMPILER V8.02 LCM1602 05/15/2009 20:51:21 PAGE 2
56 /*设置RW为输出*/
57 #define LCM1602_RW_OUT
58 /*设置RW低*/
59 #define LCM1602_RW_LOW (LCM1602RW = 0)
60 /*设置RW高*/
61 #define LCM1602_RW_HIGH (LCM1602RW = 1)
62 /*设置E为输出*/
63 #define LCM1602_E_OUT
64 /*设置E低*/
65 #define LCM1602_E_LOW (LCM1602E = 0)
66 /*设置E高*/
67 #define LCM1602_E_HIGH (LCM1602E = 1)
68
69 //8Bit模式操作
70 #ifdef LCM1602_8BIT_MODE
71 //设置DATA为输出
72 #define LCM1602_DATA_OUT
73 //设置DATA为输入
74 #define LCM1602_DATA_IN
75 //获得DATA
76 #define LCM1602_GET_DATA (P1)
77 //清除数据
78 #define LCM1602_CLEAR_DATA (LCM1602_GET_DATA = 0x00)
79 //设置DATA
80 #define LCM1602_SET_DATA(x) (LCM1602_GET_DATA = (x))
81 #endif
82
83 //4Bit模式操作
84 #ifdef LCM1602_4BIT_MODE
#endif
86
87 /***********************LCD1602地址相关******************************/
88 // 第一行DDRAM起始地址
89 #define LCM1602_LINE1_ADDR (0x80 + 0x00)
90 // 第二行DDRAM起始地址
91 #define LCM1602_LINE2_ADDR (0x80 + 0x40)
92 // 第一行
93 #define LCM1602_LINE1 (0)
94 // 第二行
95 #define LCM1602_LINE2 (1)
96 // 每行的最大字符长度
97 #define LCM1602_LINE_LENGTH (16)
98 //用于检测LCM状态字中的Busy标识
99 #define LCM1602_BUSY (1 << 7)
100 //显示清屏。数据指针清零;所有显示清零
101 //#define LCM1602_ (0x01)
102 //显示回车。数据指针清零
103 //#define LCM1602_ (0x02)
104
105 /*设置Lcm1602 RS脚状态,0设置低电平;非0设置高电平*/
106 static void Lcm1602Rs(unsigned char uchStatus);
107 /*设置Lcm1602 RW脚状态,0设置低电平;非0设置高电平*/
108 static void Lcm1602Rw(unsigned char uchStatus);
109 /*设置Lcm1602 E脚状态,0设置低电平;非0设置高电平*/
110 static void Lcm1602E(unsigned char uchStatus);
111 /*获得Lcm1602返回的数据*/
112 static unsigned int Lcm1602GetData(void);
113 /*向Lcm1602发送数据*/
114 static void Lcm1602SetData(unsigned char uchData);
115 /*检查Lcm1602是否读写使能*/
116 static unsigned char Lcm1602CheckBusy(void);
117 /*向Lcm1602发送指令*/
C51 COMPILER V8.02 LCM1602 05/15/2009 20:51:21 PAGE 3
118 static void Lcm1602Command(unsigned char uchInstruction, unsigned char uchBusy);
119 /*向Lcm1602发送数据*/
120 static void Lcm1602Data(unsigned char uchData);
121
122 extern void delay_ms(unsigned int uiTime);
123
124 /*设置1602 RS脚状态*/
125 void Lcm1602Rs(unsigned char uchStatus)
126 {
127 1 if (0 == uchStatus)
128 1 {
129 2 LCM1602_RS_LOW;
130 2 }
131 1 else
132 1 {
133 2 LCM1602_RS_HIGH;
134 2 }
135 1 }
136
137 /*设置1602 RW脚状态*/
138 void Lcm1602Rw(unsigned char uchStatus)
139 {
140 1 if (0 == uchStatus)
141 1 {
142 2 LCM1602_RW_LOW;
143 2 }
144 1 else
145 1 {
146 2 LCM1602_RW_HIGH;
147 2 }
148 1 }
149
150 /*设置1602 E脚状态*/
151 void Lcm1602E(unsigned char uchStatus)
152 {
153 1 if (0 == uchStatus)
154 1 {
155 2 LCM1602_E_LOW;
156 2 }
157 1 else
158 1 {
159 2 LCM1602_E_HIGH;
160 2 }
161 1 }
162
163 /*获得1602数据*/
164 unsigned int Lcm1602GetData(void)
165 {
166 1 unsigned int uiData;
167 1 LCM1602_DATA_IN;
168 1 uiData = LCM1602_GET_DATA;
169 1 return uiData;
170 1 }
171
172 /*将数据写到1602*/
173 void Lcm1602SetData(unsigned char uchData)
174 {
175 1 /*将IO设置为输出*/
176 1 LCM1602_DATA_OUT;
177 1 LCM1602_CLEAR_DATA;
178 1 LCM1602_SET_DATA(uchData);
179 1 }
C51 COMPILER V8.02 LCM1602 05/15/2009 20:51:21 PAGE 4
180
181 /*检查1602读写操作使能*/
182 unsigned char Lcm1602CheckBusy(void)
183 {
184 1 unsigned int uiData;
185 1
186 1 while (1)
187 1 {
188 2 Lcm1602Rs(0);
189 2 Lcm1602Rw(1);
190 2 Lcm1602E(1);
191 2 /*判断STA7是否为0*/
192 2 uiData = Lcm1602GetData();
193 2 if (0 == (uiData & LCM1602_BUSY))
194 2 {
195 3 break;
196 3 }
197 2 Lcm1602E(0);
198 2 }
199 1
200 1 return uiData;
201 1 }
202
203 /*写1602指令*/
204 void Lcm1602Command(unsigned char uchInstruction, unsigned char uchBusy)
205 {
206 1 if (0 != uchBusy)
207 1 {
208 2 Lcm1602CheckBusy();
209 2 }
210 1
211 1 Lcm1602Rs(0);
212 1 Lcm1602Rw(0);
213 1 Lcm1602SetData(uchInstruction);
214 1 Lcm1602E(1);
215 1 delay_ms(1);
216 1 Lcm1602E(0);
217 1 }
218
219 /*写1602数据*/
220 void Lcm1602Data(unsigned char uchData)
221 {
222 1 Lcm1602CheckBusy();
223 1 Lcm1602Rs(1);
224 1 Lcm1602Rw(0);
225 1 Lcm1602SetData(uchData);
226 1 Lcm1602E(1);
227 1 delay_ms(1);
228 1 Lcm1602E(0);
229 1 }
230
231 /*初始化1602*/
232 void Lcm1602Init(void)
233 {
234 1 LCM1602_RS_OUT;
235 1 LCM1602_RW_OUT;
236 1 LCM1602_E_OUT;
237 1
238 1 delay_ms(15);
239 1 //三次显示模式设置,不检测忙信号
240 1 Lcm1602Command(0x38, 0);
241 1 delay_ms(5);
C51 COMPILER V8.02 LCM1602 05/15/2009 20:51:21 PAGE 5
242 1 Lcm1602Command(0x38, 0);
243 1 delay_ms(5);
244 1 Lcm1602Command(0x38, 0);
245 1 delay_ms(5);
246 1 //显示模式设置,开始要求每次检测忙信号
247 1 Lcm1602Command(0x38, 1);
248 1 //关闭显示
249 1 Lcm1602Command(0x08, 1);
250 1 //显示清屏
251 1 Lcm1602Command(0x01, 1);
252 1 //显示光标移动设置
253 1 Lcm1602Command(0x06, 1);
254 1 //显示开及光标设置
255 1 Lcm1602Command(0x0c, 1);
256 1 }
257
258 #if 0
void Lcm1602Clear(void)
{
Lcm1602Command(0x01, 1);
}
/*****************************************************
函 数 名:void DisplayChar(unsigned char x, unsigned char y, unsigned char uchData)
功 能:按指定坐标中写入数据
说 明:X-横坐标,Y-纵坐标,DData为ASCII值
入口参数:x, y, uchData
返 回 值:无
*****************************************************/
void DisplayChar(unsigned char x, unsigned char y, unsigned char uchData)
{
y &= 0x01;
x &= 0x0F; // 限制X不能大于15,Y不能大于1
if (y)
{
x |=LCM1602_LINE2_ADDR; // 当要显示第二行时地址码:0xc0
}
x |= LCM1602_LINE1_ADDR; // 第一行的地址码:0x80
Lcm1602Command(x, 1);
Lcm1602Data(uchData);
}
#endif
284
285 /*****************************************************
286 函 数 名:void DisplayString(unsigned char x,unsigned char y,unsigned char *puszData)
287 功 能:向指定坐标中写入字符串(在LCD1602中使用此函数)
288 说 明:X-横坐标,Y-纵坐标
289 入口参数:x, y, *puszData
290 返 回 值:无
291 *****************************************************/
292 void DisplayString(unsigned char x,unsigned char y,unsigned char *puszData)
293 {
294 1 if (LCM1602_LINE1 == y) // 判断是否写入第1行
295 1 {
296 2 if (x < LCM1602_LINE_LENGTH) // 写入位数
297 2 {
298 3 Lcm1602Command(LCM1602_LINE1_ADDR + x, 1); // 写入第1行地址
299 3 for (; x < LCM1602_LINE_LENGTH && *puszData != '\0'; x++)
300 3 {
301 4 Lcm1602Data(*(puszData++)); // 写入数据
302 4 }
303 3 if(*puszData!='\0') // 判断数据是否写完
C51 COMPILER V8.02 LCM1602 05/15/2009 20:51:21 PAGE 6
304 3 {
305 4 x=0; // 没写完写入第2行
306 4 y=LCM1602_LINE2;
307 4 }
308 3 }
309 2 }
310 1
311 1 if (LCM1602_LINE2 == y) // 判断是否写入第2行
312 1 {
313 2 Lcm1602Command(LCM1602_LINE2_ADDR + x, 1); // 写入第2行地址
314 2 for (; x < LCM1602_LINE_LENGTH && *puszData != '\0'; x++) // 判断数据是否写完
315 2 {
316 3 Lcm1602Data(*(puszData++)); // 写入数据
317 3 }
318 2 }
319 1 }
320
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 344 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 5
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 + -