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

📄 lineturn.lst

📁 MEGA16单片机程序包2
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -