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

📄 rd_lcd1602b.s

📁 LCD1602键盘显示模块实例
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module RD_LCD1602B.c
	.area text(rom, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
	.area lit(rom, con, rel)
_CHR:
	.byte 48,49
	.byte 50,51
	.byte 52,53
	.byte 54,55
	.byte 56,57
	.byte 'a,'b
	.byte 'c,'d
	.byte 'e,'f
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
_LCD_Temp:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
	.area text(rom, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
	.dbfunc s LCDDelay _LCDDelay fV
;   TimeCounter1 -> R20,R21
;           Time -> R10,R11
	.even
_LCDDelay:
	xcall push_xgset300C
	movw R10,R16
	.dbline -1
	.dbline 189
; /***********************************************************
; *   函数库说明:LCD1602B基本驱动函数库                     *
; *   版本:      v2.11                                      *
; *   作者:      傻孩子                                     *
; *   创建日期:  2005年9月6日                               *
; * -------------------------------------------------------- *
; *  [支 持 库]                                              *
; * -------------------------------------------------------- *
; *  [版本更新]                                              *
; *   修改:      傻孩子                                     *
; *   修改日期:  2006年6月8日                               *
; *   版本:      v2.11                                      *
; * -------------------------------------------------------- *
; *  [版本历史]                                              *
; * -------------------------------------------------------- *
; *  [使用说明]                                              *
; *              1、需要底层硬件驱动函数支持                 *
; *                 基本的宏定义:                           *
; *                 LCD_RS   LCD_RW   LCD_E                  *
; *                 LCD_SET_WRITE_DATA  LCD_SET_READ_DATA    *
; *                 LCD_SEND_HALF_CHAR_HIGH(a)               *
; *                 LCD_SEND_HALF_CHAR_LOW(a)                *
; *                 当处于串行状态下时,只定义LCD_RS         *
; *                 LCD_E LCD_SEND_HALF_CHAR_HIGH(a)         *
; *                 LCD_SEND_HALF_CHAR_LOW(a)                *
; *              2、如果采用8数据位连接,则需要定义数据端口  *
; *                 LCD_DATA_PORT,同时需要定义宏来开启该功  *
; *                 能:_LCD1602_FULL_DATA_MODEL             *
; *              3、需要修改引用宏定义来指定底层硬件驱动     *
; *                 函数库。                                 *
; *              4、本库驱动下的LCD显示支持1602的各种连      *
; *                 接方法。当使用只写模式是请在引用该头     *
; *                 文件之前加上宏定义:                     *
; *                 # define _USE_LCD_ONLY_WRITE             *
; *              5、在调用本库之前,定义RunStringSpeed可     *
; *                 以设置滚屏的速度。通过在引用前定义       *
; *                 FlashTimeOut 和 FlashGIFTimeOut 可以     *
; *                 改变字符闪烁的频率。                     *
; *              6、增加一个GIF字幕特效函数。                *
; *              7、确定没有LCD复位问题。                    *
; *              8、增加对595串行转并行连接的支持。          *
; *                 需要头文件SerialToCollateral.h           *
; ***********************************************************/
; 
; /********************
; * 头 文 件 配 置 区 *
; ********************/
; # include "RD_MacroAndConst.h"
; # include "LIB_Config.h"
; # include "RD_LCD1602B.h"
; 
; 
; /********************
; *   系 统 宏 定 义  *
; ********************/
; 
; /*------------------*
; *   常 数 宏 定 义  *
; *------------------*/
; # define LCD_CMD_DISP_CTR   0x0c
; # define LCD_CMD_CLS        0x01
; # define LCD_CMD_ENTER_SET  0x02
; # define LCD_CMD_ICON_SHOW  0x0f
; # define LCD_CMD_ICON_HIDE  0x0c
; # define LCD_CMD_NOT_MOVE   0x14
; 
; 
; # define LCD_WRITE          0x00
; # define LCD_READ           0x01
; # define LCD_COMMAND        0x00
; # define LCD_DATA           0x01
; 
; #ifndef LCD_RUN_STRING_SPEED
;     # define LCD_RUN_STRING_SPEED 100
; #endif
; 
; #ifndef LCD_FLASH_TIME_OUT
;     # define LCD_FLASH_TIME_OUT   0x03ff
; #endif
; #ifndef LCD_FLASH_STRING_GROUP_TIME_OUT
;     # define LCD_FLASH_STRING_GROUP_TIME_OUT  0x03ff
; #endif
; 
; /*------------------*
; *   动 作 宏 定 义  *
; *------------------*/
; #ifndef LCD_SET_WRITE_DATA
;     # define LCD_SET_WRITE_DATA
; #endif
; #ifndef LCD_SET_READ_DATA
;     # define LCD_SET_READ_DATA
; #endif
; #ifndef LCD_RW
;     # define LCD_RW   LCD_Temp 
; #endif
; #ifndef LCD_BF
; 	# define LCD_BF   LCD_Temp
; #endif
; 
; #ifndef _Use_LCD1602B_Serial
;     # define SetReadState       LCD_SET_READ_DATA;LCD_RS = LCD_COMMAND;LCD_RW = LCD_READ;
;     # define SetRead            LCD_SET_READ_DATA;LCD_RW = LCD_READ;
;     # define SetWrite           LCD_SET_WRITE_DATA;LCD_RW = LCD_WRITE;
;     # define SetCommand         LCD_RS = LCD_COMMAND;
;     # define SetData            LCD_RS = LCD_DATA;
; #else
;     # define _USE_LCD_ONLY_WRITE
;     # define SetReadState
; 	# define SetRead
; 	# define SetWrite
; 	# define SetCommand         LCD_RS = LCD_COMMAND;refreshVirtualPORT();
; 	# define SetData            LCD_RS = LCD_DATA;refreshVirtualPORT();   
; 	# define SetEnable          LCD_E = High;refreshVirtualPORT();
; 	# define SetDisable         LCD_E = Low;refreshVirtualPORT();
; #endif
; 
; #ifdef _LCD1602_FULL_DATA_MODEL
;     #ifndef LCD_DATA_PORT
;         #error Need for macro: LCD_DATA_PORT
;     #endif
; #endif
; /********************
; *  用户变量类型定义 *
; ********************/
; 
; /********************
; *  模块结构体定义区 *
; ********************/
; 
; /********************
; *   模块函数声明区  *
; ********************/
; static void LCDDelay(unsigned int Time);
; static void LCDDelayUs(unsigned int Time);
; 
; 
; /********************
; *   全局函数声明区  *
; ********************/
; void LCDInit(void);
; void LCDSetXY(char X,char Y);
; void LCDDisplayString(char *String);
; void LCDDisplayNum(unsigned long Num,char BitCount);
; void RunString(char *String,char Y,char StartX,char EndX);
; char StringLength(char *String);
; void Flash(char *String,char Icon,char X,char Y);
; void FlashStringGroup(char String[][17],char StringCounter,char X,char Y);
; void LCDWaitForReady(void);
; void LCDSendCommand(char Command);
; void LCDSendData(char Data);
; 
; /********************
; *   全局函数引用区  *
; ********************/
; #ifdef _Use_LCD1602B_Serial
;     extern void refreshVirtualPORT(void);
; #endif
; 
; /********************
; *   模块变量声明区  *
; ********************/
; const static char CHR[16] = {'0','1','2','3','4','5','6','7','8'
;                      ,'9','a','b','c','d','e','f'};
;                      
; /********************
; *   全局变量声明区  *
; ********************/
; static char LCD_Temp = 0;
; 
; /********************
; *   全局变量引用区  *
; ********************/
; #ifndef SYS_TIMER_MS_ADD_UNTILL_OVF
; extern unsigned int SystemTimer;
;     #define SYS_TIMER_MS_ADD_UNTILL_OVF SystemTimer
; #else
; extern unsigned int SYS_TIMER_MS_ADD_UNTILL_OVF;
; #endif  
; 
; 
; 
; /***********************************************************
; *   函数说明:LCD驱动类毫秒延时函数                        *
; *   输入:    需要延时的大体毫秒数                         *
; *   输出:    无                                           *
; *   调用函数:LCDDelayUs()                                 *
; ***********************************************************/
; static void LCDDelay(unsigned int Time)
; {
	.dbline 190
;     unsigned int TimeCounter = 0;
	.dbline 192
; 	
; 	for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
	clr R20
	clr R21
	xjmp L5
L2:
	.dbline 193
; 	{
	.dbline 194
; 	    LCDDelayUs(255);
	ldi R16,255
	ldi R17,0
	xcall _LCDDelayUs
	.dbline 195
; 	}
L3:
	.dbline 192
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 192
	cp R20,R10
	cpc R21,R11
	brlo L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	xjmp pop_xgset300C
	.dbsym r TimeCounter1 20 i
	.dbsym r Time 10 i
	.dbend
	.dbfunc s LCDDelayUs _LCDDelayUs fV
;   TimeCounter1 -> R20,R21
;           Time -> R16,R17
	.even
_LCDDelayUs:
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 205
; }
; 
; /***********************************************************
; *   函数说明:LCD驱动指令周期延时函数                      *
; *   输入:    需要大体延时Us数                             *
; *   输出:    无                                           *
; *   调用函数:无                                           *
; ***********************************************************/
; static void LCDDelayUs(unsigned int Time)
; {
	.dbline 206
;      unsigned int TimeCounter = 0;
	.dbline 207
; 	 for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
	clr R20
	clr R21
	xjmp L10
L7:
	.dbline 208
; 	 {
	.dbline 209
; 	     asm("nop");
	nop
	.dbline 210
; 	 }
L8:
	.dbline 207
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 207
	cp R20,R16
	cpc R21,R17
	brlo L7
X1:
	.dbline -2
L6:
	.dbline 0 ; func end
	ld R21,y+
	ld R20,y+
	ret
	.dbsym r TimeCounter1 20 i
	.dbsym r Time 16 i
	.dbend
	.dbfunc e LCDInit _LCDInit fV
	.even
_LCDInit::
	.dbline -1
	.dbline 221
; }
; 
; /***********************************************************
; *   函数说明:LCD初始化函数                                *
; *   输入:    无                                           *
; *   输出:    无                                           *
; *   调用函数:LCDDelay()  LCDWaitForReady()                *
; *             LCDSendCommand()                             *
; ***********************************************************/
; void LCDInit(void)
; {
	.dbline 222
;     LCDDelay(15);
	ldi R16,15
	ldi R17,0
	xcall _LCDDelay
	.dbline 227
;    
; #ifndef _LCD1602_FULL_DATA_MODEL
; 	LCDSendCommand(0x28);
; #else
;     LCDSendCommand(0x38);
	ldi R16,56
	xcall _LCDSendCommand
	.dbline 229
; #endif
;     LCDWaitForReady();
	xcall _LCDWaitForReady
	.dbline 230
; 	LCDSendCommand(LCD_CMD_DISP_CTR);
	ldi R16,12
	xcall _LCDSendCommand
	.dbline 231
;     LCDWaitForReady();
	xcall _LCDWaitForReady
	.dbline 232
; 	LCDSendCommand(LCD_CMD_CLS);
	ldi R16,1
	xcall _LCDSendCommand
	.dbline 233
; 	LCDDelay(2);
	ldi R16,2
	ldi R17,0
	xcall _LCDDelay
	.dbline 234
; 	LCDSendCommand(LCD_CMD_ENTER_SET);
	ldi R16,2
	xcall _LCDSendCommand
	.dbline 235
;     LCDWaitForReady();
	xcall _LCDWaitForReady
	.dbline 236
;     LCDSendCommand(LCD_CMD_NOT_MOVE);
	ldi R16,20
	xcall _LCDSendCommand
	.dbline -2
L11:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCDSendCommand _LCDSendCommand fV
;        Command -> R16
	.even
_LCDSendCommand::
	.dbline -1
	.dbline 248
; 	
; }
; 
; #ifndef _Use_LCD1602B_Serial
; /***********************************************************
; *   函数说明:向LCD发送指令函数                            *
; *   输入:    需要发送的指令                               *
; *   输出:    无                                           *
; *   调用函数:LCD_SEND_HALF_CHAR_HIGH() LCD_SEND_HALF_CHAR_LOW() *
; ***********************************************************/
; void LCDSendCommand(char Command)
; {
	.dbline 249
; 	SetWrite;
	ldi R24,255
	out 0x1a,R24
	.dbline 249
	.dbline 249
	in R24,0x18
	andi R24,253
	out 0x18,R24
	.dbline 249
	.dbline 250
; 	SetCommand;
	in R24,0x18
	andi R24,254
	out 0x18,R24
	.dbline 250
	.dbline 263
;     #ifndef _LCD1602_FULL_DATA_MODEL
; 	{
; 		LCD_SEND_HALF_CHAR_HIGH(Command);
;         LCD_E = HIGH;
; 	    LCD_E = LOW;
; 	}
; 	{
;         LCD_SEND_HALF_CHAR_LOW(Command);	
; 		LCD_E = HIGH;
; 		LCD_E = LOW;
; 	}
;     #else
;         LCD_DATA_PORT = Command;
	out 0x1b,R16
	.dbline 264
;         LCD_E = HIGH;
	in R24,0x18
	ori R24,4
	out 0x18,R24
	.dbline 265
;         LCD_E = LOW;
	in R24,0x18
	andi R24,251
	out 0x18,R24
	.dbline 267
;     #endif
;     SetRead;		
	clr R2
	out 0x1a,R2
	.dbline 267
	ldi R24,255
	out 0x1b,R24
	.dbline 267
	.dbline 267
	in R24,0x18
	ori R24,2
	out 0x18,R24
	.dbline 267
	.dbline 268
; 	SetCommand;
	in R24,0x18
	andi R24,254
	out 0x18,R24
	.dbline 268
	.dbline -2
L12:
	.dbline 0 ; func end
	ret
	.dbsym r Command 16 c
	.dbend
	.dbfunc e LCDSendData _LCDSendData fV
;           Data -> R16
	.even

⌨️ 快捷键说明

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