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

📄 595_1602_example.lst

📁 ATMEGA8做的595驱动1602
💻 LST
📖 第 1 页 / 共 4 页
字号:
    0138 7D8F      ANDI	R24,0xDF
    0139 8380      STD	Z+0,R24
    013A DF80      RCALL	_refreshVirtualPORT
    013B D1ED      RCALL	<created procedures>
(0293) 	}
(0294) 	SetCommand;
    013C 7E8F      ANDI	R24,0xEF
    013D 8380      STD	Z+0,R24
    013E DF7C      RCALL	_refreshVirtualPORT
    013F D1B7      RCALL	pop_gset1
    0140 9508      RET
_LCDSendData:
  Data                 --> R20
    0141 D1B2      RCALL	push_gset1
    0142 2F40      MOV	R20,R16
    0143 D1E5      RCALL	<created procedures>
(0295) }
(0296) 
(0297) /********************************************************
(0298) *  函数说明:向LCD发送数据函数                          *
(0299) ********************************************************/
(0300) void LCDSendData(char Data)
(0301) {
(0302) 	SetData;
    0144 6180      ORI	R24,0x10
    0145 8380      STD	Z+0,R24
    0146 DF74      RCALL	_refreshVirtualPORT
    0147 D1E1      RCALL	<created procedures>
(0303) 	{
(0304) 	    SetEnable;
    0148 6280      ORI	R24,0x20
    0149 8380      STD	Z+0,R24
    014A DF70      RCALL	_refreshVirtualPORT
    014B D1E9      RCALL	0x0335
(0305) 		
(0306) 		LCD_SendHalfCharHigh(Data);
    014C DF6E      RCALL	_refreshVirtualPORT
    014D D1DB      RCALL	<created procedures>
(0307) 		
(0308) 	    SetDisable;
    014E 7D8F      ANDI	R24,0xDF
    014F 8380      STD	Z+0,R24
    0150 DF6A      RCALL	_refreshVirtualPORT
    0151 D1D7      RCALL	<created procedures>
(0309) 	}
(0310) 
(0311) 	{
(0312) 	    SetEnable;
    0152 6280      ORI	R24,0x20
    0153 8380      STD	Z+0,R24
    0154 DF66      RCALL	_refreshVirtualPORT
    0155 D1F4      RCALL	0x034A
    0156 D1EC      RCALL	0x0343
(0313) 		
(0314)         LCD_SendHalfCharLow(Data);	
    0157 DF63      RCALL	_refreshVirtualPORT
    0158 D1D0      RCALL	<created procedures>
(0315) 		
(0316) 		SetDisable;
    0159 7D8F      ANDI	R24,0xDF
    015A 8380      STD	Z+0,R24
    015B DF5F      RCALL	_refreshVirtualPORT
    015C D1CC      RCALL	<created procedures>
(0317) 	}
(0318) 	SetCommand;
    015D 7E8F      ANDI	R24,0xEF
    015E 8380      STD	Z+0,R24
    015F DF5B      RCALL	_refreshVirtualPORT
    0160 D196      RCALL	pop_gset1
    0161 9508      RET
(0319) }
(0320) 
(0321) /********************************************************
(0322) *  函数说明:等待LCD空闲状态函数                        *
(0323) ********************************************************/
(0324) void LCDWaitForReady(void)
(0325) {
(0326) 	LCDDelayUs(30);
_LCDWaitForReady:
    0162 E10E      LDI	R16,0x1E
    0163 E010      LDI	R17,0
    0164 DF9D      RCALL	_LCDDelayUs
    0165 9508      RET
_LCDSetXY:
  Address              --> R20
  Y                    --> R20
  X                    --> R22
    0166 D18B      RCALL	push_gset2
    0167 2F42      MOV	R20,R18
    0168 2F60      MOV	R22,R16
(0327) }
(0328) 
(0329) #endif
(0330) /********************************************************
(0331) *  函数说明:设置显示坐标函数                           *
(0332) ********************************************************/
(0333) void LCDSetXY(char X,char Y)
(0334) {
(0335)     char Address;
(0336)     if (Y == 0)
    0169 2344      TST	R20
    016A F419      BNE	0x016E
(0337) 	{
(0338) 	    Address = 0x80 + X;
    016B 2F46      MOV	R20,R22
    016C 5840      SUBI	R20,0x80
(0339) 	}
    016D C002      RJMP	0x0170
(0340)     else
(0341) 	{ 
(0342)         Address = 0xc0 + X;
    016E 2F46      MOV	R20,R22
    016F 5440      SUBI	R20,0x40
(0343) 	}
(0344) 	
(0345) 	LCDWaitForReady();
    0170 DFF1      RCALL	_LCDWaitForReady
(0346)     LCDSendCommand(Address);
    0171 2F04      MOV	R16,R20
    0172 DFAD      RCALL	_LCDSendCommand
    0173 D174      RCALL	pop_gset2
    0174 9508      RET
_LCDDisplayString:
  String               --> R20
    0175 D17E      RCALL	push_gset1
    0176 01A8      MOVW	R20,R16
(0347) }
(0348) 
(0349) /********************************************************
(0350) *  函数说明:LCD字符串显示函数                          *
(0351) ********************************************************/
(0352) void LCDDisplayString(char *String)
(0353) {
    0177 C006      RJMP	0x017E
(0354)     while(*String)
(0355) 	{
(0356) 	    LCDWaitForReady();
    0178 DFE9      RCALL	_LCDWaitForReady
(0357) 	    LCDSendData(*String);
    0179 01FA      MOVW	R30,R20
    017A 8100      LDD	R16,Z+0
    017B DFC5      RCALL	_LCDSendData
(0358) 		String++;
    017C 5F4F      SUBI	R20,0xFF
    017D 4F5F      SBCI	R21,0xFF
    017E 01FA      MOVW	R30,R20
    017F 8020      LDD	R2,Z+0
    0180 2022      TST	R2
    0181 F7B1      BNE	0x0178
    0182 D174      RCALL	pop_gset1
    0183 9508      RET
_LCDDisplayNum:
  a                    --> R20
  BitCount             --> Y+6
  Num                  --> Y+2
    0184 D142      RCALL	push_arg4
    0185 D16E      RCALL	push_gset1
(0359) 	}
(0360) }
(0361) 
(0362) /********************************************************
(0363) *  函数说明:数值显示函数(HEX)                          *
(0364) *  输入:    需要显示的数字(无符号长整形)             *
(0365) ********************************************************/
(0366) void LCDDisplayNum(unsigned long Num,char BitCount)
(0367) {
(0368)     char a = 0;
    0186 2744      CLR	R20
(0369) 	for (a = 8-BitCount ;a<8;a++)
    0187 E048      LDI	R20,0x8
    0188 800E      LDD	R0,Y+6
    0189 1940      SUB	R20,R0
    018A C01B      RJMP	0x01A6
(0370) 	{
(0371) 	    LCDSendData(CHR[(Num<<(a<<2))>>28]);
    018B 2E24      MOV	R2,R20
    018C 2433      CLR	R3
    018D 0C22      LSL	R2
    018E 1C33      ROL	R3
    018F 0C22      LSL	R2
    0190 1C33      ROL	R3
    0191 01FE      MOVW	R30,R28
    0192 8042      LDD	R4,Z+2
    0193 8053      LDD	R5,Z+3
    0194 8064      LDD	R6,Z+4
    0195 8075      LDD	R7,Z+5
    0196 922A      ST	R2,-Y
    0197 0182      MOVW	R16,R4
    0198 0193      MOVW	R18,R6
    0199 D171      RCALL	lsl32
    019A E18C      LDI	R24,0x1C
    019B E090      LDI	R25,0
    019C 938A      ST	R24,-Y
    019D D17F      RCALL	lsr32
    019E 01F8      MOVW	R30,R16
    019F E286      LDI	R24,0x26
    01A0 E090      LDI	R25,0
    01A1 0FE8      ADD	R30,R24
    01A2 1FF9      ADC	R31,R25
    01A3 9104      LPM	R16,0(Z)
    01A4 DF9C      RCALL	_LCDSendData
    01A5 9543      INC	R20
    01A6 3048      CPI	R20,0x8
    01A7 F318      BCS	0x018B
    01A8 D14E      RCALL	pop_gset1
    01A9 9624      ADIW	R28,4
    01AA 9508      RET
_RunString:
  StringLong           --> R22
  SCREEN               --> Y+0
  Point                --> R14
  a                    --> R10
  EndX                 --> R12
  StartX               --> R20
  Y                    --> Y+31
  Direction            --> R22
  String               --> Y+27
    01AB D11B      RCALL	push_arg4
    01AC D13F      RCALL	push_gset5
    01AD 2F62      MOV	R22,R18
    01AE 9761      SBIW	R28,0x11
    01AF A149      LDD	R20,Y+33
    01B0 A0CB      LDD	R12,Y+35
(0372) 	}
(0373) }
(0374) 
(0375) /********************************************************
(0376) *  函数说明:滚屏字幕效果                               *
(0377) *  输入:    需要滚屏的字符串 长度 位置                 *
(0378) ********************************************************/
(0379) void RunString(char *String,char Direction,char Y,char StartX,char EndX)
(0380) {
(0381)     static char StringHead = 0;
(0382) 	char SCREEN[17];
(0383) 	char a = 0;
    01B1 24AA      CLR	R10
(0384) 	char Point = StringHead;
    01B2 90E00065  LDS	R14,StringHead
(0385) 	char StringLong = StringLength(String);
    01B4 8D0B      LDD	R16,Y+27
    01B5 8D1C      LDD	R17,Y+28
    01B6 D049      RCALL	_StringLength
    01B7 2F60      MOV	R22,R16
(0386) 	static unsigned int RunTimeCounter = 0;
(0387) 	
(0388) 	for (a = 0;a<EndX - StartX + 1;a++)
    01B8 C00E      RJMP	0x01C7
(0389) 	{
(0390) 	     SCREEN[a] = String[Point];
    01B9 2DEE      MOV	R30,R14
    01BA 27FF      CLR	R31
    01BB 8C0B      LDD	R0,Y+27
    01BC 8C1C      LDD	R1,Y+28
    01BD 0DE0      ADD	R30,R0
    01BE 1DF1      ADC	R31,R1
    01BF 8020      LDD	R2,Z+0
    01C0 D190      RCALL	0x0351
    01C1 8220      STD	Z+0,R2
(0391) 		 Point ++;
    01C2 94E3      INC	R14
(0392) 		 if (Point == StringLong)
    01C3 16E6      CP	R14,R22
    01C4 F409      BNE	0x01C6
(0393) 		 {
(0394) 		     Point = 0;
    01C5 24EE      CLR	R14
    01C6 94A3      INC	R10
    01C7 2D8C      MOV	R24,R12
    01C8 1B84      SUB	R24,R20
    01C9 5F8F      SUBI	R24,0xFF
    01CA 16A8      CP	R10,R24
    01CB F368      BCS	0x01B9
(0395) 		 }
(0396) 	}
(0397) 	
(0398) 	for (;a < 17;a++)
    01CC C004      RJMP	0x01D1
(0399) 	{
(0400) 	    SCREEN[a] =' ';
    01CD D183      RCALL	0x0351
    01CE E280      LDI	R24,0x20
    01CF 8380      STD	Z+0,R24
    01D0 94A3      INC	R10
    01D1 2D8A      MOV	R24,R10
    01D2 3181      CPI	R24,0x11
    01D3 F3C8      BCS	0x01CD
(0401) 	}
(0402) 	
(0403) 	RunTimeCounter ++;
    01D4 91800066  LDS	R24,RunTimeCounter
    01D6 91900067  LDS	R25,RunTimeCounter+1
    01D8 9601      ADIW	R24,1
    01D9 93900067  STS	RunTimeCounter+1,R25
    01DB 93800066  STS	RunTimeCounter,R24
(0404) 	if (RunTimeCounter >RunStringSpeed)
    01DD E08B      LDI	R24,0xB
    01DE E090      LDI	R25,0
    01DF 90200066  LDS	R2,RunTimeCounter
    01E1 90300067  LDS	R3,RunTimeCounter+1
    01E3 1582      CP	R24,R2
    01E4 0593      CPC	R25,R3
    01E5 F478      BCC	0x01F5
(0405) 	{
(0406) 	    StringHead ++;
    01E6 91800065  LDS	R24,StringHead
    01E8 5F8F      SUBI	R24,0xFF
    01E9 93800065  STS	StringHead,R24
(0407) 		RunTimeCounter = 0;
    01EB 2422      CLR	R2
    01EC 2433      CLR	R3
    01ED 92300067  STS	RunTimeCounter+1,R3
    01EF 92200066  STS	RunTimeCounter,R2
(0408) 		if (StringHead == StringLong)
    01F1 1786      CP	R24,R22
    01F2 F411      BNE	0x01F5
(0409) 	    {
(0410) 	        StringHead = 0;
    01F3 92200065  STS	StringHead,R2
(0411) 	    }
(0412) 	}
(0413) 	
(0414) 	Locate(StartX,Y)
    01F5 8D2F      LDD	R18,Y+31
    01F6 5021      SUBI	R18,1
    01F7 2F04      MOV	R16,R20
    01F8 5001      SUBI	R16,1
    01F9 DF6C      RCALL	_LCDSetXY
(0415) 	Print(SCREEN)
    01FA 018E      MOVW	R16,R28
    01FB DF79      RCALL	_LCDDisplayString
    01FC 9661      ADIW	R28,0x11
    01FD D0EC      RCALL	pop_gset5
    01FE 9624      ADIW	R28,4
    01FF 9508      RET
_StringLength:
  n                    --> R20
  String               --> R16
    0200 D0F3      RCALL	push_gset1
(0416) }
(0417) 
(0418) /********************************************************
(0419) *  函数说明:字符串长度测试函数                         *
(0420) ********************************************************/
(0421) char StringLength(char *String)
(0422) {
(0423)     char n = 0;
    0201 2744      CLR	R20
    0202 C003      RJMP	0x0206
(0424) 	while (*String)
(0425) 	{
(0426) 	    n++;
    0203 9543      INC	R20
(0427) 		String ++;
    0204 5F0F      SUBI	R16,0xFF
    0205 4F1F      SBCI	R17,0xFF
    0206 01F8      MOVW	R30,R16
    0207 8020      LDD	R2,Z+0
    0208 2022      TST	R2
    0209 F7C9      BNE	0x0203
(0428) 	}
(0429) 	
(0430) 	return n;
    020A 2F04      MOV	R16,R20
    020B D0EB      RCALL	pop_gset1
    020C 9508      RET
_Flash:
  StringLong           --> R20
  a                    --> R22
  Y                    --> R10
  X                    --> R12
  Icon                 --> R14
  String               --> Y+10
    020D D0B9      RCALL	push_arg4
    020E D0DD      RCALL	push_gset5
    020F 2EE2      MOV	R14,R18
    0210 84CE      LDD	R12,Y+14
    0211 88A8      LDD	R10,Y+16
(0431) }
(0432) 
(0433) /********************************************************
(0434) *  函数说明:闪烁显示函数                               *
(0435) ********************************************************/
(0436) void Flash(char *String,char Icon,char X,char Y)
(0437) {
(0438)     char a = 0;
    0212 2766      CLR	R22
(0439) 	char StringLong = StringLength(String);
    0213 850A      LDD	R16,Y+10
    0214 851B      LDD	R17,Y+11
    0215 DFEA      RCALL	_StringLength
    0216 2F40      MOV	R20,R16
(0440) 	
(0441)     if (FlashTimeCounter % FlashTimeOut > (FlashTimeOut >> 1))
    0217 E220      LDI	R18,0x20
    0218 E033      LDI	R19,3
    0219 9100006C  LDS	R16,FlashTimeCounter
    021B 9110006D  LDS	R17,FlashTimeCounter+1
    021D D0AE      RCALL	mod16u
    021E E980      LDI	R24,0x90
    021F E091      LDI	R25,1
    0220 1780      CP	R24,R16
    0221 0791      CPC	R25,R17
    0222 F448      BCC	0x022C
(0442) 	{
(0443) 	    Locate(X,Y)
    0223 2D2A      MOV	R18,R10
    0224 5021      SUBI	R18,1
    0225 2D0C      MOV	R16,R12
    0226 5001      SUBI	R16,1
    0227 DF3E      RCALL	_LCDSetXY
(0444) 		Print(String)    
    0228 850A      LDD	R16,Y+10
    0229 851B      LDD	R17,Y+11
    022A DF4A      RCALL	_LCDDisplayString
(0445) 	}
    022B C00F      RJMP	0x023B
(0446) 	else
(0447) 	{
(0448) 	    for (a = X ;a < X+StringLong;a++)
    022C 2D6C      MOV	R22,R12
    022D C009      RJMP	0x0237
(0449) 		{
(0450) 		    Locate(a,Y)
    022E 2D2A      MOV	R18,R10
    022F 5021      SUBI	R18,1
    0230 2F06      MOV	R16,R22
    0231 5001      SUBI	R16,1
    0232 DF33      RCALL	_LCDSetXY
(0451) 			LCDWaitForReady();
    0233 DF2E      RCALL	_LCDWaitForReady
(0452) 			LCDSendData(Icon);
    0234 2D0E      MOV	R16,R14
    0235 DF0B      RCALL	_LCDSendData
    0236 9563      INC	R22
    0237 2C2C      MOV	R2,R12
    0238 0E24      ADD	R2,R20
    0239 1562      CP	R22,R2
    023A F398      BCS	0x022E

⌨️ 快捷键说明

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