?? rd_lcd1602b.lis
字號:
.module RD_LCD1602B.c
.area text(rom, con, rel)
0000 .dbfile O:\2007全國電子設(shè)計大賽\鍵盤顯示模塊\RD_LCD1602B.c
.area lit(rom, con, rel)
0000 _CHR:
0000 3031 .byte 48,49
0002 3233 .byte 50,51
0004 3435 .byte 52,53
0006 3637 .byte 54,55
0008 3839 .byte 56,57
000A 6162 .byte 'a,'b
000C 6364 .byte 'c,'d
000E 6566 .byte 'e,'f
.area data(ram, con, rel)
0000 .dbfile O:\2007全國電子設(shè)計大賽\鍵盤顯示模塊\RD_LCD1602B.c
0000 _LCD_Temp:
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 .dbfile O:\2007全國電子設(shè)計大賽\鍵盤顯示模塊\RD_LCD1602B.c
.area text(rom, con, rel)
0000 .dbfile O:\2007全國電子設(shè)計大賽\鍵盤顯示模塊\RD_LCD1602B.c
0000 .dbfunc s LCDDelay _LCDDelay fV
0000 ; TimeCounter1 -> R20,R21
0000 ; Time -> R10,R11
.even
0000 _LCDDelay:
0000 0E940000 xcall push_xgset300C
0004 5801 movw R10,R16
0006 .dbline -1
0006 .dbline 189
0006 ; /***********************************************************
0006 ; * 函數(shù)庫說明:LCD1602B基本驅(qū)動函數(shù)庫 *
0006 ; * 版本: v2.11 *
0006 ; * 作者: 傻孩子 *
0006 ; * 創(chuàng)建日期: 2005年9月6日 *
0006 ; * -------------------------------------------------------- *
0006 ; * [支 持 庫] *
0006 ; * -------------------------------------------------------- *
0006 ; * [版本更新] *
0006 ; * 修改: 傻孩子 *
0006 ; * 修改日期: 2006年6月8日 *
0006 ; * 版本: v2.11 *
0006 ; * -------------------------------------------------------- *
0006 ; * [版本歷史] *
0006 ; * -------------------------------------------------------- *
0006 ; * [使用說明] *
0006 ; * 1、需要底層硬件驅(qū)動函數(shù)支持 *
0006 ; * 基本的宏定義: *
0006 ; * LCD_RS LCD_RW LCD_E *
0006 ; * LCD_SET_WRITE_DATA LCD_SET_READ_DATA *
0006 ; * LCD_SEND_HALF_CHAR_HIGH(a) *
0006 ; * LCD_SEND_HALF_CHAR_LOW(a) *
0006 ; * 當(dāng)處于串行狀態(tài)下時,只定義LCD_RS *
0006 ; * LCD_E LCD_SEND_HALF_CHAR_HIGH(a) *
0006 ; * LCD_SEND_HALF_CHAR_LOW(a) *
0006 ; * 2、如果采用8數(shù)據(jù)位連接,則需要定義數(shù)據(jù)端口 *
0006 ; * LCD_DATA_PORT,同時需要定義宏來開啟該功 *
0006 ; * 能:_LCD1602_FULL_DATA_MODEL *
0006 ; * 3、需要修改引用宏定義來指定底層硬件驅(qū)動 *
0006 ; * 函數(shù)庫。 *
0006 ; * 4、本庫驅(qū)動下的LCD顯示支持1602的各種連 *
0006 ; * 接方法。當(dāng)使用只寫模式是請在引用該頭 *
0006 ; * 文件之前加上宏定義: *
0006 ; * # define _USE_LCD_ONLY_WRITE *
0006 ; * 5、在調(diào)用本庫之前,定義RunStringSpeed可 *
0006 ; * 以設(shè)置滾屏的速度。通過在引用前定義 *
0006 ; * FlashTimeOut 和 FlashGIFTimeOut 可以 *
0006 ; * 改變字符閃爍的頻率。 *
0006 ; * 6、增加一個GIF字幕特效函數(shù)。 *
0006 ; * 7、確定沒有LCD復(fù)位問題。 *
0006 ; * 8、增加對595串行轉(zhuǎn)并行連接的支持。 *
0006 ; * 需要頭文件SerialToCollateral.h *
0006 ; ***********************************************************/
0006 ;
0006 ; /********************
0006 ; * 頭 文 件 配 置 區(qū) *
0006 ; ********************/
0006 ; # include "RD_MacroAndConst.h"
0006 ; # include "LIB_Config.h"
0006 ; # include "RD_LCD1602B.h"
0006 ;
0006 ;
0006 ; /********************
0006 ; * 系 統(tǒng) 宏 定 義 *
0006 ; ********************/
0006 ;
0006 ; /*------------------*
0006 ; * 常 數(shù) 宏 定 義 *
0006 ; *------------------*/
0006 ; # define LCD_CMD_DISP_CTR 0x0c
0006 ; # define LCD_CMD_CLS 0x01
0006 ; # define LCD_CMD_ENTER_SET 0x02
0006 ; # define LCD_CMD_ICON_SHOW 0x0f
0006 ; # define LCD_CMD_ICON_HIDE 0x0c
0006 ; # define LCD_CMD_NOT_MOVE 0x14
0006 ;
0006 ;
0006 ; # define LCD_WRITE 0x00
0006 ; # define LCD_READ 0x01
0006 ; # define LCD_COMMAND 0x00
0006 ; # define LCD_DATA 0x01
0006 ;
0006 ; #ifndef LCD_RUN_STRING_SPEED
0006 ; # define LCD_RUN_STRING_SPEED 100
0006 ; #endif
0006 ;
0006 ; #ifndef LCD_FLASH_TIME_OUT
0006 ; # define LCD_FLASH_TIME_OUT 0x03ff
0006 ; #endif
0006 ; #ifndef LCD_FLASH_STRING_GROUP_TIME_OUT
0006 ; # define LCD_FLASH_STRING_GROUP_TIME_OUT 0x03ff
0006 ; #endif
0006 ;
0006 ; /*------------------*
0006 ; * 動 作 宏 定 義 *
0006 ; *------------------*/
0006 ; #ifndef LCD_SET_WRITE_DATA
0006 ; # define LCD_SET_WRITE_DATA
0006 ; #endif
0006 ; #ifndef LCD_SET_READ_DATA
0006 ; # define LCD_SET_READ_DATA
0006 ; #endif
0006 ; #ifndef LCD_RW
0006 ; # define LCD_RW LCD_Temp
0006 ; #endif
0006 ; #ifndef LCD_BF
0006 ; # define LCD_BF LCD_Temp
0006 ; #endif
0006 ;
0006 ; #ifndef _Use_LCD1602B_Serial
0006 ; # define SetReadState LCD_SET_READ_DATA;LCD_RS = LCD_COMMAND;LCD_RW = LCD_READ;
0006 ; # define SetRead LCD_SET_READ_DATA;LCD_RW = LCD_READ;
0006 ; # define SetWrite LCD_SET_WRITE_DATA;LCD_RW = LCD_WRITE;
0006 ; # define SetCommand LCD_RS = LCD_COMMAND;
0006 ; # define SetData LCD_RS = LCD_DATA;
0006 ; #else
0006 ; # define _USE_LCD_ONLY_WRITE
0006 ; # define SetReadState
0006 ; # define SetRead
0006 ; # define SetWrite
0006 ; # define SetCommand LCD_RS = LCD_COMMAND;refreshVirtualPORT();
0006 ; # define SetData LCD_RS = LCD_DATA;refreshVirtualPORT();
0006 ; # define SetEnable LCD_E = High;refreshVirtualPORT();
0006 ; # define SetDisable LCD_E = Low;refreshVirtualPORT();
0006 ; #endif
0006 ;
0006 ; #ifdef _LCD1602_FULL_DATA_MODEL
0006 ; #ifndef LCD_DATA_PORT
0006 ; #error Need for macro: LCD_DATA_PORT
0006 ; #endif
0006 ; #endif
0006 ; /********************
0006 ; * 用戶變量類型定義 *
0006 ; ********************/
0006 ;
0006 ; /********************
0006 ; * 模塊結(jié)構(gòu)體定義區(qū) *
0006 ; ********************/
0006 ;
0006 ; /********************
0006 ; * 模塊函數(shù)聲明區(qū) *
0006 ; ********************/
0006 ; static void LCDDelay(unsigned int Time);
0006 ; static void LCDDelayUs(unsigned int Time);
0006 ;
0006 ;
0006 ; /********************
0006 ; * 全局函數(shù)聲明區(qū) *
0006 ; ********************/
0006 ; void LCDInit(void);
0006 ; void LCDSetXY(char X,char Y);
0006 ; void LCDDisplayString(char *String);
0006 ; void LCDDisplayNum(unsigned long Num,char BitCount);
0006 ; void RunString(char *String,char Y,char StartX,char EndX);
0006 ; char StringLength(char *String);
0006 ; void Flash(char *String,char Icon,char X,char Y);
0006 ; void FlashStringGroup(char String[][17],char StringCounter,char X,char Y);
0006 ; void LCDWaitForReady(void);
0006 ; void LCDSendCommand(char Command);
0006 ; void LCDSendData(char Data);
0006 ;
0006 ; /********************
0006 ; * 全局函數(shù)引用區(qū) *
0006 ; ********************/
0006 ; #ifdef _Use_LCD1602B_Serial
0006 ; extern void refreshVirtualPORT(void);
0006 ; #endif
0006 ;
0006 ; /********************
0006 ; * 模塊變量聲明區(qū) *
0006 ; ********************/
0006 ; const static char CHR[16] = {'0','1','2','3','4','5','6','7','8'
0006 ; ,'9','a','b','c','d','e','f'};
0006 ;
0006 ; /********************
0006 ; * 全局變量聲明區(qū) *
0006 ; ********************/
0006 ; static char LCD_Temp = 0;
0006 ;
0006 ; /********************
0006 ; * 全局變量引用區(qū) *
0006 ; ********************/
0006 ; #ifndef SYS_TIMER_MS_ADD_UNTILL_OVF
0006 ; extern unsigned int SystemTimer;
0006 ; #define SYS_TIMER_MS_ADD_UNTILL_OVF SystemTimer
0006 ; #else
0006 ; extern unsigned int SYS_TIMER_MS_ADD_UNTILL_OVF;
0006 ; #endif
0006 ;
0006 ;
0006 ;
0006 ; /***********************************************************
0006 ; * 函數(shù)說明:LCD驅(qū)動類毫秒延時函數(shù) *
0006 ; * 輸入: 需要延時的大體毫秒數(shù) *
0006 ; * 輸出: 無 *
0006 ; * 調(diào)用函數(shù):LCDDelayUs() *
0006 ; ***********************************************************/
0006 ; static void LCDDelay(unsigned int Time)
0006 ; {
0006 .dbline 190
0006 ; unsigned int TimeCounter = 0;
0006 .dbline 192
0006 ;
0006 ; for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
0006 4427 clr R20
0008 5527 clr R21
000A 05C0 xjmp L5
000C L2:
000C .dbline 193
000C ; {
000C .dbline 194
000C ; LCDDelayUs(255);
000C 0FEF ldi R16,255
000E 10E0 ldi R17,0
0010 07D0 xcall _LCDDelayUs
0012 .dbline 195
0012 ; }
0012 L3:
0012 .dbline 192
0012 4F5F subi R20,255 ; offset = 1
0014 5F4F sbci R21,255
0016 L5:
0016 .dbline 192
0016 4A15 cp R20,R10
0018 5B05 cpc R21,R11
001A C0F3 brlo L2
001C X0:
001C .dbline -2
001C L1:
001C .dbline 0 ; func end
001C 0C940000 xjmp pop_xgset300C
0020 .dbsym r TimeCounter1 20 i
0020 .dbsym r Time 10 i
0020 .dbend
0020 .dbfunc s LCDDelayUs _LCDDelayUs fV
0020 ; TimeCounter1 -> R20,R21
0020 ; Time -> R16,R17
.even
0020 _LCDDelayUs:
0020 4A93 st -y,R20
0022 5A93 st -y,R21
0024 .dbline -1
0024 .dbline 205
0024 ; }
0024 ;
0024 ; /***********************************************************
0024 ; * 函數(shù)說明:LCD驅(qū)動指令周期延時函數(shù) *
0024 ; * 輸入: 需要大體延時Us數(shù) *
0024 ; * 輸出: 無 *
0024 ; * 調(diào)用函數(shù):無 *
0024 ; ***********************************************************/
0024 ; static void LCDDelayUs(unsigned int Time)
0024 ; {
0024 .dbline 206
0024 ; unsigned int TimeCounter = 0;
0024 .dbline 207
0024 ; for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
0024 4427 clr R20
0026 5527 clr R21
0028 03C0 xjmp L10
002A L7:
002A .dbline 208
002A ; {
002A .dbline 209
002A ; asm("nop");
002A 0000 nop
002C .dbline 210
002C ; }
002C L8:
002C .dbline 207
002C 4F5F subi R20,255 ; offset = 1
002E 5F4F sbci R21,255
0030 L10:
0030 .dbline 207
0030 4017 cp R20,R16
0032 5107 cpc R21,R17
0034 D0F3 brlo L7
0036 X1:
0036 .dbline -2
0036 L6:
0036 .dbline 0 ; func end
0036 5991 ld R21,y+
0038 4991 ld R20,y+
003A 0895 ret
003C .dbsym r TimeCounter1 20 i
003C .dbsym r Time 16 i
003C .dbend
003C .dbfunc e LCDInit _LCDInit fV
.even
003C _LCDInit::
003C .dbline -1
003C .dbline 221
003C ; }
003C ;
003C ; /***********************************************************
003C ; * 函數(shù)說明:LCD初始化函數(shù) *
003C ; * 輸入: 無 *
003C ; * 輸出: 無 *
003C ; * 調(diào)用函數(shù):LCDDelay() LCDWaitForReady() *
003C ; * LCDSendCommand() *
003C ; ***********************************************************/
003C ; void LCDInit(void)
003C ; {
003C .dbline 222
003C ; LCDDelay(15);
003C 0FE0 ldi R16,15
003E 10E0 ldi R17,0
0040 DFDF xcall _LCDDelay
0042 .dbline 227
0042 ;
0042 ; #ifndef _LCD1602_FULL_DATA_MODEL
0042 ; LCDSendCommand(0x28);
0042 ; #else
0042 ; LCDSendCommand(0x38);
0042 08E3 ldi R16,56
0044 0FD0 xcall _LCDSendCommand
0046 .dbline 229
0046 ; #endif
0046 ; LCDWaitForReady();
0046 42D0 xcall _LCDWaitForReady
0048 .dbline 230
0048 ; LCDSendCommand(LCD_CMD_DISP_CTR);
0048 0CE0 ldi R16,12
004A 0CD0 xcall _LCDSendCommand
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -