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

📄 rd_lcd1602b.s

📁 移动机器人(小车)的物理坐标和逻辑坐标的转换源码
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module RD_LCD1602B.c
	.area text(rom, con, rel)
	.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
	.area data(ram, con, rel)
	.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
_CHR:
	.blkb 2
	.area idata
	.byte 48,49
	.area data(ram, con, rel)
	.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
	.blkb 2
	.area idata
	.byte 50,51
	.area data(ram, con, rel)
	.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
	.blkb 2
	.area idata
	.byte 52,53
	.area data(ram, con, rel)
	.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
	.blkb 2
	.area idata
	.byte 54,55
	.area data(ram, con, rel)
	.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
	.blkb 2
	.area idata
	.byte 56,57
	.area data(ram, con, rel)
	.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
	.blkb 2
	.area idata
	.byte 'a,'b
	.area data(ram, con, rel)
	.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
	.blkb 2
	.area idata
	.byte 'c,'d
	.area data(ram, con, rel)
	.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
	.blkb 2
	.area idata
	.byte 'e,'f
	.area data(ram, con, rel)
	.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
_LCD_Temp:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
	.area text(rom, con, rel)
	.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
	.dbfunc s LCDDelay _LCDDelay fV
;   TimeCounter1 -> R20,R21
;           Time -> R10,R11
	.even
_LCDDelay:
	rcall push_xgset300C
	movw R10,R16
	.dbline -1
	.dbline 211
; /***********************************************************
; *   函数库说明: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
; 
; /*------------------*
; *   动 作 宏 定 义  *
; *------------------*/
; 
; #if defined(_USE_LCD_ONLY_WRITE) || defined(_Use_LCD1602B_Serial)
;     #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
; #else
;     #ifndef LCD_SET_WRITE_DATA
;         # error No define LCD_SET_WRITE_DATA
;     #endif
;     #ifndef LCD_SET_READ_DATA
;         # error No define LCD_SET_READ_DATA
;     #endif
;     #ifndef LCD_RW
;         # error No define LCD_RW
;     #endif
;     #ifndef LCD_BF
; 	    # error No define LCD_BF
;     #endif
; #endif
; 
; #ifndef LCD_RS
;     # error Need define LCD_RS
; #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(UINT16 Time);
; static void LCDDelayUs(UINT16 Time);
; 
; 
; /********************
; *   全局函数声明区  *
; ********************/
; void LCDInit(void);
; void LCDSetXY(UINT8 X,UINT8 Y);
; void LCDDisplayString(UINT8 *String);
; void LCDDisplayNum(unsigned long Num,UINT8 BitCount);
; void RunString(UINT8 *String,UINT8 Y,UINT8 StartX,UINT8 EndX);
; UINT8 StringLength(UINT8 *String);
; void Flash(UINT8 *String,UINT8 Icon,UINT8 X,UINT8 Y);
; void FlashStringGroup(UINT8 String[][17],UINT8 StringCounter,UINT8 X,UINT8 Y);
; void LCDWaitForReady(void);
; void LCDSendCommand(UINT8 Command);
; void LCDSendData(UINT8 Data);
; void PrintD(INT32 nNumber,UINT8 chCounter);
; 
; /********************
; *   全局函数引用区  *
; ********************/
; #ifdef _Use_LCD1602B_Serial
;     extern void refreshVirtualPORT(void);
; #endif
; 
; /********************
; *   模块变量声明区  *
; ********************/
; const static UINT8 CHR[16] = {'0','1','2','3','4','5','6','7','8'
;                      ,'9','a','b','c','d','e','f'};
;                      
; /********************
; *   全局变量声明区  *
; ********************/
; static UINT8 LCD_Temp = 0;
; 
; /********************
; *   全局变量引用区  *
; ********************/
; #ifndef SYS_TIMER_MS_ADD_UNTILL_OVF
; extern UINT16 g_wSystemTimer;
;     #define SYS_TIMER_MS_ADD_UNTILL_OVF g_wSystemTimer
; #else
; extern UINT16 SYS_TIMER_MS_ADD_UNTILL_OVF;
; #endif  
; 
; 
; 
; /***********************************************************
; *   函数说明:LCD驱动类毫秒延时函数                        *
; *   输入:    需要延时的大体毫秒数                         *
; *   输出:    无                                           *
; *   调用函数:LCDDelayUs()                                 *
; ***********************************************************/
; static void LCDDelay(UINT16 Time)
; {
	.dbline 212
;     UINT16 TimeCounter = 0;
	.dbline 214
; 	
; 	for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
	clr R20
	clr R21
	rjmp L5
L2:
	.dbline 215
; 	{
	.dbline 216
; 	    LCDDelayUs(255);
	ldi R16,255
	ldi R17,0
	rcall _LCDDelayUs
	.dbline 217
; 	}
L3:
	.dbline 214
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 214
	cp R20,R10
	cpc R21,R11
	brlo L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	rjmp 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 227
; }
; 
; /***********************************************************
; *   函数说明:LCD驱动指令周期延时函数                      *
; *   输入:    需要大体延时Us数                             *
; *   输出:    无                                           *
; *   调用函数:无                                           *
; ***********************************************************/
; static void LCDDelayUs(UINT16 Time)
; {
	.dbline 228
;      UINT16 TimeCounter = 0;
	.dbline 229
; 	 for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
	clr R20
	clr R21
	rjmp L10
L7:
	.dbline 230
; 	 {
	.dbline 231
; 	     asm("nop");
	nop
	.dbline 232
; 	 }
L8:
	.dbline 229
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 229
	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 243
; }
; 
; /***********************************************************
; *   函数说明:LCD初始化函数                                *
; *   输入:    无                                           *
; *   输出:    无                                           *
; *   调用函数:LCDDelay()  LCDWaitForReady()                *
; *             LCDSendCommand()                             *
; ***********************************************************/
; void LCDInit(void)
; {
	.dbline 244
;     LCDDelay(15);
	ldi R16,15
	ldi R17,0
	rcall _LCDDelay
	.dbline 247
;    
; #ifndef _LCD1602_FULL_DATA_MODEL
; 	LCDSendCommand(0x28);
	ldi R16,40
	rcall _LCDSendCommand
	.dbline 251
; #else
;     LCDSendCommand(0x38);
; #endif
;     LCDWaitForReady();
	rcall _LCDWaitForReady
	.dbline 252
; 	LCDSendCommand(LCD_CMD_DISP_CTR);
	ldi R16,12
	rcall _LCDSendCommand
	.dbline 253
;     LCDWaitForReady();
	rcall _LCDWaitForReady
	.dbline 254
; 	LCDSendCommand(LCD_CMD_CLS);
	ldi R16,1
	rcall _LCDSendCommand
	.dbline 255
; 	LCDDelay(2);
	ldi R16,2
	ldi R17,0
	rcall _LCDDelay
	.dbline 256
; 	LCDSendCommand(LCD_CMD_ENTER_SET);
	ldi R16,2
	rcall _LCDSendCommand
	.dbline 257
;     LCDWaitForReady();
	rcall _LCDWaitForReady
	.dbline 258
;     LCDSendCommand(LCD_CMD_NOT_MOVE);
	ldi R16,20
	.dbline -2
L11:
	.dbline 0 ; func end
	rjmp _LCDSendCommand
	.dbend
	.dbfunc e LCDSendCommand _LCDSendCommand fV
;        Command -> R16
	.even
_LCDSendCommand::
	.dbline -1
	.dbline 270
; 	
; }
; 
; #ifndef _Use_LCD1602B_Serial
; /***********************************************************
; *   函数说明:向LCD发送指令函数                            *
; *   输入:    需要发送的指令                               *
; *   输出:    无                                           *
; *   调用函数:LCD_SEND_HALF_CHAR_HIGH() LCD_SEND_HALF_CHAR_LOW() *
; ***********************************************************/
; void LCDSendCommand(UINT8 Command)
; {
	.dbline 271
; 	SetWrite;
	in R24,0xa
	ori R24,120
	out 0xa,R24
	.dbline 271
	in R24,0xb
	ori R24,120
	out 0xb,R24
	.dbline 271
	nop
	.dbline 271
	.dbline 271
	in R24,0x5
	andi R24,254
	out 0x5,R24
	.dbline 271
	.dbline 272
; 	SetCommand;
	in R24,0x5
	andi R24,253
	out 0x5,R24
	.dbline 272
	.dbline 274
;     #ifndef _LCD1602_FULL_DATA_MODEL
; 	{
	.dbline 275
; 		LCD_SEND_HALF_CHAR_HIGH(Command);
	in R24,0xb
	andi R24,135
	out 0xb,R24
	.dbline 275
	mov R24,R16
	andi R24,240
	lsr R24
	in R2,0xb
	or R2,R24
	out 0xb,R2
	.dbline 275
	.dbline 276
;         LCD_E = HIGH;
	in R24,0xb
	ori R24,128
	out 0xb,R24
	.dbline 277
; 	    LCD_E = LOW;
	in R24,0xb
	andi R24,127
	out 0xb,R24
	.dbline 278
; 	}
	.dbline 279
; 	{
	.dbline 280
;         LCD_SEND_HALF_CHAR_LOW(Command);	
	in R24,0xb
	andi R24,135
	out 0xb,R24
	.dbline 280
	mov R24,R16
	andi R24,15
	lsl R24
	lsl R24
	lsl R24
	in R2,0xb
	or R2,R24
	out 0xb,R2
	.dbline 280
	.dbline 281
; 		LCD_E = HIGH;
	in R24,0xb
	ori R24,128
	out 0xb,R24
	.dbline 282
; 		LCD_E = LOW;
	in R24,0xb
	andi R24,127
	out 0xb,R24
	.dbline 283

⌨️ 快捷键说明

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