📄 h4001.lst
字号:
__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 + -