📄 main.lst
字号:
__text_start:
__start:
000C EDCF LDI R28,0xDF
000D E0D0 LDI R29,0
000E BFCD OUT 0x3D,R28
000F BFDE OUT 0x3E,R29
0010 51C0 SUBI R28,0x10
0011 40D0 SBCI R29,0
0012 EA0A LDI R16,0xAA
0013 8308 STD Y+0,R16
0014 2400 CLR R0
0015 E6E0 LDI R30,0x60
0016 E0F0 LDI R31,0
0017 E010 LDI R17,0
0018 37E4 CPI R30,0x74
0019 07F1 CPC R31,R17
001A F011 BEQ 0x001D
001B 9201 ST R0,Z+
001C CFFB RJMP 0x0018
001D 8300 STD Z+0,R16
001E E1E8 LDI R30,0x18
001F E0F0 LDI R31,0
0020 E6A0 LDI R26,0x60
0021 E0B0 LDI R27,0
0022 E010 LDI R17,0
0023 31E8 CPI R30,0x18
0024 07F1 CPC R31,R17
0025 F021 BEQ 0x002A
0026 95C8 LPM
0027 9631 ADIW R30,1
0028 920D ST R0,X+
0029 CFF9 RJMP 0x0023
002A D0C3 RCALL _main
_exit:
002B CFFF RJMP _exit
FILE: I:\REDFOX~1\Remote\main.c
(0001)
(0002) //ICC-AVR application builder : 2007-11-18 19:20:12
(0003) // Target : T26
(0004) // Crystal: 2.0000Mhz
(0005)
(0006)
(0007)
(0008) #include <iot26v.h>
(0009) #include <macros.h>
(0010)
(0011)
(0012)
(0013) #define uchar unsigned char
(0014) #define uint unsigned int
(0015)
(0016) #define UP 0xC0
(0017) #define STOP 0xA0
(0018) #define DOWN 0x60
(0019)
(0020)
(0021) #define SET_LED1 PORTB |= (1<<PB5)
(0022) #define CLR_LED1 PORTB &= ~(1<<PB5)
(0023)
(0024) #define SET_LED2 PORTB |= (1<<PB4)
(0025) #define CLR_LED2 PORTB &= ~(1<<PB4)
(0026)
(0027) #define SET_RLY1 PORTA |= (1<<PA1)
(0028) #define CLR_RLY1 PORTA &= ~(1<<PA1)
(0029)
(0030) #define SET_RLY2 PORTA |= (1<<PA0)
(0031) #define CLR_RLY2 PORTA &= ~(1<<PA0)
(0032)
(0033)
(0034)
(0035) uchar flag_4ms;
(0036) uchar led_time;
(0037) uint key,key1,key2;
(0038)
(0039) uchar flag,rxd_flag;
(0040) uchar start,bits;
(0041) uchar timeH,timeL;
(0042) uchar datas;
(0043) uchar addrH,addrL;
(0044) uint addr;
(0045) uchar rxd_data;
(0046)
(0047)
(0048) void port_init(void)
(0049) {
(0050) PORTB = 0x0F;
_port_init:
002C E08F LDI R24,0xF
002D BB88 OUT 0x18,R24
(0051) DDRB = 0x30;
002E E380 LDI R24,0x30
002F BB87 OUT 0x17,R24
(0052)
(0053) PORTA = 0xE0;
0030 EE80 LDI R24,0xE0
0031 BB8B OUT 0x1B,R24
(0054) DDRA = 0x03;
0032 E083 LDI R24,3
0033 BB8A OUT 0x1A,R24
0034 9508 RET
(0055) }
(0056)
(0057)
(0058) void timer0_init(void)
(0059) {
(0060) TCCR0 = 0x00; //stop
_timer0_init:
0035 2422 CLR R2
0036 BE23 OUT 0x33,R2
(0061) TCNT0 = 0x83; //set count
0037 E883 LDI R24,0x83
0038 BF82 OUT 0x32,R24
(0062) TCCR0 = 0x03; //start timer
0039 E083 LDI R24,3
003A BF83 OUT 0x33,R24
003B 9508 RET
(0063) }
(0064)
(0065) void timer1_init(void)
(0066) {
(0067) TCCR1B = 0x00; //stop
_timer1_init:
003C 2422 CLR R2
003D BC2F OUT 0x2F,R2
(0068) TCNT1 = 0x06;
003E E086 LDI R24,6
003F BD8E OUT 0x2E,R24
(0069) OCR1A = 0xFA;
0040 EF8A LDI R24,0xFA
0041 BD8D OUT 0x2D,R24
(0070) OCR1B = 0xFA;
0042 BD8C OUT 0x2C,R24
(0071) OCR1C = 0x80;
0043 E880 LDI R24,0x80
0044 BD8B OUT 0x2B,R24
(0072) TCCR1A = 0x00;
0045 BE20 OUT 0x30,R2
0046 9508 RET
(0073) //TCCR1B = 0x05; //start Timer
(0074) }
(0075)
(0076)
(0077) void init_eeprom(void)
(0078) {
(0079) EECR = 0x07;
_init_eeprom:
0047 E087 LDI R24,7
0048 BB8C OUT 0x1C,R24
0049 9508 RET
(0080) }
(0081)
(0082)
(0083)
(0084) void EEPROM_write(unsigned char Address, unsigned char Datas)
(0085) {
(0086) while(EECR & (1<<EEWE));// 等待上一次写操作结束
_EEPROM_write:
Datas --> R18
Address --> R16
004A 99E1 SBIC 0x1C,1
004B CFFE RJMP _EEPROM_write
(0087)
(0088) EEARL= Address; // 设置地址和数据寄存器
004C BB0E OUT 0x1E,R16
(0089) EEDR = Datas;
004D BB2D OUT 0x1D,R18
(0090) EECR |= (1<<EEMWE); // 置位EEMWE
004E 9AE2 SBI 0x1C,2
(0091) EECR |= (1<<EEWE); // 置位EEWE 以启动写操作E
004F 9AE1 SBI 0x1C,1
0050 9508 RET
(0092) }
(0093)
(0094)
(0095) unsigned char EEPROM_read(unsigned char uiAddress)
(0096) {
(0097) while(EECR&(1<<EEWE)); //等待上一次写操作结束
_EEPROM_read:
uiAddress --> R16
0051 99E1 SBIC 0x1C,1
0052 CFFE RJMP _EEPROM_read
(0098) EEARL = uiAddress; // 设置地址寄存器
0053 BB0E OUT 0x1E,R16
(0099) EECR |= (1<<EERE); // 设置EERE 以启动读操作
0054 9AE0 SBI 0x1C,0
(0100) return EEDR; // 自数据寄存器返回数据
0055 B30D IN R16,0x1D
0056 9508 RET
(0101) }
(0102)
(0103)
(0104)
(0105)
(0106)
(0107)
(0108)
(0109) //call this routine to initialize all peripherals
(0110) void init_devices(void)
(0111) {
(0112) CLI(); //disable all interrupts
_init_devices:
0057 94F8 BCLR 7
(0113)
(0114) port_init();
0058 DFD3 RCALL _port_init
(0115) timer0_init();
0059 DFDB RCALL _timer0_init
(0116) timer1_init();
005A DFE1 RCALL _timer1_init
(0117) init_eeprom();
005B DFEB RCALL _init_eeprom
(0118)
(0119) MCUCR = 0x02;
005C E082 LDI R24,2
005D BF85 OUT 0x35,R24
(0120) TIMSK = 0x06; //timer interrupt sources
005E E086 LDI R24,6
005F BF89 OUT 0x39,R24
(0121) GIMSK = 0x40; //interrupt sources
0060 E480 LDI R24,0x40
0061 BF8B OUT 0x3B,R24
(0122) PLLCSR = 0x00; //PLL
0062 2422 CLR R2
0063 BC29 OUT 0x29,R2
(0123) WDR(); //this prevents a timout on enabling
0064 95A8 WDR
(0124) WDTCR = 0x08; //WATCHDOG ENABLED - dont forget to issue WD
0065 E088 LDI R24,0x8
0066 BD81 OUT 0x21,R24
(0125)
(0126) SEI(); //re-enable interrupts
0067 9478 BSET 7
0068 9508 RET
(0127) }
(0128)
(0129)
(0130) /*---------------------------------------------------------------
(0131) 按键扫描
(0132) ----------------------------------------------------------------*/
(0133)
(0134) void key_scan(void)
(0135) {
(0136) uchar temp;
(0137)
(0138) temp = PINA & 0xE0;
_key_scan:
temp --> R16
0069 B309 IN R16,0x19
006A 7E00 ANDI R16,0xE0
(0139)
(0140) if(temp==UP)
006B 3C00 CPI R16,0xC0
006C F4A1 BNE 0x0081
(0141) {
(0142) SET_LED2;
006D 9AC4 SBI 0x18,4
(0143) //if(key<500)
(0144) {
(0145) key ++;
006E 91800070 LDS R24,key
0070 91900071 LDS R25,key+1
0072 9601 ADIW R24,1
0073 93900071 STS key+1,R25
0075 93800070 STS key,R24
(0146) if(key>=5)
0077 3085 CPI R24,5
0078 E0E0 LDI R30,0
0079 079E CPC R25,R30
007A F408 BCC 0x007C
007B C03B RJMP 0x00B7
(0147) {
(0148) CLR_RLY2;
007C 98D8 CBI 0x1B,0
(0149) asm("nop");
007D 0000 NOP
(0150) asm("nop");
007E 0000 NOP
(0151) SET_RLY1;
007F 9AD9 SBI 0x1B,1
(0152) }
(0153) }
(0154) }
0080 C036 RJMP 0x00B7
(0155)
(0156) else if(temp==STOP) // k1
0081 3A00 CPI R16,0xA0
0082 F489 BNE 0x0094
(0157) {
(0158) SET_LED2;
0083 9AC4 SBI 0x18,4
(0159) //if(key1<500)
(0160) {
(0161) key1 ++;
0084 9180006E LDS R24,key1
0086 9190006F LDS R25,key1+1
0088 9601 ADIW R24,1
0089 9390006F STS key1+1,R25
008B 9380006E STS key1,R24
(0162) if(key1>=5) // 短按
008D 3085 CPI R24,5
008E E0E0 LDI R30,0
008F 079E CPC R25,R30
0090 F130 BCS 0x00B7
(0163) {
(0164) CLR_RLY1;
0091 98D9 CBI 0x1B,1
(0165) CLR_RLY2;
0092 98D8 CBI 0x1B,0
(0166) }
(0167) }
(0168) }
0093 C023 RJMP 0x00B7
(0169)
(0170) else if(temp==DOWN) // k2
0094 3600 CPI R16,0x60
0095 F499 BNE 0x00A9
(0171) {
(0172) SET_LED2;
0096 9AC4 SBI 0x18,4
(0173) //if(key2<500)
(0174) {
(0175) key2 ++;
0097 9180006C LDS R24,key2
0099 9190006D LDS R25,key2+1
009B 9601 ADIW R24,1
009C 9390006D STS key2+1,R25
009E 9380006C STS key2,R24
(0176) if(key2>=5) // 短按
00A0 3085 CPI R24,5
00A1 E0E0 LDI R30,0
00A2 079E CPC R25,R30
00A3 F098 BCS 0x00B7
(0177) {
(0178) CLR_RLY1;
00A4 98D9 CBI 0x1B,1
(0179) asm("nop");
00A5 0000 NOP
(0180) asm("nop");
00A6 0000 NOP
(0181) SET_RLY2;
00A7 9AD8 SBI 0x1B,0
(0182)
(0183) }
(0184) }
(0185) }
00A8 C00E RJMP 0x00B7
(0186) else
(0187) {
(0188) key = key1 = key2 = 0;
00A9 2422 CLR R2
00AA 2433 CLR R3
00AB 9230006D STS key2+1,R3
00AD 9220006C STS key2,R2
00AF 9230006F STS key1+1,R3
00B1 9220006E STS key1,R2
00B3 92300071 STS key+1,R3
00B5 92200070 STS key,R2
(0189) //CLR_LED2;
(0190) }
00B7 9508 RET
(0191) }
(0192)
(0193)
(0194)
(0195) void Remote_set(void)
(0196) {
(0197) if(led_time<50) led_time ++;
_Remote_set:
00B8 91800072 LDS R24,led_time
00BA 3382 CPI R24,0x32
00BB F420 BCC 0x00C0
00BC 5F8F SUBI R24,0xFF
00BD 93800072 STS led_time,R24
00BF C001 RJMP 0x00C1
(0198) else CLR_LED2;
00C0 98C4 CBI 0x18,4
(0199)
(0200) if(rxd_flag)
00C1 9020006A LDS R2,rxd_flag
00C3 2022 TST R2
00C4 F141 BEQ 0x00ED
(0201) {
(0202) rxd_flag = 0;
00C5 2422 CLR R2
00C6 9220006A STS rxd_flag,R2
(0203) if(addr==0xaaaa) // 地址正确
00C8 91800061 LDS R24,addr
00CA 91900062 LDS R25,addr+1
00CC 3A8A CPI R24,0xAA
00CD EAEA LDI R30,0xAA
00CE 079E CPC R25,R30
00CF F4E9 BNE 0x00ED
(0204) {
(0205) SET_LED2;
00D0 9AC4 SBI 0x18,4
(0206) led_time = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -