📄 lineturn.lst
字号:
__text_start:
__start:
0034 E5CF LDI R28,0x5F
0035 E0D4 LDI R29,4
0036 BFCD OUT 0x3D,R28
0037 BFDE OUT 0x3E,R29
0038 51C0 SUBI R28,0x10
0039 40D0 SBCI R29,0
003A EA0A LDI R16,0xAA
003B 8308 STD Y+0,R16
003C 2400 CLR R0
003D E7E3 LDI R30,0x73
003E E0F0 LDI R31,0
003F E010 LDI R17,0
0040 37E3 CPI R30,0x73
0041 07F1 CPC R31,R17
0042 F011 BEQ 0x0045
0043 9201 ST R0,Z+
0044 CFFB RJMP 0x0040
0045 8300 STD Z+0,R16
0046 E5E4 LDI R30,0x54
0047 E0F0 LDI R31,0
0048 E6A0 LDI R26,0x60
0049 E0B0 LDI R27,0
004A E010 LDI R17,0
004B 36E7 CPI R30,0x67
004C 07F1 CPC R31,R17
004D F021 BEQ 0x0052
004E 95C8 LPM
004F 9631 ADIW R30,1
0050 920D ST R0,X+
0051 CFF9 RJMP 0x004B
0052 940E01F1 CALL _main
_exit:
0054 CFFF RJMP _exit
FILE: F:\USING0~1\LINEAN~1\motor.c
(0001) // ICC-AVR application builder : 2007-5-5 21:20:44
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004) // Project: auto car
(0005)
(0006) #include "main.h"
(0007) /************************************function description********************************************/
(0008)
(0009) //后轮驱动,前轮转向
(0010) //驱动轮使能口为PC3,方向由PC0,PC1控制
(0011) //PC0\PC1为0\1时前转,为1\0时后转
(0012) //转向轮使能口为PC6,方向由PC4,PC5控制
(0013) //PC4\PC5为0\1时右转,为1\0时左转
(0014)
(0015) /*****************************************************************************************************/
(0016)
(0017) void forward(void)
(0018) {
(0019) DDRB=0XFF;
_forward:
0055 EF8F LDI R24,0xFF
0056 BB87 OUT 0x17,R24
(0020) PORTB=(0<<PB0)|(1<<PB1)|(1<<PB3)|(0<<PB4)|(0<<PB5)|(0<<PB6);
0057 E08A LDI R24,0xA
0058 BB88 OUT 0x18,R24
0059 9508 RET
(0021) }
(0022)
(0023)
(0024) void backward(void)
(0025) {
(0026) DDRB=0XFF;
_backward:
005A EF8F LDI R24,0xFF
005B BB87 OUT 0x17,R24
(0027) PORTB=(1<<PB0)|(0<<PB1)|(1<<PB3)|(0<<PB4)|(0<<PB5)|(0<<PB6);
005C E089 LDI R24,0x9
005D BB88 OUT 0x18,R24
005E 9508 RET
(0028) }
(0029)
(0030) void for_left(void)
(0031) {
(0032) DDRB=0XFF;
_for_left:
005F EF8F LDI R24,0xFF
0060 BB87 OUT 0x17,R24
(0033) PORTB=(0<<PB0)|(1<<PB1)|(1<<PB3)|(1<<PB4)|(0<<PB5)|(1<<PB6);
0061 E58A LDI R24,0x5A
0062 BB88 OUT 0x18,R24
0063 9508 RET
(0034) }
(0035)
(0036) void back_left(void)
(0037) {
(0038) DDRB=0XFF;
_back_left:
0064 EF8F LDI R24,0xFF
0065 BB87 OUT 0x17,R24
(0039) PORTB=(1<<PB0)|(0<<PB1)|(1<<PB3)|(1<<PB4)|(0<<PB5)|(1<<PB6);
0066 E589 LDI R24,0x59
0067 BB88 OUT 0x18,R24
0068 9508 RET
(0040) }
(0041)
(0042) void for_right(void)
(0043) {
(0044) DDRB=0XFF;
_for_right:
0069 EF8F LDI R24,0xFF
006A BB87 OUT 0x17,R24
(0045) PORTB=(0<<PB0)|(1<<PB1)|(1<<PB3)|(0<<PB4)|(1<<PB5)|(1<<PB6);
006B E68A LDI R24,0x6A
006C BB88 OUT 0x18,R24
006D 9508 RET
(0046) }
(0047)
(0048) void back_right(void)
(0049) {
(0050) DDRB=0XFF;
_back_right:
006E EF8F LDI R24,0xFF
006F BB87 OUT 0x17,R24
(0051) PORTB=(1<<PB0)|(0<<PB1)|(1<<PB3)|(0<<PB4)|(1<<PB5)|(1<<PB6);
0070 E689 LDI R24,0x69
0071 BB88 OUT 0x18,R24
0072 9508 RET
(0052) }
(0053)
(0054) void car_stop(void)
(0055) {
(0056) DDRB=0XFF;
_car_stop:
0073 EF8F LDI R24,0xFF
0074 BB87 OUT 0x17,R24
(0057) PORTB=(0<<PB0)|(0<<PB1)|(0<<PB3)|(0<<PB4)|(0<<PB5)|(0<<PB6);
0075 2422 CLR R2
0076 BA28 OUT 0x18,R2
0077 9508 RET
_delay:
i --> R20
n --> R16
0078 940E0228 CALL push_gset1
FILE: F:\USING0~1\LINEAN~1\lcd.c
(0001) //编译器:ICC-AVR
(0002) //日期: 2007-4-13 20:29:57
(0003) //目标芯片 : ATmega16
(0004) //时钟: 8.0000Mhz
(0005) //版本:VISION 2.0
(0006) /*
(0007) LCD引脚定义
(0008) 1---GND
(0009) 2---VCC
(0010) 3---VO
(0011) 4---RS
(0012) 5---RW
(0013) 6---EN
(0014) 7到14--D0-D7
(0015) 15--背景灯+
(0016) 16--背景灯-
(0017)
(0018) 下面是AVR与LCD连接信息
(0019) PA1 ->RS
(0020) PA0 ->EN
(0021) GND ->RW
(0022) PA4 ->D4
(0023) PA5 ->D5
(0024) PA6 ->D6
(0025) PA7 ->D7
(0026) */
(0027)
(0028)
(0029) #include "main.h"
(0030)
(0031) #define uchar unsigned char
(0032) #define uint unsigned int
(0033)
(0034) #define LCD_EN_PORT PORTA //数据寄存器,以下2个要设为同一个口
(0035) #define LCD_EN_DDR DDRA //数据方向寄存器
(0036) #define LCD_RS_PORT PORTA //以下2个要设为同一个口
(0037) #define LCD_RS_DDR DDRA
(0038) #define LCD_DATA_PORT PORTA //以下3个要设为同一个口
(0039) #define LCD_DATA_DDR DDRA //一定要用高4位
(0040) #define LCD_DATA_PIN PINA //端口输入引脚
(0041) #define LCD_RS (1<<PA1) //0x04 portA1 out
(0042) #define LCD_EN (1<<PA0) //0x08 portA0 out
(0043) #define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0 portA4/5/6/7 out
(0044)
(0045)
(0046)
(0047) void LCD_init(void);
(0048) void LCD_en_write(void);
(0049) void LCD_write_command(uchar command);
(0050) void LCD_write_data(uchar data);
(0051) void LCD_set_xy (uchar x, uchar y);
(0052)
(0053) void delay(uint n) //N ms延时函数
(0054) {
007A C009 RJMP 0x0084
(0055) uint i;
(0056) while(n--)
(0057) for (i=0;i<125;i++);
007B 2744 CLR R20
007C 2755 CLR R21
007D C002 RJMP 0x0080
007E 5F4F SUBI R20,0xFF
007F 4F5F SBCI R21,0xFF
0080 374D CPI R20,0x7D
0081 E0E0 LDI R30,0
0082 075E CPC R21,R30
0083 F3D0 BCS 0x007E
0084 0118 MOVW R2,R16
0085 5001 SUBI R16,1
0086 4010 SBCI R17,0
0087 2022 TST R2
0088 F791 BNE 0x007B
0089 2033 TST R3
008A F781 BNE 0x007B
008B 940E022B CALL pop_gset1
008D 9508 RET
(0058) }
(0059)
(0060) void LCD_init(void) //液晶初始化
(0061) {
(0062) LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
_LCD_init:
008E B38A IN R24,0x1A
008F 6F80 ORI R24,0xF0
0090 BB8A OUT 0x1A,R24
(0063) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
0091 9AD0 SBI 0x1A,0
(0064) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
0092 9AD1 SBI 0x1A,1
(0065) LCD_write_command(0x28);
0093 E208 LDI R16,0x28
0094 D014 RCALL _LCD_write_command
(0066) LCD_en_write();
0095 D00D RCALL _LCD_en_write
(0067) delay(40);
0096 E208 LDI R16,0x28
0097 E010 LDI R17,0
0098 DFDF RCALL _delay
(0068) LCD_write_command(0x28); //4位显示
0099 E208 LDI R16,0x28
009A D00E RCALL _LCD_write_command
(0069) LCD_write_command(0x0c); //显示开
009B E00C LDI R16,0xC
009C D00C RCALL _LCD_write_command
(0070) LCD_write_command(0x01); //清屏
009D E001 LDI R16,1
009E D00A RCALL _LCD_write_command
(0071) delay(2);
009F E002 LDI R16,2
00A0 E010 LDI R17,0
00A1 DFD6 RCALL _delay
00A2 9508 RET
(0072) }
(0073)
(0074) void LCD_en_write(void) //液晶使能
(0075) {
(0076) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
00A3 9AD8 SBI 0x1B,0
(0077) delay(1);
00A4 E001 LDI R16,1
00A5 E010 LDI R17,0
00A6 DFD1 RCALL _delay
(0078) LCD_EN_PORT&=~LCD_EN;
00A7 98D8 CBI 0x1B,0
00A8 9508 RET
_LCD_write_command:
command --> R20
00A9 940E0228 CALL push_gset1
00AB 2F40 MOV R20,R16
(0079) }
(0080)
(0081) void LCD_write_command(uchar command) //写指令
(0082) {
(0083) delay(16);
00AC E100 LDI R16,0x10
00AD E010 LDI R17,0
00AE DFC9 RCALL _delay
(0084) LCD_RS_PORT&=~LCD_RS; //RS=0
00AF 98D9 CBI 0x1B,1
(0085) LCD_DATA_PORT&=0X0f; //清高四位
00B0 B38B IN R24,0x1B
00B1 708F ANDI R24,0xF
00B2 BB8B OUT 0x1B,R24
(0086) LCD_DATA_PORT|=command&0xf0; //写高四位
00B3 2F84 MOV R24,R20
00B4 7F80 ANDI R24,0xF0
00B5 B22B IN R2,0x1B
00B6 2A28 OR R2,R24
00B7 BA2B OUT 0x1B,R2
(0087) LCD_en_write();
00B8 DFEA RCALL _LCD_en_write
(0088) command=command<<4; //低四位移到高四位
00B9 2F84 MOV R24,R20
00BA 708F ANDI R24,0xF
00BB 9582 SWAP R24
00BC 2F48 MOV R20,R24
(0089) LCD_DATA_PORT&=0x0f; //清高四位
00BD B38B IN R24,0x1B
00BE 708F ANDI R24,0xF
00BF BB8B OUT 0x1B,R24
(0090) LCD_DATA_PORT|=command&0xf0; //写低四位
00C0 2F84 MOV R24,R20
00C1 7F80 ANDI R24,0xF0
00C2 B22B IN R2,0x1B
00C3 2A28 OR R2,R24
00C4 BA2B OUT 0x1B,R2
(0091) LCD_en_write();
00C5 DFDD RCALL _LCD_en_write
00C6 940E022B CALL pop_gset1
00C8 9508 RET
_LCD_write_data:
data --> R20
00C9 940E0228 CALL push_gset1
00CB 2F40 MOV R20,R16
(0092)
(0093) }
(0094)
(0095) void LCD_write_data(uchar data) //写数据
(0096) {
(0097) delay(16);
00CC E100 LDI R16,0x10
00CD E010 LDI R17,0
00CE DFA9 RCALL _delay
(0098) LCD_RS_PORT|=LCD_RS; //RS=1
00CF 9AD9 SBI 0x1B,1
(0099) LCD_DATA_PORT&=0X0f; //清高四位
00D0 B38B IN R24,0x1B
00D1 708F ANDI R24,0xF
00D2 BB8B OUT 0x1B,R24
(0100) LCD_DATA_PORT|=data&0xf0; //写高四位
00D3 2F84 MOV R24,R20
00D4 7F80 ANDI R24,0xF0
00D5 B22B IN R2,0x1B
00D6 2A28 OR R2,R24
00D7 BA2B OUT 0x1B,R2
(0101) LCD_en_write();
00D8 DFCA RCALL _LCD_en_write
(0102) data=data<<4; //低四位移到高四位
00D9 2F84 MOV R24,R20
00DA 708F ANDI R24,0xF
00DB 9582 SWAP R24
00DC 2F48 MOV R20,R24
(0103) LCD_DATA_PORT&=0X0f; //清高四位
00DD B38B IN R24,0x1B
00DE 708F ANDI R24,0xF
00DF BB8B OUT 0x1B,R24
(0104) LCD_DATA_PORT|=data&0xf0; //写低四位
00E0 2F84 MOV R24,R20
00E1 7F80 ANDI R24,0xF0
00E2 B22B IN R2,0x1B
00E3 2A28 OR R2,R24
00E4 BA2B OUT 0x1B,R2
(0105) LCD_en_write();
00E5 DFBD RCALL _LCD_en_write
00E6 940E022B CALL pop_gset1
00E8 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00E9 940E0226 CALL push_gset2
00EB 2F42 MOV R20,R18
00EC 2F60 MOV R22,R16
(0106) }
(0107)
(0108)
(0109) void LCD_set_xy( uchar x, uchar y ) //写地址函数
(0110) {
(0111) uchar address;
(0112) if (y == 0) address = 0x80 + x;
00ED 2344 TST R20
00EE F419 BNE 0x00F2
00EF 2F46 MOV R20,R22
00F0 5840 SUBI R20,0x80
00F1 C002 RJMP 0x00F4
(0113) else address = 0xc0 + x;
00F2 2F46 MOV R20,R22
00F3 5440 SUBI R20,0x40
(0114) LCD_write_command( address);
00F4 2F04 MOV R16,R20
00F5 DFB3 RCALL _LCD_write_command
00F6 940E021A CALL pop_gset2
00F8 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
00F9 940E0224 CALL push_gset3
00FB 2EA2 MOV R10,R18
00FC 2F60 MOV R22,R16
00FD 814E LDD R20,Y+6
00FE 815F LDD R21,Y+7
(0115) }
(0116)
(0117) void LCD_write_string(uchar X,uchar Y,uchar *s) //列x=0~15,行y=0,1
(0118) {
(0119) LCD_set_xy( X, Y ); //写地址
00FF 2D2A MOV R18,R10
0100 2F06 MOV R16,R22
0101 DFE7 RCALL _LCD_set_xy
0102 C005 RJMP 0x0108
(0120) while (*s) // 写显示字符
(0121) {
(0122) LCD_write_data( *s );
0103 01FA MOVW R30,R20
0104 8100 LDD R16,Z+0
0105 DFC3 RCALL _LCD_write_data
(0123) s ++;
0106 5F4F SUBI R20,0xFF
0107 4F5F SBCI R21,0xFF
0108 01FA MOVW R30,R20
0109 8020 LDD R2,Z+0
010A 2022 TST R2
010B F7B9 BNE 0x0103
010C 940E021D CALL pop_gset3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -