📄 smart.lst
字号:
__start:
__text_start:
0047 E5CF LDI R28,0x5F
0048 E0D4 LDI R29,4
0049 BFCD OUT 0x3D,R28
004A BFDE OUT 0x3E,R29
004B 51C0 SUBI R28,0x10
004C 40D0 SBCI R29,0
004D EA0A LDI R16,0xAA
004E 8308 STD Y+0,R16
004F 2400 CLR R0
0050 E7E6 LDI R30,0x76
0051 E0F0 LDI R31,0
0052 E010 LDI R17,0
0053 39E7 CPI R30,0x97
0054 07F1 CPC R31,R17
0055 F011 BEQ 0x0058
0056 9201 ST R0,Z+
0057 CFFB RJMP 0x0053
0058 8300 STD Z+0,R16
0059 E7E7 LDI R30,0x77
005A E0F0 LDI R31,0
005B E6A0 LDI R26,0x60
005C E0B0 LDI R27,0
005D E010 LDI R17,0
005E 38ED CPI R30,0x8D
005F 07F1 CPC R31,R17
0060 F021 BEQ 0x0065
0061 95C8 LPM
0062 9631 ADIW R30,1
0063 920D ST R0,X+
0064 CFF9 RJMP 0x005E
0065 940E0231 CALL _main
_exit:
0067 CFFF RJMP _exit
FILE: C:\DOCUME~1\haolxy\桌面\smartcar\smartcar\main.c
(0001) //ICC-AVR application builder : 2009-2-18 11:55:58
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) #define mclk 8000000
(0008)
(0009)
(0010)
(0011)
(0012)
(0013) //=============================================================
(0014) // 函数名: void port_init(void)
(0015) // 功能: 端口初始化,所有端口都变为高阻态
(0016) // 参数: none
(0017) // 返回值: none
(0018) // 使用方法:port_init();
(0019) //=============================================================
(0020) void port_init(void)
(0021) {
(0022) DDRA = 0x00;
_port_init:
0068 2422 CLR R2
0069 BA2A OUT 0x1A,R2
(0023) PORTA = 0x00;
006A BA2B OUT 0x1B,R2
(0024) DDRB = 0x00;
006B BA27 OUT 0x17,R2
(0025) PORTB = 0x00;
006C BA28 OUT 0x18,R2
(0026) DDRC = 0x00;
006D BA24 OUT 0x14,R2
(0027) PORTC = 0x00;
006E BA25 OUT 0x15,R2
(0028) DDRD = 0x00;
006F BA21 OUT 0x11,R2
(0029) PORTD = 0x00;
0070 BA22 OUT 0x12,R2
0071 9508 RET
(0030) }
(0031)
(0032)
(0033) //////////////////////////////////////////////////////////////////////////////////////////////////////
(0034)
(0035)
(0036) //=============================================================
(0037) // 函数名: void motor_a(unsigned char fx,int speed)
(0038) // 功能: 控制电机A的旋转方向以及转速
(0039) // 参数: unsigned char fx,int speed fx为0或者1,speed为0-1023
(0040) // 返回值: none
(0041) // 使用方法:motor_a(0,1000);
(0042) //=============================================================
(0043) void motor_a(unsigned char fx,int speed)
(0044) {
(0045) if(fx)
_motor_a:
speed --> R18
fx --> R16
0072 2300 TST R16
0073 F019 BEQ 0x0077
(0046) {
(0047) PORTB |= BIT(2);
0074 9AC2 SBI 0x18,2
(0048) PORTB &= ~BIT(0);
0075 98C0 CBI 0x18,0
(0049) }
0076 C002 RJMP 0x0079
(0050) else
(0051) {
(0052) PORTB |= BIT(0);
0077 9AC0 SBI 0x18,0
(0053) PORTB &= ~BIT(2);
0078 98C2 CBI 0x18,2
(0054) }
(0055) OCR1A = speed;
0079 BD3B OUT 0x2B,R19
007A BD2A OUT 0x2A,R18
007B 9508 RET
(0056) }
(0057)
(0058) //=============================================================
(0059) // 函数名: void motor_b(unsigned char fx,int speed)
(0060) // 功能: 控制电机A的旋转方向以及转速
(0061) // 参数: unsigned char fx,int speed fx为0或者1,speed为0-1023
(0062) // 返回值: none
(0063) // 使用方法:motor_b(0,1000);
(0064) //=============================================================
(0065) void motor_b(unsigned char fx,int speed)
(0066) {
(0067) if(fx)
_motor_b:
speed --> R18
fx --> R16
007C 2300 TST R16
007D F019 BEQ 0x0081
(0068) {
(0069) PORTB |= BIT(4);
007E 9AC4 SBI 0x18,4
(0070) PORTB &= ~BIT(1);
007F 98C1 CBI 0x18,1
(0071) }
0080 C002 RJMP 0x0083
(0072) else
(0073) {
(0074) PORTB |= BIT(1);
0081 9AC1 SBI 0x18,1
(0075) PORTB &= ~BIT(4);
0082 98C4 CBI 0x18,4
(0076) }
(0077) OCR1B = speed;
0083 BD39 OUT 0x29,R19
0084 BD28 OUT 0x28,R18
0085 9508 RET
(0078) }
(0079) //=============================================================
(0080) // 函数名: void motor_init(void)
(0081) // 功能: 电机控制初始化
(0082) // 参数: none
(0083) // 返回值: none
(0084) // 使用方法:motor_init();
(0085) //=============================================================
(0086) void motor_init(void)
(0087) {
(0088) DDRB |= 0x17;
_motor_init:
0086 B387 IN R24,0x17
0087 6187 ORI R24,0x17
0088 BB87 OUT 0x17,R24
(0089) PORTB &= ~0x03;
0089 B388 IN R24,0x18
008A 7F8C ANDI R24,0xFC
008B BB88 OUT 0x18,R24
(0090) PORTB |= 0x14;
008C B388 IN R24,0x18
008D 6184 ORI R24,0x14
008E BB88 OUT 0x18,R24
(0091) DDRD |= 0x30;
008F B381 IN R24,0x11
0090 6380 ORI R24,0x30
0091 BB81 OUT 0x11,R24
(0092) PORTD |= 0x30;
0092 B382 IN R24,0x12
0093 6380 ORI R24,0x30
0094 BB82 OUT 0x12,R24
(0093) TCCR1A = 0xA3;
0095 EA83 LDI R24,0xA3
0096 BD8F OUT 0x2F,R24
(0094) TCCR1B = 0x0A;
0097 E08A LDI R24,0xA
0098 BD8E OUT 0x2E,R24
(0095) OCR1A = 0;
0099 2422 CLR R2
009A 2433 CLR R3
009B BC3B OUT 0x2B,R3
009C BC2A OUT 0x2A,R2
(0096) OCR1B = 0;
009D BC39 OUT 0x29,R3
009E BC28 OUT 0x28,R2
009F 9508 RET
_uart_init:
baud --> R10
00A0 940E03F8 CALL push_gset3
00A2 0158 MOVW R10,R16
(0097) }
(0098)
(0099)
(0100) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(0101)
(0102)
(0103) //=============================================================
(0104) // 函数名:void uart_init(unsigned int baud)
(0105) // 功能: 异步串行通信初始化
(0106) // 参数: unsigned int baud 设置通信波特率
(0107) // 返回值: none
(0108) // 使用方法:uart_init(19200);
(0109) //=============================================================
(0110) void uart_init(unsigned int baud)
(0111) {
(0112) UCSRB=0x00;
00A3 2422 CLR R2
00A4 B82A OUT 0x0A,R2
(0113) UCSRA=0x00; //控制寄存器清零
00A5 B82B OUT 0x0B,R2
(0114) UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0); //选择UCSRC,异步模式,禁止校验,1位停止位,8位数据位
00A6 E886 LDI R24,0x86
00A7 BD80 OUT 0x20,R24
(0115) baud=mclk/16/baud-1 ; //波特率最大为65K
00A8 0115 MOVW R2,R10
00A9 2444 CLR R4
00AA 2455 CLR R5
00AB E240 LDI R20,0x20
00AC EA51 LDI R21,0xA1
00AD E067 LDI R22,7
00AE E070 LDI R23,0
00AF 925A ST R5,-Y
00B0 924A ST R4,-Y
00B1 923A ST R3,-Y
00B2 922A ST R2,-Y
00B3 018A MOVW R16,R20
00B4 019B MOVW R18,R22
00B5 940E0373 CALL div32s
00B7 E041 LDI R20,1
00B8 E050 LDI R21,0
00B9 E060 LDI R22,0
00BA E070 LDI R23,0
00BB 0118 MOVW R2,R16
00BC 0129 MOVW R4,R18
00BD 1A24 SUB R2,R20
00BE 0A35 SBC R3,R21
00BF 0A46 SBC R4,R22
00C0 0A57 SBC R5,R23
00C1 0151 MOVW R10,R2
(0116) UBRRL=baud;
00C2 B829 OUT 0x09,R2
(0117) UBRRH=baud>>8; //设置波特率
00C3 2C23 MOV R2,R3
00C4 2433 CLR R3
00C5 BC20 OUT 0x20,R2
(0118) UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE); //接收、发送使能,接收中断使能
00C6 E988 LDI R24,0x98
00C7 B98A OUT 0x0A,R24
(0119) DDRD|=0X02; //配置TX为输出(很重要)
00C8 9A89 SBI 0x11,1
00C9 940E03F1 CALL pop_gset3
00CB 9508 RET
(0120) }
(0121) //=============================================================
(0122) // 函数名:void uart_sendB(unsigned char data)
(0123) // 功能: 串口发送一个字节
(0124) // 参数: unsigned char data 写入要发送的数据
(0125) // 返回值: none
(0126) // 使用方法:uart_sendB('a');
(0127) //=============================================================
(0128) void uart_sendB(unsigned char data)
(0129) {
(0130) while(!(UCSRA&(BIT(UDRE)))) ;
_uart_sendB:
data --> R16
00CC 9B5D SBIS 0x0B,5
00CD CFFE RJMP _uart_sendB
(0131) UDR=data;
00CE B90C OUT 0x0C,R16
(0132) while(!(UCSRA&(BIT(TXC))));
00CF 9B5E SBIS 0x0B,6
00D0 CFFE RJMP 0x00CF
(0133) UCSRA|=BIT(TXC);
00D1 9A5E SBI 0x0B,6
00D2 9508 RET
_uart_send:
d --> Y+0
data --> R20
00D3 940E03FC CALL push_gset1
00D5 01A8 MOVW R20,R16
00D6 9724 SBIW R28,4
(0134) }
(0135) //=============================================================
(0136) // 函数名:void uart_send(int data)
(0137) // 功能: 串口发送一个4位10进制数
(0138) // 参数: int data 写入要发送的数据
(0139) // 返回值: none
(0140) // 使用方法:uart_sendB(1234);
(0141) //=============================================================
(0142) void uart_send(int data)
(0143) {
(0144) unsigned char d[4];
(0145) d[3]=data/1000;
00D7 EE28 LDI R18,0xE8
00D8 E033 LDI R19,3
00D9 018A MOVW R16,R20
00DA 940E0337 CALL div16s
00DC 830B STD Y+3,R16
(0146) data=data%1000;
00DD EE28 LDI R18,0xE8
00DE E033 LDI R19,3
00DF 018A MOVW R16,R20
00E0 940E0333 CALL mod16s
00E2 01A8 MOVW R20,R16
(0147) d[2]=data/100;
00E3 E624 LDI R18,0x64
00E4 E030 LDI R19,0
00E5 940E0337 CALL div16s
00E7 830A STD Y+2,R16
(0148) data=data%100;
00E8 E624 LDI R18,0x64
00E9 E030 LDI R19,0
00EA 018A MOVW R16,R20
00EB 940E0333 CALL mod16s
00ED 01A8 MOVW R20,R16
(0149) d[1]=data/10;
00EE E02A LDI R18,0xA
00EF E030 LDI R19,0
00F0 940E0337 CALL div16s
00F2 8309 STD Y+1,R16
(0150) d[0]=data%10;
00F3 E02A LDI R18,0xA
00F4 E030 LDI R19,0
00F5 018A MOVW R16,R20
00F6 940E0333 CALL mod16s
00F8 8308 STD Y+0,R16
(0151) uart_sendB(d[3]+'0');
00F9 810B LDD R16,Y+3
00FA 5D00 SUBI R16,0xD0
00FB DFD0 RCALL _uart_sendB
(0152) uart_sendB(d[2]+'0');
00FC 810A LDD R16,Y+2
00FD 5D00 SUBI R16,0xD0
00FE DFCD RCALL _uart_sendB
(0153) uart_sendB(d[1]+'0');
00FF 8109 LDD R16,Y+1
0100 5D00 SUBI R16,0xD0
0101 DFCA RCALL _uart_sendB
(0154) uart_sendB(d[0]+'0');
0102 8108 LDD R16,Y+0
0103 5D00 SUBI R16,0xD0
0104 DFC7 RCALL _uart_sendB
(0155) uart_sendB(';');
0105 E30B LDI R16,0x3B
0106 DFC5 RCALL _uart_sendB
0107 9624 ADIW R28,4
0108 940E03FF CALL pop_gset1
010A 9508 RET
_uart_senddata:
ptr --> R20
data --> R22
010B 940E03FA CALL push_gset2
010D 01B8 MOVW R22,R16
(0156) }
(0157) //=============================================================
(0158) // 函数名:void uart_senddata(unsigned char *data)
(0159) // 功能: 通过串口发送字符串
(0160) // 参数: unsigned char *data 指针指向要发送的字符串
(0161) // 返回值: none
(0162) // 使用方法:uart_senddata(abc);
(0163) //=============================================================
(0164) void uart_senddata(unsigned char *data)
(0165) {
(0166) unsigned char *ptr;
(0167) ptr = data;
010E 01AB MOVW R20,R22
010F C005 RJMP 0x0115
(0168) while(*ptr)
(0169) {
(0170) uart_sendB(*ptr);
0110 01FA MOVW R30,R20
0111 8100 LDD R16,Z+0
0112 DFB9 RCALL _uart_sendB
(0171) ptr++;
0113 5F4F SUBI R20,0xFF
0114 4F5F SBCI R21,0xFF
0115 01FA MOVW R30,R20
0116 8020 LDD R2,Z+0
0117 2022 TST R2
0118 F7B9 BNE 0x0110
0119 940E03EE CALL pop_gset2
011B 9508 RET
(0172) }
(0173) }
(0174)
(0175)
(0176) /////////////////////////////////////////////////////////////////////////////////////////////////////////
(0177)
(0178)
(0179) //=============================================================
(0180) // 函数名:void adc_init(void)
(0181) // 功能: Adc0 初始化 内部2.56v比较电压
(0182) // 参数: none
(0183) // 返回值: none
(0184) // 使用方法:adc_init();
(0185) //=============================================================
(0186) void adc_init(void)
(0187) {
(0188) DDRA&=~BIT(PA0);
_adc_init:
011C 98D0 CBI 0x1A,0
(0189) PORTA&=~BIT(PA0);
011D 98D8 CBI 0x1B,0
(0190) ADMUX=0xc0;
011E EC80 LDI R24,0xC0
011F B987 OUT 0x07,R24
(0191) ADCSRA=0X80;
0120 E880 LDI R24,0x80
0121 B986 OUT 0x06,R24
0122 9508 RET
_mega16_ad:
addata --> R20
0123 940E03FC CALL push_gset1
(0192) }
(0193) //=============================================================
(0194) // 函数名:unsigned int mega16_ad(void)
(0195) // 功能: 读取一次ADC0的值
(0196) // 参数: none
(0197) // 返回值: addata
(0198) // 使用方法:add = mega16_ad();
(0199) //=============================================================
(0200) unsigned int mega16_ad(void)
(0201) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -