📄 main.s
字号:
.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 + -