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 + -
显示快捷键?