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

📄 ic-2313.asm

📁 ic卡读写 源程序
💻 ASM
字号:
;2313编程时要选择FSTRT,快速启动 
;**** T E L E C A R D  S Y S T E M  A T T A C K E R  ************************ 
;* 
;* Title        : TELECARD SIMULATION ROUTE 
;* Version        : 2.1 (new mode) 
;* Last updated        : 99.08.18 /99.10.6  
;* Card Type        : GPM103(Gemplus).SLE4406(Siemens).PCF7960 (Philips) 
;* 
;* Target        : AT90S2313 
;* DESCRIPTION 
;*     This program shows how to implement an AT90S2313 
;*    as an IC telephony card.  
;* 
;*    Port Usage    : PD2(INT0) ---> CLK 
;*              PD3(INT1) ---> RST 
;*              PD4(T0)   ---> SD 
;*    XTAL        : 10MHz 
;* 
;*************************************************************************** 
;Ver 99.10.6  
;    1. RST及CLK检测改为中断输入 
;    2. 修改擦除过程中读出校验错误的问题(擦除进程ICDATA应右移一位) (99.10.7) 
;    3. RST上升沿使SD变为常高,直至RST下降沿(复位)或CLK下降沿(写/擦除) 
;    4. 修正擦除后未清除ERSRDY标志的问题,避免擦除后输出不正确 
;Ver 99.10.13 
;    1. 仍未解决计费时出错问题,估计写脉冲后输出不对,有待改进 
;Ver 99.10.14 
;    1.测试:A)加电后,SD端输出为0直至复位后RST下降沿输出 
;           B)操作期间,RST正脉冲时SD输出为0,写操作时,RST下降沿输出 
;         原位地址数据直至写CLK脉冲下降沿. 
;           C)位地址超过103时,SD输出为1,直至位地址超过127时才翻转为0, 
     
;         即输出为16字节,后3字节为0xFF 
;    2.改正程序以与测试结果相符 
;    3.费用数据放入EEPROM 
;Ver 99.11.10 
;    4.擦除及写入后等待相应时间(4ms),此段时间不响应 
;Ver 00.3.12 
;    1.仔细分析了IC卡,可能用紫外光照射会擦除掉IC卡中EEPROM段信息,即利用 光 
;    除掉浮栅上的负电荷,仍需实验,“路漫漫其修远兮,吾将上下而求索!” 
;    2.2000/3/25 实验,结论: 悲哀----不行  :(  阿门,救救我吧!!!! 
;Ver 00.3.28 
;    1.将写后延时缩短为2ms,嘻嘻嘻嘻嘻嘻。。哈哈。。。咳咳。。呃。  成 功!!!  
;Ver 00.3.31 
;    1.实验,可打通,但第二次计费时错误断线(打一分钟),估计计费操作之间 IC卡 
;      已断电,造成数据不符,须加电池试之,也不排除写操作问题 
;Ver 01.2.12 
;    1.据说电话机内有金属探测器,须测试之  ....... 
; 
;**** Includes **** 

.include "2313def.inc" 

;**** Interface pin define ****  

.equ    CLK    = PD2     
.equ    RST    = PD3     
.equ    SD    = PD4 
.equ    datbuf    = 3        ;data buffer pointe to r3     
.equ    datlgth    = 16        ;data buffer length 

;**** Global Register Variables **** 

.def    temp1    = r20        ; Temporary variable 
.def    temp2    = r21        ; Extra temporary variable 
.def    mask    = r22        ; IC card flag register 
.def    badr    = r23        ; IC card bit address 
.def    icdata    = r24        ; IC card data register 
.def    status    = r25        ; Status register 

;mask register flag bit define: 

.equ    rstcomp    = 0        ;Reset card complete 
.equ    wrtrdy    = 1        ;Write ready  
.equ    wrtcomp    = 2        ;Write complete  
.equ    ersrdy    = 3        ;Erasure ready 
.equ    sdsave    = 4        ;Save sd line state 

;******************************************************************************* ******* 
;IC卡帐号及金额数据区: 
.eseg 
.ORG 0x00 
dat_tab:
.db 0x86,0x99,0x80,0xB0,0x13,0xB0,0xD4,0x60,0x00,0x00,0x07,0xff,0xff,0xFF,0xFF,0xFF     
;              [   CHD   ] [       ID        ] [     COUNTER     ] 
;                                               7*64+6*8+4=497=$50 
;******************************************************************************* ******* 

;**** Interrupt Vectors ****    code segment 
.cseg 
.org 00 
    rjmp    RESET        ; Reset handle 
    rjmp    CLK_INT        ; INT0 handle     
    rjmp    RST_INT        ; INT1 handle 
;    rjmp    ICP_INT        ; Input Capture1 Interrupt 
;    rjmp    OC1_INT        ; Output Compare1 Interrupt 
;    rjmp    OVF1_INT    ; Overflow1 Interrupt  
;    rjmp    OVF0_INT    ; Overflow0 Interrupt  
;    rjmp    RX_END        ; UART Receive Complete 
;    rjmp    UDR_EMP        ; UART Data Register Empty 
;    rjmp    TX_END        ; UART Transmit Complete 
;    rjmp    AC_INT        ; Analog Comparator 
;*************************************************************************** 
;* 
;* FUNCTION 
;*    CLK_INT 
;* 
;* DESCRIPTION 
;*    Detect ICcard reader's CLK line 
;* 
;*************************************************************************** 
CLK_INT: 
 
   ; cbi  PORTD,6

    sbis    PIND,CLK 
    rjmp    CLK_fall 
CLK_rise:                ;CLK rising edge 
    sbic    PIND,RST 
    rjmp    IC_reset 
    sbrc    mask,wrtrdy     
    rjmp    IC_WRT 
    sbrc    mask,ersrdy 
    rjmp    IC_ERS 
    cbr    mask,(1<<wrtcomp) 
    inc    badr 
    cpi    badr,8 
    brne    CLK_riseret        ; bit address =< 7,not  ready new data 
    clr    badr 
    inc    ZL 
    cpi    ZL,datbuf+datlgth 
    brne    rdydata 
    ldi    ZL,datbuf 
rdydata: 
    ld    icdata,Z 
    rjmp    CLK_riseret     

IC_WRT: 
    lsr    icdata            ;right rotate 
    andi    icdata,0b01111111    ;write 0 to current bit address     
    cbr    mask,1<<wrtrdy 
    sbr    mask,1<<wrtcomp 
    mov    temp1,badr 
    inc    temp1 
    ser    temp2            ;temp2 <-- 0xff 
    clc                ;clr C flag 
shift: 
    ror    temp2 
    dec    temp1 
    brne    shift 
    ld    temp1,Z 
    and    temp1,temp2 
    st    Z,temp1 
	mov temp2,ZL
	DEC temp2
	DEC temp2
	DEC temp2
    rjmp   WriteEEP

IC_ERS: 
    lsr    icdata 
    andi    icdata,0b01111111    ;write 0 to current bit address     
    mov    temp1,ZL        ;ZL --> temp1 
    ser    temp2            ;temp2 <-- 0xff 
    inc    ZL 
ers_nxt: 
    st    Z+,temp2        ;(Z) <-- 0xff, Z <-- Z+1  
    ;cpi    ZL,datbuf+datlgth  ;不明白为什么把后面所有字节查处
    ;brne    ers_nxt           ;暂时删除//......
    mov    ZL,temp1        ;ZL <-- temp1 
    cbr    mask,1<<ersrdy        ;clear erasure ready flag 

	mov temp2,ZL          ;//.....
	DEC temp2
	DEC temp2
	ser    temp1 ;temp1 <-- 0xff
    rjmp    WriteEEP    ;//....



;WrtDelay:                ;Write 1/0,delay 1ms  //调试  去掉
;    ldi    temp1,100 
;WrtDelay1: 
;    ldi    temp2,33        ;1 
;WrtDelay2:     
;    dec    temp2            ;1 
;    brne    WrtDelay2        ;2    33(1+2)     
;    dec    temp1            ;1 
;    brne    WrtDelay1        ;2    [33(1+2)+1+2] *100=10200*100ns=1.02ms  
WriteEEP:
	SBIC	EECR,	EEWE
	RJMP	WriteEEP
	cpi     temp2,0x0B 
    breq    Write 
	cpi     temp2,0x0C 
    breq    Write   
	rjmp    CLK_riseret  
Write:	  
	OUT	EEAR,	temp2
	OUT	EEDR,	temp1
	cli
	SBI	EECR,EEMWE
	SBI	EECR,EEWE
	sei
	rjmp    CLK_riseret 

IC_reset:                ;reset iccard 
    clr    badr 
    clr    ZH 
    ldi    ZL,datbuf 
    ld     icdata,Z 
    sbr    mask,(1<<rstcomp) 
    cbr    mask,(1<<wrtrdy)+(1<<wrtcomp)+(1<<ersrdy)+(1<<sdsave) 
CLK_riseret: 
    in    temp1,MCUCR 
    cbr    temp1,1<<ISC00 
    out    MCUCR,temp1        ;set INT1 to interrupt on  falling edge 

    reti 

CLK_fall:                ;CLK falling edge 
    sbrc    mask,rstcomp 
    rjmp    CLK_fallret 
SD_out: 
    lsl    icdata            ;output data bit 
    brcs    SD_high 
    cbi    PORTD,SD 
    rjmp    CLK_fallret 
SD_high: 
    sbi    PORTD,SD     
CLK_fallret: 
    in     temp1,MCUCR 
    sbr    temp1,1<<ISC00 
    out    MCUCR,temp1        ;set INT1 to interrupt on  rising edge 
    reti 


;*************************************************************************** 
;* 
;* FUNCTION 
;*    RST_INT 
;* 
;* DESCRIPTION 
;*    Detect ICcard reader's RST line  
;* 
;*************************************************************************** 
RST_INT: 

  ;  cbi  PORTD,6

    sbic    PIND,RST 
    rjmp    RST_rise 
RST_fall:                ;RST falling edge interrupt 
    sbrs    mask,rstcomp     
    rjmp    Cmp_rst 
    cbr    mask,(1<<rstcomp) 
    lsl    icdata            ;rstcomp=1,output 1st bit  after reset 
	nop
;RSTDelay:                ;Write 1/0,delay 1ms  //.....
;    ldi    temp1,30 
;RSTDelay2:                ;;后加的延时看似没必要
;    dec    temp1            ;1 
;    brne    RSTDelay2        ;2    33(1+2//......
    brcs    setSD 
    cbi    PORTD,SD 
    rjmp    RST_fallret 
setSD:     
    sbi    PORTD,SD     
RST_fallret: 
    in    temp1,MCUCR 
    sbr    temp1,(1<<ISC10) 
    out    MCUCR,temp1 
    reti 

Cmp_rst: 
    sbrc    mask,wrtcomp 
    rjmp    Cmp_rst1     
    sbr    mask,(1<<wrtrdy)    ;set write ready flag 
    cbi    PORTD,SD        ;output old bit      
    sbrc    mask,sdsave 
    sbi    PORTD,SD         
    rjmp    RST_fallret 
Cmp_rst1: 
    sbr    mask,(1<<ersrdy)    ;set erase ready flag 
    cbr    mask,(1<<wrtcomp)    ;clear write complete flag 
    cbi    PORTD,SD        ;output old bit 
    sbrc    mask,sdsave 
    sbi    PORTD,SD 
    rjmp    RST_fallret 

RST_rise:                ;RST rising edge interrupt 
    cbr    mask,1<<sdsave 
    sbic    PIND,SD 
    sbr    mask,1<<sdsave 
    cbi    PORTD,SD        ;Active SD to low until CLK falling  edge 
    in    temp1,MCUCR 
    cbr    temp1,(1<<ISC10) 
    out    MCUCR,temp1 
    reti 



;*************************************************************************** 
;* 
;* FUNCTION 
;*    ic_init/rd_tab 
;* 
;* DESCRIPTION 
;*    Initialization of port used by the IC interface 
;*    and get out data stored by EEPROM . 
;* 
;*************************************************************************** 

RESET: 
ic_init: 

    cli                    ;disable all  interrupt 
    ldi    temp1,low(RAMEND)         ;initialize stack 
    out    SPL,temp1 

;*** read eeprom data table *** 
	ldi    temp1,0x0a
Read:                    ;等待上次写完成
	SBIC	EECR,	EEWE
	RJMP	Read	        ;//......

    out    EEAR,temp1 
    sbi    EECR,EERE        ;set EEPROM Read strobe 
    in     temp2,EEDR        ;get data 
	cpi    temp2,0x0
    brne     SS             ; 寄存器相等则跳转

	ldi    temp1,0x07
	ldi    temp2,0x0a
W:

    SBIC	  EECR,	 EEWE      ;初始化金额
	RJMP	W	  
	OUT	EEAR,	temp2
	OUT	EEDR,	temp1
	SBI	EECR,EEMWE
	SBI	EECR,EEWE	
SS:
    ldi    temp1,(0<<CLK)+(0<<RST)+(1<<SD)+(1<<PD6)    ;initialize I/O direction 
    out    DDRD,temp1 

    ldi    temp1,(1<<CLK)+(1<<RST)+(0<<SD)+(0<<PD6)    ;initialize I/O register 
    out    PORTD,temp1 
;*** read eeprom data table *** 
rd_eeprom: 
    clr    ZH 
    ldi    ZL,datbuf        ; Load low part of byte address into  ZL 
    clr    temp1 
ReadEEP:                    ;等待上次写完成
	SBIC	EECR,	EEWE
	RJMP	ReadEEP	        ;//......
loadbyte: 
    out    EEAR,temp1 
    sbi    EECR,EERE        ;set EEPROM Read strobe 
    in    temp2,EEDR        ;get data 
    st    Z+,temp2          ;store to SRAM (Z),Z <-- Z+1  
    inc    temp1 
    cpi    ZL,datbuf+datlgth    ;reached the end? (16bytes) 
    brne    loadbyte        ;if not, loop more 
;*****************************//...
    ldi    ZL,datbuf
    ldi    temp1,0x86
    st     Z+,temp1
    ldi    temp1,0x99
    st     Z+,temp1
    ldi    temp1,0x80
    st     Z+,temp1
    ldi    temp1,0xB0
    st     Z+,temp1
    ldi    temp1,0x13
    st     Z+,temp1
	ldi    temp1,0xB0
    st     Z+,temp1
    ldi    temp1,0xD4
    st     Z+,temp1
    ldi    temp1,0x60
    st     Z+,temp1
    ldi    temp1,0x00
    st     Z+,temp1
    ldi    temp1,0x00
;**** Interrupt Initialization **** 
    ldi    temp1,(1<<ISC01)+(1<<ISC00)+(1<<ISC11)+(1<<ISC10)    ;Set  INT0/INT1(rising edge) 
    out    MCUCR,temp1                 
 
     
    ldi    temp1,(1<<INTF1)+(1<<INTF0)    ;clear all interrupt flag 
     
    out    GIFR,temp1 

    ldi    temp1,(1<<INT0)+(1<<INT1)    ; Enable INT0 and INT1 
    out    GIMSK,temp1 

;*** flag mask and register initialize *** 
    clr    mask 
    ldi    ZL,datbuf 
    clr    badr 
    sei              ;Enable global interrupt 
LOOP:
;	sbi  PORTD,6
    RJMP LOOP

⌨️ 快捷键说明

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