⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lst

📁 这一个用ATTINY26做的433M无线遥控解码程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -