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

📄 at90s2313仿真卡程序.txt

📁 c51经典子程序代码全集
💻 TXT
字号:
其他:AT90S2313仿真卡程序 [JanesLee] [141次] 01-5-25 上午 10:16:58
;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
    0x98,0x35,0x22,0x99,0x02,0x55,0x61,0xa0,0x00,0x00,0x7f,0x3f,0x0f,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:
    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
    rjmp    WrtDelay

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

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    

    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:
    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
    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

    ldi    temp1,(0<<CLK)+(0<<RST)+(1<<SD)    ;initialize I/O direction
    out    DDRD,temp1

    ldi    temp1,(0<<CLK)+(0<<RST)+(0<<SD)    ;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
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

;**** 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:    rjmp    LOOP    
                 

酷!立刻收藏!准备用于非法用途。 [笑掉大牙] [9次] 01-5-25 上午 10:23:47 

我不贪小便宜,但我讨厌中国电信! [xzm0662] [7次] 01-5-25 上午 10:24:37 

Ctrl-A,Ctrl-C,Ctrl_V先!!! [skey] [4次] 01-5-25 上午 10:46:45 

在我来说:你很利害!! [sampoo㊣] [9次] 01-5-25 下午 12:32:31 

哪里!大虾你是我的榜样! [JanesLee] [4次] 01-5-25 下午 12:43:06 

见笑! [sampoo㊣] [1次] 01-5-25 下午 01:04:38 

 
点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2001 

⌨️ 快捷键说明

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