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

📄 gps.lst

📁 利用AVRM16单片机读与GPS接收模块进行通信
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0264)   if(x==1) WriteCommand(0x0c|0x03);
    0264 3041      CPI	R20,1
    0265 F419      BNE	0x0269
    0266 E00F      LDI	R16,0xF
    0267 DFE8      RCALL	_WriteCommand
    0268 C002      RJMP	0x026B
(0265)   else  WriteCommand(0x0c);
    0269 E00C      LDI	R16,0xC
    026A DFE5      RCALL	_WriteCommand
    026B 940E0861  CALL	pop_gset1
    026D 9508      RET
_Set_display_Adress:
  address              --> R20
  x                    --> R22
  y                    --> R20
    026E 940E085C  CALL	push_gset2
    0270 2F62      MOV	R22,R18
    0271 2F40      MOV	R20,R16
(0266) }
(0267) 
(0268) //  设置显示坐标:y行,x列
(0269) void Set_display_Adress(uchar y,uchar x)//
(0270) {
(0271)  uchar address;
(0272)  switch(y)
    0272 2755      CLR	R21
    0273 3040      CPI	R20,0
    0274 0745      CPC	R20,R21
    0275 F069      BEQ	0x0283
    0276 3041      CPI	R20,1
    0277 E0E0      LDI	R30,0
    0278 075E      CPC	R21,R30
    0279 F061      BEQ	0x0286
    027A 3042      CPI	R20,2
    027B E0E0      LDI	R30,0
    027C 075E      CPC	R21,R30
    027D F059      BEQ	0x0289
    027E 3043      CPI	R20,3
    027F E0E0      LDI	R30,0
    0280 075E      CPC	R21,R30
    0281 F051      BEQ	0x028C
    0282 C00B      RJMP	0x028E
(0273)  {
(0274)  case 0:
(0275) 	address=0x80+x;
    0283 2F46      MOV	R20,R22
    0284 5840      SUBI	R20,0x80
(0276) 	break;
    0285 C008      RJMP	0x028E
(0277)  case 1:
(0278) 	address=0x90+x;
    0286 2F46      MOV	R20,R22
    0287 5740      SUBI	R20,0x70
(0279) 	break;
    0288 C005      RJMP	0x028E
(0280)  case 2:
(0281) 	address=0x88+x;
    0289 2F46      MOV	R20,R22
    028A 5748      SUBI	R20,0x78
(0282) 	break;
    028B C002      RJMP	0x028E
(0283)  case 3:
(0284) 	address=0x98+x;
    028C 2F46      MOV	R20,R22
    028D 5648      SUBI	R20,0x68
(0285) 	break;
(0286) 	}
(0287) 	WriteCommand(address);
    028E 2F04      MOV	R16,R20
    028F DFC0      RCALL	_WriteCommand
    0290 940E084A  CALL	pop_gset2
    0292 9508      RET
_display_String:
  i                    --> R20
  s                    --> R22
  x                    --> R10
  y                    --> R12
    0293 940E0856  CALL	push_gset5
    0295 2EA2      MOV	R10,R18
    0296 2EC0      MOV	R12,R16
    0297 856A      LDD	R22,Y+10
    0298 857B      LDD	R23,Y+11
(0288) }
(0289) //显示字符串
(0290) void display_String(uchar y,uchar x,uchar *s)   //
(0291) {
(0292)   uchar i=0;
    0299 2744      CLR	R20
(0293)   if(*s=='\0')return;
    029A 01FB      MOVW	R30,R22
    029B 8020      LDD	R2,Z+0
    029C 2022      TST	R2
    029D F409      BNE	0x029F
    029E C030      RJMP	0x02CF
(0294)    for(i=0;;i++)
    029F 2744      CLR	R20
(0295)    {
(0296)       if(*(s+i)=='\0')break;
    02A0 2FE4      MOV	R30,R20
    02A1 27FF      CLR	R31
    02A2 0FE6      ADD	R30,R22
    02A3 1FF7      ADC	R31,R23
    02A4 8020      LDD	R2,Z+0
    02A5 2022      TST	R2
    02A6 F409      BNE	0x02A8
    02A7 C027      RJMP	0x02CF
(0297)       if(!i%2)
    02A8 2344      TST	R20
    02A9 F421      BNE	0x02AE
    02AA E081      LDI	R24,1
    02AB E090      LDI	R25,0
    02AC 017C      MOVW	R14,R24
    02AD C002      RJMP	0x02B0
    02AE 24EE      CLR	R14
    02AF 24FF      CLR	R15
    02B0 E022      LDI	R18,2
    02B1 E030      LDI	R19,0
    02B2 0187      MOVW	R16,R14
    02B3 940E07E8  CALL	mod16s
    02B5 3000      CPI	R16,0
    02B6 0701      CPC	R16,R17
    02B7 F019      BEQ	0x02BB
(0298) 	Set_display_Adress(y,x);
    02B8 2D2A      MOV	R18,R10
    02B9 2D0C      MOV	R16,R12
    02BA DFB3      RCALL	_Set_display_Adress
(0299)       WriteData(*(s+i));
    02BB 2FE4      MOV	R30,R20
    02BC 27FF      CLR	R31
    02BD 0FE6      ADD	R30,R22
    02BE 1FF7      ADC	R31,R23
    02BF 8100      LDD	R16,Z+0
    02C0 DF7E      RCALL	_WriteData
(0300)       if(i%2)x++;
    02C1 E012      LDI	R17,2
    02C2 2F04      MOV	R16,R20
    02C3 940E0822  CALL	mod8u
    02C5 2300      TST	R16
    02C6 F009      BEQ	0x02C8
    02C7 94A3      INC	R10
(0301)       if(x>7){y++,x=0;}
    02C8 E087      LDI	R24,7
    02C9 158A      CP	R24,R10
    02CA F410      BCC	0x02CD
    02CB 94C3      INC	R12
    02CC 24AA      CLR	R10
    02CD 9543      INC	R20
    02CE CFD1      RJMP	0x02A0
    02CF 940E0853  CALL	pop_gset5
    02D1 9508      RET
_display_Char:
  ch                   --> Y+4
  x                    --> R22
  y                    --> R20
    02D2 940E085C  CALL	push_gset2
    02D4 2F62      MOV	R22,R18
    02D5 2F40      MOV	R20,R16
(0302)    }
(0303) }
(0304) //显示单个字符
(0305) void display_Char(uchar y,uchar x,char ch) 
(0306) { 
(0307) 	Set_display_Adress(y,x);
    02D6 2F26      MOV	R18,R22
    02D7 2F04      MOV	R16,R20
    02D8 DF95      RCALL	_Set_display_Adress
(0308) 	WriteData(ch);
    02D9 810C      LDD	R16,Y+4
    02DA DF64      RCALL	_WriteData
    02DB 940E084A  CALL	pop_gset2
    02DD 9508      RET
_display_Num:
  tmp                  --> Y+0
  i                    --> R20
  N                    --> R22
  num                  --> R10
  x                    --> R12
  y                    --> R14
    02DE 940E0856  CALL	push_gset5
    02E0 2EC2      MOV	R12,R18
    02E1 2EE0      MOV	R14,R16
    02E2 9725      SBIW	R28,5
    02E3 84AF      LDD	R10,Y+15
    02E4 88B8      LDD	R11,Y+16
    02E5 8969      LDD	R22,Y+17
(0309) 	
(0310) }
(0311) //可以显示 N 位的的整数num,(从个位起)最多显示6位
(0312) void display_Num(uchar y,uchar x,uint num,char N)//
(0313) {
(0314)  char tmp[5],i;//加大数组可以达到加多显示数位的效果
(0315)  //N%=6;
(0316)  for(i=0;i<N;i++)
    02E6 2744      CLR	R20
    02E7 C012      RJMP	0x02FA
(0317)  {
(0318)  tmp[i]=(num%10);
    02E8 E02A      LDI	R18,0xA
    02E9 E030      LDI	R19,0
    02EA 0185      MOVW	R16,R10
    02EB 940E0806  CALL	mod16u
    02ED 01CE      MOVW	R24,R28
    02EE 2FE4      MOV	R30,R20
    02EF 27FF      CLR	R31
    02F0 0FE8      ADD	R30,R24
    02F1 1FF9      ADC	R31,R25
    02F2 8300      STD	Z+0,R16
(0319)  num/=10;
    02F3 E02A      LDI	R18,0xA
    02F4 E030      LDI	R19,0
    02F5 0185      MOVW	R16,R10
    02F6 940E0808  CALL	div16u
    02F8 0158      MOVW	R10,R16
    02F9 9543      INC	R20
    02FA 1746      CP	R20,R22
    02FB F360      BCS	0x02E8
(0320)  };
(0321)  i--;
    02FC 954A      DEC	R20
    02FD C030      RJMP	0x032E
(0322) while(1)
(0323)     {
(0324) 	 Set_display_Adress(y,x);
    02FE 2D2C      MOV	R18,R12
    02FF 2D0E      MOV	R16,R14
    0300 DF6D      RCALL	_Set_display_Adress
(0325) 	 WriteData(tmp[i--]+0x30);
    0301 2E24      MOV	R2,R20
    0302 2433      CLR	R3
    0303 5041      SUBI	R20,1
    0304 01CE      MOVW	R24,R28
    0305 2DE2      MOV	R30,R2
    0306 27FF      CLR	R31
    0307 0FE8      ADD	R30,R24
    0308 1FF9      ADC	R31,R25
    0309 8100      LDD	R16,Z+0
    030A 5D00      SUBI	R16,0xD0
    030B DF33      RCALL	_WriteData
(0326) 	 if(!i)
    030C 2344      TST	R20
    030D F449      BNE	0x0317
(0327) 	 {WriteData(tmp[i]+0x30);break;}
    030E 01CE      MOVW	R24,R28
    030F 2FE4      MOV	R30,R20
    0310 27FF      CLR	R31
    0311 0FE8      ADD	R30,R24
    0312 1FF9      ADC	R31,R25
    0313 8100      LDD	R16,Z+0
    0314 5D00      SUBI	R16,0xD0
    0315 DF29      RCALL	_WriteData
    0316 C018      RJMP	0x032F
(0328) 	 WriteData(tmp[i--]+0x30);
    0317 2E24      MOV	R2,R20
    0318 2433      CLR	R3
    0319 5041      SUBI	R20,1
    031A 01CE      MOVW	R24,R28
    031B 2DE2      MOV	R30,R2
    031C 27FF      CLR	R31
    031D 0FE8      ADD	R30,R24
    031E 1FF9      ADC	R31,R25
    031F 8100      LDD	R16,Z+0
    0320 5D00      SUBI	R16,0xD0
    0321 DF1D      RCALL	_WriteData
(0329) 	 if(!i)
    0322 2344      TST	R20
    0323 F449      BNE	0x032D
(0330) 	 {WriteData(tmp[i]+0x30);break;}
    0324 01CE      MOVW	R24,R28
    0325 2FE4      MOV	R30,R20
    0326 27FF      CLR	R31
    0327 0FE8      ADD	R30,R24
    0328 1FF9      ADC	R31,R25
    0329 8100      LDD	R16,Z+0
    032A 5D00      SUBI	R16,0xD0
    032B DF13      RCALL	_WriteData
    032C C002      RJMP	0x032F
(0331) 	 x++;
    032D 94C3      INC	R12
    032E CFCF      RJMP	0x02FE
(0332) 	}
(0333) 	x--;
    032F 94CA      DEC	R12
    0330 9625      ADIW	R28,5
    0331 940E0853  CALL	pop_gset5
    0333 9508      RET
_Display_Picture:
  i                    --> R20
  x                    --> R22
  y                    --> R14
  j                    --> R10
  l                    --> Y+0
  k                    --> R12
  tab                  --> Y+12
    0334 931A      ST	R17,-Y
    0335 930A      ST	R16,-Y
    0336 940E0856  CALL	push_gset5
    0338 9722      SBIW	R28,2
(0334) }
(0335) //全屏显示图形子程序 128*64
(0336) void Display_Picture(const uchar *tab )
(0337) {
(0338)   unsigned  i,j,k,l=0,x=0x80,y;
    0339 2400      CLR	R0
    033A 2411      CLR	R1
    033B 8219      STD	Y+1,R1
    033C 8208      STD	Y+0,R0
    033D E860      LDI	R22,0x80
    033E E070      LDI	R23,0
(0339)   for(i=0;i<2;i++)    //x=0x80 为第一行
    033F 2744      CLR	R20
    0340 2755      CLR	R21
    0341 C037      RJMP	0x0379
(0340)   {
(0341)    for(j=0,y=0x80; j<32;j++,y++)//y为水平方向以字节为单位
    0342 24AA      CLR	R10
    0343 24BB      CLR	R11
    0344 E880      LDI	R24,0x80
    0345 E090      LDI	R25,0
    0346 017C      MOVW	R14,R24
    0347 C027      RJMP	0x036F
(0342)    { 
(0343) 	WriteCommand(0x36);  //8位扩充指令集,允许绘图
    0348 E306      LDI	R16,0x36
    0349 DF06      RCALL	_WriteCommand
(0344) 	WriteCommand(y);//地址设置
    034A 2D0E      MOV	R16,R14
    034B DF04      RCALL	_WriteCommand
(0345) 	WriteCommand(x);
    034C 2F06      MOV	R16,R22
    034D DF02      RCALL	_WriteCommand
(0346)     WriteCommand(0x30);
    034E E300      LDI	R16,0x30
    034F DF00      RCALL	_WriteCommand
(0347) 	k=16;
    0350 E180      LDI	R24,0x10
    0351 E090      LDI	R25,0
    0352 016C      MOVW	R12,R24
    0353 C00D      RJMP	0x0361
(0348)     while(k--)
(0349) 	   WriteData(tab[l++]);		//时间复杂度(16*32)*2=32*32=32个H代码控制一个汉字,共有32个汉字,则是全屏
    0354 8028      LDD	R2,Y+0
    0355 8039      LDD	R3,Y+1
    0356 01C1      MOVW	R24,R2
    0357 9601      ADIW	R24,1
    0358 8399      STD	Y+1,R25
    0359 8388      STD	Y+0,R24
    035A 01F1      MOVW	R30,R2
    035B 840C      LDD	R0,Y+12
    035C 841D      LDD	R1,Y+13
    035D 0DE0      ADD	R30,R0
    035E 1DF1      ADC	R31,R1
    035F 9104      LPM	R16,0(Z)
    0360 DEDE      RCALL	_WriteData
    0361 0116      MOVW	R2,R12
    0362 01C1      MOVW	R24,R2
    0363 9701      SBIW	R24,1
    0364 016C      MOVW	R12,R24
    0365 2022      TST	R2
    0366 F769      BNE	0x0354
    0367 2033      TST	R3
    0368 F759      BNE	0x0354
    0369 01C5      MOVW	R24,R10
    036A 9601      ADIW	R24,1
    036B 015C      MOVW	R10,R24
    036C 01C7      MOVW	R24,R14
    036D 9601      ADIW	R24,1
    036E 017C      MOVW	R14,R24
    036F 01C5      MOVW	R24,R10
    0370 3280      CPI	R24,0x20
    0371 E0E0      LDI	R30,0
    0372 079E      CPC	R25,R30
    0373 F408      BCC	0x0375
    0374 CFD3      RJMP	0x0348
(0350)    }                            //按顺序读入:0->(32*32-1)
(0351)    x=0x88;//第三行
    0375 E868      LDI	R22,0x88
    0376 E070      LDI	R23,0
    0377 5F4F      SUBI	R20,0xFF
    0378 4F5F      SBCI	R21,0xFF
    0379 3042      CPI	R20,2
    037A E0E0      LDI	R30,0
    037B 075E      CPC	R21,R30
    037C F408      BCC	0x037E
    037D CFC4      RJMP	0x0342
    037E 9622      ADIW	R28,2
    037F 940E0853  CALL	pop_gset5
    0381 9622      ADIW	R28,2
    0382 9508      RET
_Display_Picture32:
  i                    --> Y+1
  x                    --> R22
  y                    --> R10
  j                    --> R20
  l                    --> Y+0
  k                    --> R14
  tab                  --> R12
    0383 940E0856  CALL	push_gset5
    0385 0168      MOVW	R12,R16
    0386 9722      SBIW	R28,2
(0352)   }
(0353) }
(0354) //显示图形子程序 32*32
(0355) void Display_Picture32( unsigned char *tab )//
(0356) {
(0357)   unsigned  i,j,k,l=0,x=0x80,y;
    0387 2400      CLR	R0
    0388 2411      CLR	R1
    0389 8219      STD	Y+1,R1
    038A 8208      STD	Y+0,R0
    038B E860      LDI	R22,0x80
    038C E070      LDI	R23,0
(0358)  
(0359)    for(j=0,y=0x80; j<32;j++,y++)//水平扫描32行  第一个32行(汉字的两行)为一个连续地址

⌨️ 快捷键说明

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