求IC卡读写程序原代码!高分相赠

CrazyGentleman 2003-09-18 12:52:12
型号是SLE4428,C51程序!
wabshen@21cn.com
...全文
51 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
gidee 2004-01-10
  • 打赏
  • 举报
回复
学习,收藏
CrazyGentleman 2003-09-26
  • 打赏
  • 举报
回复
指正得很专业!,非常感谢!

其中(2),我想请教:
我现在有延时100us 的汇编代码,现在需要1ms、10us 的代码,是否可以写成如下格式:

PUBLIC DL100us
PUBLIC DL10us
PUBLIC DL1ms

Prog_seg SEGMENT CODE

RSEG Prog_seg


; 延时100us子程序:DL100us(时钟为6MHz,时钟周期为1/6us,)
; 24*3+12+(2*24*0x01+12+24)*0x05+24*4 = 600时钟周期
DL100us:
PUSH PSW ;24时钟周期
PUSH 07H ;24时钟周期
PUSH 06H ;24时钟周期
MOV R7,#05H ;12时钟周期
LOOP1:
MOV R6,#01H ;12时钟周期
LOOP2:
NOP ;12时钟周期
NOP ;12时钟周期
DJNZ R6,LOOP2 ;24时钟周期
DJNZ R7,LOOP1 ;24时钟周期
POP 06H ;24时钟周期
POP 07H ;24时钟周期
POP PSW ;24时钟周期
RET ;24时钟周期

DL10us:
…………
RET
DL1ms:
…………
RET

END
liangsiyuan 2003-09-26
  • 打赏
  • 举报
回复
你的代码我看了,很清晰,也很有条理,不错。
不过有写地方我认为应该修改一下,因为代码太占ROM空间了。而且效率很低。

比如:
(1)Temp_Order = Addr/256;
Temp_Order = Temp_Order << 1;
Temp_Order = Temp_Order << 1;
Temp_Order = Temp_Order << 1;
Temp_Order = Temp_Order << 1;
Temp_Order = Temp_Order << 1;
Temp_Order = Temp_Order << 1;
可改为:Temp_Order = (Addr/256)<<6;

(2)void DL10us(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
return;
}
可改为汇编写,下面是430的汇编。
delay ;void delay(int count)
;R12 = int count
TST R12 ; in case of 0==R12
JZ delay_end
delay_dec
DEC R12
JNZ delay_dec
delay_end
RET

(3)下面这个全局变量改为局部变量
unsigned char Command_Entry[3] = {0x00,0x00,0x00};

(4)下面这个判断
if((Temp_Order&Command_Entry[j])==0)
改为:if(!(Temp_Order&Command_Entry[j]))

(5)Temp_Order = Temp_Order<<1;
改为:Temp_Order <<= 1;
Error_Counter_Byte = Error_Counter_Byte&temp;
改为:Error_Counter_Byte &= temp;

*注:所有这样的操作都改成我给你的例子这样。

(6)每个函数最后的return;都删除掉。
*********************************************************

可能还有一些问题存在,显得代码不是很专业。
个人认为,在开发驱动的时候最好是用汇编写,很节省空间,效率也很高

liangsiyuan 2003-09-26
  • 打赏
  • 举报
回复
理论上讲,你上面的程序就是100us的程序,而且应该很准确。但是你最好是用示波器看看波形。

(1)延时程序最好是用传递参数的方式。

比如:
void delay(unsigned short dLen)
{
while(--dLen);
}

(2)然后你可以定义一些宏作为参数。

比如:
#define DELAY_10_US xxxxH
#define DELAY_100_US xxxxH
#define DELAY_1_MS xxxxH

(3)最后你就可以调用函数来实现了。

比如:
delay(DELAY_10_US);//10us延时
delay(DELAY_100_US);//100us延时
delay(DELAY_1_MS);//1ms延时
shweng 2003-09-25
  • 打赏
  • 举报
回复
真是高手啊
CrazyGentleman 2003-09-25
  • 打赏
  • 举报
回复
up
liangsiyuan 2003-09-24
  • 打赏
  • 举报
回复
我没收到你的代码,再发一遍吧。
我明天有个“一级告警”要解决,可能要后天才能帮你看代码。
liangsiyuan 2003-09-24
  • 打赏
  • 举报
回复
我出差了几天,昨天刚刚回来,所以今天才把代码帖出来,不好意思啊
liangsiyuan 2003-09-24
  • 打赏
  • 举报
回复
上面的是SLE4442的读写程序,我调试过了,你按照SLE4428的手册再稍微改一下就OK了。
如果看汇编累的话,就给我发Email,我把C的代码发给你。
SLE4428的寻址是16位的,4442是8位的,这是修改的关键。
liangsiyuan 2003-09-24
  • 打赏
  • 举报
回复
SFR WDG=0xA6
CS EQU P2.1
mclk EQU P2.0
DIO EQU P2.2
ICLK EQU P3.4
IO EQU P3.7
IRST EQU P3.5
HDOG EQU P2.6

;************************************
;* S_IN
;************************************
S_IN:
MOV R6,#8
SETB IO
S_IN1:
CLR ICLK
LCALL DELAY
SETB ICLK
LCALL DELAY
MOV C,IO
RRC A
DJNZ R6,S_IN1
RET

;************************************
;* S_OUT
;************************************
S_OUT:
MOV R6,#8
CLR ICLK
SOUT1:
RRC A
MOV IO,C
SETB ICLK
LCALL DELAY
CLR ICLK
LCALL DELAY
DJNZ R6,SOUT1
RET

;************************************
;* S_START
;************************************
S_START:
SETB IO
LCALL DELAY
SETB ICLK
LCALL DELAY
CLR IO
LCALL DELAY
RET

;************************************
;* S_STOP
;************************************
S_STOP:
CLR ICLK
CLR IO
LCALL DELAY
SETB ICLK
LCALL DELAY
SETB IO
RET

;************************************
;* S_PCM
;************************************
S_PCM:
CLR ICLK
SETB IO
MOV R6,#20
S_PCM3:
MOV R7,#0
S_PCM2:
JB IO,S_PCM1
CLR ICLK
NOP
SETB ICLK
NOP
NOP
CLR ICLK
DJNZ R7,S_PCM2
DJNZ R6,S_PCM3
S_PCME:
CLR C
RET
S_PCM1:
SETB C
RET

;************************************
;* S_CMD
;* R2-S_CMD,R5-ADD,R4-data
;************************************
S_CMD:
LCALL S_START
MOV A,R2
LCALL S_OUT
MOV A,R5
LCALL S_OUT
MOV A,R4
LCALL S_OUT
LCALL S_STOP
RET

;************************************
;* RESET42
;************************************
PUBLIC RESET42
reset42p SEGMENT CODE
RSEG reset42p
RESET42:
SETB IO
CLR ICLK
CLR IRST
LCALL DELAY
SETB IRST
LCALL DELAY
SETB ICLK
LCALL DELAY
CLR ICLK
LCALL DELAY
CLR IRST
LCALL DELAY
LCALL S_IN
LCALL S_IN
LCALL S_IN
LCALL S_IN
CJNE A,#91H,RESET421
CLR ICLK
NOP
NOP
SETB ICLK
NOP
CLR ICLK
NOP
SETB C
RET
RESET421:
CLR C
RET

;************************************
;* write42
;* R5-ICADD,R7-DATA,R3-length
;************************************
PUBLIC _write42
rps SEGMENT CODE
RSEG rPS
_write42:
LCALL RESET42
JNC S_W1
MOV A,R7
MOV R1,A
S_W2:
MOV R2,#38H
MOV A,@R1
MOV R4,A
LCALL S_CMD
LCALL S_PCM
JNC S_W1
INC R1
INC R5
DJNZ R3,S_W2
SETB C
S_W1:
RET

;************************************
;* read42
;* R0-ICADD,R1-DATA_ADD,R7-length
;************************************
PUBLIC _read42
sps SEGMENT CODE
RSEG sPS
_read42:
LCALL RESET42
JnC RENDG
MOV R2,#30H
MOV A,R7
MOV R1,A
LCALL S_CMD
SREAD1:
LCALL S_IN
MOV @R1,A
INC R1
DJNZ R3,SREAD1
LCALL RESET42
SETB C
RENDG:
RET

;************************************
;* comp42
;* R0-ICADD,R1-DATA_ADD,R7-length
;************************************
PUBLIC _comp42
s1ps SEGMENT CODE
RSEG s1PS
_comp42:
MOV A,R7
MOV R0,A
LCALL RESET42
JNC S_CMPE
MOV R2,#31H
MOV R5,#0
LCALL S_CMD
LCALL S_IN
anl A,#7
CJNE A,#7,S_CMPe
CLR ACC.0
MOV B,A
LCALL RESET42
JNC S_CMPE
MOV R2,#39h
MOV R5,#0
MOV R4,#6
LCALL S_CMD
LCALL S_PCM
JNC S_CMPE
MOV R3,#3
MOV R2,#33h
MOV R5,#1
S_CMP2:
MOV A,@R0
INC R0
MOV R4,A
LCALL S_CMD
LCALL S_PCM
JNC S_CMPE
INC R5
DJNZ R3,S_CMP2
S_CMP12:
MOV R2,#39h
MOV R5,#0
MOV R4,#0ffh
LCALL S_CMD
LCALL S_PCM
JNC S_CMPE
MOV R2,#31h
MOV R5,#0
LCALL S_CMD
LCALL S_IN
ANL A,#7
CJNE A,#7,S_CMPE
LCALL RESET42
SETB C
RET
S_CMPE:
CLR C
RET

end.

CrazyGentleman 2003-09-24
  • 打赏
  • 举报
回复
我把C代码发到你信箱了!
麻烦看看,还有什么不妥当的地方?/
我现在正在调试,没再遇到什么大的问题,就是不知道有什么BUG。
谢谢你的帮助。
过2天,我要结贴了!
88LYFLY 2003-09-23
  • 打赏
  • 举报
回复
给我看看可以吗

我也想了解一下
TLL_kdtx@163.com
liangsiyuan 2003-09-21
  • 打赏
  • 举报
回复
做好了,改天发给你
CrazyGentleman 2003-09-20
  • 打赏
  • 举报
回复
waiting..........
jack2004 2003-09-19
  • 打赏
  • 举报
回复
有資料嗎?給我一份,現正沒啥事一做.
fhqitxss@yahoo.com.cn
liangsiyuan 2003-09-19
  • 打赏
  • 举报
回复
我需要的信息包括:
1、I/O定义
2、SLE4428手册(中英文均可)
3、您所使用的单片机型号及手册(中英文均可)

注:如果不忙的话,一天内可帮您解决问题(联系方式见楼上)
liangsiyuan 2003-09-19
  • 打赏
  • 举报
回复
我写过SLE4442的,如果您有调试环境的话,把手册发给我,我帮你。
email:xinxin_lsy@163.com
phone:0755-26711778
sxoldbig 2003-09-18
  • 打赏
  • 举报
回复
不懂,帮你顶一下!

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧