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

📄 main.s

📁 ATmega128的GPS例子
💻 S
📖 第 1 页 / 共 4 页
字号:
	.dbline 83
; 	}
L59:
L58:
	.dbline 84
; 	Lcd_Write(0xf8,ram_address);
	mov R18,R22
	ldi R16,248
	xcall _Lcd_Write
	.dbline 85
; 	for(i=0;i<num;i++)
	clr R10
	xjmp L64
L61:
	.dbline 86
; 	{
	.dbline 87
; 		Lcd_Write(0xfa,*lcd_pointer);	
	movw R30,R20
	ldd R18,z+0
	ldi R16,250
	xcall _Lcd_Write
	.dbline 88
; 		lcd_pointer++;
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 89
; 	}	
L62:
	.dbline 85
	inc R10
L64:
	.dbline 85
	ldd R0,y+12
	cp R10,R0
	brlo L61
X17:
	.dbline -2
L56:
	.dbline 0 ; func end
	xjmp pop_xgsetF0FC
	.dbsym r ram_address 22 c
	.dbsym r i 10 c
	.dbsym l num 12 c
	.dbsym r lcd_pointer 20 pc
	.dbsym r xpos 12 c
	.dbsym r ypos 14 c
	.dbend
	.dbfunc e Hzk_Dis_Data _Hzk_Dis_Data fV
;    ram_address -> R22
;        lcd_buf -> y+0
;    lcd_pointer -> R22,R23
;              i -> R10
;            num -> R20
;           data -> y+25
;           xpos -> R12
;           ypos -> R14
	.even
_Hzk_Dis_Data::
	xcall push_xgsetF0FC
	mov R12,R18
	mov R14,R16
	sbiw R28,15
	ldd R20,y+29
	.dbline -1
	.dbline 99
; 
; }
; 
; /****************发送数据子程序******************
; ** xpos为列数,ypos为行数
; **data为数据
; **num数据占用得位数
; *********************************************************/
; void Hzk_Dis_Data(Byte ypos,Byte xpos,Long data,Byte num)								
; {
	.dbline 100
; 	Byte i=0,ram_address;//ram_address:首地址
	clr R10
	.dbline 103
; 	Byte lcd_buf[15];
; 	Byte *lcd_pointer;
; 	if(num<16)
	cpi R20,16
	brlo X23
	xjmp L66
X23:
X18:
	.dbline 104
; 	{
	.dbline 105
; 		for(i=0;i<num;i++)
	xjmp L71
L68:
	.dbline 106
; 		{
	.dbline 107
; 			lcd_buf[num-i-1]= data%10+0x30;
	ldi R24,10
	ldi R25,0
	ldi R26,0
	ldi R27,0
	ldd R16,y+25
	ldd R17,y+26
	ldd R18,y+27
	ldd R19,y+28
	st -y,R27
	st -y,R26
	st -y,R25
	st -y,R24
	xcall mod32u
	movw R2,R16
	movw R4,R18
	ldi R24,48
	ldi R25,0
	ldi R26,0
	ldi R27,0
	add R2,R24
	adc R3,R25
	adc R4,R26
	adc R5,R27
	mov R3,R10
	clr R4
	mov R30,R20
	clr R31
	sub R30,R3
	sbc R31,R4
	movw R24,R28
	sbiw R24,1
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 108
; 			data /= 10;
	ldi R24,10
	ldi R25,0
	ldi R26,0
	ldi R27,0
	ldd R16,y+25
	ldd R17,y+26
	ldd R18,y+27
	ldd R19,y+28
	st -y,R27
	st -y,R26
	st -y,R25
	st -y,R24
	xcall div32u
	std y+25,R16
	std y+26,R17
	std y+27,R18
	std y+28,R19
	.dbline 109
; 		}
L69:
	.dbline 105
	inc R10
L71:
	.dbline 105
	cp R10,R20
	brlo L68
X19:
	.dbline 112
; 		//输入灭零程序
; 		
; 		if(ypos==1)
	mov R24,R14
	cpi R24,1
	brne L73
X20:
	.dbline 113
; 		{
	.dbline 114
; 			ram_address = 0x80+xpos-1;
	mov R22,R12
	subi R22,128    ; addi 128
	subi R22,1
	.dbline 115
; 		}
	xjmp L74
L73:
	.dbline 116
; 		else if(ypos==2)
	mov R24,R14
	cpi R24,2
	brne L75
X21:
	.dbline 117
; 		{
	.dbline 118
; 			ram_address = 0x90+xpos-1;
	mov R22,R12
	subi R22,112    ; addi 144
	subi R22,1
	.dbline 119
; 		}
L75:
L74:
	.dbline 120
; 		Lcd_Write(0xf8,ram_address);
	mov R18,R22
	ldi R16,248
	xcall _Lcd_Write
	.dbline 121
; 		lcd_pointer = lcd_buf;
	movw R22,R28
	.dbline 122
; 		for(i=0;i<num;i++)
	clr R10
	xjmp L80
L77:
	.dbline 123
; 		{
	.dbline 124
; 			Lcd_Write(0xfa,*lcd_pointer);	
	movw R30,R22
	ldd R18,z+0
	ldi R16,250
	xcall _Lcd_Write
	.dbline 125
; 			lcd_pointer++;
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 126
; 		}
L78:
	.dbline 122
	inc R10
L80:
	.dbline 122
	cp R10,R20
	brlo L77
X22:
	.dbline 127
; 	}	
L66:
	.dbline -2
L65:
	.dbline 0 ; func end
	adiw R28,15
	xjmp pop_xgsetF0FC
	.dbsym r ram_address 22 c
	.dbsym l lcd_buf 0 A[15:15]c
	.dbsym r lcd_pointer 22 pc
	.dbsym r i 10 c
	.dbsym r num 20 c
	.dbsym l data 25 l
	.dbsym r xpos 12 c
	.dbsym r ypos 14 c
	.dbend
	.dbfunc e Lcd_Reset _Lcd_Reset fV
	.even
_Lcd_Reset::
	.dbline -1
	.dbline 132
; }
; 
; 
; void Lcd_Reset(void)
; {
	.dbline 133
; 	LCD_CS_H;//片选置高
	sbi 0x15,3
	.dbline 134
; 	Delay_Ms(1);//等待内部复位
	ldi R16,1
	ldi R17,0
	xcall _Delay_Ms
	.dbline 135
; 	Lcd_Write(0xf8,0x30);//使用基本指令集
	ldi R18,48
	ldi R16,248
	xcall _Lcd_Write
	.dbline 136
; 	Lcd_Write(0xf8,0x0c);//整体显示on
	ldi R18,12
	ldi R16,248
	xcall _Lcd_Write
	.dbline 137
; 	Lcd_Write(0xf8,0x01);//清除显示
	ldi R18,1
	ldi R16,248
	xcall _Lcd_Write
	.dbline 138
; 	Delay_Ms(5);//4.6ms
	ldi R16,5
	ldi R17,0
	xcall _Delay_Ms
	.dbline 139
; 	Lcd_Write(0xf8,0x06);//显示右移
	ldi R18,6
	ldi R16,248
	xcall _Lcd_Write
	.dbline 140
; 	LCD_CS_L;//片选置低
	cbi 0x15,3
	.dbline -2
L81:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Lcd_Write _Lcd_Write fV
;            com -> R10
;          start -> R12
	.even
_Lcd_Write::
	st -y,R10
	st -y,R12
	mov R10,R18
	mov R12,R16
	.dbline -1
	.dbline 144
; }
; 
; void Lcd_Write(Byte start,Byte com)//start :起始字节com:命令/数据 						  
; {
	.dbline 145
; 	LCD_CS_H;//片选置高
	sbi 0x15,3
	.dbline 146
; 	Send_8bit(start);
	mov R16,R12
	clr R17
	xcall _Send_8bit
	.dbline 147
; 	Delay_Us(100);//72us
	ldi R16,100
	xcall _Delay_Us
	.dbline 149
; 		//将data变为datal 0000 datah 0000
; 	Send_8bit(com&0xf0);
	mov R16,R10
	clr R17
	andi R16,240
	andi R17,0
	xcall _Send_8bit
	.dbline 150
; 	Delay_Us(100);//72us	
	ldi R16,100
	xcall _Delay_Us
	.dbline 151
; 	Send_8bit((com&0x0f)<<4);
	mov R16,R10
	clr R17
	andi R16,15
	andi R17,0
	lsl R16
	rol R17
	lsl R16
	rol R17
	lsl R16
	rol R17
	lsl R16
	rol R17
	xcall _Send_8bit
	.dbline 152
; 	Delay_Us(100);//72us
	ldi R16,100
	xcall _Delay_Us
	.dbline 153
; 	LCD_CS_L;//片选置低
	cbi 0x15,3
	.dbline -2
L82:
	.dbline 0 ; func end
	ld R12,y+
	ld R10,y+
	ret
	.dbsym r com 10 c
	.dbsym r start 12 c
	.dbend
	.dbfunc e Send_8bit _Send_8bit fV
;              i -> R20
;              x -> R10,R11
	.even
_Send_8bit::
	xcall push_xgset300C
	movw R10,R16
	.dbline -1
	.dbline 157
; }
; 	
; void Send_8bit(Word x)
; {
	.dbline 159
; 	Byte i;
; 	for(i=0;i<8;i++)
	clr R20
	xjmp L87
L84:
	.dbline 160
; 	{
	.dbline 161
; 		if(x&0x80)//数据线发送数据
	sbrs R10,7
	rjmp L88
X24:
	.dbline 162
; 		{
	.dbline 163
; 			LCD_STD_H;
	sbi 0x18,3
	.dbline 164
; 		}
	xjmp L89
L88:
	.dbline 166
; 		else
; 		{
	.dbline 167
; 			LCD_STD_L;
	cbi 0x18,3
	.dbline 168
; 		}
L89:
	.dbline 169
; 		LCD_SCLK_L;//产生同步时钟
	cbi 0x18,4
	.dbline 170
; 		Delay_Us(2);
	ldi R16,2
	xcall _Delay_Us
	.dbline 171
; 		LCD_SCLK_H;
	sbi 0x18,4
	.dbline 172
; 		Delay_Us(2);
	ldi R16,2
	xcall _Delay_Us
	.dbline 173
; 		x <<= 1;
	lsl R10
	rol R11
	.dbline 174
; 	}
L85:
	.dbline 159
	inc R20
L87:
	.dbline 159
	cpi R20,8
	brlo L84
X25:
	.dbline -2
L83:
	.dbline 0 ; func end
	xjmp pop_xgset300C
	.dbsym r i 20 c
	.dbsym r x 10 i
	.dbend
	.dbfunc e Hzk_Dis_Clr _Hzk_Dis_Clr fV
	.even
_Hzk_Dis_Clr::
	sbiw R28,2
	.dbline -1
	.dbline 178
; }
; 
; void Hzk_Dis_Clr(void)//汉字显示清屏
; {
	.dbline 179
; 	Hzk_Dis_Words(1,1,"                  ");
	ldi R24,<L91
	ldi R25,>L91
	std y+1,R25
	std y+0,R24
	ldi R18,1
	ldi R16,1
	xcall _Hzk_Dis_Words
	.dbline 180
; 	Hzk_Dis_Words(2,1,"                  ");	
	ldi R24,<L91
	ldi R25,>L91
	std y+1,R25
	std y+0,R24
	ldi R18,1
	ldi R16,2
	xcall _Hzk_Dis_Words
	.dbline -2
L90:
	.dbline 0 ; func end
	adiw R28,2
	ret
	.dbend
	.area lit(rom, con, rel)
_COS_TAB::
	.byte 'd,'d
	.byte 'd,'d
	.byte 'd,'c
	.byte 'c,'c
	.byte 'c,'b
	.byte 'b,'b
	.byte 'a,'a
	.byte 'a,96
	.byte 96,95
	.byte 95,94
	.byte 93,93
	.byte 92,91
	.byte 91,'Z
	.byte 'Y,'X
	.byte 'W,'W
	.byte 'V,'U
	.byte 'T,'S
	.byte 'R,'Q
	.byte 'P,'O
	.byte 'N,'M
	.byte 'K,'J
	.byte 'I,'H
	.byte 'G,'E
	.byte 'D,'C
	.byte 'B,64
	.byte 63,62
	.byte 60,59
	.byte 57,56
	.byte 55,53
	.byte 52,50
	.byte 49,47
	.byte 45,44
	.byte 42,41
	.byte 39,38
	.byte 36,34
	.byte 33,31
	.byte 29,28
	.byte 26,24
	.byte 23,21
	.byte 19,17
	.byte 16,14
	.byte 12,11
	.byte 9,7
	.byte 5,4
	.byte 2,0
	.dbfile D:\SOURCE~1\gps20080503\main.c
	.dbsym e COS_TAB _COS_TAB A[90:90]kc
	.area text(rom, con, rel)
	.dbfile D:\SOURCE~1\gps20080503\main.c
	.dbfunc e main _main fV
;              i -> <dead>
	.even
_main::
	sbiw R28,12
	.dbline -1
	.dbline 42
; //ICC-AVR application builder : 2007-11-21
; // Target : M16
; // Crystal: 8.0000Mhz
;                   
; /******************  SMG12232ZK串行接口程序******************
; * Title : Accessing to LCD-CONTROLLER                                   
; * Date :  2007.10.18                                                      
; * Support telephone:       
; * Support fax :     
; * Create by :	       
; * DESCRIPTION:This subroutine shows how to write data to LCD-CONTROLLER  
; *******************************************************************/
; 
; #include <iom16v.h>		//ATMEGA48头文件
; #include <macros.h>		//宏定义
; //#include <math.h>	
; #include "define.h"		//端口定义
; #include "initrialm16.h"//初始化mcu
; #include "delay.h"		//延时程序
; #include "smg12232zk.h" //122*32点阵屏驱动程序
; 
; 
; void Get_Key(void);
; void Get_GPRMC_data(void);//提取GPRMC数据
; long Get_Area(long x1,long y1,long x2,long y2);
; 
; 
; Byte const COS_TAB[90]=
; 	{
; 	100,100,100,100,100,99, 99, 99, 99, 98, 
; 	98, 98, 97, 97, 97, 96, 96, 95, 95, 94, 
; 	93, 93, 92, 91, 91, 90, 89, 88, 87, 87, 
; 	86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 
; 	75, 74, 73, 72, 71, 69, 68, 67, 66, 64, 
; 	63, 62, 60, 59, 57, 56, 55, 53, 52, 50, 
; 	49, 47, 45, 44, 42, 41, 39, 38, 36, 34, 
; 	33, 31, 29, 28, 26, 24, 23, 21, 19, 17, 
; 	16, 14, 12, 11,  9,  7,  5,  4,  2,  0 
; 	};
; 
; void main(void)
; {
	.dbline 44
; 	Word i;
;  	Init_Devices();
	xcall _Init_Devices
	.dbline 45
; 	Lcd_Reset();
	xcall _Lcd_Reset
	xjmp L94
L93:
	.dbline 47
; 	while(1)
; 	{
	.dbline 48
; 		Get_Key();
	xcall _Get_Key
	.dbline 49
; 		if(key != 0)
	lds R2,_key
	tst R2
	breq L96
X26:
	.dbline 50
; 		{
	.dbline 51
; 			switch(key)
	mov R10,R2
	clr R11
	movw R24,R10
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	breq L101
X27:
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	breq L102
X28:
	xjmp L99
L101:
	.dbline 53
; 			{
; 				case 1: flag_area = 1;break;//开始测量
	ldi R24,1
	sts _flag_area,R24
	.dbline 53
	xjmp L99
L102:
	.dbline 54
; 				case 2: flag_area = 2;break;
	ldi R24,2
	sts _flag_area,R24
	.dbline 54
	.dbline 55
; 				default:break;
L99:
	.dbline 57
; 			}
; 			key_dis = key;
	lds R2,_key
	sts _key_dis,R2
	.dbline 58
; 			key = 0;
	clr R2
	sts _key,R2
	.dbline 59
; 		}
L96:
	.dbline 60
; 		if(flag_area == 0)
	lds R2,_flag_area
	tst R2
	brne L103
X29:
	.dbline 61
; 		{
	.dbline 62
; 			Hzk_Dis_Data(1,1,latitude,9);
	ldi R24,9
	std y+4,R24
	lds R4,_latitude+2
	lds R5,_latitude+2+1
	lds R2,_latitude
	lds R3,_latitude+1
	std y+0,R2
	std y+1,R3
	std y+2,R4
	std y+3,R5
	ldi R18,1
	ldi R16,1
	xcall _Hzk_Dis_Data
	.dbline 63
; 			Hzk_Dis_Data(2,1,longitude,9);
	ldi R24,9
	std y+4,R24
	lds R4,_longitude+2
	lds R5,_longitude+2+1
	lds R2,_longitude
	lds R3,_longitude+1
	std y+0,R2
	std y+1,R3
	std y+2,R4
	std y+3,R5
	ldi R18,1
	ldi R16,2
	xcall _Hzk_Dis_Data
	.dbline 64
; 		}
L103:
	.dbline 65
; 		if(flag_area == 1)
	lds R24,_flag_area
	cpi R24,1
	breq X41
	xjmp L105
X41:
X30:
	.dbline 66
; 		{
	.dbline 67
; 			x0_longitude = longitude;//保存0点的坐标
	lds R4,_longitude+2
	lds R5,_longitude+2+1
	lds R2,_longitude
	lds R3,_longitude+1
	sts _x0_longitude+1,R3
	sts _x0_longitude,R2
	sts _x0_longitude+2+1,R5
	sts _x0_longitude+2,R4
	.dbline 68
; 			y0_latitude = latitude;
	lds R4,_latitude+2
	lds R5,_latitude+2+1
	lds R2,_latitude
	lds R3,_latitude+1
	sts _y0_latitude+1,R3
	sts _y0_latitude,R2
	sts _y0_latitude+2+1,R5
	sts _y0_latitude+2,R4
	.dbline 69
; 			x1_post = 0;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	sts _x1_post+1,R21
	sts _x1_post,R20
	sts _x1_post+2+1,R23
	sts _x1_post+2,R22
	.dbline 70
; 			y1_post = 0;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	sts _y1_post+1,R21
	sts _y1_post,R20
	sts _y1_post+2+1,R23
	sts _y1_post+2,R22
	.dbline 71
; 			area = 0;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	sts _area+1,R21
	sts _area,R20
	sts _area+2+1,R23
	sts _area+2,R22
	.dbline 72
; 			flag_area = 3;//测量开始
	ldi R24,3
	sts _flag_area,R24
	.dbline 73
; 		}
L105:
	.dbline 74
; 		if(flag_area == 3)
	lds R24,_flag_area
	cpi R24,3
	breq X42
	xjmp L107
X42:
X31:
	.dbline 75
; 		{
	.dbline 77
; 			//计算本次的相对坐标
; 			xishu = PI2RDIV360*COS_TAB[latitude/1000000-1]/100000;
	ldi R20,64
	ldi R21,66
	ldi R22,15
	ldi R23,0
	lds R18,_latitude+2
	lds R19,_latitude+2+1
	lds R16,_latitude
	lds R17,_latitude+1
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	xcall div32u
	movw R2,R16
	movw R4,R18
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	sub R2,R20
	sbc R3,R21
	sbc R4,R22
	sbc R5,R23
	movw R30,R2
	ldi R24,<_COS_TAB
	ldi R25,>_COS_TAB
	add R30,R24
	adc R31,R25
	lpm R2,Z
	clr R3
	clr R4
	clr R5
	ldi R20,91
	ldi R21,178
	ldi R22,1
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32s
	ldi R20,160
	ldi R21,134
	ldi R22,1
	ldi R23,0
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	xcall div32s
	sts _xishu+1,R17
	sts _xishu,R16
	sts _xishu+2+1,R19
	sts _xishu+2,R18
	.dbline 78
; 			x2_post = (longitude - x0_longitude)*xishu;
	lds R4,_x0_longitude+2
	lds R5,_x0_longitude+2+1
	lds R2,_x0_longitude
	lds R3,_x0_longitude+1
	lds R18,_longitude+2
	lds R19,_longitude+2+1
	lds R16,_longitude
	lds R17,_longitude+1
	sub R16,R2
	sbc R17,R3
	sbc R18,R4
	sbc R19,R5
	lds R4,_xishu+2
	lds R5,_xishu+2+1
	lds R2,_xishu
	lds R3,_xishu+1
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall empy32u
	sts _x2_post+1,R17
	sts _x2_post,R16
	sts _x2_post+2+1,R19
	sts _x2_post+2,R18
	.dbline 79
; 			y2_post = (latitude - y0_latitude)*111;
	lds R4,_y0_latitude+2
	lds R5,_y0_latitude+2+1
	lds R2,_y0_latitude
	lds R3,_y0_latitude+1
	lds R8,_latitude+2

⌨️ 快捷键说明

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