📄 motor.lst
字号:
__text_start:
__start:
0046 EFCF LDI R28,0xFF
0047 E1D0 LDI R29,0x10
0048 BFCD OUT 0x3D,R28
0049 BFDE OUT 0x3E,R29
004A 51C0 SUBI R28,0x10
004B 40D0 SBCI R29,0
004C EA0A LDI R16,0xAA
004D 8308 STD Y+0,R16
004E 2400 CLR R0
004F E0E0 LDI R30,0
0050 E0F1 LDI R31,1
0051 E011 LDI R17,1
0052 30E5 CPI R30,5
0053 07F1 CPC R31,R17
0054 F011 BEQ 0x0057
0055 9201 ST R0,Z+
0056 CFFB RJMP 0x0052
0057 8300 STD Z+0,R16
0058 E8EC LDI R30,0x8C
0059 E0F0 LDI R31,0
005A E0A0 LDI R26,0
005B E0B1 LDI R27,1
005C E010 LDI R17,0
005D 38EC CPI R30,0x8C
005E 07F1 CPC R31,R17
005F F021 BEQ 0x0064
0060 95C8 LPM
0061 9631 ADIW R30,1
0062 920D ST R0,X+
0063 CFF9 RJMP 0x005D
0064 940E0082 CALL _main
_exit:
0066 CFFF RJMP _exit
FILE: D:\NEWWOR~1\motor\main.c
(0001) #include <iom64v.h>
(0002) #include <macros.h>
(0003) #include "head.h"
(0004) #include "uart.h"
(0005) #include "time.h"
(0006) ////
(0007) U8 g_ucKeyData;
(0008) U8 g_ucMomeyData;
(0009) U8 g_ucMotorData;
(0010) U8 g_ucLedStatus;
(0011) U8 temp;
(0012) void InitData()
(0013) {
(0014) g_ucKeyData=0x00;
_InitData:
0067 2422 CLR R2
0068 92200104 STS g_ucKeyData,R2
(0015) g_ucMomeyData=0x00;
006A 92200103 STS g_ucMomeyData,R2
(0016) g_ucMotorData=0x00;
006C 92200102 STS g_ucMotorData,R2
(0017) g_ucLedStatus=0xff;
006E EF8F LDI R24,0xFF
006F 93800101 STS g_ucLedStatus,R24
(0018) temp=1;
0071 E081 LDI R24,1
0072 93800100 STS temp,R24
0074 9508 RET
(0019) }
(0020)
(0021) void InitTarget()
(0022) {
(0023) Time1Init();
_InitTarget:
0075 940E008A CALL _Time1Init
(0024) //Uart1Init(19200);
(0025) // moneydriver
(0026) DDRA=0XFF;
0077 EF8F LDI R24,0xFF
0078 BB8A OUT 0x1A,R24
(0027) PORTA=0x00;
0079 2422 CLR R2
007A BA2B OUT 0x1B,R2
(0028) // motordriver
(0029) DDRC=0XFF;
007B BB84 OUT 0x14,R24
(0030) PORTC=0X00;
007C BA25 OUT 0x15,R2
(0031) // turn on the first LED
(0032) DDRF=0xFF;
007D 93800061 STS 0x61,R24
(0033) PORTF=0x00;
007F 92200062 STS 0x62,R2
0081 9508 RET
(0034)
(0035) }
(0036) void main()
(0037) {
(0038) InitTarget();//
_main:
0082 DFF2 RCALL _InitTarget
(0039) InitData();
0083 DFE3 RCALL _InitData
(0040) PORTF=g_ucLedStatus;
0084 90200101 LDS R2,g_ucLedStatus
0086 92200062 STS 0x62,R2
(0041) while(true){
0088 CFFF RJMP 0x0088
0089 9508 RET
FILE: D:\NEWWOR~1\motor\time.c
(0001) #include <iom64v.h>
(0002) #include <macros.h>
(0003) #include "head.h"
(0004)
(0005)
(0006) /*-----------------------------------------------------------------
(0007) 函数名称: void Timer1Init(void)
(0008) 函数功能: 定时器1初始化 256预分频 定时一秒
(0009) 参 数:
(0010) 返 回 值: 无
(0011) -----------------------------------------------------------------*/
(0012) void Time1Init()
(0013) {
(0014) CLI(); //关全部中断 //开中断
_Time1Init:
008A 94F8 BCLR 7
(0015) TCCR1B = 0x00; //关定时器
008B 2422 CLR R2
008C BC2E OUT 0x2E,R2
(0016) TCNT1H = 0xF0; //设置定时初值
008D EF80 LDI R24,0xF0
008E BD8D OUT 0x2D,R24
(0017) TCNT1L = 0xBE;
008F EB8E LDI R24,0xBE
0090 BD8C OUT 0x2C,R24
(0018) OCR1AH = 0x0F;
0091 E08F LDI R24,0xF
0092 BD8B OUT 0x2B,R24
(0019) OCR1AL = 0x42;
0093 E482 LDI R24,0x42
0094 BD8A OUT 0x2A,R24
(0020) OCR1BH = 0x0F;
0095 E08F LDI R24,0xF
0096 BD89 OUT 0x29,R24
(0021) OCR1BL = 0x42;
0097 E482 LDI R24,0x42
0098 BD88 OUT 0x28,R24
(0022) ICR1H = 0x0F;
0099 E08F LDI R24,0xF
009A BD87 OUT 0x27,R24
(0023) ICR1L = 0x42;
009B E482 LDI R24,0x42
009C BD86 OUT 0x26,R24
(0024) TCCR1A = 0x00;
009D BC2F OUT 0x2F,R2
(0025) TCCR1B = 0x04; //开始计数
009E E084 LDI R24,4
009F BD8E OUT 0x2E,R24
(0026)
(0027) TIMSK = 0x04; //timer interrupt sources
00A0 BF87 OUT 0x37,R24
(0028) SEI();
00A1 9478 BSET 7
00A2 9508 RET
_timer1_ovf_isr:
00A3 922A ST R2,-Y
00A4 938A ST R24,-Y
00A5 B62F IN R2,0x3F
00A6 922A ST R2,-Y
(0029) }
(0030)
(0031) #pragma interrupt_handler timer1_ovf_isr:15
(0032) void timer1_ovf_isr(void)
(0033) {
(0034)
(0035) TCNT1H = 0xF0; //重新装载计数值
00A7 EF80 LDI R24,0xF0
00A8 BD8D OUT 0x2D,R24
(0036) TCNT1L = 0xBE;
00A9 EB8E LDI R24,0xBE
00AA BD8C OUT 0x2C,R24
(0037) if(temp){
00AB 90200100 LDS R2,temp
00AD 2022 TST R2
00AE F041 BEQ 0x00B7
(0038) g_ucLedStatus=0x00;
00AF 2422 CLR R2
00B0 92200101 STS g_ucLedStatus,R2
(0039) PORTF = g_ucLedStatus;
00B2 92200062 STS 0x62,R2
(0040) temp=0;
00B4 92200100 STS temp,R2
(0041) }else{
00B6 C009 RJMP 0x00C0
(0042) g_ucLedStatus=0xff;
00B7 EF8F LDI R24,0xFF
00B8 93800101 STS g_ucLedStatus,R24
(0043) PORTF = g_ucLedStatus;
00BA 2E28 MOV R2,R24
00BB 92200062 STS 0x62,R2
(0044) temp=1;
00BD E081 LDI R24,1
00BE 93800100 STS temp,R24
(0045) }
00C0 9029 LD R2,Y+
00C1 BE2F OUT 0x3F,R2
00C2 9189 LD R24,Y+
00C3 9029 LD R2,Y+
00C4 9518 RETI
_baudselect:
bauddata --> R20
baud --> R16
00C5 940E0134 CALL push_gset1
FILE: D:\NEWWOR~1\motor\uart.c
(0001) #include <iom64v.h>
(0002) #include <macros.h>
(0003) #include "head.h"
(0004)
(0005) uint baudselect(uint baud)//baud的选择
(0006) {
(0007) uint bauddata=0;
00C7 2744 CLR R20
00C8 2755 CLR R21
(0008) if(baud==9600) bauddata=0x47; //baud=9600
00C9 3800 CPI R16,0x80
00CA E2E5 LDI R30,0x25
00CB 071E CPC R17,R30
00CC F411 BNE 0x00CF
00CD E447 LDI R20,0x47
00CE C00D RJMP 0x00DC
(0009) else if(baud==19200) bauddata=0x23; //baud=19200
00CF 3000 CPI R16,0
00D0 E4EB LDI R30,0x4B
00D1 071E CPC R17,R30
00D2 F419 BNE 0x00D6
00D3 E243 LDI R20,0x23
00D4 E050 LDI R21,0
00D5 C006 RJMP 0x00DC
(0010) else if(baud==57600) bauddata=0x0B; //baud=57600
00D6 3000 CPI R16,0
00D7 EEE1 LDI R30,0xE1
00D8 071E CPC R17,R30
00D9 F411 BNE 0x00DC
00DA E04B LDI R20,0xB
00DB E050 LDI R21,0
(0011) return(bauddata);
00DC 018A MOVW R16,R20
00DD 940E0137 CALL pop_gset1
00DF 9508 RET
_Uart1Init:
baud --> R20
00E0 940E0134 CALL push_gset1
00E2 01A8 MOVW R20,R16
(0012) }
(0013) void Uart1Init(uint baud)
(0014) {
(0015) CLI(); //disable all interrupts
00E3 94F8 BCLR 7
(0016) UCSR1B = 0x00; //disable while setting baud rate
00E4 2422 CLR R2
00E5 9220009A STS 0x9A,R2
(0017) UCSR1A=0x00;
00E7 9220009B STS 0x9B,R2
(0018) UBRR1H=((baudselect(baud))>>8)&0x00ff;
00E9 018A MOVW R16,R20
00EA DFDA RCALL _baudselect
00EB 01C8 MOVW R24,R16
00EC 2F89 MOV R24,R25
00ED 2799 CLR R25
00EE 7090 ANDI R25,0
00EF 93800098 STS 0x98,R24
(0019) UBRR1L=(baudselect(baud))&0x00ff;
00F1 018A MOVW R16,R20
00F2 DFD2 RCALL _baudselect
00F3 01C8 MOVW R24,R16
00F4 7090 ANDI R25,0
00F5 93800099 STS 0x99,R24
(0020) UCSR1B=(1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1);//接收器与发送器使能
00F7 E988 LDI R24,0x98
00F8 9380009A STS 0x9A,R24
(0021) UCSR1C=(3<<UCSZ10);//设计浈格式:8位数据位,1位停止位,无效验位,异步模式
00FA E086 LDI R24,6
00FB 9380009D STS 0x9D,R24
(0022) SEI(); //re-enable interrupts
00FD 9478 BSET 7
00FE 940E0137 CALL pop_gset1
0100 9508 RET
(0023) }
(0024)
(0025) void USART_Transmit_byte(uchar bytedata)
(0026) {
(0027) while(!(UCSR1A&(1<<UDRE1)));
_USART_Transmit_byte:
bytedata --> R16
0101 9020009B LDS R2,0x9B
0103 FE25 SBRS R2,5
0104 CFFC RJMP _USART_Transmit_byte
(0028) UDR1=bytedata;
0105 9300009C STS 0x9C,R16
0107 9508 RET
_USART_Transmit_arraydata:
i --> R20
arraydata --> R22
lenght --> R10
0108 940E0130 CALL push_gset3
010A 01B9 MOVW R22,R18
010B 2EA0 MOV R10,R16
(0029) }
(0030)
(0031) /***send array_byte data**********/
(0032)
(0033) void USART_Transmit_arraydata(uchar lenght,uchar arraydata[])
(0034) {
(0035) uchar i;
(0036) for(i=0;i<lenght;i++)
010C 2744 CLR R20
010D C007 RJMP 0x0115
(0037) USART_Transmit_byte(arraydata[i]);
010E 2FE4 MOV R30,R20
010F 27FF CLR R31
0110 0FE6 ADD R30,R22
0111 1FF7 ADC R31,R23
0112 8100 LDD R16,Z+0
0113 DFED RCALL _USART_Transmit_byte
0114 9543 INC R20
0115 154A CP R20,R10
0116 F3B8 BCS 0x010E
0117 940E0129 CALL pop_gset3
0119 9508 RET
(0038) }
(0039)
(0040) uchar USART_Flush( void )
(0041) {
_USART_Flush:
dummy --> R16
011A C002 RJMP 0x011D
(0042) unsigned char dummy;
(0043) while ( UCSR1A & (1<<RXC1) ) dummy = UDR1; //读UDR会使RXC清零 ]
011B 9100009C LDS R16,0x9C
011D 9020009B LDS R2,0x9B
011F FC27 SBRC R2,7
0120 CFFA RJMP 0x011B
(0044) return dummy;
0121 9508 RET
(0045) }
(0046)
(0047) /*interrupt process***************/
(0048)
(0049) #pragma interrupt_handler uart1_rx_isr:31
(0050) void uart1_rx_isr(void) //uart has received a character in UDR
(0051) {
_uart1_rx_isr:
0122 9518 RETI
FILE: D:\NEWWOR~1\motor\motorprocess.c
(0001) #include <iom64v.h>
(0002) #include <macros.h>
(0003) #include "head.h"
(0004) void ActionMoneyDrive(U8 ucData,U8 ucSeg)
(0005) {
_ActionMoneyDrive:
ucSeg --> Y+2
ucData --> Y+0
0123 9508 RET
(0006) //控制电机
(0007) //do something
(0008) //电机是否正确动作
(0009) //return something
(0010) //return true;
(0011) }
(0012) void ActionMotorDrive(U8 ucData,U8 ucSeg)
(0013) {
_ActionMotorDrive:
ucSeg --> Y+2
ucData --> Y+0
0124 9508 RET
(0014)
(0015) //控制电机
(0016) //do something
(0017) //电机是否正确动作
(0018) //return something
(0019) //return true;
(0020) }
(0021)
(0022) void ProcessMoneyDrive()
(0023) {
(0024) U8 ucData;
(0025) U8 ucSeg;
(0026) ucData=ucSeg=0;
_ProcessMoneyDrive:
ucSeg --> R16
ucData --> R16
0125 2700 CLR R16
0126 9508 RET
(0027) ///1.第一步
(0028) ///2.第二步
(0029) ///
(0030) //return true;
(0031) }
(0032) void ProcessMotorDrive()
(0033) {
(0034) U8 ucData;
(0035) U8 ucSeg;
(0036) ucData=ucSeg=0;
FILE: <library>
_ProcessMotorDrive:
ucSeg --> R16
ucData --> R16
0127 2700 CLR R16
0128 9508 RET
pop_gset3:
0129 E0E4 LDI R30,4
012A 940C0138 JMP pop
push_gset5:
012C 92FA ST R15,-Y
012D 92EA ST R14,-Y
push_gset4:
012E 92DA ST R13,-Y
012F 92CA ST R12,-Y
push_gset3:
0130 92BA ST R11,-Y
0131 92AA ST R10,-Y
push_gset2:
0132 937A ST R23,-Y
0133 936A ST R22,-Y
push_gset1:
0134 935A ST R21,-Y
0135 934A ST R20,-Y
0136 9508 RET
pop_gset1:
0137 E0E1 LDI R30,1
pop:
0138 9149 LD R20,Y+
0139 9159 LD R21,Y+
013A FDE0 SBRC R30,0
013B 9508 RET
013C 9169 LD R22,Y+
013D 9179 LD R23,Y+
013E FDE1 SBRC R30,1
013F 9508 RET
0140 90A9 LD R10,Y+
0141 90B9 LD R11,Y+
0142 FDE2 SBRC R30,2
0143 9508 RET
0144 90C9 LD R12,Y+
0145 90D9 LD R13,Y+
0146 FDE3 SBRC R30,3
0147 9508 RET
0148 90E9 LD R14,Y+
0149 90F9 LD R15,Y+
014A 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -