📄 main.lis
字号:
.module main.c
.area data(ram, con, rel)
0000 _led_ch::
0000 .blkb 1
.area idata
0000 80 .byte 128
.area data(ram, con, rel)
0001 .dbfile E:\work\百步梯攀登计划\AVR程序\new\main.c
0001 .dbsym e led_ch _led_ch c
0001 _tmp_led_index::
0001 .blkb 1
.area idata
0001 00 .byte 0
.area data(ram, con, rel)
0002 .dbfile E:\work\百步梯攀登计划\AVR程序\new\main.c
0002 .dbsym e tmp_led_index _tmp_led_index c
.area lit(rom, con, rel)
0000 _LED_INDEX::
0000 3F06 .byte 63,6
0002 5B4F .byte 91,'O
0004 666D .byte 'f,'m
0006 7D07 .byte 125,7
0008 7F6F .byte 127,'o
000A .dbsym e LED_INDEX _LED_INDEX A[10:10]kc
.area text(rom, con, rel)
0000 .dbfile E:\work\百步梯攀登计划\AVR程序\new\main.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 17
0000 ; //ICC-AVR application builder : 2007-2-22 12:20:11
0000 ; // Target : M16
0000 ; // Crystal: 10.000Mhz
0000 ;
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; unsigned char tmp_cn_0; //临时计数器——0
0000 ; unsigned char tmp_cn_1; //临时计数器——1
0000 ; unsigned char led_ch=0x80; //闪烁的花样
0000 ; unsigned char key_code; //键盘按下的键盘代码
0000 ; unsigned char tmp_led_index=0x00;
0000 ; unsigned char const LED_INDEX[]={0X3F,0X06,0X5B,0X4F,
0000 ; 0X66,0X6D,0X7D,0X07,
0000 ; 0X7F,0X6F};//共阴管的数字0-9的代码
0000 ; void port_init(void)
0000 ; {
0000 .dbline 18
0000 ; PORTA = 0xC0;
0000 80EC ldi R24,192
0002 8BBB out 0x1b,R24
0004 .dbline 19
0004 ; DDRA = 0xC0; //高2位作为10位ADC的MSB,低2位用外部ADC输入,其余用于键盘的输入
0004 8ABB out 0x1a,R24
0006 .dbline 20
0006 ; PORTB = 0xFF;
0006 8FEF ldi R24,255
0008 88BB out 0x18,R24
000A .dbline 21
000A ; DDRB = 0xFF; //驱动静态595显示,只用到高4位,低四位保留
000A 87BB out 0x17,R24
000C .dbline 22
000C ; PORTC = 0xFF; //m103 output only
000C 85BB out 0x15,R24
000E .dbline 23
000E ; DDRC = 0xFF; //ADC的低8位输出
000E 84BB out 0x14,R24
0010 .dbline 24
0010 ; PORTD = 0xFF;
0010 82BB out 0x12,R24
0012 .dbline 25
0012 ; DDRD = 0xFF; //高6位用于显示LED,低2位用于串口的输出。
0012 81BB out 0x11,R24
0014 .dbline -2
0014 L1:
0014 .dbline 0 ; func end
0014 0895 ret
0016 .dbend
0016 .dbfunc e timer0_init _timer0_init fV
.even
0016 _timer0_init::
0016 .dbline -1
0016 .dbline 34
0016 ; }
0016 ;
0016 ;
0016 ; //TIMER0 initialize - prescale:256
0016 ; // WGM: Normal
0016 ; // desired value: 2mSec
0016 ; // actual value: 1.997mSec (0.2%)
0016 ; void timer0_init(void) //硬件计数器0的初始化程序
0016 ; {
0016 .dbline 35
0016 ; TCCR0 = 0x00; //stop
0016 2224 clr R2
0018 23BE out 0x33,R2
001A .dbline 36
001A ; TCNT0 = 0xB2; //set count
001A 82EB ldi R24,178
001C 82BF out 0x32,R24
001E .dbline 37
001E ; OCR0 = 0x4E; //set compare
001E 8EE4 ldi R24,78
0020 8CBF out 0x3c,R24
0022 .dbline 38
0022 ; TCCR0 = 0x04; //start timer
0022 84E0 ldi R24,4
0024 83BF out 0x33,R24
0026 .dbline -2
0026 L2:
0026 .dbline 0 ; func end
0026 0895 ret
0028 .dbend
0028 .dbfunc e adc_init _adc_init fV
.even
0028 _adc_init::
0028 .dbline -1
0028 .dbline 45
0028 ; }
0028 ;
0028 ; /*-----------------------ADC转换初始化----------------------------------------*/
0028 ; //ADC initialize
0028 ; // Conversion time: 26uS
0028 ; void adc_init(void)
0028 ; {
0028 .dbline 46
0028 ; ADCSR = 0x00; //disable adc
0028 2224 clr R2
002A 26B8 out 0x6,R2
002C .dbline 47
002C ; ADMUX = 0x00; //选择外部基准电压 通道 0 输入
002C 27B8 out 0x7,R2
002E .dbline 48
002E ; ACSR = 0xC0; //模拟比较器控制和状态寄存器 ACSR
002E 80EC ldi R24,192
0030 88B9 out 0x8,R24
0032 .dbline 53
0032 ; //ACD置1,使模拟比较器禁用
0032 ; /*--ACD--ACBG--ACO--ACI---ACIE---ACIC---ACIS1---ACIS0------------------------*/
0032 ; /*-模拟比较起禁用--模拟比较器的能隙基准源--模拟比较起输出--模拟比较器中断标志*/
0032 ; /*-模拟比较器中断使能--模拟比较器输入捕捉使能--模拟比较器中断模式选择--------*/
0032 ; ADCSR = 0x8B;//模拟比较起控制和状态寄存器
0032 8BE8 ldi R24,139
0034 86B9 out 0x6,R24
0036 .dbline -2
0036 L3:
0036 .dbline 0 ; func end
0036 0895 ret
0038 .dbend
.area vector(rom, abs)
.org 56
0038 0C941C00 jmp _adc_isr
.area text(rom, con, rel)
0038 .dbfile E:\work\百步梯攀登计划\AVR程序\new\main.c
0038 .dbfunc e adc_isr _adc_isr fV
0038 ; rr -> R16
.even
0038 _adc_isr::
0038 2A92 st -y,R2
003A 3A92 st -y,R3
003C 0A93 st -y,R16
003E 1A93 st -y,R17
0040 8A93 st -y,R24
0042 9A93 st -y,R25
0044 2FB6 in R2,0x3f
0046 2A92 st -y,R2
0048 .dbline -1
0048 .dbline 60
0048 ; /*-----------ADEN---ADSC---ADFR---ADIF---ADIE---ADPS2---ADPS1---ADPS0--------*/
0048 ; //使能模数转换 ADC开始转换 ADC连续转换 ADC中断使能 128分频
0048 ; }
0048 ; /*-----------------------ADC转换中断程序--------------------------------------*/
0048 ; #pragma interrupt_handler adc_isr:15
0048 ; void adc_isr(void) //组合输出ADC DATA
0048 ; {
0048 .dbline 61
0048 ; unsigned char rr=0;
0048 0027 clr R16
004A .dbline 63
004A ; //conversion complete, read value (int) using...
004A ; PORTC=~(ADCL); //c口显示低8位的信息 (反相)
004A 24B0 in R2,0x4
004C 2094 com R2
004E 25BA out 0x15,R2
0050 .dbline 64
0050 ; rr =ADCH<<6; //高8位的信息
0050 05B1 in R16,0x5
0052 000F lsl R16
0054 000F lsl R16
0056 000F lsl R16
0058 000F lsl R16
005A 000F lsl R16
005C 000F lsl R16
005E .dbline 65
005E ; rr ^=(0x03<<6); //反相
005E 80EC ldi R24,192
0060 90E0 ldi R25,0
0062 202E mov R2,R16
0064 3324 clr R3
0066 2826 eor R2,R24
0068 3926 eor R3,R25
006A 022D mov R16,R2
006C .dbline 66
006C ; PORTA=rr; //在A口高2位显示
006C 2BBA out 0x1b,R2
006E .dbline -2
006E L4:
006E 2990 ld R2,y+
0070 2FBE out 0x3f,R2
0072 9991 ld R25,y+
0074 8991 ld R24,y+
0076 1991 ld R17,y+
0078 0991 ld R16,y+
007A 3990 ld R3,y+
007C 2990 ld R2,y+
007E .dbline 0 ; func end
007E 1895 reti
0080 .dbsym r rr 16 c
0080 .dbend
0080 .dbfunc e start_adc_0 _start_adc_0 fV
.even
0080 _start_adc_0::
0080 .dbline -1
0080 .dbline 70
0080 ; }
0080 ;
0080 ; void start_adc_0(void) //启动ADC转换的程序
0080 ; {
0080 .dbline 71
0080 ; ADMUX = 0x00; //选择通道0
0080 2224 clr R2
0082 27B8 out 0x7,R2
0084 .dbline 72
0084 ; ADCSR |= 0x40; //开始ADC转换
0084 369A sbi 0x6,6
0086 .dbline -2
0086 L5:
0086 .dbline 0 ; func end
0086 0895 ret
0088 .dbend
0088 .dbfunc e spi_init _spi_init fV
.even
0088 _spi_init::
0088 .dbline -1
0088 .dbline 78
0088 ; }
0088 ;
0088 ; //SPI initialize //初始化硬件SPIS口的程序
0088 ; // clock rate: 2500000hz
0088 ; void spi_init(void)
0088 ; {
0088 .dbline 79
0088 ; SPCR = 0x50; //setup SPI
0088 80E5 ldi R24,80
008A 8DB9 out 0xd,R24
008C .dbline 80
008C ; SPSR = 0x00; //setup SPI
008C 2224 clr R2
008E 2EB8 out 0xe,R2
0090 .dbline -2
0090 L6:
0090 .dbline 0 ; func end
0090 0895 ret
0092 .dbend
0092 .dbfunc e SPI_595_Out _SPI_595_Out fV
0092 ; i -> R16
.even
0092 _SPI_595_Out::
0092 .dbline -1
0092 .dbline 84
0092 ; }
0092 ;
0092 ; void SPI_595_Out(unsigned char i) //HC595数据的输出
0092 ; {
0092 .dbline 85
0092 ; SPDR = i; /* 启动数据传输 */
0092 0FB9 out 0xf,R16
0094 L8:
0094 .dbline 86
0094 L9:
0094 .dbline 86
0094 ; while (!(SPSR & (1<<SPIF))); //等待传输结束
0094 779B sbis 0xe,7
0096 FECF rjmp L8
0098 .dbline -2
0098 L7:
0098 .dbline 0 ; func end
0098 0895 ret
009A .dbsym r i 16 c
009A .dbend
009A .dbfunc e disp_led _disp_led fV
009A ; i -> R20
.even
009A _disp_led::
009A 0E940000 xcall push_gset1
009E 402F mov R20,R16
00A0 .dbline -1
00A0 .dbline 90
00A0 ; }
00A0 ;
00A0 ; void disp_led(unsigned char i)
00A0 ; {
00A0 .dbline 91
00A0 ; PORTB &= ~(1 << PB4); //准备锁存,在全部的四个LED数据送完后再锁存
00A0 C498 cbi 0x18,4
00A2 .dbline 92
00A2 ; SPI_595_Out(i);
00A2 042F mov R16,R20
00A4 F6DF xcall _SPI_595_Out
00A6 .dbline 93
00A6 ; PORTB |= (1 << PB4); //在这个时候锁存数据 显示
00A6 C49A sbi 0x18,4
00A8 .dbline -2
00A8 L11:
00A8 0E940000 xcall pop_gset1
00AC .dbline 0 ; func end
00AC 0895 ret
00AE .dbsym r i 20 c
00AE .dbend
00AE .dbfunc e uart0_init _uart0_init fV
.even
00AE _uart0_init::
00AE .dbline -1
00AE .dbline 102
00AE ; }
00AE ;
00AE ; //UART0 initialize //初始化串口0的程序
00AE ; // desired baud rate: 9600
00AE ; // actual: baud rate:9615 (0.2%)
00AE ; // char size: 8 bit 没有校验位
00AE ; // parity: Disabled
00AE ; void uart0_init(void)
00AE ; {
00AE .dbline 103
00AE ; UCSRB = 0x00; //disable while setting baud rate
00AE 2224 clr R2
00B0 2AB8 out 0xa,R2
00B2 .dbline 104
00B2 ; UCSRA = 0x00;
00B2 2BB8 out 0xb,R2
00B4 .dbline 105
00B4 ; UCSRC = BIT(URSEL) | 0x06;
00B4 86E8 ldi R24,134
00B6 80BD out 0x20,R24
00B8 .dbline 106
00B8 ; UBRRL = 0x40; //set baud rate lo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -