?? 中國電信.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 + -