001
/*--------------------------------------------------------------------------
002 LCD1602.H
003
004 The user function is C51.
005 Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
006 All rights reserved.
007 --------------------------------------------------------------------------*/
008
009 #ifndef __LCD1602_H__
010 #define __LCD1602_H__
011
012 /*连接线图:
013 ---------------------------------------------------
014 | LCM-----51 | LCM-----51 | LCM------51 |
015 | ----------------------------------------------- |
016 | DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 |
017 | DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 |
018 | DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
019 | DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |
020 ---------------------------------------------------*/
021
022 /****************** LCD1602指令 ***********************************/
023 //输入方式设置
024 #define LCD_AC_AUTO_INCREMENT 0x06 // 数据读、写操作后,AC自动增一
025 #define LCD_AC_AUTO_DECREASE 0x04 // 数据读、写操作后,AC自动减一
026 #define LCD_MOVE_ENABLE 0x05 // 数据读、写操作,画面平移
027 #define LCD_MOVE_DISENABLE 0x04 // 数据读、写操作,画面不动
028 #define LCD_GO_HOME 0x02 // AC=0,光标、画面回HOME位
029 //设置显示、光标及闪烁开、关
030 #define LCD_DISPLAY_ON 0x0C // 显示开
031 #define LCD_DISPLAY_OFF 0x08 // 显示关
032 #define LCD_CURSOR_ON 0x0A // 光标显示
033 #define LCD_CURSOR_OFF 0x08 // 光标不显示
034 #define LCD_CURSOR_BLINK_ON 0x09 // 光标闪烁
035 #define LCD_CURSOR_BLINK_OFF 0x08 // 光标不闪烁
036 //光标、画面移动,不影响DDRAM
037 #define LCD_LEFT_MOVE 0x18 // LCD显示左移一位
038 #define LCD_RIGHT_MOVE 0x1C // LCD显示右移一位
039 #define LCD_CURSOR_LEFT_MOVE 0x10 // 光标左移一位
040 #define LCD_CURSOR_RIGHT_MOVE 0x14 // 光标右移一位
041 //工作方式设置
042 #define LCD_DISPLAY_DOUBLE_LINE 0x38 // 两行显示
043 #define LCD_DISPLAY_SINGLE_LINE 0x30 // 单行显示
044 #define LCD_CLEAR_SCREEN 0x01 // 清屏
045
046 /***********************LCD1602地址相关******************************/
047 #define LINE1_HEAD 0x80 // 第一行DDRAM起始地址
048 #define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址
049 #define LINE1 0 // 第一行
050 #define LINE2 1 // 第二行
051 #define LINE_LENGTH 8 // 每行的最大字符长度
052
053 /***********************LCD1602接线引脚定义**************************/
054
055 #define LCM_RS P2_0 // 数据/命令选择信号
056 #define LCM_RW P2_1 // 读/写选择信号
057 #define LCM_E P2_2 // 使能信号
058 #define LCM_Data P0 // 显示数据端口
059 #define Busy 0x80 // 用于检测LCM状态字中的Busy标识
060
061 #define uchar unsigned char
062 #define uint unsigned int
063
064 //================================ LCM1602控制部分 =========================================================
065
066 /*****************************************************
067 函 数 名:void Delay_LCD(void)
068 功 能:5ms延时
069 说 明:LCD显示延时
070 入口参数:无
071 返 回 值:无
072 *****************************************************/
073 void Delay_LCD( void)
074 {
075 uint TempCyc = 5552; // 放入延时数据
076
077 while( TempCyc --)
078 {
079 ;
080 }
081 }
082
083 /*****************************************************
084 函 数 名:uchar ReadStatusLCM()
085 功 能:读忙状态
086 说 明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替
087 入口参数:无
088 返 回 值:LCM_Data
089 *****************************************************/
090 //读状态
091 uchar ReadStatusLCM( void)
092 {
093 LCM_Data = 0xFF; // LCM数据口先置1
094
095 LCM_RS = 0;
096 LCM_RW = 1;
097 LCM_E = 0;
098 LCM_E = 0;
099 LCM_E = 1;
100
101 while ( LCM_Data & Busy) // 检测忙信号.如果忙,则不执行
102 {
103 ;
104 }
105
106 return ( LCM_Data); // 不忙返回读取数据
107 }
108
109 /*****************************************************
110 函 数 名:void WriteDataLCM()
111 功 能:向LCM1602中写入数据
112 说 明:将形参WDLCM中的数据写入LCM中
113 入口参数:WDLCM
114 返 回 值:无
115 *****************************************************/
116 //写数据
117 void WriteDataLCM( uchar WDLCM)
118 {
119 ReadStatusLCM(); // 检测忙
120
121 LCM_Data = WDLCM; // 写入数据到LCM
122
123 LCM_RS = 1;
124 LCM_RW = 0;
125 LCM_E = 0; // 若晶振速度太高可以在这后加小的延时
126 LCM_E = 0; // 延时
127 LCM_E = 1;
128 }
129
130 /*****************************************************
131 函 数 名:void WriteCommandLCM()
132 功 能:向LCM1602中写入指令
133 说 明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测
134 入口参数:WCLCM,BuysC
135 返 回 值:无
136 *****************************************************/
137 //写指令
138 void WriteCommandLCM( uchar WCLCM , BuysC) // BuysC为0时忽略忙检测
139 {
140 if ( BuysC)
141 {
142 ReadStatusLCM(); // 根据需要检测忙
143 }
144
145 LCM_Data = WCLCM; // 写入指令
146
147 LCM_RS = 0;
148 LCM_RW = 0;
149 LCM_E = 0;
150 LCM_E = 0;
151 LCM_E = 1;
152 }
153
154 /*****************************************************
155 函 数 名:void LCMInit()
156 功 能:初始化LCM1602
157 说 明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作
158 入口参数:无
159 返 回 值:无
160 *****************************************************/
161 //LCM初始化
162 void LCMInit( void)
163 {
164 LCM_Data = 0;
165 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 0); // 三次显示模式设置,不检测忙信号
166 Delay_LCD();
167 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 0); // 0x38指令表示:8位数据显示模式,俩行多显示
168 Delay_LCD();
169 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 0);
170 Delay_LCD();
171
172 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 1); // 显示模式设置,开始要求每次检测忙信号
173 WriteCommandLCM( LCD_DISPLAY_OFF , 1); // 关闭显示
174 WriteCommandLCM( LCD_CLEAR_SCREEN , 1); // 显示清屏
175 WriteCommandLCM( LCD_AC_AUTO_INCREMENT , 1); // 显示光标移动设置
176 WriteCommandLCM( LCD_DISPLAY_ON , 1); // 显示开及光标设置
177 }
178
179 /*****************************************************
180 函 数 名:void DisplayOneChar()
181 功 能:按指定坐标中写入数据
182 说 明:X-横坐标,Y-纵坐标,DData为ASCII值
183 入口参数:X,Y,DData
184 返 回 值:无
185 *****************************************************/
186 //按指定位置显示一个字符
187 void DisplayOneChar( uchar X , uchar Y , uchar DData)
188 {
189 Y &= 0x01;
190 X &= 0x0F; // 限制X不能大于15,Y不能大于1
191
192 if ( Y)
193 {
194 X |= LINE2_HEAD; // 当要显示第二行时地址码:0xc0
195 }
196
197 X |= LINE1_HEAD; // 第一行的地址码:0x80
198 WriteCommandLCM( X , 0); // 这里不检测忙信号,发送地址码
199 WriteDataLCM( DData);
200 }
201 /*在LCD1602中使用此函数,在DIPS082中使用下面的函数
202 /*****************************************************
203 函 数 名:void DisplayListChar(uchar x,uchar y,uchar *DData)
204 功 能:向指定坐标中写入字符串(在LCD1602中使用此函数)
205 说 明:X-横坐标,Y-纵坐标
206 入口参数:X,Y,*DData
207 返 回 值:无
208 *****************************************************
209 //按指定位置显示字符串
210 void DisplayListChar(uchar x,uchar y,uchar *DData)
211 {
212 if (y == LINE1) // 判断是否写入第1行
213 {
214 if (x < LINE_LENGTH) // 写入位数
215 {
216 WriteCommandLCM(LINE1_HEAD+x,0); // 写入第1行地址
217
218 for (; x<LINE_LENGTH&&*DData!='/0'; x++)
219 {
220 WriteDataLCM(*(DData++)); // 写入数据
221 }
222
223 if(*DData != '/0') // 判断数据是否写完
224 {
225 x = 0; // 没写完写入第2行
226 y = LINE2;
227 }
228 }
229 }
230
231 if (y == LINE2) // 判断是否写入第2行
232 {
233 WriteCommandLCM(LINE2_HEAD+x,0); // 写入第2行地址
234
235 for (; x<LINE_LENGTH&&*DData!='/0'; x++) // 判断数据是否写完
236 {
237 WriteDataLCM(*(DData++)); // 写入数据
238 }
239 }
240 }*/
241
242 /*****************************************************
243 函 数 名:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
244 功 能:向指定坐标中写入字符串(在DIPS082中使用此的函数)
245 说 明:X-横坐标,Y-纵坐标
246 入口参数:X,Y,*DData
247 返 回 值:无
248 *****************************************************/
249 //按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***
250 void DisplayListChar( uchar X , uchar Y , uchar code * DData)
251 {
252 uchar ListLength , j;
253
254 ListLength = strlen( DData); // strlen:读取字符串的长度
255 Y &= 0x1;
256 X &= 0xF; // 限制X不能大于15,Y不能大于1
257
258 if ( X <= 0x0F) // X坐标应小于0xF
259 {
260 for( j = 0; j < ListLength; j ++)
261 {
262 DisplayOneChar( X , Y , DData [ j ]); // 显示单个字符
263 X ++; // 横坐标加1,纵坐标不变
264 }
265 }
266 }
267
268 /*****************************************************
269 函 数 名:void Mychar()
270 功 能:自定义字符--CGRAM
271 说 明:LCM1602字符库中没有温度符号,自定义温度符号
272 入口参数:无
273 返 回 值:无
274 /*****************************************************/
275 void Mychar( void)
276 {
277 //---------自定义字符代码--00H------闹铃符号-------------
278 WriteCommandLCM( 0x40 , 1); //第1行
279 WriteDataLCM( 0x01); //
280 WriteCommandLCM( 0x41 , 1); //第2行
281 WriteDataLCM( 0x1b); //
282 WriteCommandLCM( 0x42 , 1); //第3行
283 WriteDataLCM( 0x1d); //
284 WriteCommandLCM( 0x43 , 1); //第4行
285 WriteDataLCM( 0x19); //
286 WriteCommandLCM( 0x44 , 1); //第5行
287 WriteDataLCM( 0x1d); //
288 WriteCommandLCM( 0x45 , 1); //第6行
289 WriteDataLCM( 0x1b); //
290 WriteCommandLCM( 0x46 , 1); //第7行
291 WriteDataLCM( 0x01); //
292 WriteCommandLCM( 0x47 , 1); //第8行
293 WriteDataLCM( 0x00); //
294 //---------自定义字符代码--01H-------温度符号------------
295 WriteCommandLCM( 0x48 , 1); //第1行
296 WriteDataLCM( 0x02); //
297 WriteCommandLCM( 0x49 , 1); //第2行
298 WriteDataLCM( 0x05); //
299 WriteCommandLCM( 0x4a , 1); //第3行 1------**--
300 WriteDataLCM( 0x05); // 2----**--**
301 WriteCommandLCM( 0x4b , 1); //第4行 3----**--**
302 WriteDataLCM( 0x02); // 4------**--
303 WriteCommandLCM( 0x4c , 1); //第5行 5----------
304 WriteDataLCM( 0x00); // 6----------
305 WriteCommandLCM( 0x4d , 1); //第6行 7----------
306 WriteDataLCM( 0x00); // 8----------
307 WriteCommandLCM( 0x4e , 1); //第7行
308 WriteDataLCM( 0x00); //
309 WriteCommandLCM( 0x4f , 1); //第8行
310 WriteDataLCM( 0x00); //
311 //---------自定义字符代码--02H-------当前时间------------
312 WriteCommandLCM( 0x50 , 1); //第1行
313 WriteDataLCM( 0x1f); //
314 WriteCommandLCM( 0x51 , 1); //第2行
315 WriteDataLCM( 0x11); //
316 WriteCommandLCM( 0x52 , 1); //第3行
317 WriteDataLCM( 0x15); //
318 WriteCommandLCM( 0x53 , 1); //第4行
319 WriteDataLCM( 0x11); //
320 WriteCommandLCM( 0x54 , 1); //第5行
321 WriteDataLCM( 0x1b); //
322 WriteCommandLCM( 0x55 , 1); //第6行
323 WriteDataLCM( 0x0a); //
324 WriteCommandLCM( 0x56 , 1); //第7行
325 WriteDataLCM( 0x1f); //
326 WriteCommandLCM( 0x57 , 1); //第8行
327 WriteDataLCM( 0x00); //
328 //-----------------------------------------------
329 }
330 #endif
002 LCD1602.H
003
004 The user function is C51.
005 Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
006 All rights reserved.
007 --------------------------------------------------------------------------*/
008
009 #ifndef __LCD1602_H__
010 #define __LCD1602_H__
011
012 /*连接线图:
013 ---------------------------------------------------
014 | LCM-----51 | LCM-----51 | LCM------51 |
015 | ----------------------------------------------- |
016 | DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 |
017 | DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 |
018 | DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
019 | DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |
020 ---------------------------------------------------*/
021
022 /****************** LCD1602指令 ***********************************/
023 //输入方式设置
024 #define LCD_AC_AUTO_INCREMENT 0x06 // 数据读、写操作后,AC自动增一
025 #define LCD_AC_AUTO_DECREASE 0x04 // 数据读、写操作后,AC自动减一
026 #define LCD_MOVE_ENABLE 0x05 // 数据读、写操作,画面平移
027 #define LCD_MOVE_DISENABLE 0x04 // 数据读、写操作,画面不动
028 #define LCD_GO_HOME 0x02 // AC=0,光标、画面回HOME位
029 //设置显示、光标及闪烁开、关
030 #define LCD_DISPLAY_ON 0x0C // 显示开
031 #define LCD_DISPLAY_OFF 0x08 // 显示关
032 #define LCD_CURSOR_ON 0x0A // 光标显示
033 #define LCD_CURSOR_OFF 0x08 // 光标不显示
034 #define LCD_CURSOR_BLINK_ON 0x09 // 光标闪烁
035 #define LCD_CURSOR_BLINK_OFF 0x08 // 光标不闪烁
036 //光标、画面移动,不影响DDRAM
037 #define LCD_LEFT_MOVE 0x18 // LCD显示左移一位
038 #define LCD_RIGHT_MOVE 0x1C // LCD显示右移一位
039 #define LCD_CURSOR_LEFT_MOVE 0x10 // 光标左移一位
040 #define LCD_CURSOR_RIGHT_MOVE 0x14 // 光标右移一位
041 //工作方式设置
042 #define LCD_DISPLAY_DOUBLE_LINE 0x38 // 两行显示
043 #define LCD_DISPLAY_SINGLE_LINE 0x30 // 单行显示
044 #define LCD_CLEAR_SCREEN 0x01 // 清屏
045
046 /***********************LCD1602地址相关******************************/
047 #define LINE1_HEAD 0x80 // 第一行DDRAM起始地址
048 #define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址
049 #define LINE1 0 // 第一行
050 #define LINE2 1 // 第二行
051 #define LINE_LENGTH 8 // 每行的最大字符长度
052
053 /***********************LCD1602接线引脚定义**************************/
054
055 #define LCM_RS P2_0 // 数据/命令选择信号
056 #define LCM_RW P2_1 // 读/写选择信号
057 #define LCM_E P2_2 // 使能信号
058 #define LCM_Data P0 // 显示数据端口
059 #define Busy 0x80 // 用于检测LCM状态字中的Busy标识
060
061 #define uchar unsigned char
062 #define uint unsigned int
063
064 //================================ LCM1602控制部分 =========================================================
065
066 /*****************************************************
067 函 数 名:void Delay_LCD(void)
068 功 能:5ms延时
069 说 明:LCD显示延时
070 入口参数:无
071 返 回 值:无
072 *****************************************************/
073 void Delay_LCD( void)
074 {
075 uint TempCyc = 5552; // 放入延时数据
076
077 while( TempCyc --)
078 {
079 ;
080 }
081 }
082
083 /*****************************************************
084 函 数 名:uchar ReadStatusLCM()
085 功 能:读忙状态
086 说 明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替
087 入口参数:无
088 返 回 值:LCM_Data
089 *****************************************************/
090 //读状态
091 uchar ReadStatusLCM( void)
092 {
093 LCM_Data = 0xFF; // LCM数据口先置1
094
095 LCM_RS = 0;
096 LCM_RW = 1;
097 LCM_E = 0;
098 LCM_E = 0;
099 LCM_E = 1;
100
101 while ( LCM_Data & Busy) // 检测忙信号.如果忙,则不执行
102 {
103 ;
104 }
105
106 return ( LCM_Data); // 不忙返回读取数据
107 }
108
109 /*****************************************************
110 函 数 名:void WriteDataLCM()
111 功 能:向LCM1602中写入数据
112 说 明:将形参WDLCM中的数据写入LCM中
113 入口参数:WDLCM
114 返 回 值:无
115 *****************************************************/
116 //写数据
117 void WriteDataLCM( uchar WDLCM)
118 {
119 ReadStatusLCM(); // 检测忙
120
121 LCM_Data = WDLCM; // 写入数据到LCM
122
123 LCM_RS = 1;
124 LCM_RW = 0;
125 LCM_E = 0; // 若晶振速度太高可以在这后加小的延时
126 LCM_E = 0; // 延时
127 LCM_E = 1;
128 }
129
130 /*****************************************************
131 函 数 名:void WriteCommandLCM()
132 功 能:向LCM1602中写入指令
133 说 明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测
134 入口参数:WCLCM,BuysC
135 返 回 值:无
136 *****************************************************/
137 //写指令
138 void WriteCommandLCM( uchar WCLCM , BuysC) // BuysC为0时忽略忙检测
139 {
140 if ( BuysC)
141 {
142 ReadStatusLCM(); // 根据需要检测忙
143 }
144
145 LCM_Data = WCLCM; // 写入指令
146
147 LCM_RS = 0;
148 LCM_RW = 0;
149 LCM_E = 0;
150 LCM_E = 0;
151 LCM_E = 1;
152 }
153
154 /*****************************************************
155 函 数 名:void LCMInit()
156 功 能:初始化LCM1602
157 说 明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作
158 入口参数:无
159 返 回 值:无
160 *****************************************************/
161 //LCM初始化
162 void LCMInit( void)
163 {
164 LCM_Data = 0;
165 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 0); // 三次显示模式设置,不检测忙信号
166 Delay_LCD();
167 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 0); // 0x38指令表示:8位数据显示模式,俩行多显示
168 Delay_LCD();
169 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 0);
170 Delay_LCD();
171
172 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 1); // 显示模式设置,开始要求每次检测忙信号
173 WriteCommandLCM( LCD_DISPLAY_OFF , 1); // 关闭显示
174 WriteCommandLCM( LCD_CLEAR_SCREEN , 1); // 显示清屏
175 WriteCommandLCM( LCD_AC_AUTO_INCREMENT , 1); // 显示光标移动设置
176 WriteCommandLCM( LCD_DISPLAY_ON , 1); // 显示开及光标设置
177 }
178
179 /*****************************************************
180 函 数 名:void DisplayOneChar()
181 功 能:按指定坐标中写入数据
182 说 明:X-横坐标,Y-纵坐标,DData为ASCII值
183 入口参数:X,Y,DData
184 返 回 值:无
185 *****************************************************/
186 //按指定位置显示一个字符
187 void DisplayOneChar( uchar X , uchar Y , uchar DData)
188 {
189 Y &= 0x01;
190 X &= 0x0F; // 限制X不能大于15,Y不能大于1
191
192 if ( Y)
193 {
194 X |= LINE2_HEAD; // 当要显示第二行时地址码:0xc0
195 }
196
197 X |= LINE1_HEAD; // 第一行的地址码:0x80
198 WriteCommandLCM( X , 0); // 这里不检测忙信号,发送地址码
199 WriteDataLCM( DData);
200 }
201 /*在LCD1602中使用此函数,在DIPS082中使用下面的函数
202 /*****************************************************
203 函 数 名:void DisplayListChar(uchar x,uchar y,uchar *DData)
204 功 能:向指定坐标中写入字符串(在LCD1602中使用此函数)
205 说 明:X-横坐标,Y-纵坐标
206 入口参数:X,Y,*DData
207 返 回 值:无
208 *****************************************************
209 //按指定位置显示字符串
210 void DisplayListChar(uchar x,uchar y,uchar *DData)
211 {
212 if (y == LINE1) // 判断是否写入第1行
213 {
214 if (x < LINE_LENGTH) // 写入位数
215 {
216 WriteCommandLCM(LINE1_HEAD+x,0); // 写入第1行地址
217
218 for (; x<LINE_LENGTH&&*DData!='/0'; x++)
219 {
220 WriteDataLCM(*(DData++)); // 写入数据
221 }
222
223 if(*DData != '/0') // 判断数据是否写完
224 {
225 x = 0; // 没写完写入第2行
226 y = LINE2;
227 }
228 }
229 }
230
231 if (y == LINE2) // 判断是否写入第2行
232 {
233 WriteCommandLCM(LINE2_HEAD+x,0); // 写入第2行地址
234
235 for (; x<LINE_LENGTH&&*DData!='/0'; x++) // 判断数据是否写完
236 {
237 WriteDataLCM(*(DData++)); // 写入数据
238 }
239 }
240 }*/
241
242 /*****************************************************
243 函 数 名:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
244 功 能:向指定坐标中写入字符串(在DIPS082中使用此的函数)
245 说 明:X-横坐标,Y-纵坐标
246 入口参数:X,Y,*DData
247 返 回 值:无
248 *****************************************************/
249 //按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***
250 void DisplayListChar( uchar X , uchar Y , uchar code * DData)
251 {
252 uchar ListLength , j;
253
254 ListLength = strlen( DData); // strlen:读取字符串的长度
255 Y &= 0x1;
256 X &= 0xF; // 限制X不能大于15,Y不能大于1
257
258 if ( X <= 0x0F) // X坐标应小于0xF
259 {
260 for( j = 0; j < ListLength; j ++)
261 {
262 DisplayOneChar( X , Y , DData [ j ]); // 显示单个字符
263 X ++; // 横坐标加1,纵坐标不变
264 }
265 }
266 }
267
268 /*****************************************************
269 函 数 名:void Mychar()
270 功 能:自定义字符--CGRAM
271 说 明:LCM1602字符库中没有温度符号,自定义温度符号
272 入口参数:无
273 返 回 值:无
274 /*****************************************************/
275 void Mychar( void)
276 {
277 //---------自定义字符代码--00H------闹铃符号-------------
278 WriteCommandLCM( 0x40 , 1); //第1行
279 WriteDataLCM( 0x01); //
280 WriteCommandLCM( 0x41 , 1); //第2行
281 WriteDataLCM( 0x1b); //
282 WriteCommandLCM( 0x42 , 1); //第3行
283 WriteDataLCM( 0x1d); //
284 WriteCommandLCM( 0x43 , 1); //第4行
285 WriteDataLCM( 0x19); //
286 WriteCommandLCM( 0x44 , 1); //第5行
287 WriteDataLCM( 0x1d); //
288 WriteCommandLCM( 0x45 , 1); //第6行
289 WriteDataLCM( 0x1b); //
290 WriteCommandLCM( 0x46 , 1); //第7行
291 WriteDataLCM( 0x01); //
292 WriteCommandLCM( 0x47 , 1); //第8行
293 WriteDataLCM( 0x00); //
294 //---------自定义字符代码--01H-------温度符号------------
295 WriteCommandLCM( 0x48 , 1); //第1行
296 WriteDataLCM( 0x02); //
297 WriteCommandLCM( 0x49 , 1); //第2行
298 WriteDataLCM( 0x05); //
299 WriteCommandLCM( 0x4a , 1); //第3行 1------**--
300 WriteDataLCM( 0x05); // 2----**--**
301 WriteCommandLCM( 0x4b , 1); //第4行 3----**--**
302 WriteDataLCM( 0x02); // 4------**--
303 WriteCommandLCM( 0x4c , 1); //第5行 5----------
304 WriteDataLCM( 0x00); // 6----------
305 WriteCommandLCM( 0x4d , 1); //第6行 7----------
306 WriteDataLCM( 0x00); // 8----------
307 WriteCommandLCM( 0x4e , 1); //第7行
308 WriteDataLCM( 0x00); //
309 WriteCommandLCM( 0x4f , 1); //第8行
310 WriteDataLCM( 0x00); //
311 //---------自定义字符代码--02H-------当前时间------------
312 WriteCommandLCM( 0x50 , 1); //第1行
313 WriteDataLCM( 0x1f); //
314 WriteCommandLCM( 0x51 , 1); //第2行
315 WriteDataLCM( 0x11); //
316 WriteCommandLCM( 0x52 , 1); //第3行
317 WriteDataLCM( 0x15); //
318 WriteCommandLCM( 0x53 , 1); //第4行
319 WriteDataLCM( 0x11); //
320 WriteCommandLCM( 0x54 , 1); //第5行
321 WriteDataLCM( 0x1b); //
322 WriteCommandLCM( 0x55 , 1); //第6行
323 WriteDataLCM( 0x0a); //
324 WriteCommandLCM( 0x56 , 1); //第7行
325 WriteDataLCM( 0x1f); //
326 WriteCommandLCM( 0x57 , 1); //第8行
327 WriteDataLCM( 0x00); //
328 //-----------------------------------------------
329 }
330 #endif
001
/*--------------------------------------------------------------------------
002 LCD1602.H
003
004 The user function is C51.
005 Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
006 All rights reserved.
007 --------------------------------------------------------------------------*/
008
009 #ifndef __LCD1602_H__
010 #define __LCD1602_H__
011
012 /*连接线图:
013 ---------------------------------------------------
014 | LCM-----51 | LCM-----51 | LCM------51 |
015 | ----------------------------------------------- |
016 | DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 |
017 | DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 |
018 | DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
019 | DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |
020 ---------------------------------------------------*/
021
022 /****************** LCD1602指令 ***********************************/
023 //输入方式设置
024 #define LCD_AC_AUTO_INCREMENT 0x06 // 数据读、写操作后,AC自动增一
025 #define LCD_AC_AUTO_DECREASE 0x04 // 数据读、写操作后,AC自动减一
026 #define LCD_MOVE_ENABLE 0x05 // 数据读、写操作,画面平移
027 #define LCD_MOVE_DISENABLE 0x04 // 数据读、写操作,画面不动
028 #define LCD_GO_HOME 0x02 // AC=0,光标、画面回HOME位
029 //设置显示、光标及闪烁开、关
030 #define LCD_DISPLAY_ON 0x0C // 显示开
031 #define LCD_DISPLAY_OFF 0x08 // 显示关
032 #define LCD_CURSOR_ON 0x0A // 光标显示
033 #define LCD_CURSOR_OFF 0x08 // 光标不显示
034 #define LCD_CURSOR_BLINK_ON 0x09 // 光标闪烁
035 #define LCD_CURSOR_BLINK_OFF 0x08 // 光标不闪烁
036 //光标、画面移动,不影响DDRAM
037 #define LCD_LEFT_MOVE 0x18 // LCD显示左移一位
038 #define LCD_RIGHT_MOVE 0x1C // LCD显示右移一位
039 #define LCD_CURSOR_LEFT_MOVE 0x10 // 光标左移一位
040 #define LCD_CURSOR_RIGHT_MOVE 0x14 // 光标右移一位
041 //工作方式设置
042 #define LCD_DISPLAY_DOUBLE_LINE 0x38 // 两行显示
043 #define LCD_DISPLAY_SINGLE_LINE 0x30 // 单行显示
044 #define LCD_CLEAR_SCREEN 0x01 // 清屏
045
046 /***********************LCD1602地址相关******************************/
047 #define LINE1_HEAD 0x80 // 第一行DDRAM起始地址
048 #define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址
049 #define LINE1 0 // 第一行
050 #define LINE2 1 // 第二行
051 #define LINE_LENGTH 8 // 每行的最大字符长度
052
053 /***********************LCD1602接线引脚定义**************************/
054
055 #define LCM_RS P2_0 // 数据/命令选择信号
056 #define LCM_RW P2_1 // 读/写选择信号
057 #define LCM_E P2_2 // 使能信号
058 #define LCM_Data P0 // 显示数据端口
059 #define Busy 0x80 // 用于检测LCM状态字中的Busy标识
060
061 #define uchar unsigned char
062 #define uint unsigned int
063
064 //================================ LCM1602控制部分 =========================================================
065
066 /*****************************************************
067 函 数 名:void Delay_LCD(void)
068 功 能:5ms延时
069 说 明:LCD显示延时
070 入口参数:无
071 返 回 值:无
072 *****************************************************/
073 void Delay_LCD( void)
074 {
075 uint TempCyc = 5552; // 放入延时数据
076
077 while( TempCyc --)
078 {
079 ;
080 }
081 }
082
083 /*****************************************************
084 函 数 名:uchar ReadStatusLCM()
085 功 能:读忙状态
086 说 明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替
087 入口参数:无
088 返 回 值:LCM_Data
089 *****************************************************/
090 //读状态
091 uchar ReadStatusLCM( void)
092 {
093 LCM_Data = 0xFF; // LCM数据口先置1
094
095 LCM_RS = 0;
096 LCM_RW = 1;
097 LCM_E = 0;
098 LCM_E = 0;
099 LCM_E = 1;
100
101 while ( LCM_Data & Busy) // 检测忙信号.如果忙,则不执行
102 {
103 ;
104 }
105
106 return ( LCM_Data); // 不忙返回读取数据
107 }
108
109 /*****************************************************
110 函 数 名:void WriteDataLCM()
111 功 能:向LCM1602中写入数据
112 说 明:将形参WDLCM中的数据写入LCM中
113 入口参数:WDLCM
114 返 回 值:无
115 *****************************************************/
116 //写数据
117 void WriteDataLCM( uchar WDLCM)
118 {
119 ReadStatusLCM(); // 检测忙
120
121 LCM_Data = WDLCM; // 写入数据到LCM
122
123 LCM_RS = 1;
124 LCM_RW = 0;
125 LCM_E = 0; // 若晶振速度太高可以在这后加小的延时
126 LCM_E = 0; // 延时
127 LCM_E = 1;
128 }
129
130 /*****************************************************
131 函 数 名:void WriteCommandLCM()
132 功 能:向LCM1602中写入指令
133 说 明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测
134 入口参数:WCLCM,BuysC
135 返 回 值:无
136 *****************************************************/
137 //写指令
138 void WriteCommandLCM( uchar WCLCM , BuysC) // BuysC为0时忽略忙检测
139 {
140 if ( BuysC)
141 {
142 ReadStatusLCM(); // 根据需要检测忙
143 }
144
145 LCM_Data = WCLCM; // 写入指令
146
147 LCM_RS = 0;
148 LCM_RW = 0;
149 LCM_E = 0;
150 LCM_E = 0;
151 LCM_E = 1;
152 }
153
154 /*****************************************************
155 函 数 名:void LCMInit()
156 功 能:初始化LCM1602
157 说 明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作
158 入口参数:无
159 返 回 值:无
160 *****************************************************/
161 //LCM初始化
162 void LCMInit( void)
163 {
164 LCM_Data = 0;
165 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 0); // 三次显示模式设置,不检测忙信号
166 Delay_LCD();
167 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 0); // 0x38指令表示:8位数据显示模式,俩行多显示
168 Delay_LCD();
169 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 0);
170 Delay_LCD();
171
172 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 1); // 显示模式设置,开始要求每次检测忙信号
173 WriteCommandLCM( LCD_DISPLAY_OFF , 1); // 关闭显示
174 WriteCommandLCM( LCD_CLEAR_SCREEN , 1); // 显示清屏
175 WriteCommandLCM( LCD_AC_AUTO_INCREMENT , 1); // 显示光标移动设置
176 WriteCommandLCM( LCD_DISPLAY_ON , 1); // 显示开及光标设置
177 }
178
179 /*****************************************************
180 函 数 名:void DisplayOneChar()
181 功 能:按指定坐标中写入数据
182 说 明:X-横坐标,Y-纵坐标,DData为ASCII值
183 入口参数:X,Y,DData
184 返 回 值:无
185 *****************************************************/
186 //按指定位置显示一个字符
187 void DisplayOneChar( uchar X , uchar Y , uchar DData)
188 {
189 Y &= 0x01;
190 X &= 0x0F; // 限制X不能大于15,Y不能大于1
191
192 if ( Y)
193 {
194 X |= LINE2_HEAD; // 当要显示第二行时地址码:0xc0
195 }
196
197 X |= LINE1_HEAD; // 第一行的地址码:0x80
198 WriteCommandLCM( X , 0); // 这里不检测忙信号,发送地址码
199 WriteDataLCM( DData);
200 }
201 /*在LCD1602中使用此函数,在DIPS082中使用下面的函数
202 /*****************************************************
203 函 数 名:void DisplayListChar(uchar x,uchar y,uchar *DData)
204 功 能:向指定坐标中写入字符串(在LCD1602中使用此函数)
205 说 明:X-横坐标,Y-纵坐标
206 入口参数:X,Y,*DData
207 返 回 值:无
208 *****************************************************
209 //按指定位置显示字符串
210 void DisplayListChar(uchar x,uchar y,uchar *DData)
211 {
212 if (y == LINE1) // 判断是否写入第1行
213 {
214 if (x < LINE_LENGTH) // 写入位数
215 {
216 WriteCommandLCM(LINE1_HEAD+x,0); // 写入第1行地址
217
218 for (; x<LINE_LENGTH&&*DData!='/0'; x++)
219 {
220 WriteDataLCM(*(DData++)); // 写入数据
221 }
222
223 if(*DData != '/0') // 判断数据是否写完
224 {
225 x = 0; // 没写完写入第2行
226 y = LINE2;
227 }
228 }
229 }
230
231 if (y == LINE2) // 判断是否写入第2行
232 {
233 WriteCommandLCM(LINE2_HEAD+x,0); // 写入第2行地址
234
235 for (; x<LINE_LENGTH&&*DData!='/0'; x++) // 判断数据是否写完
236 {
237 WriteDataLCM(*(DData++)); // 写入数据
238 }
239 }
240 }*/
241
242 /*****************************************************
243 函 数 名:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
244 功 能:向指定坐标中写入字符串(在DIPS082中使用此的函数)
245 说 明:X-横坐标,Y-纵坐标
246 入口参数:X,Y,*DData
247 返 回 值:无
248 *****************************************************/
249 //按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***
250 void DisplayListChar( uchar X , uchar Y , uchar code * DData)
251 {
252 uchar ListLength , j;
253
254 ListLength = strlen( DData); // strlen:读取字符串的长度
255 Y &= 0x1;
256 X &= 0xF; // 限制X不能大于15,Y不能大于1
257
258 if ( X <= 0x0F) // X坐标应小于0xF
259 {
260 for( j = 0; j < ListLength; j ++)
261 {
262 DisplayOneChar( X , Y , DData [ j ]); // 显示单个字符
263 X ++; // 横坐标加1,纵坐标不变
264 }
265 }
266 }
267
268 /*****************************************************
269 函 数 名:void Mychar()
270 功 能:自定义字符--CGRAM
271 说 明:LCM1602字符库中没有温度符号,自定义温度符号
272 入口参数:无
273 返 回 值:无
274 /*****************************************************/
275 void Mychar( void)
276 {
277 //---------自定义字符代码--00H------闹铃符号-------------
278 WriteCommandLCM( 0x40 , 1); //第1行
279 WriteDataLCM( 0x01); //
280 WriteCommandLCM( 0x41 , 1); //第2行
281 WriteDataLCM( 0x1b); //
282 WriteCommandLCM( 0x42 , 1); //第3行
283 WriteDataLCM( 0x1d); //
284 WriteCommandLCM( 0x43 , 1); //第4行
285 WriteDataLCM( 0x19); //
286 WriteCommandLCM( 0x44 , 1); //第5行
287 WriteDataLCM( 0x1d); //
288 WriteCommandLCM( 0x45 , 1); //第6行
289 WriteDataLCM( 0x1b); //
290 WriteCommandLCM( 0x46 , 1); //第7行
291 WriteDataLCM( 0x01); //
292 WriteCommandLCM( 0x47 , 1); //第8行
293 WriteDataLCM( 0x00); //
294 //---------自定义字符代码--01H-------温度符号------------
295 WriteCommandLCM( 0x48 , 1); //第1行
296 WriteDataLCM( 0x02); //
297 WriteCommandLCM( 0x49 , 1); //第2行
298 WriteDataLCM( 0x05); //
299 WriteCommandLCM( 0x4a , 1); //第3行 1------**--
300 WriteDataLCM( 0x05); // 2----**--**
301 WriteCommandLCM( 0x4b , 1); //第4行 3----**--**
302 WriteDataLCM( 0x02); // 4------**--
303 WriteCommandLCM( 0x4c , 1); //第5行 5----------
304 WriteDataLCM( 0x00); // 6----------
305 WriteCommandLCM( 0x4d , 1); //第6行 7----------
306 WriteDataLCM( 0x00); // 8----------
307 WriteCommandLCM( 0x4e , 1); //第7行
308 WriteDataLCM( 0x00); //
309 WriteCommandLCM( 0x4f , 1); //第8行
310 WriteDataLCM( 0x00); //
311 //---------自定义字符代码--02H-------当前时间------------
312 WriteCommandLCM( 0x50 , 1); //第1行
313 WriteDataLCM( 0x1f); //
314 WriteCommandLCM( 0x51 , 1); //第2行
315 WriteDataLCM( 0x11); //
316 WriteCommandLCM( 0x52 , 1); //第3行
317 WriteDataLCM( 0x15); //
318 WriteCommandLCM( 0x53 , 1); //第4行
319 WriteDataLCM( 0x11); //
320 WriteCommandLCM( 0x54 , 1); //第5行
321 WriteDataLCM( 0x1b); //
322 WriteCommandLCM( 0x55 , 1); //第6行
323 WriteDataLCM( 0x0a); //
324 WriteCommandLCM( 0x56 , 1); //第7行
325 WriteDataLCM( 0x1f); //
326 WriteCommandLCM( 0x57 , 1); //第8行
327 WriteDataLCM( 0x00); //
328 //-----------------------------------------------
329 }
330 #endif
002 LCD1602.H
003
004 The user function is C51.
005 Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
006 All rights reserved.
007 --------------------------------------------------------------------------*/
008
009 #ifndef __LCD1602_H__
010 #define __LCD1602_H__
011
012 /*连接线图:
013 ---------------------------------------------------
014 | LCM-----51 | LCM-----51 | LCM------51 |
015 | ----------------------------------------------- |
016 | DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 |
017 | DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 |
018 | DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
019 | DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |
020 ---------------------------------------------------*/
021
022 /****************** LCD1602指令 ***********************************/
023 //输入方式设置
024 #define LCD_AC_AUTO_INCREMENT 0x06 // 数据读、写操作后,AC自动增一
025 #define LCD_AC_AUTO_DECREASE 0x04 // 数据读、写操作后,AC自动减一
026 #define LCD_MOVE_ENABLE 0x05 // 数据读、写操作,画面平移
027 #define LCD_MOVE_DISENABLE 0x04 // 数据读、写操作,画面不动
028 #define LCD_GO_HOME 0x02 // AC=0,光标、画面回HOME位
029 //设置显示、光标及闪烁开、关
030 #define LCD_DISPLAY_ON 0x0C // 显示开
031 #define LCD_DISPLAY_OFF 0x08 // 显示关
032 #define LCD_CURSOR_ON 0x0A // 光标显示
033 #define LCD_CURSOR_OFF 0x08 // 光标不显示
034 #define LCD_CURSOR_BLINK_ON 0x09 // 光标闪烁
035 #define LCD_CURSOR_BLINK_OFF 0x08 // 光标不闪烁
036 //光标、画面移动,不影响DDRAM
037 #define LCD_LEFT_MOVE 0x18 // LCD显示左移一位
038 #define LCD_RIGHT_MOVE 0x1C // LCD显示右移一位
039 #define LCD_CURSOR_LEFT_MOVE 0x10 // 光标左移一位
040 #define LCD_CURSOR_RIGHT_MOVE 0x14 // 光标右移一位
041 //工作方式设置
042 #define LCD_DISPLAY_DOUBLE_LINE 0x38 // 两行显示
043 #define LCD_DISPLAY_SINGLE_LINE 0x30 // 单行显示
044 #define LCD_CLEAR_SCREEN 0x01 // 清屏
045
046 /***********************LCD1602地址相关******************************/
047 #define LINE1_HEAD 0x80 // 第一行DDRAM起始地址
048 #define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址
049 #define LINE1 0 // 第一行
050 #define LINE2 1 // 第二行
051 #define LINE_LENGTH 8 // 每行的最大字符长度
052
053 /***********************LCD1602接线引脚定义**************************/
054
055 #define LCM_RS P2_0 // 数据/命令选择信号
056 #define LCM_RW P2_1 // 读/写选择信号
057 #define LCM_E P2_2 // 使能信号
058 #define LCM_Data P0 // 显示数据端口
059 #define Busy 0x80 // 用于检测LCM状态字中的Busy标识
060
061 #define uchar unsigned char
062 #define uint unsigned int
063
064 //================================ LCM1602控制部分 =========================================================
065
066 /*****************************************************
067 函 数 名:void Delay_LCD(void)
068 功 能:5ms延时
069 说 明:LCD显示延时
070 入口参数:无
071 返 回 值:无
072 *****************************************************/
073 void Delay_LCD( void)
074 {
075 uint TempCyc = 5552; // 放入延时数据
076
077 while( TempCyc --)
078 {
079 ;
080 }
081 }
082
083 /*****************************************************
084 函 数 名:uchar ReadStatusLCM()
085 功 能:读忙状态
086 说 明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替
087 入口参数:无
088 返 回 值:LCM_Data
089 *****************************************************/
090 //读状态
091 uchar ReadStatusLCM( void)
092 {
093 LCM_Data = 0xFF; // LCM数据口先置1
094
095 LCM_RS = 0;
096 LCM_RW = 1;
097 LCM_E = 0;
098 LCM_E = 0;
099 LCM_E = 1;
100
101 while ( LCM_Data & Busy) // 检测忙信号.如果忙,则不执行
102 {
103 ;
104 }
105
106 return ( LCM_Data); // 不忙返回读取数据
107 }
108
109 /*****************************************************
110 函 数 名:void WriteDataLCM()
111 功 能:向LCM1602中写入数据
112 说 明:将形参WDLCM中的数据写入LCM中
113 入口参数:WDLCM
114 返 回 值:无
115 *****************************************************/
116 //写数据
117 void WriteDataLCM( uchar WDLCM)
118 {
119 ReadStatusLCM(); // 检测忙
120
121 LCM_Data = WDLCM; // 写入数据到LCM
122
123 LCM_RS = 1;
124 LCM_RW = 0;
125 LCM_E = 0; // 若晶振速度太高可以在这后加小的延时
126 LCM_E = 0; // 延时
127 LCM_E = 1;
128 }
129
130 /*****************************************************
131 函 数 名:void WriteCommandLCM()
132 功 能:向LCM1602中写入指令
133 说 明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测
134 入口参数:WCLCM,BuysC
135 返 回 值:无
136 *****************************************************/
137 //写指令
138 void WriteCommandLCM( uchar WCLCM , BuysC) // BuysC为0时忽略忙检测
139 {
140 if ( BuysC)
141 {
142 ReadStatusLCM(); // 根据需要检测忙
143 }
144
145 LCM_Data = WCLCM; // 写入指令
146
147 LCM_RS = 0;
148 LCM_RW = 0;
149 LCM_E = 0;
150 LCM_E = 0;
151 LCM_E = 1;
152 }
153
154 /*****************************************************
155 函 数 名:void LCMInit()
156 功 能:初始化LCM1602
157 说 明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作
158 入口参数:无
159 返 回 值:无
160 *****************************************************/
161 //LCM初始化
162 void LCMInit( void)
163 {
164 LCM_Data = 0;
165 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 0); // 三次显示模式设置,不检测忙信号
166 Delay_LCD();
167 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 0); // 0x38指令表示:8位数据显示模式,俩行多显示
168 Delay_LCD();
169 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 0);
170 Delay_LCD();
171
172 WriteCommandLCM( LCD_DISPLAY_DOUBLE_LINE , 1); // 显示模式设置,开始要求每次检测忙信号
173 WriteCommandLCM( LCD_DISPLAY_OFF , 1); // 关闭显示
174 WriteCommandLCM( LCD_CLEAR_SCREEN , 1); // 显示清屏
175 WriteCommandLCM( LCD_AC_AUTO_INCREMENT , 1); // 显示光标移动设置
176 WriteCommandLCM( LCD_DISPLAY_ON , 1); // 显示开及光标设置
177 }
178
179 /*****************************************************
180 函 数 名:void DisplayOneChar()
181 功 能:按指定坐标中写入数据
182 说 明:X-横坐标,Y-纵坐标,DData为ASCII值
183 入口参数:X,Y,DData
184 返 回 值:无
185 *****************************************************/
186 //按指定位置显示一个字符
187 void DisplayOneChar( uchar X , uchar Y , uchar DData)
188 {
189 Y &= 0x01;
190 X &= 0x0F; // 限制X不能大于15,Y不能大于1
191
192 if ( Y)
193 {
194 X |= LINE2_HEAD; // 当要显示第二行时地址码:0xc0
195 }
196
197 X |= LINE1_HEAD; // 第一行的地址码:0x80
198 WriteCommandLCM( X , 0); // 这里不检测忙信号,发送地址码
199 WriteDataLCM( DData);
200 }
201 /*在LCD1602中使用此函数,在DIPS082中使用下面的函数
202 /*****************************************************
203 函 数 名:void DisplayListChar(uchar x,uchar y,uchar *DData)
204 功 能:向指定坐标中写入字符串(在LCD1602中使用此函数)
205 说 明:X-横坐标,Y-纵坐标
206 入口参数:X,Y,*DData
207 返 回 值:无
208 *****************************************************
209 //按指定位置显示字符串
210 void DisplayListChar(uchar x,uchar y,uchar *DData)
211 {
212 if (y == LINE1) // 判断是否写入第1行
213 {
214 if (x < LINE_LENGTH) // 写入位数
215 {
216 WriteCommandLCM(LINE1_HEAD+x,0); // 写入第1行地址
217
218 for (; x<LINE_LENGTH&&*DData!='/0'; x++)
219 {
220 WriteDataLCM(*(DData++)); // 写入数据
221 }
222
223 if(*DData != '/0') // 判断数据是否写完
224 {
225 x = 0; // 没写完写入第2行
226 y = LINE2;
227 }
228 }
229 }
230
231 if (y == LINE2) // 判断是否写入第2行
232 {
233 WriteCommandLCM(LINE2_HEAD+x,0); // 写入第2行地址
234
235 for (; x<LINE_LENGTH&&*DData!='/0'; x++) // 判断数据是否写完
236 {
237 WriteDataLCM(*(DData++)); // 写入数据
238 }
239 }
240 }*/
241
242 /*****************************************************
243 函 数 名:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
244 功 能:向指定坐标中写入字符串(在DIPS082中使用此的函数)
245 说 明:X-横坐标,Y-纵坐标
246 入口参数:X,Y,*DData
247 返 回 值:无
248 *****************************************************/
249 //按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***
250 void DisplayListChar( uchar X , uchar Y , uchar code * DData)
251 {
252 uchar ListLength , j;
253
254 ListLength = strlen( DData); // strlen:读取字符串的长度
255 Y &= 0x1;
256 X &= 0xF; // 限制X不能大于15,Y不能大于1
257
258 if ( X <= 0x0F) // X坐标应小于0xF
259 {
260 for( j = 0; j < ListLength; j ++)
261 {
262 DisplayOneChar( X , Y , DData [ j ]); // 显示单个字符
263 X ++; // 横坐标加1,纵坐标不变
264 }
265 }
266 }
267
268 /*****************************************************
269 函 数 名:void Mychar()
270 功 能:自定义字符--CGRAM
271 说 明:LCM1602字符库中没有温度符号,自定义温度符号
272 入口参数:无
273 返 回 值:无
274 /*****************************************************/
275 void Mychar( void)
276 {
277 //---------自定义字符代码--00H------闹铃符号-------------
278 WriteCommandLCM( 0x40 , 1); //第1行
279 WriteDataLCM( 0x01); //
280 WriteCommandLCM( 0x41 , 1); //第2行
281 WriteDataLCM( 0x1b); //
282 WriteCommandLCM( 0x42 , 1); //第3行
283 WriteDataLCM( 0x1d); //
284 WriteCommandLCM( 0x43 , 1); //第4行
285 WriteDataLCM( 0x19); //
286 WriteCommandLCM( 0x44 , 1); //第5行
287 WriteDataLCM( 0x1d); //
288 WriteCommandLCM( 0x45 , 1); //第6行
289 WriteDataLCM( 0x1b); //
290 WriteCommandLCM( 0x46 , 1); //第7行
291 WriteDataLCM( 0x01); //
292 WriteCommandLCM( 0x47 , 1); //第8行
293 WriteDataLCM( 0x00); //
294 //---------自定义字符代码--01H-------温度符号------------
295 WriteCommandLCM( 0x48 , 1); //第1行
296 WriteDataLCM( 0x02); //
297 WriteCommandLCM( 0x49 , 1); //第2行
298 WriteDataLCM( 0x05); //
299 WriteCommandLCM( 0x4a , 1); //第3行 1------**--
300 WriteDataLCM( 0x05); // 2----**--**
301 WriteCommandLCM( 0x4b , 1); //第4行 3----**--**
302 WriteDataLCM( 0x02); // 4------**--
303 WriteCommandLCM( 0x4c , 1); //第5行 5----------
304 WriteDataLCM( 0x00); // 6----------
305 WriteCommandLCM( 0x4d , 1); //第6行 7----------
306 WriteDataLCM( 0x00); // 8----------
307 WriteCommandLCM( 0x4e , 1); //第7行
308 WriteDataLCM( 0x00); //
309 WriteCommandLCM( 0x4f , 1); //第8行
310 WriteDataLCM( 0x00); //
311 //---------自定义字符代码--02H-------当前时间------------
312 WriteCommandLCM( 0x50 , 1); //第1行
313 WriteDataLCM( 0x1f); //
314 WriteCommandLCM( 0x51 , 1); //第2行
315 WriteDataLCM( 0x11); //
316 WriteCommandLCM( 0x52 , 1); //第3行
317 WriteDataLCM( 0x15); //
318 WriteCommandLCM( 0x53 , 1); //第4行
319 WriteDataLCM( 0x11); //
320 WriteCommandLCM( 0x54 , 1); //第5行
321 WriteDataLCM( 0x1b); //
322 WriteCommandLCM( 0x55 , 1); //第6行
323 WriteDataLCM( 0x0a); //
324 WriteCommandLCM( 0x56 , 1); //第7行
325 WriteDataLCM( 0x1f); //
326 WriteCommandLCM( 0x57 , 1); //第8行
327 WriteDataLCM( 0x00); //
328 //-----------------------------------------------
329 }
330 #endif
补充材料,不是头文件部分内容
1602LCD管脚定义如下: |
第1脚:VSS为地电源 |
第2脚:VDD接5V正电源 |
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”, |
使用时可以通过一个10K的电位器调整对比度 |
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 |
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址, |
当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。 |
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 |
第7~14脚:D0~D7为8位双向数据线。 |
第15脚:背光电源接5V正电压 |
第16脚:背光电源接地 |