📄 lcddrive.lst
字号:
253 /* 以下为LCM的驱动层,主要负责发送T6963的各种命令,提供设置显示地址等功能,在发送命令前会检测其状态字。带
-参数命令模式:先参数,后命令;操作模式:先命令,后数据 */
254
255 /* T6963C 命令定义 */
256 #define LCD_CUR_POS 0x21 /* 光标位置设置(只有设置到有效显示地址并打开显示时才看到) */
ARM COMPILER V2.32a, LCDDRIVE 25/01/07 14:11:01 PAGE 5
257 #define LCD_CGR_POS 0x22 /* CGRAM偏置地址设置(可以增加自已的符号) */
258 #define LCD_ADR_POS 0x24 /* 地址指针位置(设置读写操作指针) */
259
260 #define LCD_TXT_STP 0x40 /* 文本区首址(从此地址开始向屏幕左上角显示字符) */
261 #define LCD_TXT_WID 0x41 /* 文本区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
262 #define LCD_GRH_STP 0x42 /* 图形区首址(从此地址开始向屏幕左上角显示点) */
263 #define LCD_GRH_WID 0x43 /* 图形区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
264
265 #define LCD_MOD_OR 0x80 /* 显示方式:逻辑或 */
266 #define LCD_MOD_XOR 0x81 /* 显示方式:逻辑异或 */
267 #define LCD_MOD_AND 0x82 /* 显示方式:逻辑与 */
268 #define LCD_MOD_TCH 0x83 /* 显示方式:文本特征 */
269
270 #define LCD_DIS_SW 0x90 /* 显示开关:D0=1/0,光标闪烁启用/禁用 */
271 /* D1=1/0,光标显示启用/禁用 */
272 /* D2=1/0,文本显示启用/禁用(打开后再使用) */
273 /* D3=1/0,图形显示启用/禁用(打开后再使用) */
274
275 #define LCD_CUR_SHP 0xA0 /* 光标形状选择:0xA0-0xA7表示光标占的行数 */
276
277 #define LCD_AUT_WR 0xB0 /* 自动写设置 */
278 #define LCD_AUT_RD 0xB1 /* 自动读设置 */
279 #define LCD_AUT_OVR 0xB2 /* 自动读/写结束 */
280
281 #define LCD_INC_WR 0xC0 /* 数据一次写,地址加1 */
282 #define LCD_INC_RD 0xC1 /* 数据一次读,地址加1 */
283 #define LCD_DEC_WR 0xC2 /* 数据一次写,地址减1 */
284 #define LCD_DEC_RD 0xC3 /* 数据一次读,地址减1 */
285 #define LCD_NOC_WR 0xC4 /* 数据一次写,地址不变 */
286 #define LCD_NOC_RD 0xC5 /* 数据一次读,地址不变 */
287
288 #define LCD_SCN_RD 0xE0 /* 屏读 */
289
290 #define LCD_SCN_CP 0xE8 /* 屏拷贝 */
291
292 #define LCD_BIT_OP 0xF0 /* 位操作:D0-D2--定义D0-D7位,D3--1为置位,0为清除 */
293
294
295 /***********************************************************************
296 * 名称:LCD_TestStaBit01()
297 * 功能:判断读写指令和读写数据是否允许。
298 * 入口参数:无
299 * 出口参数:返回0表示禁止,否则表示允许
300 ***********************************************************************/
301 extern uint8 LCD_TestStaBit01(void)
302 { uint8 i;
303 1
304 1 for(i=100; i>0; i--)
305 1 { if( (LCD_ReadState()&0x03)==0x03 ) {
306 3 break;}
307 2 }
308 1 return(i);
309 1 }
310
311
312 /***********************************************************************
313 * 名称:LCD_TestStaBit3()
314 * 功能:数据自动写状态是否允许。
315 * 入口参数:无
316 * 出口参数:返回0表示禁止,否则表示允许
317 ***********************************************************************/
318 extern uint8 LCD_TestStaBit3(void)
319 { uint8 i;
320 1 for(i=100; i>0; i--)
321 1 { if( (LCD_ReadState()&0x08)==0x08 ) break;
322 2 }
ARM COMPILER V2.32a, LCDDRIVE 25/01/07 14:11:01 PAGE 6
323 1 return(i);
324 1 }
325
326
327 /***********************************************************************
328 * 名称:LCD_RTCommand1()
329 * 功能:读一个字节子程序。会先判断LCM状态字。
330 * 入口参数:command 要写入LCM的命令字
331 * 出口参数:操作出错返回0,否则返回数据
332 ***********************************************************************/
333 extern uint8 LCD_RTCommand1(uint8 command)
334 {
335 1 uint8 redddd;
336 1 if( LCD_TestStaBit01()==0 ) return(0);
337 1 LCD_WriteCommand(command); // 发送命令字
338 1 redddd=LCD_ReadData();
339 1 return(redddd);
340 1 }
341 /***********************************************************************
342 * 名称:LCD_WriteTCommand1()
343 * 功能:写无参数命令子程序。会先判断LCM状态字。
344 * 入口参数:command 要写入LCM的命令字
345 * 出口参数:操作出错返回0,否则返回1
346 ***********************************************************************/
347 extern uint8 LCD_WriteTCommand1(uint8 command)
348 {
349 1
350 1 if( LCD_TestStaBit01()==0 ) return(0);
351 1 LCD_WriteCommand(command); // 发送命令字
352 1
353 1 return(1);
354 1 }
355
356 /***********************************************************************
357 * 名称:LCD_WriteTCommand2()
358 * 功能:写单参数命令子程序。会先判断LCM状态字。
359 * 入口参数:command 要写入LCM的命令字
360 * dat1 参数1
361 * 出口参数:操作出错返回0,否则返回1
362 * 说明:先发送参数据数据,再发送命令字
363 ***********************************************************************/
364 extern uint8 LCD_WriteTCommand2(uint8 command, uint8 dat1)
365 {
366 1
367 1 if( LCD_TestStaBit01()==0 ) return(0);
368 1 LCD_WriteData(dat1); // 发送数据1
369 1
370 1 if( LCD_TestStaBit01()==0 ) return(0);
371 1 LCD_WriteCommand(command); // 发送命令字
372 1
373 1 return(1);
374 1 }
375
376 /***********************************************************************
377 * 名称:LCD_WriteTCommand3()
378 * 功能:写双参数命令子程序。会先判断LCM状态字。
379 * 入口参数:command 要写入LCM的命令字
380 * dat1 参数1
381 * dat2 参数2
382 * 出口参数:操作出错返回0,否则返回1
383 * 说明:先发送两字节参数据数据,再发送命令字
384 ***********************************************************************/
385 extern uint8 LCD_WriteTCommand3(uint8 command, uint8 dat1, uint8 dat2)
386 {
387 1
388 1
ARM COMPILER V2.32a, LCDDRIVE 25/01/07 14:11:01 PAGE 7
389 1 if( LCD_TestStaBit01()==0 ) { IOCLR0=IOCLR0|BEEPCON;
390 2 return(0);}
391 1 LCD_WriteData(dat1); // 发送数据1
392 1
393 1 if( LCD_TestStaBit01()==0 ) return(0);
394 1 LCD_WriteData(dat2); // 发送数据2
395 1
396 1 if( LCD_TestStaBit01()==0 ) return(0);
397 1 LCD_WriteCommand(command); // 发送命令字
398 1
399 1 DelayNs(1);
400 1 return(1);
401 1 }
402
403 /***********************************************************************
404 * 名称:LCD_WriteTData1()
405 * 功能:写1字节数据子程序。会先判断状态字。
406 * 入口参数:dat 要写入LCM的数据
407 * 出口参数:操作出错返回0,否则返回1
408 ***********************************************************************/
409 extern uint8 LCD_WriteTData1(uint8 dat)
410 {
411 1
412 1 if( LCD_TestStaBit3()==0 ) return(0);
413 1 LCD_WriteData(dat);
414 1
415 1 return(1);
416 1 }
417
418
419
420 /* *************以下为LCM的用户接口层,主要负责解释用户命令,并发送到LCM,为用户编程提供接口 ************
-******/
421
422
423 /***********************************************************************
424 * 名称:LCD_Initialize()
425 * 功能:LCM初始化,将LCM初始化为纯图形模式,显示起始地址为0x0000,。
426 * 入口参数:无
427 * 出口参数:无
428 * 说明:函数会设置LCM数据总线为输出方式
429 ***********************************************************************/
430 extern void LCD_Initialize(void)
431 { LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00); // 设置文本方式RAM起始地址
432 1 //DelayNs(1);
433 1 LCD_WriteTCommand3(LCD_TXT_WID, 16, 0x00); // 设置文本模式的宽度,宽度为N/6或N/8,N为宽度点数,128
434 1 //DelayNs(1);
435 1 LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00); // 设置图形方式RAM起始地址
436 1 //DelayNs(1);
437 1 LCD_WriteTCommand3(LCD_GRH_WID, 16, 0x00); // 设置图形模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
438 1 // DelayNs(1);
439 1 LCD_WriteTCommand1(LCD_MOD_OR); // 设置显示方式为"或"
440 1 // DelayNs(1);
441 1 LCD_WriteTCommand1(LCD_DIS_SW|0x08); // 设置纯图形显示模式
442 1 }
443
444
445 /***********************************************************************
446 * 名称:LCD_FillAll()
447 * 功能:LCD填充。以图形方式进行填充,起始地址为0x0000。
448 * 入口参数:dat 要填充的数据
449 * 出口参数:无
450 ***********************************************************************/
451 extern void LCD_FillAll(uint8 dat)
452 { uint32 i;
453 1
ARM COMPILER V2.32a, LCDDRIVE 25/01/07 14:11:01 PAGE 8
454 1 LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00); // 置地址指针
455 1 DelayNs(1);
456 1 LCD_WriteTCommand1(LCD_AUT_WR); // 自动写
457 1 DelayNs(1);
458 1 for(i=0;i<64*16;i++)
459 1 { LCD_WriteTData1(dat); // 写数据
460 2 }
461 1 DelayNs(1);
462 1 LCD_WriteTCommand1(LCD_AUT_OVR); // 自动写结束
463 1 DelayNs(1);
464 1 LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); // 重置地址指针
465 1 }
466
467
468 /****************************************************************************
469 * 名称:LCD_UpdatePoint()
470 * 功能:在指定位置上画点,刷新某一点。
471 * 入口参数: x 指定点所在列的位置
472 * y 指定点所在行的位置
473 * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
474 * 说明:操作失败原因是指定地址超出缓冲区范围。
475 ****************************************************************************/
476 extern void LCD_UpdatePoint(uint32 x, uint32 y)
477 { uint32 addr;
478 1
479 1 /* 找出目标地址 */
480 1 addr = y*(GUI_LCM_XMAX>>3) + (x>>3); //找到是那个区域(8位)
481 1 LCD_WriteTCommand3(LCD_ADR_POS, addr&0xFF, addr>>8); // 置地址指针
482 1
483 1 /* 输出数据 */
484 1 LCD_WriteTCommand2(LCD_INC_WR, gui_disp_buf[y][x>>3]);
485 1 }
486
487
488
489 /****************************************************************************
490 * 名称:GUI_FillSCR()
491 * 功能:全屏填充。直接使用数据填充显示缓冲区。
492 * 入口参数:dat 填充的数据(对于黑白色LCM,为0的点灭,为1的点显示)
493 * 出口参数:无
494 ****************************************************************************/
495 extern void GUI_FillSCR(uint8 dat)
496 { uint32 i, j;
497 1
498 1 for(i=0; i<GUI_LCM_YMAX; i++) // 历遍所有行
499 1 { for(j=0; j<GUI_LCM_XMAX/8; j++) // 历遍所有行
500 2 { gui_disp_buf[i][j] = dat; // 填充数据
501 3 }
502 2 }
503 1
504 1 /* 填充LCM */
505 1 LCD_FillAll(dat);
506 1 }
507
508
509 uint8 const DCB_HEX_TAB[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -