?? 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; //臨時計數(shù)器——0
(0009) unsigned char tmp_cn_1; //臨時計數(shù)器——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};//共陰管的數(shù)字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; //驅(qū)動靜態(tài)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) //硬件計數(shù)器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轉(zhuǎn)換初始化----------------------------------------*/
(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; //模擬比較器控制和狀態(tài)寄存器 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;//模擬比較起控制和狀態(tài)寄存器
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) //使能模數(shù)轉(zhuǎn)換 ADC開始轉(zhuǎn)換 ADC連續(xù)轉(zhuǎn)換 ADC中斷使能 128分頻
(0056) }
(0057) /*-----------------------ADC轉(zhuǎn)換中斷程序--------------------------------------*/
(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轉(zhuǎn)換的程序
(0070) {
(0071) ADMUX = 0x00; //選擇通道0
_start_adc_0:
0091 2422 CLR R2
0092 B827 OUT 0x07,R2
(0072) ADCSR |= 0x40; //開始ADC轉(zhuǎn)換
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數(shù)據(jù)的輸出
(0084) {
(0085) SPDR = i; /* 啟動數(shù)據(jù)傳輸 */
_SPI_595_Out:
i --> R16
009A B90F OUT 0x0F,R16
(0086) while (!(SPSR & (1<<SPIF))); //等待傳輸結(jié)束
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數(shù)據(jù)送完后再鎖存
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); //在這個時候鎖存數(shù)據(jù) 顯示
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)) ) // 等待發(fā)送緩沖器為空
_USART_Transmit:
data --> R16
00B3 9B5D SBIS 0x0B,5
00B4 CFFE RJMP _USART_Transmit
(0115) ;
(0116) UDR = data; //將數(shù)據(jù)放入緩沖器,發(fā)送數(shù)據(jù)
00B5 B90C OUT 0x0C,R16
00B6 9508 RET
(0117) }
(0118)
(0119) unsigned char USART_Receive(void) //使用中斷接受時不用此函數(shù)
(0120) {
(0121) while ( !(UCSRA & (1<<RXC)) ) // 等待接收數(shù)據(jù)
_USART_Receive:
00B7 9B5F SBIS 0x0B,7
00B8 CFFE RJMP _USART_Receive
(0122) ;
(0123) return UDR; // 從緩沖器中獲取并返回數(shù)據(jù)
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的中斷服務(wù)程序
(0128) {
(0129) USART_Transmit(UDR); //把接收到的數(shù)據(jù)重新發(fā)回給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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -