?? tic4.asm
字號(hào):
;=========port ic card======
ICSDA BIT p1.1
ICSCL BIT p1.4
ICRST BIT p1.5
ICPWR BIT p1.6
ICINT BIT P1.7
ICPGM BIT P1.2
;=========port 24c01===
SCL24 BIT P3.4
SDA24 BIT P3.5
;=======ic card=============
CBUF EQU 08H ;(TEMP)commond buffer 08h-0Ch bytes
MBUF EQU 0DH ;(TEMP) 0Dh-11H 存放卡效驗(yàn)結(jié)果和密碼4字節(jié)
CHECKIC EQU 12H ;讀IC卡數(shù)據(jù)用(臨時(shí)變量)
;========24C01===============
DATAR EQU 21H ;24C01 讀子程序使用
DATAW EQU 22H ;24C01 寫子程序使用
CHECKSUM EQU 13H ;24C01 效驗(yàn)和
TEMP0 EQU 14H ;24C01 存放地址(臨時(shí)變量)
TEMP2 EQU 15H ;24C01 存放數(shù)據(jù)(臨時(shí)變量)
;----------------------------
DCOUNT EQU 18H ;判斷上位PC發(fā)送的數(shù)據(jù)是否超時(shí),設(shè)置為0.5秒超時(shí)
OVTIM EQU 19H ;同一段數(shù)據(jù)傳送次數(shù)記錄
TEMP10 EQU 1AH ;軟件定時(shí)器,累計(jì)到一秒
TEMP11 EQU 1BH ;軟件定時(shí)器,累計(jì)到一秒,用于拔卡
STIME EQU 1CH ;軟件定時(shí)器,累計(jì)到一分
STIME1 EQU 1DH ;軟件定時(shí)器,記錄分鐘數(shù)(與小精靈相比較)
TEMPS1 EQU 1EH ;解密加密時(shí)使用(臨時(shí)變量)
;============================
DATALONGT EQU 30H ;臨時(shí)放置總數(shù)據(jù)長(zhǎng)度
DATACHE EQU 31H ;傳送總數(shù)據(jù)效驗(yàn)和
DATALONG EQU 32H ;總數(shù)據(jù)長(zhǎng)度
DATAF EQU 33H ;數(shù)據(jù)標(biāo)志(37h---66H)
S1 EQU 34H
S2 EQU 35H
DATAL EQU 36H ;有效數(shù)據(jù)長(zhǎng)度
R EQU 37H
DATACON EQU 38H ;數(shù)據(jù)內(nèi)容 (37h---66H)
DATACON1 EQU 39H
DATACON2 EQU 3aH
DATACON3 EQU 3bH
;============================
FLAG1 EQU 23H ;flag1.0--是否有卡插入 (1)
;flag1.1--小精靈有通訊 (1)
;flag1.2--自由上機(jī)狀態(tài) (1?)
;flag1.3--錯(cuò)卡或壞卡 (1)
;flag1.4--發(fā)送卡拔出消息
;flag1.5--小精靈有通訊用于程序進(jìn)入工作 (1)
;flag1.6--讀寫2401,ic失敗 (1)
;flag1.7--是否開(kāi)始發(fā)送數(shù)據(jù) (1)
RFLAG EQU 24h ;RFLAG.0--接收數(shù)據(jù)開(kāi)始
;RFLAG.1--需要向PC發(fā)數(shù)據(jù)
;RFLAG.2--5次超時(shí)到
;RFLAG.3--第一次超時(shí)
;RFLAG.4--發(fā)送數(shù)據(jù)有反饋
;RFLAG.5--已接收上位機(jī)發(fā)送下來(lái)的完整數(shù)據(jù)(1)
;RFLAG.6--IC卡已經(jīng)處理過(guò)(效驗(yàn)密碼)
;rflag.7--接收數(shù)據(jù)結(jié)束不包含效驗(yàn)
TEMP1 EQU 20H ;TEMP1.0--
;TEMP1.1--新卡(1)
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;程序復(fù)位執(zhí)行
ORG 0000H
LJMP START
;定時(shí)器處理程序
ORG 000BH
LJMP EINT
;串口處理程序
ORG 0023H
LJMP SERVICE
;======================================
;主程序
;======================================
ORG 0030H
START:
MOV SP,#66H ;設(shè)置堆棧指針
; LCALL NORMALLIGHT
;SEED DOG
LCALL SEDOG
;光藕保持正常狀態(tài)
LCALL RESTORE
; 選擇寄存器組
LCALL CHOSERES
;關(guān)IC卡電源
LCALL CLOSE_IC ;關(guān)IC卡電源
LCALL INITIC ;IC卡端口初始化
;初始化變量
LCALL INICLR ;清理寄存器
LCALL INITCOMM ;初始化串行口
LCALL INIT0 ;初始化定時(shí)器
MOV DATACON,#20H
MOV DATACON1,#06H
MOV R0,#06H
MOV R1,#DATACON2
TEIC24: MOV @R1,#38H
INC R1
DJNZ R0,TEIC24
LCALL WRITESAVE ;向2401中寫數(shù)據(jù)
MOV DATACON2,#44H
MOV DATACON,#23H
MOV DATACON1,#05H
LCALL GETPARA ;讀2401中數(shù)據(jù)
JNB FLAG1.6,TEIC241
CLR FLAG1.6
SJMP TEIC242
TEIC241: NOP
TEIC242: SJMP $
;=======主循環(huán)程序========
MAIN_LOOP:
LCALL SEDOG
JNB RFLAG.0,MAIN_2 ;開(kāi)始接收數(shù)據(jù)否
CLR ET0
CLR TR0
MOV R7,#0FFH ;如果超過(guò)200ms沒(méi)收到則清除標(biāo)志
MOV R6,#0FFH
MAIN_1: JB RFLAG.5,MAIN_11 ;數(shù)據(jù)接收完否
DJNZ R6,MAIN_1
NOP
MOV R6,#0FFH
DJNZ R7,MAIN_1
SETB ET0
setb tr0
CLR RFLAG.0
CLR RFLAG.7
LCALL SEDOG
SJMP MAIN_2
;處理上位命令時(shí)關(guān)串口中斷
MAIN_11:
CLR ET0
CLR TR0
CLR ES ;上位有數(shù)據(jù)發(fā)送下來(lái)
LCALL SEDOG
CLR RFLAG.5 ;清除有數(shù)據(jù)標(biāo)志
LCALL DEALPC ;處理從上位發(fā)送下來(lái)的命令
SETB ET0
SETB TR0
SETB ES
MAIN_2: JNB RFLAG.1,MAIN_2_0 ;有沒(méi)有需要向上位發(fā)送的數(shù)據(jù)
JB RFLAG.0,MAIN_OUT ;是否正在接收上位發(fā)下來(lái)的數(shù)據(jù)
JB FLAG1.7,SENDTE ;重復(fù)向上位發(fā)送數(shù)據(jù)
SETB FLAG1.7
MOV OVTIM,#00H
LCALL SENDTOPC
aJMP MAIN_2_0
SENDTE: JB RFLAG.4,CLRSENT
CLR C
MOV A,DCOUNT
SUBB A,#32h ;500MS到否
JC MAIN_2_0 ;判斷向上位發(fā)送的數(shù)據(jù)是否超時(shí)
LCALL OVERTIME ;傳送超時(shí)
JB RFLAG.2, CLRSENT ;5次傳送超時(shí)
LCALL SENDTOPC
AJMP MAIN_2_0
CLRSENT: CLR RFLAG.2
CLR FLAG1.7
CLR RFLAG.1
CLR RFLAG.4
MAIN_2_0: ; JNB FLAG1.5,MAIN_OUT ;客戶端是否開(kāi)始工作
LCALL ICTEST
JB FLAG1.0,MAIN_IN ; 有卡插入否
; LCALL NORMALLIGHT ;無(wú)卡的燈
AJMP MAIN_OUT
MAIN_IN:
JB RFLAG.6, MAIN_OUT ;IC處理過(guò)嗎
JB RFLAG.0,MAIN_OUT ;是否正在接收上位發(fā)下來(lái)的數(shù)據(jù)
LCALL READICT ;處理新插入的卡
MAIN_OUT: LJMP MAIN_LOOP
;======初始化讀卡類型=====
READICT:
CLR ET0
CLR TR0
CLR ES
SETB RFLAG.6 ;卡處理過(guò)標(biāo)志
CLR FLAG1.3 ;不是錯(cuò)卡
CLR TEMP1.1 ;不是新卡
READICT_1:
LCALL DELAY_PC
MOV R5,#1BH ;(IN IC)
MOV R7,#1 ;
MOV R6,#CHECKIC ;(IN RAM)
LCALL READ_CARD
MOV A,CHECKIC
CJNE A,#0BBH,READICT_2 ;判斷是否在服務(wù)器上處理過(guò)或本系統(tǒng)的卡
LCALL CARDCHECK ;校驗(yàn)卡密碼
JB FLAG1.3,ICINTW
; LCALL GREENLIGHT ;正常插卡的燈
LCALL IN_IC
AJMP ICINT_OUT0
READICT_2: CJNE A,#0FFH,READICT_3
LCALL CARDCHECK1 ;校驗(yàn)是否新卡密碼
JB FLAG1.3,ICINTW
LCALL IN_NEWIC
SETB TEMP1.1
AJMP ICINT_OUT0
READICT_3: JB FLAG1.3,ICINTW ;再次判斷以防剛插入抖動(dòng)誤判
setb flag1.3
AJMP READICT_1
ICINTW: ; LCALL REDLIGHT ;錯(cuò)卡紅燈爍
LCALL WRONGICSEND
ICINT_OUT0: SETB RFLAG.1
SETB ET0
SETB TR0
SETB ES
RET
;======向PC發(fā)送數(shù)據(jù)========
SENDTOPC: CLR ET0
CLR TR0
CLR ES
LCALL SEDOG
MOV R0,#DATALONG
MOV A,@R0
LCALL SENDBYTE
MOV R0,#DATAF
MOV R1,#00H
SENTOPC1:
MOV A,@R0
LCALL SENDBYTE
LCALL DELAY_20
INC R1
INC R0
MOV A,R1
CJNE A,DATALONG,SENTOPC1
LCALL DELAY_20
MOV R0, #DATACHE
MOV A,@R0
LCALL SENDBYTE
MOV DCOUNT,#00H
SETB ES
SETB ET0
SETB TR0
RET
;===============向PC發(fā)送一個(gè)字節(jié)=========
SENDBYTE:
CLR TI
MOV SBUF,A
JNB TI,$
CLR TI
RET
;===========串口中斷處理程序==============
SERVICE:
PUSH PSW
PUSH ACC
CLR ET0
CLR TR0
CLR ES
NOP
NOP
CLR RI
MOV A,SBUF
SERVICES: JB RFLAG.0,SERVICE1 ;接收第一字節(jié)否
SETB RFLAG.0
CLR RFLAG.7
MOV DATALONG,A
MOV DATALONGT,#00H
SJMP SERVICEOUT
SERVICE1:
JB RFLAG.7,SERVICE2 ;接受數(shù)據(jù)完否
MOV R0,#DATAF
PUSH A
MOV A,R0
ADD A,DATALONGT
MOV R0,A
POP A
MOV @R0,A
INC DATALONGT
MOV A,DATALONGT
CJNE A,DATALONG,SERVICEOUT
MOV DATALONGT,#00H
SETB RFLAG.7
SJMP SERVICEOUT
SERVICE2:
MOV DATACHE,A
CLR RFLAG.7
CLR RFLAG.0
SETB RFLAG.5
SERVICEOUT: SETB ET0
SETB TR0
setb es
pop acc
pop psw
reti
;===============PC機(jī)發(fā)送的命令處理程序=========
DEALPC:
MOV R0,#DATAF
MOV R1,DATALONG
MOV A,#00H
CLR C
DATACHECK: ADD A,@R0
INC R0
DJNZ R1,DATACHECK
CJNE A,DATACHE,DEALPCOUT1
LCALL PASSKEY ;解密碼
MOV A,DATAF
CJNE A,#0AAH,BEPCDEAL ;是否是PC反饋信號(hào)
SETB RFLAG.4
CLR RFLAG.1
CLR FLAG1.7
AJMP DEALPCOUT1
BEPCDEAL: CJNE A,#51H,DEALPC1
SETB FLAG1.1
SETB FLAG1.5
LCALL RERIGHT
AJMP DEALPCOUT
DEALPC1:
CJNE A,#52H,DEALPC2
NOP ; 待擴(kuò)展
AJMP DEALPCOUT1
DEALPC2:
CJNE A,#53H,DEALPC3
LCALL GETPARA ;讀2401中數(shù)據(jù)
LCALL GETPARA_RE
AJMP DEALPCOUT
DEALPC3:
CJNE A,#54H,DEALPC4
LCALL WRITESAVE ;向2401中寫數(shù)據(jù)
LCALL GETPARA ;讀2401中數(shù)據(jù)
JNB FLAG1.6,DEALPC7
CLR FLAG1.6
LCALL WRREADIC ;無(wú)法正確讀出數(shù)據(jù)
AJMP DEALPCOUT
DEALPC7: LCALL RIGHTSAVE
AJMP DEALPCOUT
DEALPC4:
CJNE A,#55H,DEALPC5
LCALL READICCARD ;讀IC卡中數(shù)據(jù)
LCALL GETPARA_RE
AJMP DEALPCOUT
DEALPC5:
CJNE A,#56H,DEALPC6
LCALL WRITEICCARD ;向IC卡中寫數(shù)據(jù)
LCALL READICCARD ;讀IC卡中數(shù)據(jù)
JNB FLAG1.6,DEALPC9
CLR FLAG1.6
LCALL WRREADIC ;無(wú)法正確讀出數(shù)據(jù)
AJMP DEALPCOUT
DEALPC9: LCALL RIGHTSAVE
AJMP DEALPCOUT
DEALPC6: CJNE A,#59H,DEALPCOUT1
LCALL RERIGHT
LCALL SENDTOPC
LCALL CLOSESTORE ; 關(guān)機(jī)
LCALL DELAY_PC
AJMP DEALPCOUT1
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -