📄 m8demo.lst
字号:
__text_start:
__start:
00CA E5CF LDI R28,0x5F
00CB E0D4 LDI R29,4
00CC BFCD OUT 0x3D,R28
00CD BFDE OUT 0x3E,R29
00CE 52C0 SUBI R28,0x20
00CF 40D0 SBCI R29,0
00D0 EA0A LDI R16,0xAA
00D1 8308 STD Y+0,R16
00D2 2400 CLR R0
00D3 EBEE LDI R30,0xBE
00D4 E0F1 LDI R31,1
00D5 E011 LDI R17,1
00D6 3CEF CPI R30,0xCF
00D7 07F1 CPC R31,R17
00D8 F011 BEQ 0x00DB
00D9 9201 ST R0,Z+
00DA CFFB RJMP 0x00D6
00DB 8300 STD Z+0,R16
00DC E3E6 LDI R30,0x36
00DD E0F0 LDI R31,0
00DE E6A0 LDI R26,0x60
00DF E0B0 LDI R27,0
00E0 E011 LDI R17,1
00E1 39E4 CPI R30,0x94
00E2 07F1 CPC R31,R17
00E3 F021 BEQ 0x00E8
00E4 95C8 LPM
00E5 9631 ADIW R30,1
00E6 920D ST R0,X+
00E7 CFF9 RJMP 0x00E1
00E8 D56D RCALL _main
_exit:
00E9 CFFF RJMP _exit
FILE: D:\Datasheet\Atmel\FROMJI~1\AVR_Demo\m8\SoftWare\M8Demo.c
(0001) //ICC-AVR application builder : 2003-11-10 10:04:46
(0002) // Target : M8
(0003) // Crystal: 7.3728Mhz
(0004) #include <iom8v.h>
(0005) #include <macros.h>
(0006) #include "M8Demo.h"
(0007) #include"I2C.H"
(0008) #include "Eeprom.h"
(0009) #include "AT45DB021.h"
(0010) #include "Uart.h"
(0011) #include "assembly.h"
(0012) unsigned int DelayTimer;
(0013) unsigned int TimerCount;
(0014) unsigned int TimerCountOld;
(0015) unsigned int key_tick;
(0016) unsigned char key_state;
(0017) unsigned char key_value;
(0018) unsigned char key_pressed;
(0019) unsigned char mode_state;
(0020)
(0021) unsigned char *OutPutStr;
(0022) unsigned char out_eeprom_data;
(0023) unsigned char out_eeprom_addr=0;
(0024) unsigned char in_eeprom_data;
(0025) unsigned char in_eeprom_addr=0;
(0026) unsigned int adc_value=0;
(0027) unsigned char AT45DB021_data;
(0028) unsigned char AT45DB021_addr=0;
(0029) unsigned char Display_Position=0;
(0030)
(0031) const char DataTab[16]=
(0032) {0xc0,0xf9,0xa4,0xb0,0x99,0x92,
(0033) 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8E};
(0034)
(0035)
(0036) void Delay(unsigned int delay_time)
(0037) {
_Delay:
delay_time --> R16
00EA C002 RJMP 0x00ED
(0038) while(delay_time)
(0039) delay_time--;
00EB 5001 SUBI R16,1
00EC 4010 SBCI R17,0
00ED 3000 CPI R16,0
00EE 0701 CPC R16,R17
00EF F7D9 BNE 0x00EB
00F0 9508 RET
(0040) }
(0041)
(0042) void Delayms(unsigned int timers)
(0043) {
(0044) DelayTimer=0;
_Delayms:
timers --> R16
00F1 2422 CLR R2
00F2 2433 CLR R3
00F3 923001CE STS DelayTimer+1,R3
00F5 922001CD STS DelayTimer,R2
00F7 C008 RJMP 0x0100
(0045) while(1)
(0046) {if(DelayTimer>timers)
00F8 902001CD LDS R2,DelayTimer
00FA 903001CE LDS R3,DelayTimer+1
00FC 1502 CP R16,R2
00FD 0513 CPC R17,R3
00FE F408 BCC 0x0100
(0047) return;
00FF C001 RJMP 0x0101
0100 CFF7 RJMP 0x00F8
0101 9508 RET
(0048) }
(0049) }
(0050)
(0051) void port_init(void)
(0052) {
(0053) PORTB = 0xFF;
_port_init:
0102 EF8F LDI R24,0xFF
0103 BB88 OUT 0x18,R24
(0054) DDRB = 0xFF;
0104 BB87 OUT 0x17,R24
(0055) PORTC = 0x7F; //m103 output only
0105 E78F LDI R24,0x7F
0106 BB85 OUT 0x15,R24
(0056) DDRC = 0x79;
0107 E789 LDI R24,0x79
0108 BB84 OUT 0x14,R24
(0057) PORTD = 0xFF;
0109 EF8F LDI R24,0xFF
010A BB82 OUT 0x12,R24
(0058) DDRD = 0xFC;
010B EF8C LDI R24,0xFC
010C BB81 OUT 0x11,R24
010D 9508 RET
(0059) }
(0060)
(0061) //TIMER0 initialisation - prescale:1024
(0062) // WGM: Normal
(0063) // desired value: 10mSec
(0064) // actual value: 10.000mSec (0.0%)
(0065) void timer0_init(void)
(0066) {
(0067) TCCR0 = 0x00; //stop
_timer0_init:
010E 2422 CLR R2
010F BE23 OUT 0x33,R2
(0068) TCNT0 = 0x8D; //set count
0110 E88D LDI R24,0x8D
0111 BF82 OUT 0x32,R24
(0069) TCCR0 = 0x03; //start timer
0112 E083 LDI R24,3
0113 BF83 OUT 0x33,R24
0114 9508 RET
_timer0_ovf_isr:
0115 D9CC RCALL push_lset
0116 D9B4 RCALL push_gset1
(0070)
(0071) }
(0072)
(0073) #pragma interrupt_handler timer0_ovf_isr:10
(0074) void timer0_ovf_isr(void)
(0075) {
(0076) TCNT0 = 0x8D; //reload counter value
0117 E88D LDI R24,0x8D
0118 BF82 OUT 0x32,R24
(0077) // TCNT0 = 0xA4; //reload counter value
(0078)
(0079) DelayTimer++;
0119 918001CD LDS R24,DelayTimer
011B 919001CE LDS R25,DelayTimer+1
011D 9601 ADIW R24,1
011E 939001CE STS DelayTimer+1,R25
0120 938001CD STS DelayTimer,R24
(0080) key_tick++;
0122 918001C7 LDS R24,key_tick
0124 919001C8 LDS R25,key_tick+1
0126 9601 ADIW R24,1
0127 939001C8 STS key_tick+1,R25
0129 938001C7 STS key_tick,R24
(0081) Display_Position++;
012B 91800065 LDS R24,Display_Position
012D 5F8F SUBI R24,0xFF
012E 93800065 STS Display_Position,R24
(0082) if(Display_Position>=5)
0130 3085 CPI R24,5
0131 F018 BCS 0x0135
(0083) Display_Position=1;
0132 E081 LDI R24,1
0133 93800065 STS Display_Position,R24
(0084)
(0085) switch(mode_state)
0135 914001C3 LDS R20,mode_state
0137 2755 CLR R21
0138 3040 CPI R20,0
0139 0745 CPC R20,R21
013A F129 BEQ 0x0160
013B 3041 CPI R20,1
013C E0E0 LDI R30,0
013D 075E CPC R21,R30
013E F139 BEQ 0x0166
013F 3042 CPI R20,2
0140 E0E0 LDI R30,0
0141 075E CPC R21,R30
0142 F119 BEQ 0x0166
0143 3043 CPI R20,3
0144 E0E0 LDI R30,0
0145 075E CPC R21,R30
0146 F0F9 BEQ 0x0166
0147 3044 CPI R20,4
0148 E0E0 LDI R30,0
0149 075E CPC R21,R30
014A F109 BEQ 0x016C
014B 3045 CPI R20,5
014C E0E0 LDI R30,0
014D 075E CPC R21,R30
014E F0E9 BEQ 0x016C
014F 3046 CPI R20,6
0150 E0E0 LDI R30,0
0151 075E CPC R21,R30
0152 F0C9 BEQ 0x016C
0153 3047 CPI R20,7
0154 E0E0 LDI R30,0
0155 075E CPC R21,R30
0156 F0D9 BEQ 0x0172
0157 3048 CPI R20,0x8
0158 E0E0 LDI R30,0
0159 075E CPC R21,R30
015A F0E9 BEQ 0x0178
015B 3049 CPI R20,0x9
015C E0E0 LDI R30,0
015D 075E CPC R21,R30
015E F0C9 BEQ 0x0178
015F C01D RJMP 0x017D
(0086) {
(0087) case clock_mode: DisplayTimer(TimerCount);break;
0160 910001CB LDS R16,TimerCount
0162 911001CC LDS R17,TimerCount+1
0164 D164 RCALL _DisplayTimer
0165 C017 RJMP 0x017D
(0088) case out_eeprom_addr_modify_mode:
(0089) case out_eeprom_data_modify_mode:
(0090) case out_eeprom_read_mode:DisplayHexData(out_eeprom_addr,out_eeprom_data);break;
0166 912001C0 LDS R18,out_eeprom_data
0168 91000060 LDS R16,out_eeprom_addr
016A D0BD RCALL _DisplayHexData
016B C011 RJMP 0x017D
(0091) case in_eeprom_addr_modify_mode:
(0092) case in_eeprom_data_modify_mode:
(0093) case in_eeprom_read_mode:DisplayHexData(in_eeprom_addr,in_eeprom_data);break;
016C 912001BF LDS R18,in_eeprom_data
016E 91000061 LDS R16,in_eeprom_addr
0170 D0B7 RCALL _DisplayHexData
0171 C00B RJMP 0x017D
(0094) case adc_mode:DisplayData( adc_value);break;
0172 91000062 LDS R16,adc_value
0174 91100063 LDS R17,adc_value+1
0176 D0CD RCALL _DisplayData
0177 C005 RJMP 0x017D
(0095) case AT45DB021_addr_modify_mode:
(0096) case AT45DB021_data_modify_mode:DisplayHexData(AT45DB021_addr,AT45DB021_data);break;
0178 912001BE LDS R18,AT45DB021_data
017A 91000064 LDS R16,AT45DB021_addr
017C D0AB RCALL _DisplayHexData
(0097) default :break;
017D D950 RCALL pop_gset1
017E D97A RCALL pop_lset
017F 9518 RETI
(0098) }
(0099)
(0100) }
(0101)
(0102) //TIMER1 initialisation - prescale:256
(0103) // WGM: 0) Normal, TOP=0xFFFF
(0104) // desired value: 1Sec
(0105) // actual value: 1.000Sec (0.0%)
(0106) void timer1_init(void)
(0107) {
(0108) TCCR1B = 0x00; //stop
_timer1_init:
0180 2422 CLR R2
0181 BC2E OUT 0x2E,R2
(0109) TCNT1H = 0x8F; //setup
0182 E88F LDI R24,0x8F
0183 BD8D OUT 0x2D,R24
(0110) TCNT1L = 0x80;
0184 E880 LDI R24,0x80
0185 BD8C OUT 0x2C,R24
(0111) OCR1AH = 0x70;
0186 E780 LDI R24,0x70
0187 BD8B OUT 0x2B,R24
(0112) OCR1AL = 0x80;
0188 E880 LDI R24,0x80
0189 BD8A OUT 0x2A,R24
(0113) OCR1BH = 0x70;
018A E780 LDI R24,0x70
018B BD89 OUT 0x29,R24
(0114) OCR1BL = 0x80;
018C E880 LDI R24,0x80
018D BD88 OUT 0x28,R24
(0115) ICR1H = 0x70;
018E E780 LDI R24,0x70
018F BD87 OUT 0x27,R24
(0116) ICR1L = 0x80;
0190 E880 LDI R24,0x80
0191 BD86 OUT 0x26,R24
(0117) TCCR1A = 0x00;
0192 BC2F OUT 0x2F,R2
(0118) TCCR1B = 0x04; //start Timer
0193 E084 LDI R24,4
0194 BD8E OUT 0x2E,R24
0195 9508 RET
_timer1_ovf_isr:
0196 922A ST R2,-Y
0197 923A ST R3,-Y
0198 938A ST R24,-Y
0199 939A ST R25,-Y
019A 93EA ST R30,-Y
019B B62F IN R2,0x3F
019C 922A ST R2,-Y
(0119) }
(0120)
(0121) #pragma interrupt_handler timer1_ovf_isr:9
(0122) void timer1_ovf_isr(void)
(0123) {
(0124) //TIMER1 has overflowed
(0125) TCNT1H = 0x8F; //reload counter high value
019D E88F LDI R24,0x8F
019E BD8D OUT 0x2D,R24
(0126) TCNT1L = 0x80; //reload counter low value
019F E880 LDI R24,0x80
01A0 BD8C OUT 0x2C,R24
(0127) TimerCount++;
01A1 918001CB LDS R24,TimerCount
01A3 919001CC LDS R25,TimerCount+1
01A5 9601 ADIW R24,1
01A6 939001CC STS TimerCount+1,R25
01A8 938001CB STS TimerCount,R24
(0128) if(TimerCount==3600)
01AA 3180 CPI R24,0x10
01AB E0EE LDI R30,0xE
01AC 079E CPC R25,R30
01AD F431 BNE 0x01B4
(0129) TimerCount=0;
01AE 2422 CLR R2
01AF 2433 CLR R3
01B0 923001CC STS TimerCount+1,R3
01B2 922001CB STS TimerCount,R2
01B4 9029 LD R2,Y+
01B5 BE2F OUT 0x3F,R2
01B6 91E9 LD R30,Y+
01B7 9199 LD R25,Y+
01B8 9189 LD R24,Y+
01B9 9039 LD R3,Y+
01BA 9029 LD R2,Y+
01BB 9518 RETI
(0130) }
(0131)
(0132)
(0133) void spi_init(void)
(0134) {
(0135) SPCR = 0x70; //setup SPI
_spi_init:
01BC E780 LDI R24,0x70
01BD B98D OUT 0x0D,R24
(0136) SPSR = 0x00; //setup SPI
01BE 2422 CLR R2
01BF B82E OUT 0x0E,R2
01C0 9508 RET
(0137) }
(0138)
(0139) //TWI initialisation
(0140) // bit rate:1
(0141) void twi_init(void)
(0142) {
(0143) TWCR= 0X00; //disable twi
_twi_init:
01C1 2422 CLR R2
01C2 BE26 OUT 0x36,R2
(0144) TWBR= 0x01; //set bit rate
01C3 E081 LDI R24,1
01C4 B980 OUT 0x00,R24
(0145) TWSR= 0x00; //set prescale
01C5 B821 OUT 0x01,R2
(0146) TWAR= 0x02; //set slave address
01C6 E082 LDI R24,2
01C7 B982 OUT 0x02,R24
(0147) TWCR= 0x44; //enable twi
01C8 E484 LDI R24,0x44
01C9 BF86 OUT 0x36,R24
01CA 9508 RET
(0148) }
(0149)
(0150) void twi_Enable(void)
(0151) {
(0152) TWCR= 0x44; //enable twi
_twi_Enable:
01CB E484 LDI R24,0x44
01CC BF86 OUT 0x36,R24
01CD 9508 RET
(0153) }
(0154) void twi_Disable(void)
(0155) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -