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

📄 lyj.lst

📁 /*红外解码的方法 NEC格式 upd6121 1、9Ms的高电平启动头
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0013 E5CF      LDI	R28,0x5F
    0014 E0D4      LDI	R29,4
    0015 BFCD      OUT	0x3D,R28
    0016 BFDE      OUT	0x3E,R29
    0017 51C0      SUBI	R28,0x10
    0018 40D0      SBCI	R29,0
    0019 EA0A      LDI	R16,0xAA
    001A 8308      STD	Y+0,R16
    001B 2400      CLR	R0
    001C E6E0      LDI	R30,0x60
    001D E0F0      LDI	R31,0
    001E E010      LDI	R17,0
    001F 36EF      CPI	R30,0x6F
    0020 07F1      CPC	R31,R17
    0021 F011      BEQ	0x0024
    0022 9201      ST	R0,Z+
    0023 CFFB      RJMP	0x001F
    0024 8300      STD	Z+0,R16
    0025 E2E6      LDI	R30,0x26
    0026 E0F0      LDI	R31,0
    0027 E6A0      LDI	R26,0x60
    0028 E0B0      LDI	R27,0
    0029 E010      LDI	R17,0
    002A 32E6      CPI	R30,0x26
    002B 07F1      CPC	R31,R17
    002C F021      BEQ	0x0031
    002D 95C8      LPM
    002E 9631      ADIW	R30,1
    002F 920D      ST	R0,X+
    0030 CFF9      RJMP	0x002A
    0031 D07A      RCALL	_main
_exit:
    0032 CFFF      RJMP	_exit
FILE: D:\IccAvr\Pei\LYJ\LYJ.c
(0001) //ICC-AVR application builder : 2006-2-26 21:26:27
(0002) // Target : 电动晾衣架 DC电机+红外
(0003) // Crystal: 8Mhz
(0004) 
(0005) /*红外解码的方法 NEC格式 upd6121
(0006) 1、9Ms的高电平启动头,然后是4.5Ms的低电平,如果2.25Ms时就有高电平,是持续信号,不处理
(0007) 2、然后以一个高电平和一个低电平为1Bit,高电平时间是0.5625Ms=562us,
(0008)    高低电平时间比为1:1时是Bit1,比为1:3时是Bit0
(0009) 3、Timer1中断执行100us采样周期,9Ms=90,4.5Ms=45,高电平=5,低电平最多15
(0010) 4、共读入4Byte共24bit,第1、2Byte是CustomCode码和其反码,第3、4Byte是DataCode和其反码
(0011) 5、CustomCode正确和DataCode效验正确的话,执行
(0012) 6、红外接收器输出是反相的
(0013) */
(0014) #include <eeprom.h>
(0015) #include "config.h"
(0016) #include <string.h>
(0017) 
(0018) #define VERSION 10
(0019) 
(0020) #define CT1H 0x94;//CA01=10ms 最小应答间隔
(0021) #define CT1L 0x01;//BF34=12ms AF01=15ms 9401=20ms
(0022) 
(0023) #define T0N 10
(0024) #define LEDON CLR(PORTB,LED);
(0025) #define LEDOFF SET(PORTB,LED);
(0026) 
(0027) #define CSTOP 1  
(0028) #define CUP   2
(0029) #define CDOWN 3
(0030) #define CLAMP 4
(0031) #define CDIS  5
(0032) 
(0033) //红外命令按键码
(0034) #define IRSTOP 10  
(0035) #define IRUP   11
(0036) #define IRDOWN 7
(0037) #define IRLAMP 2
(0038) #define IRDIS  14
(0039) 
(0040) bit b20ms,bTimer,bCmdOk,bIrCmdOk;
(0041) uchar T0Cnt,iCmd;
(0042) uchar iPreBit,iHight,iLow,iIrMode;
(0043) uchar iBitCount,iIrData[4];
(0044)  
(0045) void DelayMs(char);
(0046) void DelayUs(uint);
(0047) 
(0048) void PortInit(void)
(0049) {
(0050)  PORTB = 0xFD;
_PortInit:
    0033 EF8D      LDI	R24,0xFD
    0034 BB88      OUT	0x18,R24
(0051)  DDRB  = 0x02;
    0035 E082      LDI	R24,2
    0036 BB87      OUT	0x17,R24
(0052)  PORTC = 0x00; //m103 output only
    0037 2422      CLR	R2
    0038 BA25      OUT	0x15,R2
(0053)  DDRC  = 0x7F;
    0039 E78F      LDI	R24,0x7F
    003A BB84      OUT	0x14,R24
(0054)  PORTD = 0x9F;
    003B E98F      LDI	R24,0x9F
    003C BB82      OUT	0x12,R24
(0055)  DDRD  = 0x60;
    003D E680      LDI	R24,0x60
    003E BB81      OUT	0x11,R24
    003F 9508      RET
(0056)   
(0057) }
(0058) 
(0059) //Watchdog initialize
(0060) // prescale: 2048K
(0061) void WdtInit(void)
(0062) {
(0063)  WDR(); 
_WdtInit:
    0040 95A8      WDR
(0064)  WDTCR=(1<<WDTOE)|(1<<WDE);//!!注意:M8的WDT修改要先WDTOE,WDE=1 P42 
    0041 E188      LDI	R24,0x18
    0042 BD81      OUT	0x21,R24
(0065)  WDTCR=(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0);//2.2s 
    0043 E08F      LDI	R24,0xF
    0044 BD81      OUT	0x21,R24
    0045 9508      RET
(0066) }
(0067) 
(0068) void Timer0Init(void)
(0069) {
(0070)  TCCR0 = 0x00; //stop
_Timer0Init:
    0046 2422      CLR	R2
    0047 BE23      OUT	0x33,R2
(0071)  TCNT0 = 0x64; //set count
    0048 E684      LDI	R24,0x64
    0049 BF82      OUT	0x32,R24
(0072)  TCCR0 = 0x05; //start timer
    004A E085      LDI	R24,5
    004B BF83      OUT	0x33,R24
    004C 9508      RET
_Timer0:
    004D D279      RCALL	push_lset
(0073) }
(0074) 
(0075) #pragma interrupt_handler Timer0:10
(0076) void Timer0(void)
(0077) {
(0078)  TCNT0 = 0x64; //reload counter value 20ms
    004E E684      LDI	R24,0x64
    004F BF82      OUT	0x32,R24
(0079)  
(0080)  b20ms=1;
    0050 E081      LDI	R24,1
    0051 9380006E  STS	b20ms,R24
(0081)  if (--T0Cnt==0)
    0053 9180006A  LDS	R24,T0Cnt
    0055 5081      SUBI	R24,1
    0056 2E28      MOV	R2,R24
    0057 9220006A  STS	T0Cnt,R2
    0059 2388      TST	R24
    005A F431      BNE	0x0061
(0082)    {T0Cnt=T0N;
    005B E08A      LDI	R24,0xA
    005C 9380006A  STS	T0Cnt,R24
(0083)     bTimer=1;
    005E E081      LDI	R24,1
    005F 9380006D  STS	bTimer,R24
(0084)     }
(0085)  
(0086)  CheckStop();//判断限位开关
    0061 D1C5      RCALL	_CheckStop
    0062 D27B      RCALL	pop_lset
    0063 9518      RETI
(0087) 
(0088) }
(0089) //TIMER1 initialize - prescale:8
(0090) // WGM: 0) Normal, TOP=0xFFFF
(0091) // desired value: 100uSec
(0092) // actual value: 100.000uSec (0.0%)
(0093) void Timer1Init(void)
(0094) {
(0095)  TCCR1B = 0x00; //stop
_Timer1Init:
    0064 2422      CLR	R2
    0065 BC2E      OUT	0x2E,R2
(0096)  TCNT1H = 0xFF; //setup
    0066 EF8F      LDI	R24,0xFF
    0067 BD8D      OUT	0x2D,R24
(0097)  TCNT1L = 0x9C;
    0068 E98C      LDI	R24,0x9C
    0069 BD8C      OUT	0x2C,R24
(0098)  OCR1AH = 0x00;
    006A BC2B      OUT	0x2B,R2
(0099)  OCR1AL = 0x64;
    006B E684      LDI	R24,0x64
    006C BD8A      OUT	0x2A,R24
(0100)  OCR1BH = 0x00;
    006D BC29      OUT	0x29,R2
(0101)  OCR1BL = 0x64;
    006E BD88      OUT	0x28,R24
(0102)  ICR1H  = 0x00;
    006F BC27      OUT	0x27,R2
(0103)  ICR1L  = 0x64;
    0070 BD86      OUT	0x26,R24
(0104)  TCCR1A = 0x00;
    0071 BC2F      OUT	0x2F,R2
(0105)  TCCR1B = 0x02; //start Timer
    0072 E082      LDI	R24,2
    0073 BD8E      OUT	0x2E,R24
    0074 9508      RET
_Timer1:
    0075 D251      RCALL	push_lset
(0106) }
(0107) 
(0108) #pragma interrupt_handler Timer1:9
(0109) void Timer1(void)
(0110) {
(0111)  //TIMER1 has overflowed
(0112)  TCNT1H = 0xFF; //reload counter high value
    0076 EF8F      LDI	R24,0xFF
    0077 BD8D      OUT	0x2D,R24
(0113)  TCNT1L = 0x9C; //reload counter low value
    0078 E98C      LDI	R24,0x9C
    0079 BD8C      OUT	0x2C,R24
(0114)  
(0115)  CheckIR();//红外解码
    007A D08B      RCALL	_CheckIR
    007B D262      RCALL	pop_lset
    007C 9518      RETI
(0116) }
(0117) 
(0118) //call this routine to initialize all peripherals
(0119) void IoInit(void)
(0120) {
(0121)  //stop errant interrupts until set up
(0122)  CLI(); //disable all interrupts
_IoInit:
    007D 94F8      BCLR	7
(0123)  PortInit();
    007E DFB4      RCALL	_PortInit
(0124)  WdtInit();
    007F DFC0      RCALL	_WdtInit
(0125)  Timer0Init();
    0080 DFC5      RCALL	_Timer0Init
(0126)  Timer1Init();
    0081 DFE2      RCALL	_Timer1Init
(0127)  //ADCSR&=~BIT(ADEN);
(0128)  
(0129)  MCUCR = 0x00;//int0 low level在掉电模式,低电平触发才能唤醒,下跳沿不行
    0082 2422      CLR	R2
    0083 BE25      OUT	0x35,R2
(0130)  GICR  = 0x00;//Int Mask,Int0 disable
    0084 BE2B      OUT	0x3B,R2
(0131)  TIMSK = 0x05; //timer interrupt Mask: Timer0,1 enable
    0085 E085      LDI	R24,5
    0086 BF89      OUT	0x39,R24
(0132)  SEI(); //re-enable interrupts
    0087 9478      BSET	7
    0088 9508      RET
(0133)  //all peripherals are now initialized
(0134) }
(0135) 
(0136) 
(0137) void WdtOn()
(0138) {
(0139)   WDR();
_WdtOn:
    0089 95A8      WDR
(0140)   WDTCR=0x0f;
    008A E08F      LDI	R24,0xF
    008B BD81      OUT	0x21,R24
    008C 9508      RET
(0141) 
(0142) }
(0143) 
(0144) void WdtOff()
(0145) {
(0146)   CLI();//!!必须,WDTOE置位后必须4个时钟内清 WDE,才能真正关断WDT
_WdtOff:
    008D 94F8      BCLR	7
(0147)   WDR();
    008E 95A8      WDR
(0148)   WDTCR |=(BIT(WDTOE)|(BIT(WDE)));
    008F B581      IN	R24,0x21
    0090 6188      ORI	R24,0x18
    0091 BD81      OUT	0x21,R24
(0149)   //WDTCR&=~BIT(WDE);//0;//off
(0150)   WDTCR=0x07;
    0092 E087      LDI	R24,7
    0093 BD81      OUT	0x21,R24
(0151)   SEI();
    0094 9478      BSET	7
    0095 9508      RET
(0152) }
(0153) 
(0154) void PwrIdle()
(0155) {//P30 MCUCR 休眠控制和INT0,1,
(0156)   MCUCR&=0x0f;
_PwrIdle:
    0096 B785      IN	R24,0x35
    0097 708F      ANDI	R24,0xF
    0098 BF85      OUT	0x35,R24
(0157)   MCUCR |=BIT(SE);
    0099 B785      IN	R24,0x35
    009A 6880      ORI	R24,0x80
    009B BF85      OUT	0x35,R24
(0158)   asm("sleep");
    009C 9588      SLEEP
    009D 9508      RET
(0159) }
(0160) 
(0161) void PwrDown()
(0162) { 
(0163)   MCUCR&=0x0f;
_PwrDown:
    009E B785      IN	R24,0x35
    009F 708F      ANDI	R24,0xF
    00A0 BF85      OUT	0x35,R24
(0164)   MCUCR |=0x60;//0x60掉电 0x70省电
    00A1 B785      IN	R24,0x35
    00A2 6680      ORI	R24,0x60
    00A3 BF85      OUT	0x35,R24
(0165)   asm("sleep");
    00A4 9588      SLEEP
    00A5 9508      RET
(0166) }
(0167) 
(0168) //测试红外输出
(0169) //无信号时有小许干扰输出,遥控器保持按键时有持续输出
(0170) void TestIR()
(0171) {
(0172) if ((PIND&(1<<IR))!=0)
_TestIR:
    00A6 9B87      SBIS	0x10,7
    00A7 C002      RJMP	0x00AA
(0173) 	     {BeepOff();}
    00A8 D1AD      RCALL	_BeepOff
    00A9 C001      RJMP	0x00AB
(0174)       else
(0175) 	     {BeepOn();}
    00AA D1A9      RCALL	_BeepOn
    00AB 9508      RET
(0176) 
(0177) }
(0178) 
(0179) void main(void)
(0180) {
(0181) 
(0182)    IoInit();
_main:
    00AC DFD0      RCALL	_IoInit
(0183)    SystemIni();
    00AD D1D6      RCALL	_SystemIni
(0184)    Beep();
    00AE D1A9      RCALL	_Beep
    00AF C010      RJMP	0x00C0
(0185)    while (1)
(0186)    {  
(0187)       if (bTimer) TimerFunc();
    00B0 9020006D  LDS	R2,bTimer
    00B2 2022      TST	R2
    00B3 F009      BEQ	0x00B5
    00B4 D17B      RCALL	_TimerFunc
(0188) 	  //TestIR();
(0189) 	  if (bIrCmdOk) CheckIrCmd();
    00B5 9020006B  LDS	R2,bIrCmdOk
    00B7 2022      TST	R2
    00B8 F009      BEQ	0x00BA
    00B9 D11B      RCALL	_CheckIrCmd
(0190) 	  if (bCmdOk) ReadCmd();
    00BA 9020006C  LDS	R2,bCmdOk
    00BC 2022      TST	R2
    00BD F009      BEQ	0x00BF
    00BE D003      RCALL	_ReadCmd
(0191) 	  PwrIdle();
    00BF DFD6      RCALL	_PwrIdle
    00C0 CFEF      RJMP	0x00B0
(0192)     };
    00C1 9508      RET
_ReadCmd:
    00C2 D1ED      RCALL	push_gset1
(0193) 
(0194) }
(0195) 
(0196) //命令执行
(0197) void ReadCmd()
(0198) {
(0199)     bCmdOk=0;
    00C3 2422      CLR	R2
    00C4 9220006C  STS	bCmdOk,R2
(0200) 	//Beep();
(0201) 	switch (iCmd)
    00C6 91400069  LDS	R20,iCmd
    00C8 2755      CLR	R21
    00C9 3041      CPI	R20,1
    00CA E0E0      LDI	R30,0
    00CB 075E      CPC	R21,R30
    00CC F089      BEQ	0x00DE
    00CD 3042      CPI	R20,2
    00CE E0E0      LDI	R30,0
    00CF 075E      CPC	R21,R30
    00D0 F091      BEQ	0x00E3
    00D1 3043      CPI	R20,3
    00D2 E0E0      LDI	R30,0
    00D3 075E      CPC	R21,R30
    00D4 F099      BEQ	0x00E8
    00D5 3044      CPI	R20,4
    00D6 E0E0      LDI	R30,0
    00D7 075E      CPC	R21,R30
    00D8 F0A1      BEQ	0x00ED
    00D9 3045      CPI	R20,5
    00DA E0E0      LDI	R30,0
    00DB 075E      CPC	R21,R30
    00DC F0E1      BEQ	0x00F9
    00DD C026      RJMP	0x0104
(0202) 	{
(0203) 	   case CSTOP:
(0204) 	       MotorStop();
    00DE D160      RCALL	_MotorStop
(0205) 		   BeepN(2);
    00DF E002      LDI	R16,2
    00E0 E010      LDI	R17,0
    00E1 D17B      RCALL	_BeepN
(0206) 	       break;
    00E2 C021      RJMP	0x0104
(0207) 	   case CUP:
(0208) 	       MotorUp();
    00E3 D155      RCALL	_MotorUp
(0209) 		   BeepN(1);
    00E4 E001      LDI	R16,1
    00E5 E010      LDI	R17,0
    00E6 D176      RCALL	_BeepN
(0210) 	       break;
    00E7 C01C      RJMP	0x0104
(0211) 	   case CDOWN:
(0212) 	       MotorDown();
    00E8 D153      RCALL	_MotorDown
(0213) 		   BeepN(1);
    00E9 E001      LDI	R16,1
    00EA E010      LDI	R17,0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -