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

📄 h4001.lst

📁 用AVR单片机ATMega32通过U2270B读取H4001只读RFID卡号的范例
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0036 E5CF      LDI	R28,0x5F
    0037 E0D8      LDI	R29,0x8
    0038 BFCD      OUT	0x3D,R28
    0039 BFDE      OUT	0x3E,R29
    003A 51C0      SUBI	R28,0x10
    003B 40D0      SBCI	R29,0
    003C EA0A      LDI	R16,0xAA
    003D 8308      STD	Y+0,R16
    003E 2400      CLR	R0
    003F E6E8      LDI	R30,0x68
    0040 E0F0      LDI	R31,0
    0041 E011      LDI	R17,1
    0042 36E1      CPI	R30,0x61
    0043 07F1      CPC	R31,R17
    0044 F011      BEQ	0x0047
    0045 9201      ST	R0,Z+
    0046 CFFB      RJMP	0x0042
    0047 8300      STD	Z+0,R16
    0048 E6E4      LDI	R30,0x64
    0049 E0F0      LDI	R31,0
    004A E6A0      LDI	R26,0x60
    004B E0B0      LDI	R27,0
    004C E010      LDI	R17,0
    004D 36EC      CPI	R30,0x6C
    004E 07F1      CPC	R31,R17
    004F F021      BEQ	0x0054
    0050 95C8      LPM
    0051 9631      ADIW	R30,1
    0052 920D      ST	R0,X+
    0053 CFF9      RJMP	0x004D
    0054 D342      RCALL	_main
_exit:
    0055 CFFF      RJMP	_exit
FILE: D:\TK5552\Iccavr\H4001\H4001.c
(0001) // --------------------------------------
(0002) // Function: H4001 64位RFID只读卡读头
(0003) // MCU:   ATmega32
(0004) // Crystal: 7.3728Mhz
(0005) // Date:  2005/01/16
(0006) // --------------------------------------
(0007) // Compiler:
(0008) // ICCAVR 6.28C,6.31A
(0009) // RFID基站芯片:U2270B 
(0010) // --------------------------------------
(0011) 
(0012) #include <iom32v.h>
(0013) #include <macros.h>
(0014) //variable definition
(0015) unsigned char timer_count,error=0,post=0,data1,rxdata,run=0;
(0016) unsigned char decode[192],head=0,rfiddata[54];
(0017) unsigned int  tcomp=0;
(0018) unsigned char lastbit=0,half=0; 
(0019) const unsigned char ascii[16]="0123456789ABCDEF";
(0020) //pin definition
(0021) #define led() (PORTD^=0x80)
(0022) #define RFW (1<<6)                        
(0023) //RFW, RFID输出载波控制
(0024) #define RFW_1() (PORTC |=RFW)          
(0025) #define RFW_0() (PORTC &=~RFW)
(0026) #define beep (1<<4)                        
(0027) #define beep_1() (PORTC |=beep)
(0028) #define beep_0() (PORTC &=~beep)
(0029) #define okled (1<<0)
(0030) #define okled1() (PORTC |=okled)
(0031) #define okled0() (PORTC &=~okled)
(0032) //RFID_IN U2270B返回卡的未解调码
(0033) #define RFID_IN  (PINC&0x80)
(0034) 
(0035) void port_init(void)
(0036) {
(0037)  PORTA = 0xFF;
_port_init:
    0056 EF8F      LDI	R24,0xFF
    0057 BB8B      OUT	0x1B,R24
(0038)  DDRA  = 0x00;
    0058 2422      CLR	R2
    0059 BA2A      OUT	0x1A,R2
(0039)  PORTB = 0xFF;
    005A BB88      OUT	0x18,R24
(0040)  DDRB  = 0x00;
    005B BA27      OUT	0x17,R2
(0041)  PORTC = 0xFF; 
    005C BB85      OUT	0x15,R24
(0042)  DDRC  = 0x51;
    005D E581      LDI	R24,0x51
    005E BB84      OUT	0x14,R24
(0043)  PORTD = 0x7F;
    005F E78F      LDI	R24,0x7F
    0060 BB82      OUT	0x12,R24
(0044)  DDRD  = 0x80;
    0061 E880      LDI	R24,0x80
    0062 BB81      OUT	0x11,R24
    0063 9508      RET
(0045) }
(0046) 
(0047) //TIMER0 initialisation - prescale:1024
(0048) // WGM: Normal
(0049) // desired value: 10mSec
(0050) // actual value:  9.861mSec (1.4%)
(0051) void timer0_init(void)
(0052) {
(0053)  TCCR0 = 0x00; //stop
_timer0_init:
    0064 2422      CLR	R2
    0065 BE23      OUT	0x33,R2
(0054)  TCNT0 = 0xB9; //set count
    0066 EB89      LDI	R24,0xB9
    0067 BF82      OUT	0x32,R24
(0055)  OCR0  = 0x47;  //set compare
    0068 E487      LDI	R24,0x47
    0069 BF8C      OUT	0x3C,R24
(0056)  TCCR0 = 0x05; //start timer
    006A E085      LDI	R24,5
    006B BF83      OUT	0x33,R24
    006C 9508      RET
_timer0_ovf_isr:
    006D 922A      ST	R2,-Y
    006E 938A      ST	R24,-Y
    006F 939A      ST	R25,-Y
    0070 B62F      IN	R2,0x3F
    0071 922A      ST	R2,-Y
(0057) }
(0058) 
(0059) #pragma interrupt_handler timer0_ovf_isr:12
(0060) void timer0_ovf_isr(void)
(0061) {
(0062)      TCNT0 = 0xB9; //reload counter value
    0072 EB89      LDI	R24,0xB9
    0073 BF82      OUT	0x32,R24
(0063)      timer_count++;
    0074 91800160  LDS	R24,timer_count
    0076 5F8F      SUBI	R24,0xFF
    0077 93800160  STS	timer_count,R24
(0064) 	 if (timer_count>50) {     // 0.01*50=0.5sec,每0.5秒扫描一次是否有ID卡
    0079 E382      LDI	R24,0x32
    007A 90200160  LDS	R2,timer_count
    007C 1582      CP	R24,R2
    007D F430      BCC	0x0084
(0065) //      led();
(0066) 	    timer_count=0;
    007E 2422      CLR	R2
    007F 92200160  STS	timer_count,R2
(0067)         run=1;
    0081 E081      LDI	R24,1
    0082 93800062  STS	run,R24
(0068)         }
    0084 9029      LD	R2,Y+
    0085 BE2F      OUT	0x3F,R2
    0086 9199      LD	R25,Y+
    0087 9189      LD	R24,Y+
    0088 9029      LD	R2,Y+
    0089 9518      RETI
(0069) }
(0070) 
(0071) //TIMER1 initialisation - prescale:1
(0072) // WGM: 0) Normal, TOP=0xFFFF
(0073) // desired value: 1Hz
(0074) // actual value: Out of range
(0075) void timer1_init(void)
(0076) {
(0077)  TCCR1B = 0x00; //stop
_timer1_init:
    008A 2422      CLR	R2
    008B BC2E      OUT	0x2E,R2
(0078)  TCNT1H = 0x00 /*INVALID SETTING*/; //setup
    008C BC2D      OUT	0x2D,R2
(0079)  TCNT1L = 0x00 /*INVALID SETTING*/;
    008D BC2C      OUT	0x2C,R2
(0080)  OCR1AH = 0x00 /*INVALID SETTING*/;
    008E BC2B      OUT	0x2B,R2
(0081)  OCR1AL = 0x00 /*INVALID SETTING*/;
    008F BC2A      OUT	0x2A,R2
(0082)  OCR1BH = 0x00 /*INVALID SETTING*/;
    0090 BC29      OUT	0x29,R2
(0083)  OCR1BL = 0x00 /*INVALID SETTING*/;
    0091 BC28      OUT	0x28,R2
(0084)  ICR1H  = 0x00 /*INVALID SETTING*/;
    0092 BC27      OUT	0x27,R2
(0085)  ICR1L  = 0x00 /*INVALID SETTING*/;
    0093 BC26      OUT	0x26,R2
(0086)  TCCR1A = 0x00;
    0094 BC2F      OUT	0x2F,R2
(0087)  TCCR1B = 0x01; //start Timer
    0095 E081      LDI	R24,1
    0096 BD8E      OUT	0x2E,R24
    0097 9508      RET
(0088) }
(0089) 
(0090) //UART0 initialisation
(0091) // desired baud rate: 9600
(0092) // actual: baud rate:57600 (0.0%)
(0093) // char size: 8 bit
(0094) // parity: Disabled
(0095) void uart0_init(void)         //Uart初始化   
(0096) {
(0097)  UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
    0098 2422      CLR	R2
    0099 B82A      OUT	0x0A,R2
(0098)  UCSRA = 0x00;
    009A B82B      OUT	0x0B,R2
(0099)  UCSRC = 0x06;
    009B E086      LDI	R24,6
    009C BD80      OUT	0x20,R24
(0100)  UBRRL = 0x07; //set baud rate lo,9600=0x2F,57600=0x07
    009D E087      LDI	R24,7
    009E B989      OUT	0x09,R24
(0101)  UBRRH = 0x00; //set baud rate hi
    009F BC20      OUT	0x20,R2
(0102)  UCSRB = 0x98; 
    00A0 E988      LDI	R24,0x98
    00A1 B98A      OUT	0x0A,R24
    00A2 9508      RET
_uart0_rx_isr:
    00A3 922A      ST	R2,-Y
    00A4 B62F      IN	R2,0x3F
    00A5 922A      ST	R2,-Y
(0103) }
(0104) 
(0105) #pragma interrupt_handler uart0_rx_isr:14  
(0106) void uart0_rx_isr(void)        //接收中断处理           
(0107) {
(0108)  //uart has received a character in UDR
(0109)    rxdata=UDR;
    00A6 B02C      IN	R2,0x0C
    00A7 9220015E  STS	rxdata,R2
    00A9 9029      LD	R2,Y+
    00AA BE2F      OUT	0x3F,R2
    00AB 9029      LD	R2,Y+
    00AC 9518      RETI
(0110) }
(0111) 
(0112) 
(0113) //call this routine to initialise all peripherals
(0114) void init_devices(void)              //初始化
(0115) {
(0116)  //stop errant interrupts until set up
(0117)  CLI(); //disable all interrupts
_init_devices:
    00AD 94F8      BCLR	7
(0118)  port_init();
    00AE DFA7      RCALL	_port_init
(0119)  timer0_init();
    00AF DFB4      RCALL	_timer0_init
(0120)  timer1_init();
    00B0 DFD9      RCALL	_timer1_init
(0121)  uart0_init();
    00B1 DFE6      RCALL	_uart0_init
(0122)  MCUCR = 0x02;
    00B2 E082      LDI	R24,2
    00B3 BF85      OUT	0x35,R24
(0123)  GICR  = 0x40;
    00B4 E480      LDI	R24,0x40
    00B5 BF8B      OUT	0x3B,R24
(0124)  TIMSK = 0x01; //timer interrupt sources
    00B6 E081      LDI	R24,1
    00B7 BF89      OUT	0x39,R24
(0125)  SEI(); //re-enable interrupts
    00B8 9478      BSET	7
    00B9 9508      RET
(0126)  //all peripherals are now initialised
(0127) }
(0128) 
(0129) 
(0130) void ldelay(unsigned int i)       //长延时
(0131)      {
(0132)      while(i--);
_ldelay:
  i                    --> R16
    00BA 0118      MOVW	R2,R16
    00BB 5001      SUBI	R16,1
    00BC 4010      SBCI	R17,0
    00BD 2022      TST	R2
    00BE F7D9      BNE	0x00BA
    00BF 2033      TST	R3
    00C0 F7C9      BNE	0x00BA
    00C1 9508      RET
_beeps:
  i                    --> R20
    00C2 D328      RCALL	push_gset1
    00C3 2F40      MOV	R20,R16
(0133)      }
(0134) 
(0135) void beeps(unsigned char i) {     //讯响 
    00C4 C014      RJMP	0x00D9
(0136)      while(i--) { 
(0137) 	       beep_0();
    00C5 98AC      CBI	0x15,4
(0138) 	       ldelay(60000);
    00C6 E600      LDI	R16,0x60
    00C7 EE1A      LDI	R17,0xEA
    00C8 DFF1      RCALL	_ldelay
(0139) 		   ldelay(60000);
    00C9 E600      LDI	R16,0x60
    00CA EE1A      LDI	R17,0xEA
    00CB DFEE      RCALL	_ldelay
(0140) 		   ldelay(60000);
    00CC E600      LDI	R16,0x60
    00CD EE1A      LDI	R17,0xEA
    00CE DFEB      RCALL	_ldelay
(0141) 		   beep_1();
    00CF 9AAC      SBI	0x15,4
(0142) 	       ldelay(60000);
    00D0 E600      LDI	R16,0x60
    00D1 EE1A      LDI	R17,0xEA
    00D2 DFE7      RCALL	_ldelay
(0143) 		   ldelay(60000);
    00D3 E600      LDI	R16,0x60
    00D4 EE1A      LDI	R17,0xEA
    00D5 DFE4      RCALL	_ldelay
(0144) 		   ldelay(60000);
    00D6 E600      LDI	R16,0x60
    00D7 EE1A      LDI	R17,0xEA
    00D8 DFE1      RCALL	_ldelay
    00D9 2E24      MOV	R2,R20
    00DA 2433      CLR	R3
    00DB 5041      SUBI	R20,1
    00DC 2022      TST	R2
    00DD F739      BNE	0x00C5
    00DE D30F      RCALL	pop_gset1
    00DF 9508      RET
(0145) 		   }		   
(0146)      }	    
(0147)    
(0148) void wait_tx() {	              //等待发送完一个字节
(0149) 	while(!(UCSRA&0x40));
_wait_tx:
    00E0 9B5E      SBIS	0x0B,6
    00E1 CFFE      RJMP	_wait_tx
(0150)     UCSRA|=0x40; 
    00E2 9A5E      SBI	0x0B,6
    00E3 9508      RET
_R_H4001:
  j                    --> Y+1
  bits                 --> R22
  i                    --> Y+0
    00E4 D2FE      RCALL	push_gset5
    00E5 972C      SBIW	R28,0xC
(0151) 	}    
(0152) 
(0153) 	
(0154) void R_H4001()                    //读卡 
(0155)     {              
(0156)      unsigned char i=0,j=0;
    00E6 2400      CLR	R0
    00E7 8208      STD	Y+0,R0
    00E8 8209      STD	Y+1,R0
(0157)      unsigned int bits=0;
    00E9 2766      CLR	R22
    00EA 2777      CLR	R23
(0158) 	 data1=0;
    00EB 2422      CLR	R2
    00EC 9220015F  STS	data1,R2
(0159) 	 for (i=0;i<192;i++) {
    00EE 8208      STD	Y+0,R0
    00EF C008      RJMP	0x00F8
(0160)          decode[i]=1;
    00F0 E98E      LDI	R24,0x9E
    00F1 940E0402  CALL	<created procedures>
    00F3 E081      LDI	R24,1
    00F4 8380      STD	Z+0,R24
    00F5 8008      LDD	R0,Y+0
    00F6 9403      INC	R0
    00F7 8208      STD	Y+0,R0
    00F8 8188      LDD	R24,Y+0
    00F9 3C80      CPI	R24,0xC0
    00FA F3A8      BCS	0x00F0
(0161) 		}   
(0162) 	 for (i=0;i<64;i++) {
    00FB 2400      CLR	R0
    00FC 8208      STD	Y+0,R0
    00FD C008      RJMP	0x0106
(0163)          rfiddata[i]=0;
    00FE E688      LDI	R24,0x68
    00FF 940E0402  CALL	<created procedures>
    0101 2422      CLR	R2
    0102 8220      STD	Z+0,R2
    0103 8008      LDD	R0,Y+0
    0104 9403      INC	R0
    0105 8208      STD	Y+0,R0
    0106 8188      LDD	R24,Y+0
    0107 3480      CPI	R24,0x40
    0108 F3A8      BCS	0x00FE
(0164) 		}   
(0165) 	 RFW_1();
    0109 9AAE      SBI	0x15,6
(0166)      data1=0;
    010A 2422      CLR	R2
    010B 9220015F  STS	data1,R2
(0167) 	 lastbit=0;
    010D 92200066  STS	lastbit,R2
(0168) 	 TCNT1=0;
    010F 2433      CLR	R3
    0110 BC3D      OUT	0x2D,R3
    0111 BC2C      OUT	0x2C,R2
(0169) 	 half=0;
    0112 92200067  STS	half,R2
(0170) 	 j=0;
    0114 2400      CLR	R0
    0115 8209      STD	Y+1,R0
(0171) 	 for (bits=0;bits<256;bits++) {
    0116 2766      CLR	R22
    0117 2777      CLR	R23
    0118 C0C8      RJMP	0x01E1
(0172)     //	 while (((!(PINC&0x80))==lastbit)& (TCNT1<20000)) { }            //low level  
(0173)     //   while (((!(PINC&0x80))==lastbit)& (TCNT1<20000)) { }
(0174)          while (((!(RFID_IN))==lastbit)& (TCNT1<20000)) { }              
    0119 999F      SBIC	0x13,7
    011A C003      RJMP	0x011E
    011B E041      LDI	R20,1
    011C E050      LDI	R21,0
    011D C002      RJMP	0x0120
    011E 2744      CLR	R20
    011F 2755      CLR	R21
    0120 90200066  LDS	R2,lastbit
    0122 2433      CLR	R3
    0123 1542      CP	R20,R2

⌨️ 快捷键说明

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