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

📄 gps20080503icc.lst

📁 ATmega128的GPS例子
💻 LST
📖 第 1 页 / 共 5 页
字号:
  j                    --> R22
  x10us                --> R16
     13B 940E 09AA CALL	push_xgsetF000
(0086) 		}
(0087) }
(0088) 
(0089) void Delay10us(Word x10us)//crystal=8MHz
(0090) {
(0091) 	Word i;Byte j; //variable:declare Word
(0092) 	for(i=0; i<x10us; i++)
     13D 2744      CLR	R20
     13E 2755      CLR	R21
     13F C00A      RJMP	0x014A
(0093) 	{
(0094) 			for(j=0;j<2;j++)
     140 2766      CLR	R22
     141 C004      RJMP	0x0146
(0095) 			{
(0096) 			 	NOP();
     142 0000      NOP
(0097) 				NOP();
     143 0000      NOP
(0098) 				NOP();
     144 0000      NOP
     145 9563      INC	R22
     146 3062      CPI	R22,2
     147 F3D0      BCS	0x0142
     148 5F4F      SUBI	R20,0xFF
     149 4F5F      SBCI	R21,0xFF
     14A 1740      CP	R20,R16
     14B 0751      CPC	R21,R17
     14C F398      BCS	0x0140
     14D 940C 09AF JMP	pop_xgsetF000
_Hzk_Dis_Words:
  ram_address          --> R10
  i                    --> R20
  lcd_pointer          --> R22
  xpos                 --> R12
  ypos                 --> R14
     14F 940E 0995 CALL	push_xgsetF0FC
     151 2EC2      MOV	R12,R18
     152 2EE0      MOV	R14,R16
     153 856A      LDD	R22,Y+10
     154 857B      LDD	R23,Y+11
FILE: D:\SOURCE~1\gps20080503\smg12232zk.h
(0001)                  
(0002) /******************  SMG12232ZK串行接口程序******************
(0003) * Title : Accessing to LCD-CONTROLLER                                   
(0004) * Date :  2007.10.18                                                      
(0005) * Support telephone:       
(0006) * Support fax :     
(0007) * Create by :	       
(0008) * DESCRIPTION:This subroutine shows how to write data to LCD-CONTROLLER  
(0009) *******************************************************************/
(0010) #ifndef __SMG12232ZK_H
(0011) #define __SMG12232ZK_H	
(0012) 
(0013) #define LCD_PORT1 PORTB
(0014) 	#define LCD_SCLK PB4
(0015) 	#define LCD_STD PB3
(0016) 	
(0017) #define LCD_PORT2 PORTC
(0018) 	#define LCD_CS	PC3
(0019) 
(0020) #define LCD_CS_H LCD_PORT2 |= BIT(LCD_CS)
(0021) #define LCD_CS_L LCD_PORT2 &=~ BIT(LCD_CS)
(0022) #define LCD_STD_H LCD_PORT1 |= BIT(LCD_STD)
(0023) #define LCD_STD_L LCD_PORT1 &=~ BIT(LCD_STD)
(0024) #define LCD_SCLK_H LCD_PORT1 |= BIT(LCD_SCLK)
(0025) #define LCD_SCLK_L LCD_PORT1 &=~ BIT(LCD_SCLK)
(0026) 
(0027) 
(0028) 
(0029) void Send_8bit(Word x);//串行发送8位数据
(0030) void Lcd_Write(Byte start,Byte data);//模块写入子程序
(0031) void Lcd_Reset(void);//模块复位子程序
(0032) void Hzk_Dis_Words(Byte ypos,Byte xpos,char *lcd_pointer);//xpos为列数,ypos为行数,num字符串长度
(0033) void Hzk_Dis_Data(Byte ypos,Byte xpos,Long data,Byte num);//xpos为列数,ypos为行数,num字符串长度		
(0034) void Hzk_Dis_Char(Byte ypos,Byte xpos,char *lcd_pointer,Byte num);//xpos为列数,ypos为行数,num字符串长度									
(0035) void Hzk_Dis_Clr(void);//汉字显示清屏
(0036) 
(0037) Long lcd_data1;
(0038) Long lcd_data2;
(0039) 
(0040) /****************发送汉字子程序******************
(0041) ** xpos为列数,ypos为行数
(0042) **lcd_pointer为字符串首地址
(0043) *********************************************************/
(0044) void Hzk_Dis_Words(Byte ypos,Byte xpos,char *lcd_pointer)//xpos为列数,ypos为行数,num字符串长度									
(0045) {
(0046) 	Byte i=0,ram_address;//ram_address:首地址
     155 2744      CLR	R20
     156 C001      RJMP	0x0158
(0047) 	//首先判断字符串得长度
(0048) 	while(*(lcd_pointer+i) != '\0')//字符串长度
(0049) 	{
(0050) 		i++;
     157 9543      INC	R20
     158 2FE4      MOV	R30,R20
     159 27FF      CLR	R31
     15A 0FE6      ADD	R30,R22
     15B 1FF7      ADC	R31,R23
     15C 8020      LDD	R2,Z+0
     15D 2022      TST	R2
     15E F7C1      BNE	0x0157
(0051) 	}//i=字符串长度	
(0052) 	if(i>15)
     15F E08F      LDI	R24,0xF
     160 1784      CP	R24,R20
     161 F408      BCC	0x0163
(0053) 	{
(0054) 		i=15;
     162 E04F      LDI	R20,0xF
(0055) 	}
(0056) 	if(ypos==1)
     163 2D8E      MOV	R24,R14
     164 3081      CPI	R24,1
     165 F429      BNE	0x016B
(0057) 	{
(0058) 		ram_address = 0x80+xpos-1;
     166 2D8C      MOV	R24,R12
     167 5880      SUBI	R24,0x80
     168 5081      SUBI	R24,1
     169 2EA8      MOV	R10,R24
(0059) 	}
     16A C007      RJMP	0x0172
(0060) 	else if(ypos==2)
     16B 2D8E      MOV	R24,R14
     16C 3082      CPI	R24,2
     16D F421      BNE	0x0172
(0061) 	{
(0062) 		ram_address = 0x90+xpos-1;
     16E 2D8C      MOV	R24,R12
     16F 5780      SUBI	R24,0x70
     170 5081      SUBI	R24,1
     171 2EA8      MOV	R10,R24
(0063) 	}
(0064) 	Lcd_Write(0xf8,ram_address);
     172 2D2A      MOV	R18,R10
     173 EF08      LDI	R16,0xF8
     174 D0A9      RCALL	_Lcd_Write
(0065) 	for(;i>0;i--)
     175 C007      RJMP	0x017D
(0066) 	{
(0067) 		Lcd_Write(0xfa,*lcd_pointer);	
     176 01FB      MOVW	R30,R22
     177 8120      LDD	R18,Z+0
     178 EF0A      LDI	R16,0xFA
     179 D0A4      RCALL	_Lcd_Write
(0068) 		lcd_pointer++;
     17A 5F6F      SUBI	R22,0xFF
     17B 4F7F      SBCI	R23,0xFF
     17C 954A      DEC	R20
     17D E080      LDI	R24,0
     17E 1784      CP	R24,R20
     17F F3B0      BCS	0x0176
     180 940C 098A JMP	pop_xgsetF0FC
_Hzk_Dis_Char:
  ram_address          --> R22
  i                    --> R10
  num                  --> Y,+12
  lcd_pointer          --> R20
  xpos                 --> R12
  ypos                 --> R14
     182 940E 0995 CALL	push_xgsetF0FC
     184 2EC2      MOV	R12,R18
     185 2EE0      MOV	R14,R16
     186 854A      LDD	R20,Y+10
     187 855B      LDD	R21,Y+11
(0069) 	}	
(0070) 	
(0071) }
(0072) 
(0073) void Hzk_Dis_Char(Byte ypos,Byte xpos,char *lcd_pointer,Byte num)//xpos为列数,ypos为行数,num字符串长度									
(0074) {
(0075) 	Byte i=0,ram_address;//ram_address:首地址
     188 24AA      CLR	R10
(0076) 	if(ypos==1)
     189 2D8E      MOV	R24,R14
     18A 3081      CPI	R24,1
     18B F421      BNE	0x0190
(0077) 	{
(0078) 		ram_address = 0x80+xpos-1;
     18C 2D6C      MOV	R22,R12
     18D 5860      SUBI	R22,0x80
     18E 5061      SUBI	R22,1
(0079) 	}
     18F C006      RJMP	0x0196
(0080) 	else if(ypos==2)
     190 2D8E      MOV	R24,R14
     191 3082      CPI	R24,2
     192 F419      BNE	0x0196
(0081) 	{
(0082) 		ram_address = 0x90+xpos-1;
     193 2D6C      MOV	R22,R12
     194 5760      SUBI	R22,0x70
     195 5061      SUBI	R22,1
(0083) 	}
(0084) 	Lcd_Write(0xf8,ram_address);
     196 2F26      MOV	R18,R22
     197 EF08      LDI	R16,0xF8
     198 D085      RCALL	_Lcd_Write
(0085) 	for(i=0;i<num;i++)
     199 24AA      CLR	R10
     19A C007      RJMP	0x01A2
(0086) 	{
(0087) 		Lcd_Write(0xfa,*lcd_pointer);	
     19B 01FA      MOVW	R30,R20
     19C 8120      LDD	R18,Z+0
     19D EF0A      LDI	R16,0xFA
     19E D07F      RCALL	_Lcd_Write
(0088) 		lcd_pointer++;
     19F 5F4F      SUBI	R20,0xFF
     1A0 4F5F      SBCI	R21,0xFF
     1A1 94A3      INC	R10
     1A2 840C      LDD	R0,Y+12
     1A3 14A0      CP	R10,R0
     1A4 F3B0      BCS	0x019B
     1A5 940C 098A JMP	pop_xgsetF0FC
_Hzk_Dis_Data:
  ram_address          --> R22
  lcd_buf              --> Y,+0
  lcd_pointer          --> R22
  i                    --> R10
  num                  --> R20
  data                 --> Y,+25
  xpos                 --> R12
  ypos                 --> R14
     1A7 940E 0995 CALL	push_xgsetF0FC
     1A9 2EC2      MOV	R12,R18
     1AA 2EE0      MOV	R14,R16
     1AB 972F      SBIW	R28,0xF
     1AC 8D4D      LDD	R20,Y+29
(0089) 	}	
(0090) 
(0091) }
(0092) 
(0093) /****************发送数据子程序******************
(0094) ** xpos为列数,ypos为行数
(0095) **data为数据
(0096) **num数据占用得位数
(0097) *********************************************************/
(0098) void Hzk_Dis_Data(Byte ypos,Byte xpos,Long data,Byte num)								
(0099) {
(0100) 	Byte i=0,ram_address;//ram_address:首地址
     1AD 24AA      CLR	R10
(0101) 	Byte lcd_buf[15];
(0102) 	Byte *lcd_pointer;
(0103) 	if(num<16)
     1AE 3140      CPI	R20,0x10
     1AF F008      BCS	0x01B1
     1B0 C055      RJMP	0x0206
(0104) 	{
(0105) 		for(i=0;i<num;i++)
     1B1 C036      RJMP	0x01E8
(0106) 		{
(0107) 			lcd_buf[num-i-1]= data%10+0x30;
     1B2 E08A      LDI	R24,0xA
     1B3 E090      LDI	R25,0
     1B4 E0A0      LDI	R26,0
     1B5 E0B0      LDI	R27,0
     1B6 8D09      LDD	R16,Y+25
     1B7 8D1A      LDD	R17,Y+26
     1B8 8D2B      LDD	R18,Y+27
     1B9 8D3C      LDD	R19,Y+28
     1BA 93BA      ST	R27,-Y
     1BB 93AA      ST	R26,-Y
     1BC 939A      ST	R25,-Y
     1BD 938A      ST	R24,-Y
     1BE 940E 08EE CALL	mod32u
     1C0 0118      MOVW	R2,R16
     1C1 0129      MOVW	R4,R18
     1C2 E380      LDI	R24,0x30
     1C3 E090      LDI	R25,0
     1C4 E0A0      LDI	R26,0
     1C5 E0B0      LDI	R27,0
     1C6 0E28      ADD	R2,R24
     1C7 1E39      ADC	R3,R25
     1C8 1E4A      ADC	R4,R26
     1C9 1E5B      ADC	R5,R27
     1CA 2C3A      MOV	R3,R10
     1CB 2444      CLR	R4
     1CC 2FE4      MOV	R30,R20
     1CD 27FF      CLR	R31
     1CE 19E3      SUB	R30,R3
     1CF 09F4      SBC	R31,R4
     1D0 01CE      MOVW	R24,R28
     1D1 9701      SBIW	R24,1
     1D2 0FE8      ADD	R30,R24
     1D3 1FF9      ADC	R31,R25
     1D4 8220      STD	Z+0,R2
(0108) 			data /= 10;
     1D5 E08A      LDI	R24,0xA
     1D6 E090      LDI	R25,0
     1D7 E0A0      LDI	R26,0
     1D8 E0B0      LDI	R27,0
     1D9 8D09      LDD	R16,Y+25
     1DA 8D1A      LDD	R17,Y+26
     1DB 8D2B      LDD	R18,Y+27
     1DC 8D3C      LDD	R19,Y+28
     1DD 93BA      ST	R27,-Y
     1DE 93AA      ST	R26,-Y
     1DF 939A      ST	R25,-Y
     1E0 938A      ST	R24,-Y
     1E1 940E 08EC CALL	div32u
     1E3 8F09      STD	Y+25,R16
     1E4 8F1A      STD	Y+26,R17
     1E5 8F2B      STD	Y+27,R18
     1E6 8F3C      STD	Y+28,R19
     1E7 94A3      INC	R10
     1E8 16A4      CP	R10,R20
     1E9 F240      BCS	0x01B2
(0109) 		}
(0110) 		//输入灭零程序
(0111) 		
(0112) 		if(ypos==1)
     1EA 2D8E      MOV	R24,R14
     1EB 3081      CPI	R24,1
     1EC F421      BNE	0x01F1
(0113) 		{
(0114) 			ram_address = 0x80+xpos-1;
     1ED 2D6C      MOV	R22,R12
     1EE 5860      SUBI	R22,0x80
     1EF 5061      SUBI	R22,1
(0115) 		}
     1F0 C006      RJMP	0x01F7
(0116) 		else if(ypos==2)
     1F1 2D8E      MOV	R24,R14
     1F2 3082      CPI	R24,2
     1F3 F419      BNE	0x01F7
(0117) 		{
(0118) 			ram_address = 0x90+xpos-1;
     1F4 2D6C      MOV	R22,R12
     1F5 5760      SUBI	R22,0x70
     1F6 5061      SUBI	R22,1
(0119) 		}
(0120) 		Lcd_Write(0xf8,ram_address);
     1F7 2F26      MOV	R18,R22
     1F8 EF08      LDI	R16,0xF8
     1F9 D024      RCALL	_Lcd_Write
(0121) 		lcd_pointer = lcd_buf;
     1FA 01BE      MOVW	R22,R28
(0122) 		for(i=0;i<num;i++)
     1FB 24AA      CLR	R10
     1FC C007      RJMP	0x0204
(0123) 		{
(0124) 			Lcd_Write(0xfa,*lcd_pointer);	
     1FD 01FB      MOVW	R30,R22
     1FE 8120      LDD	R18,Z+0
     1FF EF0A      LDI	R16,0xFA
     200 D01D      RCALL	_Lcd_Write
(0125) 			lcd_pointer++;
     201 5F6F      SUBI	R22,0xFF
     202 4F7F      SBCI	R23,0xFF
     203 94A3      INC	R10
     204 16A4      CP	R10,R20
     205 F3B8      BCS	0x01FD
(0126) 		}
(0127) 	}	
     206 962F      ADIW	R28,0xF
     207 940C 098A JMP	pop_xgsetF0FC
(0128) }
(0129) 
(0130) 
(0131) void Lcd_Reset(void)
(0132) {
(0133) 	LCD_CS_H;//片选置高
_Lcd_Reset:
     209 9AAB      SBI	0x15,3
(0134) 	Delay_Ms(1);//等待内部复位
     20A E001      LDI	R16,1
     20B E010      LDI	R17,0
     20C DF10      RCALL	_Delay_Ms
(0135) 	Lcd_Write(0xf8,0x30);//使用基本指令集
     20D E320      LDI	R18,0x30
     20E EF08      LDI	R16,0xF8
     20F D00E      RCALL	_Lcd_Write
(0136) 	Lcd_Write(0xf8,0x0c);//整体显示on
     210 E02C      LDI	R18,0xC
     211 EF08      LDI	R16,0xF8
     212 D00B      RCALL	_Lcd_Write
(0137) 	Lcd_Write(0xf8,0x01);//清除显示
     213 E021      LDI	R18,1
     214 EF08      LDI	R16,0xF8
     215 D008      RCALL	_Lcd_Write
(0138) 	Delay_Ms(5);//4.6ms
     216 E005      LDI	R16,5
     217 E010      LDI	R17,0
     218 DF04      RCALL	_Delay_Ms
(0139) 	Lcd_Write(0xf8,0x06);//显示右移
     219 E026      LDI	R18,6
     21A EF08      LDI	R16,0xF8
     21B D002      RCALL	_Lcd_Write
(0140) 	LCD_CS_L;//片选置低
     21C 98AB      CBI	0x15,3
     21D 9508      RET
_Lcd_Write:
  com                  --> R10
  start                --> R12
     21E 92AA      ST	R10,-Y
     21F 92CA      ST	R12,-Y
     220 2EA2      MOV	R10,R18
     221 2EC0      MOV	R12,R16
(0141) }
(0142) 
(0143) void Lcd_Write(Byte start,Byte com)//start :起始字节com:命令/数据 						  
(0144) {
(0145) 	LCD_CS_H;//片选置高
     222 9AAB      SBI	0x15,3
(0146) 	Send_8bit(start);
     223 2D0C      MOV	R16,R12
     224 2711      CLR	R17
     225 D01C      RCALL	_Send_8bit
(0147) 	Delay_Us(100);//72us
     226 E604      LDI	R16,0x64
     227 DEDF      RCALL	_Delay_Us

⌨️ 快捷键说明

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