📄 595_1602_example.lst
字号:
00CA D00B RCALL _sendBITS
00CB 9563 INC R22
00CC 3061 CPI R22,1
00CD F3A0 BCS 0x00C2
00CE D260 RCALL 0x032F
(0208) }
(0209) VRCK = 1;
00CF 6088 ORI R24,0x8
00D0 8380 STD Z+0,R24
(0210) IfPortChange = False;
00D1 2422 CLR R2
00D2 92200063 STS IfPortChange,R2
00D4 D213 RCALL pop_gset2
00D5 9508 RET
_sendBITS:
n --> R20
Data --> R22
00D6 D21B RCALL push_gset2
00D7 2F60 MOV R22,R16
(0211) }
(0212)
(0213) /********************************************************
(0214) * 函数说明:发送串行数据函数 *
(0215) * 输入: 要发送的字节 *
(0216) ********************************************************/
(0217) void sendBITS(char Data)
(0218) {
(0219) char n = 0;
00D8 2744 CLR R20
(0220) for (n = 0;n<8;n++)
00D9 C014 RJMP 0x00EE
(0221) {
(0222) VSCK = 0;
00DA D254 RCALL 0x032F
00DB 7E8F ANDI R24,0xEF
00DC 8380 STD Z+0,R24
(0223) if (((Data<<n)& 0x80 )==0)
00DD 2F06 MOV R16,R22
00DE 2F14 MOV R17,R20
00DF D237 RCALL lsl8
00E0 2F80 MOV R24,R16
00E1 7880 ANDI R24,0x80
00E2 F421 BNE 0x00E7
00E3 D24B RCALL 0x032F
(0224) {
(0225) VSI = 0;
00E4 7D8F ANDI R24,0xDF
00E5 8380 STD Z+0,R24
(0226) }
00E6 C003 RJMP 0x00EA
(0227) else
(0228) {
(0229) VSI = 1;
00E7 D247 RCALL 0x032F
00E8 6280 ORI R24,0x20
00E9 8380 STD Z+0,R24
(0230) }
(0231) VSCK = 1; //拉高时钟线
00EA D244 RCALL 0x032F
00EB 6180 ORI R24,0x10
00EC 8380 STD Z+0,R24
00ED 9543 INC R20
00EE 3048 CPI R20,0x8
00EF F408 BCC 0x00F1
00F0 CFE9 RJMP 0x00DA
00F1 D1F6 RCALL pop_gset2
00F2 9508 RET
_LCDDelay:
TimeCounter --> R20
Time --> R22
00F3 D1FE RCALL push_gset2
00F4 01B8 MOVW R22,R16
FILE: G:\单片机\源程序\串行1602\595_1602_Example\RD_LCD1602B.h
(0001) #ifndef _Use_LCD1602B
(0002) #define _Use_LCD1602B
(0003) /********************************************************
(0004) * 函数库说明:LCD1602B基本驱动函数库 *
(0005) * 版本: v2.0 *
(0006) * 作者: 傻孩子 *
(0007) * 日期: 2005年9月6日 *
(0008) * 修改: 傻孩子 *
(0009) * 修改日期: 2006年1月20日 *
(0010) * *
(0011) * 说明: *
(0012) * 1、需要底层硬件驱动函数支持 *
(0013) * 基本的宏定义: *
(0014) * LCD_RS LCD_RW LCD_E *
(0015) * LCD_SetWriteData LCD_SetReadData *
(0016) * LCD_SendHalfCharHigh(a) *
(0017) * LCD_SendHalfCharLow(a) *
(0018) * 当处于串行状态下时,只定义LCD_RS *
(0019) * LCD_E LCD_LCD_SendHalfCharHigh(a) *
(0020) * LCD_SendHalfCharLow(a) *
(0021) * 2、自带基本的延时函数。需要外部提供毫秒 *
(0022) * 单向增加的两个计数器用于特效显示: *
(0023) * FlashTimeCounter RunTimeCounter *
(0024) * 3、需要修改引用宏定义来指定底层硬件驱动 *
(0025) * 函数库。 *
(0026) * 4、本库驱动下的LCD显示支持1602的各种连 *
(0027) * 接方法。当使用只写模式是请在引用该头 *
(0028) * 文件之前加上宏定义: *
(0029) * # define _Use_LCDOnlyWrite *
(0030) * 5、在调用本库之前,定义RunStringSpeed可 *
(0031) * 以设置滚屏的速度。通过在引用前定义 *
(0032) * FlashTimeOut 和 FlashGIFTimeOut 可以 *
(0033) * 改变字符闪烁的频率。 *
(0034) * 6、增加一个GIF字幕特效函数。 *
(0035) * 7、确定没有LCD复位问题。 *
(0036) * 8、增加对595串行转并行连接的支持。 *
(0037) * 需要头文件SerialToCollateral.h *
(0038) ********************************************************/
(0039)
(0040)
(0041) /***********************
(0042) * 系 统 宏 定 义 *
(0043) ***********************/
(0044)
(0045) /*---------------------*
(0046) * 常 数 宏 定 义 *
(0047) *---------------------*/
(0048) #ifndef True
(0049) # define True 0x01
(0050) #endif
(0051) #ifndef False
(0052) # define False 0x00
(0053) #endif
(0054)
(0055) #ifndef High
(0056) # define High 0x01
(0057) #endif
(0058) #ifndef Low
(0059) # define Low 0x00
(0060) #endif
(0061)
(0062) #ifndef RunStringSpeed
(0063) # define RunStringSpeed 100
(0064) #endif
(0065)
(0066) #ifndef FlashTimeOut
(0067) # define FlashTimeOut 500
(0068) #endif
(0069) #ifndef FlashGIFTimeOut
(0070) # define FlashGIFTimeOut 1000
(0071) #endif
(0072)
(0073) # define LCD_Write 0x00
(0074) # define LCD_Read 0x01
(0075) # define LCD_Command 0x00
(0076) # define LCD_Data 0x01
(0077) # define LCD_CMD_Init 0x28
(0078) # define LCD_CMD_DispCtr 0x0c
(0079) # define LCD_CMD_CLS 0x01
(0080) # define LCD_CMD_EnterSet 0x06
(0081) # define LCD_CMD_IconShow 0x0f
(0082) # define LCD_CMD_IconHide 0x0c
(0083) # define LCD_CMD_NotMove 0b00010100
(0084) /*---------------------*
(0085) * 动 作 宏 定 义 *
(0086) *---------------------*/
(0087)
(0088) #ifndef LCD_SetWriteData
(0089) # define LCD_SetWriteData
(0090) #endif
(0091) #ifndef LCD_SetReadData
(0092) # define LCD_SetReadData
(0093) #endif
(0094) #ifndef LCD_RW
(0095) # define LCD_RW LCD_Temp
(0096) #endif
(0097) #ifndef LCD_BF
(0098) # define LCD_BF LCD_Temp
(0099) #endif
(0100)
(0101) #ifndef _Use_LCD1602B_Serial
(0102) # define SetReadState LCD_SetReadData;LCD_RS = LCD_Command;LCD_RW = LCD_Read;
(0103) # define SetRead LCD_SetReadData;LCD_RW = LCD_Read;
(0104) # define SetWrite LCD_SetWriteData;LCD_RW = LCD_Write;
(0105) # define SetCommand LCD_RS = LCD_Command;
(0106) # define SetData LCD_RS = LCD_Data;
(0107) #else
(0108) # define _Use_LCDOnlyWrite
(0109) # define SetReadState
(0110) # define SetRead
(0111) # define SetWrite
(0112) # define SetCommand LCD_RS = LCD_Command;refreshVirtualPORT();
(0113) # define SetData LCD_RS = LCD_Data;refreshVirtualPORT();
(0114) # define SetEnable LCD_E = High;refreshVirtualPORT();
(0115) # define SetDisable LCD_E = Low;refreshVirtualPORT();
(0116) #endif
(0117)
(0118) # define Print(a) LCDDisplayString(a);
(0119) # define Locate(x,y) LCDSetXY(x-1,y-1);
(0120) # define CLS LCDWaitForReady();LCDSendCommand(LCD_CMD_CLS);LCDWaitForReady();
(0121) # define PrintN(a,b) LCDDisplayNum((unsigned long)a,b);
(0122) # define ShowIcon LCDWaitForReady();LCDSendCommand(LCD_CMD_IconShow);LCDWaitForReady();
(0123) # define HideIcon LCDWaitForReady();LCDSendCommand(LCD_CMD_IconHide);LCDWaitForReady();
(0124) /***********************
(0125) * 全局变量声明区 *
(0126) ***********************/
(0127) const char CHR[16] = {'0','1','2','3','4','5','6','7','8'
(0128) ,'9','a','b','c','d','e','f'};
(0129) extern unsigned int FlashTimeCounter;
(0130) extern unsigned int RunTimeCounter;
(0131) extern unsigned int FlashGIFStringCounter;
(0132) char LCD_Temp = 0;
(0133) /***********************
(0134) * 系统函数声明区 *
(0135) ***********************/
(0136) void LCDInit(void);
(0137) void LCDSendCommand(char Command);
(0138) void LCDSendData(char Data);
(0139) void LCDWaitForReady(void);
(0140) void LCDSetXY(char X,char Y);
(0141) void LCDDisplayString(char *String);
(0142) void LCDDisplayNum(unsigned long Num,char BitCount);
(0143) void LCDDelay(unsigned int Time);
(0144) void LCDDelayUs(unsigned int Time);
(0145) void RunString(char *String,char Direction,char Y,char StartX,char EndX);
(0146) void Flash(char *String,char Icon,char X,char Y);
(0147) char StringLength(char *String);
(0148) void FlashStringGroup(char String[][17],char StringCounter,char X,char Y);
(0149) #ifdef _Use_LCD1602B_Serial
(0150) extern void refreshVirtualPORT(void);
(0151) #endif
(0152) /********************************************************
(0153) * 函数说明:LCD驱动类毫秒延时函数 *
(0154) * 输入: 需要延时的大体毫秒数 *
(0155) ********************************************************/
(0156) void LCDDelay(unsigned int Time)
(0157) {
(0158) unsigned int TimeCounter = 0;
00F5 2744 CLR R20
00F6 2755 CLR R21
(0159)
(0160) for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
00F7 C005 RJMP 0x00FD
(0161) {
(0162) LCDDelayUs(255);
00F8 EF0F LDI R16,0xFF
00F9 E010 LDI R17,0
00FA D007 RCALL _LCDDelayUs
00FB 5F4F SUBI R20,0xFF
00FC 4F5F SBCI R21,0xFF
00FD 1746 CP R20,R22
00FE 0757 CPC R21,R23
00FF F3C0 BCS 0x00F8
0100 D1E7 RCALL pop_gset2
0101 9508 RET
_LCDDelayUs:
TimeCounter --> R20
Time --> R16
0102 D1F1 RCALL push_gset1
(0163) }
(0164) }
(0165)
(0166) /********************************************************
(0167) * 函数说明:LCD驱动指令周期延时函数 *
(0168) * 输入: 需要大体延时Us数 *
(0169) ********************************************************/
(0170) void LCDDelayUs(unsigned int Time)
(0171) {
(0172) unsigned int TimeCounter = 0;
0103 2744 CLR R20
0104 2755 CLR R21
(0173) for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
0105 C003 RJMP 0x0109
(0174) {
(0175) asm("nop");
0106 0000 NOP
0107 5F4F SUBI R20,0xFF
0108 4F5F SBCI R21,0xFF
0109 1740 CP R20,R16
010A 0751 CPC R21,R17
010B F3D0 BCS 0x0106
010C D1EA RCALL pop_gset1
010D 9508 RET
(0176) }
(0177) }
(0178)
(0179) /********************************************************
(0180) * 函数说明:LCD初始化函数 *
(0181) ********************************************************/
(0182) void LCDInit(void)
(0183) {
(0184) LCDDelay(15);
_LCDInit:
010E E00F LDI R16,0xF
010F E010 LDI R17,0
0110 DFE2 RCALL _LCDDelay
(0185)
(0186) LCDWaitForReady();
0111 D050 RCALL _LCDWaitForReady
(0187) LCDSendCommand(LCD_CMD_Init);
0112 E208 LDI R16,0x28
0113 D00C RCALL _LCDSendCommand
(0188)
(0189) LCDWaitForReady();
0114 D04D RCALL _LCDWaitForReady
(0190) LCDSendCommand(LCD_CMD_DispCtr);
0115 E00C LDI R16,0xC
0116 D009 RCALL _LCDSendCommand
(0191)
(0192) LCDWaitForReady();
0117 D04A RCALL _LCDWaitForReady
(0193) LCDSendCommand(LCD_CMD_CLS);
0118 E001 LDI R16,1
0119 D006 RCALL _LCDSendCommand
(0194) LCDDelay(2);
011A E002 LDI R16,2
011B E010 LDI R17,0
011C DFD6 RCALL _LCDDelay
(0195) LCDSendCommand(LCD_CMD_EnterSet);
011D E006 LDI R16,6
011E D001 RCALL _LCDSendCommand
011F 9508 RET
_LCDSendCommand:
Command --> R20
0120 D1D3 RCALL push_gset1
0121 2F40 MOV R20,R16
0122 D206 RCALL <created procedures>
(0196)
(0197) }
(0198) #ifndef _Use_LCD1602B_Serial
(0199) /********************************************************
(0200) * 函数说明:向LCD发送指令函数 *
(0201) * 输入: 需要发送的指令 *
(0202) ********************************************************/
(0203) void LCDSendCommand(char Command)
(0204) {
(0205) SetWrite;
(0206) SetCommand;
(0207) {
(0208) LCD_E = High;
(0209)
(0210) LCD_SendHalfCharHigh(Command);
(0211)
(0212) LCD_E = Low;
(0213) }
(0214) {
(0215) LCD_E = High;
(0216)
(0217) LCD_SendHalfCharLow(Command);
(0218)
(0219) LCD_E = Low;
(0220) }
(0221) SetRead;
(0222) SetCommand;
(0223) }
(0224)
(0225) /********************************************************
(0226) * 函数说明:向LCD发送数据函数 *
(0227) ********************************************************/
(0228) void LCDSendData(char Data)
(0229) {
(0230) SetWrite;
(0231) SetData;
(0232) {
(0233) LCD_E = High;
(0234)
(0235) LCD_SendHalfCharHigh(Data);
(0236)
(0237) LCD_E = Low;
(0238) }
(0239)
(0240) {
(0241) LCD_E = High;
(0242)
(0243) LCD_SendHalfCharLow(Data);
(0244)
(0245) LCD_E = Low;
(0246) }
(0247) SetRead;
(0248) SetCommand;
(0249) }
(0250)
(0251) /********************************************************
(0252) * 函数说明:等待LCD空闲状态函数 *
(0253) ********************************************************/
(0254) void LCDWaitForReady(void)
(0255) {
(0256) #ifdef _Use_LCDOnlyWrite
(0257) LCDDelayUs(30);
(0258) #else
(0259)
(0260) SetRead;
(0261) SetCommand;
(0262)
(0263) LCD_E = High;
(0264)
(0265) while (LCD_BF == Enable); //RW=1,读PD7,为0表示空闲;
(0266)
(0267) LCD_E = Low;
(0268)
(0269) #endif
(0270) }
(0271) #else
(0272)
(0273) /********************************************************
(0274) * 函数说明:向LCD发送指令函数 *
(0275) * 输入: 需要发送的指令 *
(0276) ********************************************************/
(0277) void LCDSendCommand(char Command)
(0278) {
(0279) SetCommand;
0123 7E8F ANDI R24,0xEF
0124 8380 STD Z+0,R24
0125 DF95 RCALL _refreshVirtualPORT
0126 D202 RCALL <created procedures>
(0280) {
(0281) SetEnable;
0127 6280 ORI R24,0x20
0128 8380 STD Z+0,R24
0129 DF91 RCALL _refreshVirtualPORT
012A D20A RCALL 0x0335
(0282)
(0283) LCD_SendHalfCharHigh(Command);
012B DF8F RCALL _refreshVirtualPORT
012C D1FC RCALL <created procedures>
(0284)
(0285) SetDisable;
012D 7D8F ANDI R24,0xDF
012E 8380 STD Z+0,R24
012F DF8B RCALL _refreshVirtualPORT
0130 D1F8 RCALL <created procedures>
(0286) }
(0287) {
(0288) SetEnable;
0131 6280 ORI R24,0x20
0132 8380 STD Z+0,R24
0133 DF87 RCALL _refreshVirtualPORT
0134 D215 RCALL 0x034A
0135 D20D RCALL 0x0343
(0289)
(0290) LCD_SendHalfCharLow(Command);
0136 DF84 RCALL _refreshVirtualPORT
0137 D1F1 RCALL <created procedures>
(0291)
(0292) SetDisable;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -