📄 main.lst
字号:
__text_start:
__start:
0030 E5CF LDI R28,0x5F
0031 E0D4 LDI R29,4
0032 BFCD OUT 0x3D,R28
0033 BFDE OUT 0x3E,R29
0034 51C0 SUBI R28,0x10
0035 40D0 SBCI R29,0
0036 EA0A LDI R16,0xAA
0037 8308 STD Y+0,R16
0038 2400 CLR R0
0039 E6E2 LDI R30,0x62
003A E0F0 LDI R31,0
003B E010 LDI R17,0
003C 36E5 CPI R30,0x65
003D 07F1 CPC R31,R17
003E F011 BEQ 0x0041
003F 9201 ST R0,Z+
0040 CFFB RJMP 0x003C
0041 8300 STD Z+0,R16
0042 E5EE LDI R30,0x5E
0043 E0F0 LDI R31,0
0044 E6A0 LDI R26,0x60
0045 E0B0 LDI R27,0
0046 E010 LDI R17,0
0047 36E0 CPI R30,0x60
0048 07F1 CPC R31,R17
0049 F021 BEQ 0x004E
004A 95C8 LPM
004B 9631 ADIW R30,1
004C 920D ST R0,X+
004D CFF9 RJMP 0x0047
004E 940E01B2 CALL _main
_exit:
0050 CFFF RJMP _exit
FILE: E:\work\百步梯攀登计划\AVR程序\new\main.c
(0001) //ICC-AVR application builder : 2007-2-22 12:20:11
(0002) // Target : M16
(0003) // Crystal: 10.000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007)
(0008) unsigned char tmp_cn_0; //临时计数器——0
(0009) unsigned char tmp_cn_1; //临时计数器——1
(0010) unsigned char led_ch=0x80; //闪烁的花样
(0011) unsigned char key_code; //键盘按下的键盘代码
(0012) unsigned char tmp_led_index=0x00;
(0013) unsigned char const LED_INDEX[]={0X3F,0X06,0X5B,0X4F,
(0014) 0X66,0X6D,0X7D,0X07,
(0015) 0X7F,0X6F};//共阴管的数字0-9的代码
(0016) void port_init(void)
(0017) {
(0018) PORTA = 0xC0;
_port_init:
0051 EC80 LDI R24,0xC0
0052 BB8B OUT 0x1B,R24
(0019) DDRA = 0xC0; //高2位作为10位ADC的MSB,低2位用外部ADC输入,其余用于键盘的输入
0053 BB8A OUT 0x1A,R24
(0020) PORTB = 0xFF;
0054 EF8F LDI R24,0xFF
0055 BB88 OUT 0x18,R24
(0021) DDRB = 0xFF; //驱动静态595显示,只用到高4位,低四位保留
0056 BB87 OUT 0x17,R24
(0022) PORTC = 0xFF; //m103 output only
0057 BB85 OUT 0x15,R24
(0023) DDRC = 0xFF; //ADC的低8位输出
0058 BB84 OUT 0x14,R24
(0024) PORTD = 0xFF;
0059 BB82 OUT 0x12,R24
(0025) DDRD = 0xFF; //高6位用于显示LED,低2位用于串口的输出。
005A BB81 OUT 0x11,R24
005B 9508 RET
(0026) }
(0027)
(0028)
(0029) //TIMER0 initialize - prescale:256
(0030) // WGM: Normal
(0031) // desired value: 2mSec
(0032) // actual value: 1.997mSec (0.2%)
(0033) void timer0_init(void) //硬件计数器0的初始化程序
(0034) {
(0035) TCCR0 = 0x00; //stop
_timer0_init:
005C 2422 CLR R2
005D BE23 OUT 0x33,R2
(0036) TCNT0 = 0xB2; //set count
005E EB82 LDI R24,0xB2
005F BF82 OUT 0x32,R24
(0037) OCR0 = 0x4E; //set compare
0060 E48E LDI R24,0x4E
0061 BF8C OUT 0x3C,R24
(0038) TCCR0 = 0x04; //start timer
0062 E084 LDI R24,4
0063 BF83 OUT 0x33,R24
0064 9508 RET
(0039) }
(0040)
(0041) /*-----------------------ADC转换初始化----------------------------------------*/
(0042) //ADC initialize
(0043) // Conversion time: 26uS
(0044) void adc_init(void)
(0045) {
(0046) ADCSR = 0x00; //disable adc
_adc_init:
0065 2422 CLR R2
0066 B826 OUT 0x06,R2
(0047) ADMUX = 0x00; //选择外部基准电压 通道 0 输入
0067 B827 OUT 0x07,R2
(0048) ACSR = 0xC0; //模拟比较器控制和状态寄存器 ACSR
0068 EC80 LDI R24,0xC0
0069 B988 OUT 0x08,R24
(0049) //ACD置1,使模拟比较器禁用
(0050) /*--ACD--ACBG--ACO--ACI---ACIE---ACIC---ACIS1---ACIS0------------------------*/
(0051) /*-模拟比较起禁用--模拟比较器的能隙基准源--模拟比较起输出--模拟比较器中断标志*/
(0052) /*-模拟比较器中断使能--模拟比较器输入捕捉使能--模拟比较器中断模式选择--------*/
(0053) ADCSR = 0x8B;//模拟比较起控制和状态寄存器
006A E88B LDI R24,0x8B
006B B986 OUT 0x06,R24
006C 9508 RET
_adc_isr:
rr --> R16
006D 922A ST R2,-Y
006E 923A ST R3,-Y
006F 930A ST R16,-Y
0070 931A ST R17,-Y
0071 938A ST R24,-Y
0072 939A ST R25,-Y
0073 B62F IN R2,0x3F
0074 922A ST R2,-Y
(0054) /*-----------ADEN---ADSC---ADFR---ADIF---ADIE---ADPS2---ADPS1---ADPS0--------*/
(0055) //使能模数转换 ADC开始转换 ADC连续转换 ADC中断使能 128分频
(0056) }
(0057) /*-----------------------ADC转换中断程序--------------------------------------*/
(0058) #pragma interrupt_handler adc_isr:15
(0059) void adc_isr(void) //组合输出ADC DATA
(0060) {
(0061) unsigned char rr=0;
0075 2700 CLR R16
(0062) //conversion complete, read value (int) using...
(0063) PORTC=~(ADCL); //c口显示低8位的信息 (反相)
0076 B024 IN R2,0x04
0077 9420 COM R2
0078 BA25 OUT 0x15,R2
(0064) rr =ADCH<<6; //高8位的信息
0079 B105 IN R16,0x05
007A 0F00 LSL R16
007B 0F00 LSL R16
007C 0F00 LSL R16
007D 0F00 LSL R16
007E 0F00 LSL R16
007F 0F00 LSL R16
(0065) rr ^=(0x03<<6); //反相
0080 EC80 LDI R24,0xC0
0081 E090 LDI R25,0
0082 2E20 MOV R2,R16
0083 2433 CLR R3
0084 2628 EOR R2,R24
0085 2639 EOR R3,R25
0086 2D02 MOV R16,R2
(0066) PORTA=rr; //在A口高2位显示
0087 BA2B OUT 0x1B,R2
0088 9029 LD R2,Y+
0089 BE2F OUT 0x3F,R2
008A 9199 LD R25,Y+
008B 9189 LD R24,Y+
008C 9119 LD R17,Y+
008D 9109 LD R16,Y+
008E 9039 LD R3,Y+
008F 9029 LD R2,Y+
0090 9518 RETI
(0067) }
(0068)
(0069) void start_adc_0(void) //启动ADC转换的程序
(0070) {
(0071) ADMUX = 0x00; //选择通道0
_start_adc_0:
0091 2422 CLR R2
0092 B827 OUT 0x07,R2
(0072) ADCSR |= 0x40; //开始ADC转换
0093 9A36 SBI 0x06,6
0094 9508 RET
(0073) }
(0074)
(0075) //SPI initialize //初始化硬件SPIS口的程序
(0076) // clock rate: 2500000hz
(0077) void spi_init(void)
(0078) {
(0079) SPCR = 0x50; //setup SPI
_spi_init:
0095 E580 LDI R24,0x50
0096 B98D OUT 0x0D,R24
(0080) SPSR = 0x00; //setup SPI
0097 2422 CLR R2
0098 B82E OUT 0x0E,R2
0099 9508 RET
(0081) }
(0082)
(0083) void SPI_595_Out(unsigned char i) //HC595数据的输出
(0084) {
(0085) SPDR = i; /* 启动数据传输 */
_SPI_595_Out:
i --> R16
009A B90F OUT 0x0F,R16
(0086) while (!(SPSR & (1<<SPIF))); //等待传输结束
009B 9B77 SBIS 0x0E,7
009C CFFE RJMP 0x009B
009D 9508 RET
_disp_led:
i --> R20
009E 940E01C6 CALL push_gset1
00A0 2F40 MOV R20,R16
(0087) }
(0088)
(0089) void disp_led(unsigned char i)
(0090) {
(0091) PORTB &= ~(1 << PB4); //准备锁存,在全部的四个LED数据送完后再锁存
00A1 98C4 CBI 0x18,4
(0092) SPI_595_Out(i);
00A2 2F04 MOV R16,R20
00A3 DFF6 RCALL _SPI_595_Out
(0093) PORTB |= (1 << PB4); //在这个时候锁存数据 显示
00A4 9AC4 SBI 0x18,4
00A5 940E01C9 CALL pop_gset1
00A7 9508 RET
(0094) }
(0095)
(0096) //UART0 initialize //初始化串口0的程序
(0097) // desired baud rate: 9600
(0098) // actual: baud rate:9615 (0.2%)
(0099) // char size: 8 bit 没有校验位
(0100) // parity: Disabled
(0101) void uart0_init(void)
(0102) {
(0103) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
00A8 2422 CLR R2
00A9 B82A OUT 0x0A,R2
(0104) UCSRA = 0x00;
00AA B82B OUT 0x0B,R2
(0105) UCSRC = BIT(URSEL) | 0x06;
00AB E886 LDI R24,0x86
00AC BD80 OUT 0x20,R24
(0106) UBRRL = 0x40; //set baud rate lo
00AD E480 LDI R24,0x40
00AE B989 OUT 0x09,R24
(0107) UBRRH = 0x00; //set baud rate hi
00AF BC20 OUT 0x20,R2
(0108) UCSRB = 0x98;
00B0 E988 LDI R24,0x98
00B1 B98A OUT 0x0A,R24
00B2 9508 RET
(0109) }
(0110)
(0111) void USART_Transmit( unsigned char data )
(0112) {
(0113)
(0114) while ( !( UCSRA & (1<<UDRE)) ) // 等待发送缓冲器为空
_USART_Transmit:
data --> R16
00B3 9B5D SBIS 0x0B,5
00B4 CFFE RJMP _USART_Transmit
(0115) ;
(0116) UDR = data; //将数据放入缓冲器,发送数据
00B5 B90C OUT 0x0C,R16
00B6 9508 RET
(0117) }
(0118)
(0119) unsigned char USART_Receive(void) //使用中断接受时不用此函数
(0120) {
(0121) while ( !(UCSRA & (1<<RXC)) ) // 等待接收数据
_USART_Receive:
00B7 9B5F SBIS 0x0B,7
00B8 CFFE RJMP _USART_Receive
(0122) ;
(0123) return UDR; // 从缓冲器中获取并返回数据
00B9 B10C IN R16,0x0C
00BA 9508 RET
_uart0_rx_isr:
00BB 940E01DD CALL push_lset
(0124) }
(0125)
(0126) #pragma interrupt_handler uart0_rx_isr:12
(0127) void uart0_rx_isr(void) //串口0的中断服务程序
(0128) {
(0129) USART_Transmit(UDR); //把接收到的数据重新发回给PC机
00BD B10C IN R16,0x0C
00BE DFF4 RCALL _USART_Transmit
00BF 940E01F4 CALL pop_lset
00C1 9518 RETI
(0130) }
(0131)
(0132)
(0133) //call this routine to initialize all peripherals
(0134) void init_devices(void)
(0135) {
(0136) //stop errant interrupts until set up
(0137) CLI(); //disable all interrupts
_init_devices:
00C2 94F8 BCLR 7
(0138) port_init();
00C3 DF8D RCALL _port_init
(0139) timer0_init();
00C4 DF97 RCALL _timer0_init
(0140) uart0_init();
00C5 DFE2 RCALL _uart0_init
(0141) spi_init();
00C6 DFCE RCALL _spi_init
(0142) adc_init();
00C7 DF9D RCALL _adc_init
(0143) MCUCR = 0x00;
00C8 2422 CLR R2
00C9 BE25 OUT 0x35,R2
(0144) GICR = 0x00;
00CA BE2B OUT 0x3B,R2
(0145) ASSR &= ~(0X08);
00CB B582 IN R24,0x22
00CC 7F87 ANDI R24,0xF7
00CD BD82 OUT 0x22,R24
(0146) TIMSK = 0x01; //timer interrupt sources
00CE E081 LDI R24,1
00CF BF89 OUT 0x39,R24
(0147) SEI(); //re-enable interrupts
00D0 9478 BSET 7
00D1 9508 RET
(0148) //all peripherals are now initialized
(0149) }
(0150)
(0151)
(0152) void flash_led_type1(void) //PD口的跑马灯显示 从右到左
(0153) {
(0154) if (led_ch==0x02) led_ch=0x80;
_flash_led_type1:
00D2 91800060 LDS R24,led_ch
00D4 3082 CPI R24,2
00D5 F419 BNE 0x00D9
00D6 E880 LDI R24,0x80
00D7 93800060 STS led_ch,R24
(0155) PORTD=~(led_ch);
00D9 90200060 LDS R2,led_ch
00DB 9420 COM R2
00DC BA22 OUT 0x12,R2
(0156) led_ch=led_ch>>1;
00DD 90200060 LDS R2,led_ch
00DF 9426 LSR R2
00E0 92200060 STS led_ch,R2
00E2 9508 RET
(0157) }
(0158)
(0159) void flash_led_type2(void) //PD口的跑马灯显示 从左到右
(0160) {
(0161) if (led_ch==0x00) led_ch=0x02;
_flash_led_type2:
00E3 90200060 LDS R2,led_ch
00E5 2022 TST R2
00E6 F419 BNE 0x00EA
00E7 E082 LDI R24,2
00E8 93800060 STS led_ch,R24
(0162) PORTD=~(led_ch);
00EA 90200060 LDS R2,led_ch
00EC 9420 COM R2
00ED BA22 OUT 0x12,R2
(0163) led_ch=led_ch<<1;
00EE 90200060 LDS R2,led_ch
00F0 0C22 LSL R2
00F1 92200060 STS led_ch,R2
00F3 9508 RET
(0164) }
(0165)
(0166) void flash_led_type3(void) //PD口的跑马灯显示 反相
(0167) {
(0168) PORTD^=0XFC;
_flash_led_type3:
00F4 EF8C LDI R24,0xFC
00F5 E090 LDI R25,0
00F6 B222 IN R2,0x12
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -