📄 tic4.asm
字号:
;=========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 存放卡效验结果和密码4字节
CHECKIC EQU 12H ;读IC卡数据用(临时变量)
;========24C01===============
DATAR EQU 21H ;24C01 读子程序使用
DATAW EQU 22H ;24C01 写子程序使用
CHECKSUM EQU 13H ;24C01 效验和
TEMP0 EQU 14H ;24C01 存放地址(临时变量)
TEMP2 EQU 15H ;24C01 存放数据(临时变量)
;----------------------------
DCOUNT EQU 18H ;判断上位PC发送的数据是否超时,设置为0.5秒超时
OVTIM EQU 19H ;同一段数据传送次数记录
TEMP10 EQU 1AH ;软件定时器,累计到一秒
TEMP11 EQU 1BH ;软件定时器,累计到一秒,用于拔卡
STIME EQU 1CH ;软件定时器,累计到一分
STIME1 EQU 1DH ;软件定时器,记录分钟数(与小精灵相比较)
TEMPS1 EQU 1EH ;解密加密时使用(临时变量)
;============================
DATALONGT EQU 30H ;临时放置总数据长度
DATACHE EQU 31H ;传送总数据效验和
DATALONG EQU 32H ;总数据长度
DATAF EQU 33H ;数据标志(37h---66H)
S1 EQU 34H
S2 EQU 35H
DATAL EQU 36H ;有效数据长度
R EQU 37H
DATACON EQU 38H ;数据内容 (37h---66H)
DATACON1 EQU 39H
DATACON2 EQU 3aH
DATACON3 EQU 3bH
;============================
FLAG1 EQU 23H ;flag1.0--是否有卡插入 (1)
;flag1.1--小精灵有通讯 (1)
;flag1.2--自由上机状态 (1?)
;flag1.3--错卡或坏卡 (1)
;flag1.4--发送卡拔出消息
;flag1.5--小精灵有通讯用于程序进入工作 (1)
;flag1.6--读写2401,ic失败 (1)
;flag1.7--是否开始发送数据 (1)
RFLAG EQU 24h ;RFLAG.0--接收数据开始
;RFLAG.1--需要向PC发数据
;RFLAG.2--5次超时到
;RFLAG.3--第一次超时
;RFLAG.4--发送数据有反馈
;RFLAG.5--已接收上位机发送下来的完整数据(1)
;RFLAG.6--IC卡已经处理过(效验密码)
;rflag.7--接收数据结束不包含效验
TEMP1 EQU 20H ;TEMP1.0--
;TEMP1.1--新卡(1)
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;程序复位执行
ORG 0000H
LJMP START
;定时器处理程序
ORG 000BH
LJMP EINT
;串口处理程序
ORG 0023H
LJMP SERVICE
;======================================
;主程序
;======================================
ORG 0030H
START:
MOV SP,#66H ;设置堆栈指针
; LCALL NORMALLIGHT
;SEED DOG
LCALL SEDOG
;光藕保持正常状态
LCALL RESTORE
; 选择寄存器组
LCALL CHOSERES
;关IC卡电源
LCALL CLOSE_IC ;关IC卡电源
LCALL INITIC ;IC卡端口初始化
;初始化变量
LCALL INICLR ;清理寄存器
LCALL INITCOMM ;初始化串行口
LCALL INIT0 ;初始化定时器
MOV DATACON,#20H
MOV DATACON1,#06H
MOV R0,#06H
MOV R1,#DATACON2
TEIC24: MOV @R1,#38H
INC R1
DJNZ R0,TEIC24
LCALL WRITESAVE ;向2401中写数据
MOV DATACON2,#44H
MOV DATACON,#23H
MOV DATACON1,#05H
LCALL GETPARA ;读2401中数据
JNB FLAG1.6,TEIC241
CLR FLAG1.6
SJMP TEIC242
TEIC241: NOP
TEIC242: SJMP $
;=======主循环程序========
MAIN_LOOP:
LCALL SEDOG
JNB RFLAG.0,MAIN_2 ;开始接收数据否
CLR ET0
CLR TR0
MOV R7,#0FFH ;如果超过200ms没收到则清除标志
MOV R6,#0FFH
MAIN_1: JB RFLAG.5,MAIN_11 ;数据接收完否
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
;处理上位命令时关串口中断
MAIN_11:
CLR ET0
CLR TR0
CLR ES ;上位有数据发送下来
LCALL SEDOG
CLR RFLAG.5 ;清除有数据标志
LCALL DEALPC ;处理从上位发送下来的命令
SETB ET0
SETB TR0
SETB ES
MAIN_2: JNB RFLAG.1,MAIN_2_0 ;有没有需要向上位发送的数据
JB RFLAG.0,MAIN_OUT ;是否正在接收上位发下来的数据
JB FLAG1.7,SENDTE ;重复向上位发送数据
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 ;判断向上位发送的数据是否超时
LCALL OVERTIME ;传送超时
JB RFLAG.2, CLRSENT ;5次传送超时
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 ;客户端是否开始工作
LCALL ICTEST
JB FLAG1.0,MAIN_IN ; 有卡插入否
; LCALL NORMALLIGHT ;无卡的灯
AJMP MAIN_OUT
MAIN_IN:
JB RFLAG.6, MAIN_OUT ;IC处理过吗
JB RFLAG.0,MAIN_OUT ;是否正在接收上位发下来的数据
LCALL READICT ;处理新插入的卡
MAIN_OUT: LJMP MAIN_LOOP
;======初始化读卡类型=====
READICT:
CLR ET0
CLR TR0
CLR ES
SETB RFLAG.6 ;卡处理过标志
CLR FLAG1.3 ;不是错卡
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 ;判断是否在服务器上处理过或本系统的卡
LCALL CARDCHECK ;校验卡密码
JB FLAG1.3,ICINTW
; LCALL GREENLIGHT ;正常插卡的灯
LCALL IN_IC
AJMP ICINT_OUT0
READICT_2: CJNE A,#0FFH,READICT_3
LCALL CARDCHECK1 ;校验是否新卡密码
JB FLAG1.3,ICINTW
LCALL IN_NEWIC
SETB TEMP1.1
AJMP ICINT_OUT0
READICT_3: JB FLAG1.3,ICINTW ;再次判断以防刚插入抖动误判
setb flag1.3
AJMP READICT_1
ICINTW: ; LCALL REDLIGHT ;错卡红灯烁
LCALL WRONGICSEND
ICINT_OUT0: SETB RFLAG.1
SETB ET0
SETB TR0
SETB ES
RET
;======向PC发送数据========
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发送一个字节=========
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 ;接收第一字节否
SETB RFLAG.0
CLR RFLAG.7
MOV DATALONG,A
MOV DATALONGT,#00H
SJMP SERVICEOUT
SERVICE1:
JB RFLAG.7,SERVICE2 ;接受数据完否
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机发送的命令处理程序=========
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反馈信号
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 ; 待扩展
AJMP DEALPCOUT1
DEALPC2:
CJNE A,#53H,DEALPC3
LCALL GETPARA ;读2401中数据
LCALL GETPARA_RE
AJMP DEALPCOUT
DEALPC3:
CJNE A,#54H,DEALPC4
LCALL WRITESAVE ;向2401中写数据
LCALL GETPARA ;读2401中数据
JNB FLAG1.6,DEALPC7
CLR FLAG1.6
LCALL WRREADIC ;无法正确读出数据
AJMP DEALPCOUT
DEALPC7: LCALL RIGHTSAVE
AJMP DEALPCOUT
DEALPC4:
CJNE A,#55H,DEALPC5
LCALL READICCARD ;读IC卡中数据
LCALL GETPARA_RE
AJMP DEALPCOUT
DEALPC5:
CJNE A,#56H,DEALPC6
LCALL WRITEICCARD ;向IC卡中写数据
LCALL READICCARD ;读IC卡中数据
JNB FLAG1.6,DEALPC9
CLR FLAG1.6
LCALL WRREADIC ;无法正确读出数据
AJMP DEALPCOUT
DEALPC9: LCALL RIGHTSAVE
AJMP DEALPCOUT
DEALPC6: CJNE A,#59H,DEALPCOUT1
LCALL RERIGHT
LCALL SENDTOPC
LCALL CLOSESTORE ; 关机
LCALL DELAY_PC
AJMP DEALPCOUT1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -