📄 main.s
字号:
.module main.c
.area text(rom, con, rel)
.dbfile D:\SOURCE~1\gps20080503\main.c
.area data(ram, con, rel)
.dbfile D:\SOURCE~1\gps20080503\main.c
_sink0_num::
.blkb 1
.area idata
.byte 100
.area data(ram, con, rel)
.dbfile D:\SOURCE~1\gps20080503\main.c
.dbfile D:\SOURCE~1\gps20080503\define.h
.dbsym e sink0_num _sink0_num c
.area text(rom, con, rel)
.dbfile D:\SOURCE~1\gps20080503\define.h
.dbfile D:\SOURCE~1\gps20080503\initrialm16.h
.dbfunc e Init_Devices _Init_Devices fV
.even
_Init_Devices::
.dbline -1
.dbline 36
; //ICC-AVR application builder : 2007-6-27 10:26:06
; // Target : M8
; // Crystal: 8.0000Mhz
;
; /**************初始化m8函数***************/
; #ifndef Initrial_M16_H
; #define Initrial_M16_H
;
; /**************************************************************
; **函数名称 :void init_devices(void)
; **函数功能 :初始化设备
; **输入参数 :无
; **返回值 :无
; **外定义变量:无
; **调用的函数:无
; **************************************************************/
; void Init_Devices(void);
;
; /**************************************************************
; **函数名称 :void port_init(void)
; **函数功能 :初始化端口
; **输入参数 :无
; **返回值 :无
; **外定义变量:无
; **调用的函数: Port_init();
; **************************************************************/
; void Port_Init(void);
; void Init_Devices(void);
; void uart0_init(void);
; void uart0_rx_isr(void);
; extern void Get_GPRMC_data(void);//提取GPRMC数据
;
;
; //call this routine to initialize all peripherals
; void Init_Devices(void)
; {
.dbline 38
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 39
; Port_Init();
xcall _Port_Init
.dbline 40
; uart0_init();
xcall _uart0_init
.dbline 41
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 42
; GICR = 0x00;
out 0x3b,R2
.dbline 43
; TIMSK = 0x00; //timer interrupt sources
out 0x39,R2
.dbline 44
; SEI(); //re-enable interrupts
sei
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Port_Init _Port_Init fV
.even
_Port_Init::
.dbline -1
.dbline 49
; //all peripherals are now initialized
; }
;
; void Port_Init(void)
; {
.dbline 50
; PORTB = 0xFF;
ldi R24,255
out 0x18,R24
.dbline 51
; DDRB = 0xFF;
out 0x17,R24
.dbline 52
; PORTC = 0x7F; //m103 output only
ldi R24,127
out 0x15,R24
.dbline 53
; DDRC = 0x7F;
out 0x14,R24
.dbline 54
; PORTD = 0xFF;
ldi R24,255
out 0x12,R24
.dbline 55
; DDRD = 0xFF;
out 0x11,R24
.dbline 57
;
; DDRD &=~ BIT(PD0);
cbi 0x11,0
.dbline 58
; PORTD &= ~ BIT(PD0);
cbi 0x12,0
.dbline 60
;
; DDRA &=~ BIT(PA1);//按键
cbi 0x1a,1
.dbline 61
; DDRA &=~ BIT(PA3);
cbi 0x1a,3
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e uart0_init _uart0_init fV
.even
_uart0_init::
.dbline -1
.dbline 73
; //PORTA &= ~ BIT(PA5);
; //PORTA &= ~ BIT(PA7);
;
;
;
; }
;
; //UART0 initialize
; // desired baud rate: 9600
; // actual: baud rate:9615 (0.2%)
; void uart0_init(void)
; {
.dbline 74
; UCSRB = 0x00; //disable while setting baud rate
clr R2
out 0xa,R2
.dbline 75
; UCSRA = 0x00;
out 0xb,R2
.dbline 76
; UCSRC = BIT(URSEL) | 0x06;
ldi R24,134
out 0x20,R24
.dbline 77
; UBRRL = 0x33; //set baud rate lo
ldi R24,51
out 0x9,R24
.dbline 78
; UBRRH = 0x00; //set baud rate hi
out 0x20,R2
.dbline 79
; UCSRB = 0x98;
ldi R24,152
out 0xa,R24
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 44
jmp _uart0_rx_isr
.area text(rom, con, rel)
.dbfile D:\SOURCE~1\gps20080503\initrialm16.h
.dbfunc e uart0_rx_isr _uart0_rx_isr fV
; data -> R20
.even
_uart0_rx_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R6
st -y,R7
st -y,R8
st -y,R9
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R26
st -y,R27
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
st -y,R20
.dbline -1
.dbline 84
; }
;
; #pragma interrupt_handler uart0_rx_isr:12
; void uart0_rx_isr(void)
; {
.dbline 86
; char data;
; data = UDR;
in R20,0xc
.dbline 87
; if(data == '$')//开始字符
cpi R20,36
brne L5
X0:
.dbline 88
; {
.dbline 89
; usart_flag |= BIT(SINK0_START);
lds R24,_usart_flag
ori R24,1
sts _usart_flag,R24
.dbline 90
; sink0_count = 0;
clr R2
sts _sink0_count,R2
.dbline 91
; }
L5:
.dbline 92
; if(usart_flag & BIT(SINK0_START))
lds R2,_usart_flag
sbrs R2,0
rjmp L7
X1:
.dbline 93
; {
.dbline 94
; sink0_buf[sink0_count] = data;
ldi R24,<_sink0_buf
ldi R25,>_sink0_buf
lds R30,_sink0_count
clr R31
add R30,R24
adc R31,R25
std z+0,R20
.dbline 95
; sink0_count ++;
lds R24,_sink0_count
subi R24,255 ; addi 1
sts _sink0_count,R24
.dbline 96
; }
L7:
.dbline 97
; if(data == 0x0a)//换行结束字符
cpi R20,10
brne L9
X2:
.dbline 98
; {
.dbline 99
; usart_flag &=~ BIT(SINK0_START);
lds R24,_usart_flag
andi R24,254
sts _usart_flag,R24
.dbline 100
; usart_flag |= BIT(SINK0_FINISH);
ori R24,2
sts _usart_flag,R24
.dbline 102
;
; }
L9:
.dbline 103
; if(usart_flag & BIT(SINK0_FINISH))
lds R2,_usart_flag
sbrs R2,1
rjmp L11
X3:
.dbline 104
; {
.dbline 105
; Get_GPRMC_data();
xcall _Get_GPRMC_data
.dbline 106
; usart_flag &=~ BIT(SINK0_FINISH);
lds R24,_usart_flag
andi R24,253
sts _usart_flag,R24
.dbline 107
; }
L11:
.dbline -2
L4:
.dbline 0 ; func end
ld R20,y+
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R27,y+
ld R26,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R9,y+
ld R8,y+
ld R7,y+
ld R6,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
reti
.dbsym r data 20 c
.dbend
.dbfile D:\SOURCE~1\gps20080503\delay.h
.dbfunc e Delay_1us _Delay_1us fV
.even
_Delay_1us::
.dbline -1
.dbline 53
; #ifndef _DELAY_H
; #define _DELAY_H
;
; // mcu:avr crystal=8MHz
;
; /**************************************************************
; **函数功能:延时1us
; **输入参数:无
; **返回值:无
; **在本函数外定义变量:无
; **调用的函数:NOP()
; **************************************************************/
; void Delay_1us(void);
;
; /**************************************************************
; **函数功能:us级延时
; **输入参数:xus:延时us数
; **返回值:无
; **在本函数外定义变量:无
; **调用的函数:Delay_1us()
; **************************************************************/
; void Delay_Us(unsigned char xus);
;
; /**************************************************************
; **函数功能:延时1ms
; **输入参数:无
; **返回值:无
; **在本函数外定义变量:无
; **调用的函数:NOP()
; **************************************************************/
; void Delay_1ms(void);
;
; /**************************************************************
; **函数功能:ms级延时
; **输入参数:xms:延时ms数
; **返回值:无
; **在本函数外定义变量:无
; **调用的函数:Delay_1ms()
; **************************************************************/
; void Delay_Ms(unsigned int xms);
;
; /**************************************************************
; **函数功能:10us级延时
; **输入参数:x10us:延时x10us数
; **返回值:无
; **在本函数外定义变量:无
; **调用的函数:无
; **************************************************************/
; void Delay10us(Word x10us);
;
;
; void Delay_1us()
; {
.dbline 54
; NOP();
nop
.dbline -2
L13:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Delay_Us _Delay_Us fV
; i -> R10
; xus -> R12
.even
_Delay_Us::
st -y,R10
st -y,R12
mov R12,R16
.dbline -1
.dbline 58
; }
;
; void Delay_Us(unsigned char xus)
; {
.dbline 60
; unsigned char i;
; for(i=0;i<xus;i++)
clr R10
xjmp L18
L15:
.dbline 61
; Delay_1us();
xcall _Delay_1us
L16:
.dbline 60
inc R10
L18:
.dbline 60
cp R10,R12
brlo L15
X4:
.dbline -2
L14:
.dbline 0 ; func end
ld R12,y+
ld R10,y+
ret
.dbsym r i 10 c
.dbsym r xus 12 c
.dbend
.dbfunc e Delay_1ms _Delay_1ms fV
; i -> R16,R17
.even
_Delay_1ms::
.dbline -1
.dbline 65
; }
;
; void Delay_1ms(void)
; {
.dbline 67
; unsigned int i;
; for(i=0;i<1142;i++)
clr R16
clr R17
xjmp L23
L20:
.dbline 68
; ;
L21:
.dbline 67
subi R16,255 ; offset = 1
sbci R17,255
L23:
.dbline 67
cpi R16,118
ldi R30,4
cpc R17,R30
brlo L20
X5:
.dbline -2
L19:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e Delay_Ms _Delay_Ms fV
; i -> R20,R21
; j -> R22,R23
; xms -> R16,R17
.even
_Delay_Ms::
xcall push_xgsetF000
.dbline -1
.dbline 72
; }
;
; void Delay_Ms(Word xms) //crystal=8MHz
; {
.dbline 74
; Word i,j; //variable:declare Word
; for(i=0; i<xms; i++)
clr R20
clr R21
xjmp L28
L25:
.dbline 75
; for(j=0; j<498;j++)
clr R22
clr R23
xjmp L32
L29:
.dbline 76
; {
.dbline 77
; NOP();
nop
.dbline 78
; NOP();
nop
.dbline 79
; NOP();
nop
.dbline 80
; NOP();
nop
.dbline 81
; NOP();
nop
.dbline 82
; NOP();
nop
.dbline 83
; NOP();
nop
.dbline 84
; NOP();
nop
.dbline 85
; NOP();
nop
.dbline 86
; }
L30:
.dbline 75
subi R22,255 ; offset = 1
sbci R23,255
L32:
.dbline 75
cpi R22,242
ldi R30,1
cpc R23,R30
brlo L29
X6:
L26:
.dbline 74
subi R20,255 ; offset = 1
sbci R21,255
L28:
.dbline 74
cp R20,R16
cpc R21,R17
brlo L25
X7:
.dbline -2
L24:
.dbline 0 ; func end
xjmp pop_xgsetF000
.dbsym r i 20 i
.dbsym r j 22 i
.dbsym r xms 16 i
.dbend
.dbfunc e Delay10us _Delay10us fV
; i -> R20,R21
; j -> R22
; x10us -> R16,R17
.even
_Delay10us::
xcall push_xgsetF000
.dbline -1
.dbline 90
; }
;
; void Delay10us(Word x10us)//crystal=8MHz
; {
.dbline 92
; Word i;Byte j; //variable:declare Word
; for(i=0; i<x10us; i++)
clr R20
clr R21
xjmp L37
L34:
.dbline 93
; {
.dbline 94
; for(j=0;j<2;j++)
clr R22
xjmp L41
L38:
.dbline 95
; {
.dbline 96
; NOP();
nop
.dbline 97
; NOP();
nop
.dbline 98
; NOP();
nop
.dbline 99
; }
L39:
.dbline 94
inc R22
L41:
.dbline 94
cpi R22,2
brlo L38
X8:
.dbline 100
; }
L35:
.dbline 92
subi R20,255 ; offset = 1
sbci R21,255
L37:
.dbline 92
cp R20,R16
cpc R21,R17
brlo L34
X9:
.dbline -2
L33:
.dbline 0 ; func end
xjmp pop_xgsetF000
.dbsym r i 20 i
.dbsym r j 22 c
.dbsym r x10us 16 i
.dbend
.dbfile D:\SOURCE~1\gps20080503\smg12232zk.h
.dbfunc e Hzk_Dis_Words _Hzk_Dis_Words fV
; ram_address -> R10
; i -> R20
; lcd_pointer -> R22,R23
; xpos -> R12
; ypos -> R14
.even
_Hzk_Dis_Words::
xcall push_xgsetF0FC
mov R12,R18
mov R14,R16
ldd R22,y+10
ldd R23,y+11
.dbline -1
.dbline 45
;
; /****************** 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
; *******************************************************************/
; #ifndef __SMG12232ZK_H
; #define __SMG12232ZK_H
;
; #define LCD_PORT1 PORTB
; #define LCD_SCLK PB4
; #define LCD_STD PB3
;
; #define LCD_PORT2 PORTC
; #define LCD_CS PC3
;
; #define LCD_CS_H LCD_PORT2 |= BIT(LCD_CS)
; #define LCD_CS_L LCD_PORT2 &=~ BIT(LCD_CS)
; #define LCD_STD_H LCD_PORT1 |= BIT(LCD_STD)
; #define LCD_STD_L LCD_PORT1 &=~ BIT(LCD_STD)
; #define LCD_SCLK_H LCD_PORT1 |= BIT(LCD_SCLK)
; #define LCD_SCLK_L LCD_PORT1 &=~ BIT(LCD_SCLK)
;
;
;
; void Send_8bit(Word x);//串行发送8位数据
; void Lcd_Write(Byte start,Byte data);//模块写入子程序
; void Lcd_Reset(void);//模块复位子程序
; void Hzk_Dis_Words(Byte ypos,Byte xpos,char *lcd_pointer);//xpos为列数,ypos为行数,num字符串长度
; void Hzk_Dis_Data(Byte ypos,Byte xpos,Long data,Byte num);//xpos为列数,ypos为行数,num字符串长度
; void Hzk_Dis_Char(Byte ypos,Byte xpos,char *lcd_pointer,Byte num);//xpos为列数,ypos为行数,num字符串长度
; void Hzk_Dis_Clr(void);//汉字显示清屏
;
; Long lcd_data1;
; Long lcd_data2;
;
; /****************发送汉字子程序******************
; ** xpos为列数,ypos为行数
; **lcd_pointer为字符串首地址
; *********************************************************/
; void Hzk_Dis_Words(Byte ypos,Byte xpos,char *lcd_pointer)//xpos为列数,ypos为行数,num字符串长度
; {
.dbline 46
; Byte i=0,ram_address;//ram_address:首地址
clr R20
xjmp L44
L43:
.dbline 49
; //首先判断字符串得长度
; while(*(lcd_pointer+i) != '\0')//字符串长度
; {
.dbline 50
; i++;
inc R20
.dbline 51
; }//i=字符串长度
L44:
.dbline 48
mov R30,R20
clr R31
add R30,R22
adc R31,R23
ldd R2,z+0
tst R2
brne L43
X10:
.dbline 52
; if(i>15)
ldi R24,15
cp R24,R20
brsh L46
X11:
.dbline 53
; {
.dbline 54
; i=15;
ldi R20,15
.dbline 55
; }
L46:
.dbline 56
; if(ypos==1)
mov R24,R14
cpi R24,1
brne L48
X12:
.dbline 57
; {
.dbline 58
; ram_address = 0x80+xpos-1;
mov R24,R12
subi R24,128 ; addi 128
subi R24,1
mov R10,R24
.dbline 59
; }
xjmp L49
L48:
.dbline 60
; else if(ypos==2)
mov R24,R14
cpi R24,2
brne L50
X13:
.dbline 61
; {
.dbline 62
; ram_address = 0x90+xpos-1;
mov R24,R12
subi R24,112 ; addi 144
subi R24,1
mov R10,R24
.dbline 63
; }
L50:
L49:
.dbline 64
; Lcd_Write(0xf8,ram_address);
mov R18,R10
ldi R16,248
xcall _Lcd_Write
.dbline 65
; for(;i>0;i--)
xjmp L55
L52:
.dbline 66
; {
.dbline 67
; Lcd_Write(0xfa,*lcd_pointer);
movw R30,R22
ldd R18,z+0
ldi R16,250
xcall _Lcd_Write
.dbline 68
; lcd_pointer++;
subi R22,255 ; offset = 1
sbci R23,255
.dbline 69
; }
L53:
.dbline 65
dec R20
L55:
.dbline 65
ldi R24,0
cp R24,R20
brlo L52
X14:
.dbline -2
L42:
.dbline 0 ; func end
xjmp pop_xgsetF0FC
.dbsym r ram_address 10 c
.dbsym r i 20 c
.dbsym r lcd_pointer 22 pc
.dbsym r xpos 12 c
.dbsym r ypos 14 c
.dbend
.dbfunc e Hzk_Dis_Char _Hzk_Dis_Char fV
; ram_address -> R22
; i -> R10
; num -> y+12
; lcd_pointer -> R20,R21
; xpos -> R12
; ypos -> R14
.even
_Hzk_Dis_Char::
xcall push_xgsetF0FC
mov R12,R18
mov R14,R16
ldd R20,y+10
ldd R21,y+11
.dbline -1
.dbline 74
;
; }
;
; void Hzk_Dis_Char(Byte ypos,Byte xpos,char *lcd_pointer,Byte num)//xpos为列数,ypos为行数,num字符串长度
; {
.dbline 75
; Byte i=0,ram_address;//ram_address:首地址
clr R10
.dbline 76
; if(ypos==1)
mov R24,R14
cpi R24,1
brne L57
X15:
.dbline 77
; {
.dbline 78
; ram_address = 0x80+xpos-1;
mov R22,R12
subi R22,128 ; addi 128
subi R22,1
.dbline 79
; }
xjmp L58
L57:
.dbline 80
; else if(ypos==2)
mov R24,R14
cpi R24,2
brne L59
X16:
.dbline 81
; {
.dbline 82
; ram_address = 0x90+xpos-1;
mov R22,R12
subi R22,112 ; addi 144
subi R22,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -