⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rd_lcd1602b.lis

📁 LCD1602键盘显示模块实例
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .module RD_LCD1602B.c
                        .area text(rom, con, rel)
 0000                   .dbfile O:\2007全国电子设计大赛\键盘显示模块\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全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
 0000           _LCD_Temp:
 0000                   .blkb 1
                        .area idata
 0000 00                .byte 0
                        .area data(ram, con, rel)
 0001                   .dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
                        .area text(rom, con, rel)
 0000                   .dbfile O:\2007全国电子设计大赛\键盘显示模块\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           ; *   函数库说明:LCD1602B基本驱动函数库                     *
 0006           ; *   版本:      v2.11                                      *
 0006           ; *   作者:      傻孩子                                     *
 0006           ; *   创建日期:  2005年9月6日                               *
 0006           ; * -------------------------------------------------------- *
 0006           ; *  [支 持 库]                                              *
 0006           ; * -------------------------------------------------------- *
 0006           ; *  [版本更新]                                              *
 0006           ; *   修改:      傻孩子                                     *
 0006           ; *   修改日期:  2006年6月8日                               *
 0006           ; *   版本:      v2.11                                      *
 0006           ; * -------------------------------------------------------- *
 0006           ; *  [版本历史]                                              *
 0006           ; * -------------------------------------------------------- *
 0006           ; *  [使用说明]                                              *
 0006           ; *              1、需要底层硬件驱动函数支持                 *
 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           ; *                 当处于串行状态下时,只定义LCD_RS         *
 0006           ; *                 LCD_E LCD_SEND_HALF_CHAR_HIGH(a)         *
 0006           ; *                 LCD_SEND_HALF_CHAR_LOW(a)                *
 0006           ; *              2、如果采用8数据位连接,则需要定义数据端口  *
 0006           ; *                 LCD_DATA_PORT,同时需要定义宏来开启该功  *
 0006           ; *                 能:_LCD1602_FULL_DATA_MODEL             *
 0006           ; *              3、需要修改引用宏定义来指定底层硬件驱动     *
 0006           ; *                 函数库。                                 *
 0006           ; *              4、本库驱动下的LCD显示支持1602的各种连      *
 0006           ; *                 接方法。当使用只写模式是请在引用该头     *
 0006           ; *                 文件之前加上宏定义:                     *
 0006           ; *                 # define _USE_LCD_ONLY_WRITE             *
 0006           ; *              5、在调用本库之前,定义RunStringSpeed可     *
 0006           ; *                 以设置滚屏的速度。通过在引用前定义       *
 0006           ; *                 FlashTimeOut 和 FlashGIFTimeOut 可以     *
 0006           ; *                 改变字符闪烁的频率。                     *
 0006           ; *              6、增加一个GIF字幕特效函数。                *
 0006           ; *              7、确定没有LCD复位问题。                    *
 0006           ; *              8、增加对595串行转并行连接的支持。          *
 0006           ; *                 需要头文件SerialToCollateral.h           *
 0006           ; ***********************************************************/
 0006           ; 
 0006           ; /********************
 0006           ; * 头 文 件 配 置 区 *
 0006           ; ********************/
 0006           ; # include "RD_MacroAndConst.h"
 0006           ; # include "LIB_Config.h"
 0006           ; # include "RD_LCD1602B.h"
 0006           ; 
 0006           ; 
 0006           ; /********************
 0006           ; *   系 统 宏 定 义  *
 0006           ; ********************/
 0006           ; 
 0006           ; /*------------------*
 0006           ; *   常 数 宏 定 义  *
 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           ; *  模块结构体定义区 *
 0006           ; ********************/
 0006           ; 
 0006           ; /********************
 0006           ; *   模块函数声明区  *
 0006           ; ********************/
 0006           ; static void LCDDelay(unsigned int Time);
 0006           ; static void LCDDelayUs(unsigned int Time);
 0006           ; 
 0006           ; 
 0006           ; /********************
 0006           ; *   全局函数声明区  *
 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           ; *   全局函数引用区  *
 0006           ; ********************/
 0006           ; #ifdef _Use_LCD1602B_Serial
 0006           ;     extern void refreshVirtualPORT(void);
 0006           ; #endif
 0006           ; 
 0006           ; /********************
 0006           ; *   模块变量声明区  *
 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           ; *   全局变量声明区  *
 0006           ; ********************/
 0006           ; static char LCD_Temp = 0;
 0006           ; 
 0006           ; /********************
 0006           ; *   全局变量引用区  *
 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           ; *   函数说明:LCD驱动类毫秒延时函数                        *
 0006           ; *   输入:    需要延时的大体毫秒数                         *
 0006           ; *   输出:    无                                           *
 0006           ; *   调用函数: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           ; *   函数说明:LCD驱动指令周期延时函数                      *
 0024           ; *   输入:    需要大体延时Us数                             *
 0024           ; *   输出:    无                                           *
 0024           ; *   调用函数:无                                           *
 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           ; *   函数说明:LCD初始化函数                                *
 003C           ; *   输入:    无                                           *
 003C           ; *   输出:    无                                           *
 003C           ; *   调用函数: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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -