LCD驱动接口函数(转)

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

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

 

补充材料,不是头文件部分内容

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脚:背光电源接地


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值