📄 mega16.lst
字号:
__text_start:
__start:
0037 E5CF LDI R28,0x5F
0038 E0D4 LDI R29,4
0039 BFCD OUT 0x3D,R28
003A BFDE OUT 0x3E,R29
003B 51C0 SUBI R28,0x10
003C 40D0 SBCI R29,0
003D EA0A LDI R16,0xAA
003E 8308 STD Y+0,R16
003F 2400 CLR R0
0040 E7E9 LDI R30,0x79
0041 E0F0 LDI R31,0
0042 E010 LDI R17,0
0043 38EB CPI R30,0x8B
0044 07F1 CPC R31,R17
0045 F011 BEQ 0x0048
0046 9201 ST R0,Z+
0047 CFFB RJMP 0x0043
0048 8300 STD Z+0,R16
0049 E5E4 LDI R30,0x54
004A E0F0 LDI R31,0
004B E6A0 LDI R26,0x60
004C E0B0 LDI R27,0
004D E010 LDI R17,0
004E 36ED CPI R30,0x6D
004F 07F1 CPC R31,R17
0050 F021 BEQ 0x0055
0051 95C8 LPM
0052 9631 ADIW R30,1
0053 920D ST R0,X+
0054 CFF9 RJMP 0x004E
0055 940E0245 CALL _main
_exit:
0057 CFFF RJMP _exit
FILE: D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
(0001) ////////////////////////////////////////////////////////////////////////////////
(0002) //ICC-AVR application builder : 2006-8-1 上午 08:05:37
(0003) // Target : M16
(0004) // Crystal: 16.0000Mhz
(0005) // ADc2采集转把信号
(0006) ////////////////////////////////////////////////////////////////////////////////
(0007) #include <iom16v.h>
(0008) #include <macros.h>
(0009)
(0010) #define fre 125
(0011) #define uchar unsigned char
(0012) #define uint unsigned int
(0013) unsigned char kk;
(0014) int k;
(0015) uchar temp_data,hour_data,minut_data,second_data,second_flag;
(0016) uchar AdResult=0;
(0017) uchar SpeedMode=0;//SpeedMode=0 手动模式;SpeedMode=0x55 巡航模式
(0018) uchar SpeedVal=0;//保存当前速度参数,用于巡航模式
(0019) uchar M8Mode=0x0;//M8控制字=Rev,Rev,Rev,RevMode,Rev,Rev,LEFT_LED,RIGHT_LED
(0020) uchar LedTab[16]={0xEB,0x41,0xB3,0xBA,0x78,0xDA,0xDB,0xA8,0xFB,0xFA,
(0021) 0xF9,0xFB,0xC3,0xEB,0xD3,0xD1};
(0022) uchar LedBuf[2]={0,0};
(0023) uchar LedDp=0;
(0024) uchar UartBuf[10],UartBufCount=0;
(0025) uchar LRledReg=0;
(0026)
(0027)
(0028) ////////////////////////////////////////////////////////////////////////////////
(0029) //function declare
(0030) void port_init(void);
(0031) void uart0_init(void);
(0032) void uart0_rx_isr(void);
(0033) void uart0_tx(uchar tdata);
(0034) void tx_pack(void);
(0035) void timer1_init(void);
(0036) void timer1_comp_isr(void);
(0037) void led_display(uchar delay);
(0038) void HexToDec(uchar hex,uchar dec);
(0039) void ms_delay(uint delay);
(0040) void init_devices(void);
(0041) void adc_init(void);
(0042) ////////////////////////////////////////////////////////////////////////////////
(0043) void port_init(void)
(0044) {
(0045) PORTA = 0xFF;
_port_init:
0058 EF8F LDI R24,0xFF
0059 BB8B OUT 0x1B,R24
(0046) DDRA = 0xFB; //PA2=ADC2,输入
005A EF8B LDI R24,0xFB
005B BB8A OUT 0x1A,R24
(0047) PORTB = 0xFF;
005C EF8F LDI R24,0xFF
005D BB88 OUT 0x18,R24
(0048) DDRB = 0x1F; //数码管片选信号,低有效,常态为高,PB4=LED-dp
005E E18F LDI R24,0x1F
005F BB87 OUT 0x17,R24
(0049) PORTC = 0xFF; //m103 output only
0060 EF8F LDI R24,0xFF
0061 BB85 OUT 0x15,R24
(0050) DDRC = 0x00; //PC0,1=RL_in
0062 2422 CLR R2
0063 BA24 OUT 0x14,R2
(0051) PORTD = 0x9F;
0064 E98F LDI R24,0x9F
0065 BB82 OUT 0x12,R24
(0052) DDRD = 0x78;
0066 E788 LDI R24,0x78
0067 BB81 OUT 0x11,R24
0068 9508 RET
(0053) }
(0054)
(0055)
(0056) //TIMER1 initialisation - prescale:1
(0057) // WGM: 0) Normal, TOP=0xFFFF
(0058) // desired value: 1Sec
(0059) // actual value: 1.000Sec (0.0%)
(0060) void timer1_init(void)
(0061) {
(0062) TCCR1B = 0x00; //stop
_timer1_init:
0069 2422 CLR R2
006A BC2E OUT 0x2E,R2
(0063) TCNT1H = 0xC2; //setup
006B EC82 LDI R24,0xC2
006C BD8D OUT 0x2D,R24
(0064) TCNT1L = 0xF7;
006D EF87 LDI R24,0xF7
006E BD8C OUT 0x2C,R24
(0065) OCR1AH = 0x3D;
006F E38D LDI R24,0x3D
0070 BD8B OUT 0x2B,R24
(0066) OCR1AL = 0x09;
0071 E089 LDI R24,0x9
0072 BD8A OUT 0x2A,R24
(0067) OCR1BH = 0x3D;
0073 E38D LDI R24,0x3D
0074 BD89 OUT 0x29,R24
(0068) OCR1BL = 0x09;
0075 E089 LDI R24,0x9
0076 BD88 OUT 0x28,R24
(0069) //OCR1CH = $OCR1CH$;
(0070) //OCR1CL = $OCR1CL$;
(0071) ICR1H = 0x3D;
0077 E38D LDI R24,0x3D
0078 BD87 OUT 0x27,R24
(0072) ICR1L = 0x09;
0079 E089 LDI R24,0x9
007A BD86 OUT 0x26,R24
(0073) TCCR1A = 0x00;
007B BC2F OUT 0x2F,R2
(0074) TCCR1B = 0x05; //start Timer
007C E085 LDI R24,5
007D BD8E OUT 0x2E,R24
007E 9508 RET
(0075) }
(0076) /***************************************************************************
(0077)
(0078) ****************************************************************************/
(0079) //UART0 initialize
(0080) // desired baud rate: 9600
(0081) // actual: baud rate:9615 (0.2%)
(0082) // char size: 8 bit
(0083) // parity: Disabled
(0084) void uart0_init(void)
(0085) {
(0086) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
007F 2422 CLR R2
0080 B82A OUT 0x0A,R2
(0087) UCSRA = 0x00;
0081 B82B OUT 0x0B,R2
(0088) UCSRC = BIT(URSEL) | 0x06;
0082 E886 LDI R24,0x86
0083 BD80 OUT 0x20,R24
(0089) UBRRL = 0x67; //set baud rate lo
0084 E687 LDI R24,0x67
0085 B989 OUT 0x09,R24
(0090) UBRRH = 0x00; //set baud rate hi
0086 BC20 OUT 0x20,R2
(0091) UCSRB = 0x98;
0087 E988 LDI R24,0x98
0088 B98A OUT 0x0A,R24
0089 9508 RET
_uart0_rx_isr:
voldata --> R20
008A 920A ST R0,-Y
008B 921A ST R1,-Y
008C 922A ST R2,-Y
008D 923A ST R3,-Y
008E 930A ST R16,-Y
008F 931A ST R17,-Y
0090 932A ST R18,-Y
0091 933A ST R19,-Y
0092 938A ST R24,-Y
0093 939A ST R25,-Y
0094 93EA ST R30,-Y
0095 93FA ST R31,-Y
0096 B60F IN R0,0x3F
0097 920A ST R0,-Y
0098 940E02FA CALL push_gset1
(0092) }
(0093) /***************************************************************************
(0094)
(0095) ****************************************************************************/
(0096) #pragma interrupt_handler uart0_rx_isr:12
(0097) void uart0_rx_isr(void)
(0098) {
(0099) uchar voldata;
(0100) //uart has received a character in UDR
(0101) UartBuf[UartBufCount++]= UDR;
009A 90200077 LDS R2,UartBufCount
009C 2433 CLR R3
009D 2D82 MOV R24,R2
009E 5F8F SUBI R24,0xFF
009F 93800077 STS UartBufCount,R24
00A1 E789 LDI R24,0x79
00A2 E090 LDI R25,0
00A3 2DE2 MOV R30,R2
00A4 27FF CLR R31
00A5 0FE8 ADD R30,R24
00A6 1FF9 ADC R31,R25
00A7 B02C IN R2,0x0C
00A8 8220 STD Z+0,R2
(0102) if(UartBuf[0]==0xaa)//包头
00A9 91800079 LDS R24,UartBuf
00AB 3A8A CPI R24,0xAA
00AC F559 BNE 0x00D8
(0103) {
(0104) //UartBuf[3]=Rev,Rev,Rev,Rev,Rev,Rev,LEFT_LED,RIGHT_LED
(0105) if(UartBufCount>4)
00AD E084 LDI R24,4
00AE 90200077 LDS R2,UartBufCount
00B0 1582 CP R24,R2
00B1 F548 BCC 0x00DB
(0106) {
(0107) if( ((UartBuf[1]+UartBuf[2])==0xff)&&
00B2 9020007B LDS R2,UartBuf+2
00B4 9180007A LDS R24,UartBuf+1
00B6 0D82 ADD R24,R2
00B7 3F8F CPI R24,0xFF
00B8 F4D9 BNE 0x00D4
00B9 9020007D LDS R2,0x7D
00BB 9180007C LDS R24,UartBuf+3
00BD 0D82 ADD R24,R2
00BE 3F8F CPI R24,0xFF
00BF F4A1 BNE 0x00D4
(0108) ((UartBuf[3]+UartBuf[4])==0xff) )
(0109) {
(0110) LedBuf[0]=UartBuf[1];//SpeedVal
00C0 9020007A LDS R2,UartBuf+1
00C2 92200074 STS LedBuf,R2
(0111) voldata=UartBuf[3];
00C4 9140007C LDS R20,UartBuf+3
(0112) if(voldata<105)voldata=105; //电压范围21~29.5,每个码表示0.2V
00C6 3649 CPI R20,0x69
00C7 F408 BCC 0x00C9
00C8 E649 LDI R20,0x69
(0113) // result=100*((tmpvol/5)-21)/(29.5-21)
(0114) LedBuf[1]=40*(voldata-105)/17;//+24V
00C9 E288 LDI R24,0x28
00CA 9F84 MUL R24,R20
00CB 0180 MOVW R16,R0
00CC 5608 SUBI R16,0x68
00CD 4110 SBCI R17,0x10
00CE E121 LDI R18,0x11
00CF E030 LDI R19,0
00D0 940E02A6 CALL div16s
00D2 93000075 STS LedBuf+1,R16
(0115)
(0116) }
(0117) UartBufCount=0;
00D4 2422 CLR R2
00D5 92200077 STS UartBufCount,R2
(0118) }
(0119) }
00D7 C003 RJMP 0x00DB
(0120) else UartBufCount=0;
00D8 2422 CLR R2
00D9 92200077 STS UartBufCount,R2
00DB 940E02FD CALL pop_gset1
00DD 9009 LD R0,Y+
00DE BE0F OUT 0x3F,R0
00DF 91F9 LD R31,Y+
00E0 91E9 LD R30,Y+
00E1 9199 LD R25,Y+
00E2 9189 LD R24,Y+
00E3 9139 LD R19,Y+
00E4 9129 LD R18,Y+
00E5 9119 LD R17,Y+
00E6 9109 LD R16,Y+
00E7 9039 LD R3,Y+
00E8 9029 LD R2,Y+
00E9 9019 LD R1,Y+
00EA 9009 LD R0,Y+
00EB 9518 RETI
(0121) }
(0122) /***************************************************************************
(0123)
(0124) ****************************************************************************/
(0125) void uart0_tx(uchar tdata)
(0126) {
(0127) while(!(UCSRA & (1<<UDRE) ));
_uart0_tx:
tdata --> R16
00EC 9B5D SBIS 0x0B,5
00ED CFFE RJMP _uart0_tx
(0128) UDR = tdata;
00EE B90C OUT 0x0C,R16
00EF 9508 RET
(0129) }
(0130) void tx_pack(void)
(0131) {
(0132)
(0133) uart0_tx(0xaa);
_tx_pack:
00F0 EA0A LDI R16,0xAA
00F1 DFFA RCALL _uart0_tx
(0134) if(SpeedMode)
00F2 90200061 LDS R2,SpeedMode
00F4 2022 TST R2
00F5 F059 BEQ 0x0101
(0135) { //巡航模式
(0136) uart0_tx(SpeedVal);
00F6 91000062 LDS R16,SpeedVal
00F8 DFF3 RCALL _uart0_tx
(0137) uart0_tx(0xff-SpeedVal);
00F9 90200062 LDS R2,SpeedVal
00FB 2433 CLR R3
00FC EF0F LDI R16,0xFF
00FD 1902 SUB R16,R2
00FE 0913 SBC R17,R3
00FF DFEC RCALL _uart0_tx
(0138) }
0100 C00A RJMP 0x010B
(0139) else
(0140) { //手动模式
(0141) uart0_tx(AdResult);
0101 91000060 LDS R16,AdResult
0103 DFE8 RCALL _uart0_tx
(0142) uart0_tx(0xff-AdResult);
0104 90200060 LDS R2,AdResult
0106 2433 CLR R3
0107 EF0F LDI R16,0xFF
0108 1902 SUB R16,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -