model.lst

来自「移动机器人(小车)的物理坐标和逻辑坐标的转换源码」· LST 代码 · 共 1,693 行 · 第 1/5 页

LST
1,693
字号
(0019) *                 LCD_RS   LCD_RW   LCD_E                  *
(0020) *                 LCD_SET_WRITE_DATA  LCD_SET_READ_DATA    *
(0021) *                 LCD_SEND_HALF_CHAR_HIGH(a)               *
(0022) *                 LCD_SEND_HALF_CHAR_LOW(a)                *
(0023) *                 当处于串行状态下时,只定义LCD_RS         *
(0024) *                 LCD_E LCD_SEND_HALF_CHAR_HIGH(a)         *
(0025) *                 LCD_SEND_HALF_CHAR_LOW(a)                *
(0026) *              2、如果采用8数据位连接,则需要定义数据端口  *
(0027) *                 LCD_DATA_PORT,同时需要定义宏来开启该功  *
(0028) *                 能:_LCD1602_FULL_DATA_MODEL             *
(0029) *              3、需要修改引用宏定义来指定底层硬件驱动     *
(0030) *                 函数库。                                 *
(0031) *              4、本库驱动下的LCD显示支持1602的各种连      *
(0032) *                 接方法。当使用只写模式是请在引用该头     *
(0033) *                 文件之前加上宏定义:                     *
(0034) *                 # define _USE_LCD_ONLY_WRITE             *
(0035) *              5、在调用本库之前,定义RunStringSpeed可     *
(0036) *                 以设置滚屏的速度。通过在引用前定义       *
(0037) *                 FlashTimeOut 和 FlashGIFTimeOut 可以     *
(0038) *                 改变字符闪烁的频率。                     *
(0039) *              6、增加一个GIF字幕特效函数。                *
(0040) *              7、确定没有LCD复位问题。                    *
(0041) *              8、增加对595串行转并行连接的支持。          *
(0042) *                 需要头文件SerialToCollateral.h           *
(0043) ***********************************************************/
(0044) 
(0045) /********************
(0046) * 头 文 件 配 置 区 *
(0047) ********************/
(0048) # include "RD_MacroAndConst.h"
(0049) # include "LIB_Config.h"
(0050) # include "RD_LCD1602B.h"
(0051) 
(0052) 
(0053) /********************
(0054) *   系 统 宏 定 义  *
(0055) ********************/
(0056) 
(0057) /*------------------*
(0058) *   常 数 宏 定 义  *
(0059) *------------------*/
(0060) # define LCD_CMD_DISP_CTR   0x0c
(0061) # define LCD_CMD_CLS        0x01
(0062) # define LCD_CMD_ENTER_SET  0x02
(0063) # define LCD_CMD_ICON_SHOW  0x0f
(0064) # define LCD_CMD_ICON_HIDE  0x0c
(0065) # define LCD_CMD_NOT_MOVE   0x14
(0066) 
(0067) 
(0068) # define LCD_WRITE          0x00
(0069) # define LCD_READ           0x01
(0070) # define LCD_COMMAND        0x00
(0071) # define LCD_DATA           0x01
(0072) 
(0073) #ifndef LCD_RUN_STRING_SPEED
(0074)     # define LCD_RUN_STRING_SPEED 100
(0075) #endif
(0076) 
(0077) #ifndef LCD_FLASH_TIME_OUT
(0078)     # define LCD_FLASH_TIME_OUT   0x03ff
(0079) #endif
(0080) #ifndef LCD_FLASH_STRING_GROUP_TIME_OUT
(0081)     # define LCD_FLASH_STRING_GROUP_TIME_OUT  0x03ff
(0082) #endif
(0083) 
(0084) /*------------------*
(0085) *   动 作 宏 定 义  *
(0086) *------------------*/
(0087) 
(0088) #if defined(_USE_LCD_ONLY_WRITE) || defined(_Use_LCD1602B_Serial)
(0089)     #ifndef LCD_SET_WRITE_DATA
(0090)         # define LCD_SET_WRITE_DATA
(0091)     #endif
(0092)     #ifndef LCD_SET_READ_DATA
(0093)         # define LCD_SET_READ_DATA
(0094)     #endif
(0095)     #ifndef LCD_RW
(0096)         # define LCD_RW   LCD_Temp 
(0097)     #endif
(0098)     
(0099)     #ifndef LCD_BF
(0100) 	    # define LCD_BF   LCD_Temp
(0101)     #endif
(0102) #else
(0103)     #ifndef LCD_SET_WRITE_DATA
(0104)         # error No define LCD_SET_WRITE_DATA
(0105)     #endif
(0106)     #ifndef LCD_SET_READ_DATA
(0107)         # error No define LCD_SET_READ_DATA
(0108)     #endif
(0109)     #ifndef LCD_RW
(0110)         # error No define LCD_RW
(0111)     #endif
(0112)     #ifndef LCD_BF
(0113) 	    # error No define LCD_BF
(0114)     #endif
(0115) #endif
(0116) 
(0117) #ifndef LCD_RS
(0118)     # error Need define LCD_RS
(0119) #endif
(0120) 
(0121) #ifndef _Use_LCD1602B_Serial
(0122)     # define SetReadState       LCD_SET_READ_DATA;LCD_RS = LCD_COMMAND;LCD_RW = LCD_READ;
(0123)     # define SetRead            LCD_SET_READ_DATA;LCD_RW = LCD_READ;
(0124)     # define SetWrite           LCD_SET_WRITE_DATA;LCD_RW = LCD_WRITE;
(0125)     # define SetCommand         LCD_RS = LCD_COMMAND;
(0126)     # define SetData            LCD_RS = LCD_DATA;
(0127) #else
(0128)     # define _USE_LCD_ONLY_WRITE
(0129)     # define SetReadState
(0130) 	# define SetRead
(0131) 	# define SetWrite
(0132) 	# define SetCommand         LCD_RS = LCD_COMMAND;refreshVirtualPORT();
(0133) 	# define SetData            LCD_RS = LCD_DATA;refreshVirtualPORT();   
(0134) 	# define SetEnable          LCD_E = High;refreshVirtualPORT();
(0135) 	# define SetDisable         LCD_E = Low;refreshVirtualPORT();
(0136) #endif
(0137) 
(0138) #ifdef _LCD1602_FULL_DATA_MODEL
(0139)     #ifndef LCD_DATA_PORT
(0140)         #error Need for macro: LCD_DATA_PORT
(0141)     #endif
(0142) #endif
(0143) /********************
(0144) *  用户变量类型定义 *
(0145) ********************/
(0146) 
(0147) /********************
(0148) *  模块结构体定义区 *
(0149) ********************/
(0150) 
(0151) /********************
(0152) *   模块函数声明区  *
(0153) ********************/
(0154) static void LCDDelay(UINT16 Time);
(0155) static void LCDDelayUs(UINT16 Time);
(0156) 
(0157) 
(0158) /********************
(0159) *   全局函数声明区  *
(0160) ********************/
(0161) void LCDInit(void);
(0162) void LCDSetXY(UINT8 X,UINT8 Y);
(0163) void LCDDisplayString(UINT8 *String);
(0164) void LCDDisplayNum(unsigned long Num,UINT8 BitCount);
(0165) void RunString(UINT8 *String,UINT8 Y,UINT8 StartX,UINT8 EndX);
(0166) UINT8 StringLength(UINT8 *String);
(0167) void Flash(UINT8 *String,UINT8 Icon,UINT8 X,UINT8 Y);
(0168) void FlashStringGroup(UINT8 String[][17],UINT8 StringCounter,UINT8 X,UINT8 Y);
(0169) void LCDWaitForReady(void);
(0170) void LCDSendCommand(UINT8 Command);
(0171) void LCDSendData(UINT8 Data);
(0172) void PrintD(INT32 nNumber,UINT8 chCounter);
(0173) 
(0174) /********************
(0175) *   全局函数引用区  *
(0176) ********************/
(0177) #ifdef _Use_LCD1602B_Serial
(0178)     extern void refreshVirtualPORT(void);
(0179) #endif
(0180) 
(0181) /********************
(0182) *   模块变量声明区  *
(0183) ********************/
(0184) const static UINT8 CHR[16] = {'0','1','2','3','4','5','6','7','8'
(0185)                      ,'9','a','b','c','d','e','f'};
(0186)                      
(0187) /********************
(0188) *   全局变量声明区  *
(0189) ********************/
(0190) static UINT8 LCD_Temp = 0;
(0191) 
(0192) /********************
(0193) *   全局变量引用区  *
(0194) ********************/
(0195) #ifndef SYS_TIMER_MS_ADD_UNTILL_OVF
(0196) extern UINT16 g_wSystemTimer;
(0197)     #define SYS_TIMER_MS_ADD_UNTILL_OVF g_wSystemTimer
(0198) #else
(0199) extern UINT16 SYS_TIMER_MS_ADD_UNTILL_OVF;
(0200) #endif  
(0201) 
(0202) 
(0203) 
(0204) /***********************************************************
(0205) *   函数说明:LCD驱动类毫秒延时函数                        *
(0206) *   输入:    需要延时的大体毫秒数                         *
(0207) *   输出:    无                                           *
(0208) *   调用函数:LCDDelayUs()                                 *
(0209) ***********************************************************/
(0210) static void LCDDelay(UINT16 Time)
(0211) {
(0212)     UINT16 TimeCounter = 0;
(0213) 	
(0214) 	for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
     27B 2744      CLR	R20
     27C 2755      CLR	R21
     27D C005      RJMP	0x0283
(0215) 	{
(0216) 	    LCDDelayUs(255);
     27E EF0F      LDI	R16,0xFF
     27F E010      LDI	R17,0
     280 D006      RCALL	RD_LCD1602B.c:LCDDelayUs
     281 5F4F      SUBI	R20,0xFF
     282 4F5F      SBCI	R21,0xFF
     283 154A      CP	R20,R10
     284 055B      CPC	R21,R11
     285 F3C0      BCS	0x027E
     286 C62D      RJMP	pop_xgset300C
RD_LCD1602B.c:LCDDelayUs:
_LCDDelayUs:
  TimeCounter1         --> R20
  Time                 --> R16
     287 934A      ST	R20,-Y
     288 935A      ST	R21,-Y
(0217) 	}
(0218) }
(0219) 
(0220) /***********************************************************
(0221) *   函数说明:LCD驱动指令周期延时函数                      *
(0222) *   输入:    需要大体延时Us数                             *
(0223) *   输出:    无                                           *
(0224) *   调用函数:无                                           *
(0225) ***********************************************************/
(0226) static void LCDDelayUs(UINT16 Time)
(0227) {
(0228)      UINT16 TimeCounter = 0;
(0229) 	 for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
     289 2744      CLR	R20
     28A 2755      CLR	R21
     28B C003      RJMP	0x028F
(0230) 	 {
(0231) 	     asm("nop");
     28C 0000      NOP
     28D 5F4F      SUBI	R20,0xFF
     28E 4F5F      SBCI	R21,0xFF
     28F 1740      CP	R20,R16
     290 0751      CPC	R21,R17
     291 F3D0      BCS	0x028C
     292 9159      LD	R21,Y+
     293 9149      LD	R20,Y+
     294 9508      RET
(0232) 	 }
(0233) }
(0234) 
(0235) /***********************************************************
(0236) *   函数说明:LCD初始化函数                                *
(0237) *   输入:    无                                           *
(0238) *   输出:    无                                           *
(0239) *   调用函数:LCDDelay()  LCDWaitForReady()                *
(0240) *             LCDSendCommand()                             *
(0241) ***********************************************************/
(0242) void LCDInit(void)
(0243) {
(0244)     LCDDelay(15);
_LCDInit:
     295 E00F      LDI	R16,0xF
     296 E010      LDI	R17,0
     297 DFE1      RCALL	RD_LCD1602B.c:LCDDelay
(0245)    
(0246) #ifndef _LCD1602_FULL_DATA_MODEL
(0247) 	LCDSendCommand(0x28);
     298 E208      LDI	R16,0x28
     299 D00E      RCALL	_LCDSendCommand
(0248) #else
(0249)     LCDSendCommand(0x38);
(0250) #endif
(0251)     LCDWaitForReady();
     29A D083      RCALL	_LCDWaitForReady
(0252) 	LCDSendCommand(LCD_CMD_DISP_CTR);
     29B E00C      LDI	R16,0xC
     29C D00B      RCALL	_LCDSendCommand
(0253)     LCDWaitForReady();
     29D D080      RCALL	_LCDWaitForReady
(0254) 	LCDSendCommand(LCD_CMD_CLS);
     29E E001      LDI	R16,1
     29F D008      RCALL	_LCDSendCommand
(0255) 	LCDDelay(2);
     2A0 E002      LDI	R16,2
     2A1 E010      LDI	R17,0
     2A2 DFD6      RCALL	RD_LCD1602B.c:LCDDelay
(0256) 	LCDSendCommand(LCD_CMD_ENTER_SET);
     2A3 E002      LDI	R16,2
     2A4 D003      RCALL	_LCDSendCommand
(0257)     LCDWaitForReady();
     2A5 D078      RCALL	_LCDWaitForReady
(0258)     LCDSendCommand(LCD_CMD_NOT_MOVE);
     2A6 E104      LDI	R16,0x14
     2A7 C000      RJMP	_LCDSendCommand
(0259) 	
(0260) }
(0261) 
(0262) #ifndef _Use_LCD1602B_Serial
(0263) /***********************************************************
(0264) *   函数说明:向LCD发送指令函数                            *
(0265) *   输入:    需要发送的指令                               *
(0266) *   输出:    无                                           *
(0267) *   调用函数:LCD_SEND_HALF_CHAR_HIGH() LCD_SEND_HALF_CHAR_LOW() *
(0268) ***********************************************************/
(0269) void LCDSendCommand(UINT8 Command)
(0270) {
(0271) 	SetWrite;
     2A8 B18A      IN	R24,0x0A
     2A9 6788      ORI	R24,0x78
     2AA B98A      OUT	0x0A,R24
     2AB B18B      IN	R24,0x0B
     2AC 6788      ORI	R24,0x78
     2AD B98B      OUT	0x0B,R24
     2AE 0000      NOP
     2AF B185      IN	R24,0x05
     2B0 7F8E      ANDI	R24,0xFE
     2B1 B985      OUT	0x05,R24
(0272) 	SetCommand;
     2B2 B185      IN	R24,0x05
     2B3 7F8D      ANDI	R24,0xFD
     2B4 B985      OUT	0x05,R24
(0273)     #ifndef _LCD1602_FULL_DATA_MODEL
(0274) 	{
(0275) 		LCD_SEND_HALF_CHAR_HIGH(Command);
     2B5 B18B      IN	R24,0x0B
     2B6 7887      ANDI	R24,0x87
     2B7 B98B      OUT	0x0B,R24
     2B8 2F80      MOV	R24,R16
     2B9 7F80      ANDI	R24,0xF0
     2BA 9586      LSR	R24
     2BB B02B      IN	R2,0x0B
     2BC 2A28      OR	R2,R24
     2BD B82B      OUT	0x0B,R2
(0276)         LCD_E = HIGH;
     2BE B18B      IN	R24,0x0B
     2BF 6880      ORI	R24,0x80
     2C0 B98B      OUT	0x0B,R24
(0277) 	    LCD_E = LOW;
     2C1 B18B      IN	R24,0x0B
     2C2 778F      ANDI	R24,0x7F
     2C3 B98B      OUT	0x0B,R24
(0278) 	}
(0279) 	{

⌨️ 快捷键说明

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