📄 erase_card.s
字号:
.module Erase_Card.c
.area data(ram, con, rel)
_Erase_IC_FLAG::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\PROGRA~1\ICC\Pro(AVR)\环保型IC卡门禁系统\Erase_Card.c
.dbsym e Erase_IC_FLAG _Erase_IC_FLAG c
.area text(rom, con, rel)
.dbfile D:\PROGRA~1\ICC\Pro(AVR)\环保型IC卡门禁系统\Erase_Card.c
.dbfunc e Erase_bit _Erase_bit fV
; i -> R20
; Erase_flag -> R22
.even
_Erase_bit::
rcall push_gset2
mov R22,R16
.dbline -1
.dbline 14
; /*******************************************************************************
;
; 擦除高字节 函数
;
; *******************************************************************************/
;
; #include <iom8v.h>
; #include <macros.h>
; #include "lcd1602.h"
;
; unsigned char Erase_IC_FLAG=0 ; // 擦除高位标志
;
; void Erase_bit(unsigned char Erase_flag) // 擦除位函数
; {
.dbline 15
; unsigned char i=0 ;
clr R20
.dbline 17
;
; Reset_0 ;
in R24,0x18
andi R24,191
out 0x18,R24
.dbline 18
; CLK_0 ; // IC_Card 卡复位
in R24,0x18
andi R24,127
out 0x18,R24
.dbline 19
; delay_nms(10);
ldi R16,10
ldi R17,0
rcall _delay_nms
.dbline 21
;
; Reset_1 ; // 把
sbi 0x18,6
.dbline 22
; delay_nus(8) ;
ldi R16,8
ldi R17,0
rcall _delay_nus
.dbline 23
; CLK_1 ; // 地
sbi 0x18,7
.dbline 24
; delay_nus(44) ;
ldi R16,44
ldi R17,0
rcall _delay_nus
.dbline 25
; CLK_0 ; // 址
in R24,0x18
andi R24,127
out 0x18,R24
.dbline 26
; delay_nus(8) ;
ldi R16,8
ldi R17,0
rcall _delay_nus
.dbline 27
; Reset_0 ; // 加
in R24,0x18
andi R24,191
out 0x18,R24
.dbline 28
; delay_nus(10) ;
ldi R16,10
ldi R17,0
rcall _delay_nus
.dbline 29
; delay_nus(27) ; // 到
ldi R16,27
ldi R17,0
rcall _delay_nus
.dbline 31
;
; for (i=0;i<Erase_flag;i++) // 要
rjmp L5
L2:
.dbline 32
.dbline 33
sbi 0x18,7
.dbline 34
ldi R16,40
ldi R17,0
rcall _delay_nus
.dbline 35
in R24,0x18
andi R24,127
out 0x18,R24
.dbline 36
ldi R16,25
ldi R17,0
rcall _delay_nus
.dbline 37
ldi R16,20
ldi R17,0
rcall _delay_nus
.dbline 38
L3:
.dbline 31
inc R20
L5:
.dbline 31
cp R20,R22
brlo L2
.dbline 40
; {
; CLK_1 ; // 擦
; delay_nus(40) ;
; CLK_0 ; // 的
; delay_nus(25) ;
; delay_nus(20) ; // 位
; }
;
; Reset_1 ; // 擦
sbi 0x18,6
.dbline 41
; delay_nus(50) ;
ldi R16,50
ldi R17,0
rcall _delay_nus
.dbline 42
; Reset_0 ; // 除
in R24,0x18
andi R24,191
out 0x18,R24
.dbline 43
; delay_nus(10) ;
ldi R16,10
ldi R17,0
rcall _delay_nus
.dbline 44
; CLK_1 ; // 字
sbi 0x18,7
.dbline 45
; delay_nus(15000) ;
ldi R16,15000
ldi R17,58
rcall _delay_nus
.dbline 46
; CLK_0 ; // 节
in R24,0x18
andi R24,127
out 0x18,R24
.dbline 47
; delay_nus(50) ;
ldi R16,50
ldi R17,0
rcall _delay_nus
.dbline 48
; Reset_1 ; //
sbi 0x18,6
.dbline 49
; delay_nus(50) ;
ldi R16,50
ldi R17,0
rcall _delay_nus
.dbline 50
; Reset_0 ; // 时
in R24,0x18
andi R24,191
out 0x18,R24
.dbline 51
; delay_nus(100) ;
ldi R16,100
ldi R17,0
rcall _delay_nus
.dbline 52
; CLK_1 ; //
sbi 0x18,7
.dbline 53
; delay_nus(50000) ;
ldi R16,50000
ldi R17,195
rcall _delay_nus
.dbline 54
; CLK_0 ; // 序
in R24,0x18
andi R24,127
out 0x18,R24
.dbline 56
;
; Read_Card();
rcall _Read_Card
.dbline -2
L1:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r Erase_flag 22 c
.dbend
.dbfunc e Erase_Card _Erase_Card fV
; Erase_flag -> R20
; i -> R22
; flag -> R10
.even
_Erase_Card::
rcall push_gset3
.dbline -1
.dbline 60
; }
;
; void Erase_Card(void) // 检测擦除位操作
; {
.dbline 62
; //移位标志 // 擦除位置标志
; unsigned char i=0 , flag=0 , Erase_flag=0 ;
clr R22
.dbline 62
clr R10
.dbline 62
clr R20
.dbline 64
;
; flag=0x01 ;
clr R10
inc R10
.dbline 66
;
; if( IC_Codes_8[11] != 0 )
lds R2,_IC_Codes_8+11
tst R2
breq L7
.dbline 67
; { // 检测该位是否为0,不为0则擦除该位
.dbline 68
; for(i=0;i<8;i++)
rjmp L13
L10:
.dbline 69
; {
.dbline 70
; if ( (IC_Codes_8[12]&flag) != 0 ) // 检测到不为0的位则进行下面操作
lds R2,_IC_Codes_8+12
and R2,R10
breq L14
.dbline 71
; {
.dbline 72
; Erase_flag = 95-i ; // 确定要擦除的位
ldi R20,95
sub R20,R22
.dbline 73
; Erase_bit(Erase_flag); // 擦除位
mov R16,R20
rcall _Erase_bit
.dbline 74
; }
L14:
.dbline 75
lsl R10
.dbline 76
L11:
.dbline 68
inc R22
L13:
.dbline 68
cpi R22,8
brlo L10
.dbline 77
; flag=flag<<1;
; }
; }
rjmp L8
L7:
.dbline 80
;
; else // 检测个位是否为0,为0则先擦除高字节数据再写位
; {
.dbline 81
; flag=0x01 ;
clr R10
inc R10
.dbline 82
; if( IC_Codes_8[10] != 0 )
lds R2,_IC_Codes_8+10
tst R2
breq L17
.dbline 83
; { // 检测该位是否为0,不为0则擦除该位
.dbline 84
; for(i=0;i<8;i++)
clr R22
rjmp L23
L20:
.dbline 85
; {
.dbline 86
; if ( (IC_Codes_8[10]&flag) != 0 ) // 检测到不为0的位则进行下面操作
lds R2,_IC_Codes_8+10
and R2,R10
breq L24
.dbline 87
; {
.dbline 88
; Erase_flag = 87-i ; // 确定要擦除的位
ldi R20,87
sub R20,R22
.dbline 89
; Erase_bit(Erase_flag); // 擦除位
mov R16,R20
rcall _Erase_bit
.dbline 90
; }
L24:
.dbline 91
lsl R10
.dbline 92
L21:
.dbline 84
inc R22
L23:
.dbline 84
cpi R22,8
brlo L20
.dbline 93
; flag=flag<<1;
; }
; }
rjmp L18
L17:
.dbline 96
;
; else // 检测个位是否为0,为0则先擦除高字节数据再写位
; {
.dbline 97
; flag=0x01 ;
clr R10
inc R10
.dbline 98
; if( IC_Codes_8[9] != 0 )
lds R2,_IC_Codes_8+9
tst R2
breq L27
.dbline 99
; { // 检测该位是否为0,不为0则擦除该位
.dbline 100
; for(i=0;i<8;i++)
clr R22
rjmp L33
L30:
.dbline 101
; {
.dbline 102
; if ( (IC_Codes_8[9]&flag) != 0 ) // 检测到不为0的位则进行下面操作
lds R2,_IC_Codes_8+9
and R2,R10
breq L34
.dbline 103
; {
.dbline 104
; Erase_flag = 79-i ; // 确定要擦除的位
ldi R20,79
sub R20,R22
.dbline 105
; Erase_bit(Erase_flag); // 擦除位
mov R16,R20
rcall _Erase_bit
.dbline 106
; }
L34:
.dbline 107
lsl R10
.dbline 108
L31:
.dbline 100
inc R22
L33:
.dbline 100
cpi R22,8
brlo L30
.dbline 109
; flag=flag<<1;
; }
; }
rjmp L28
L27:
.dbline 112
;
; else // 若无数据可擦写,则显示0
; {
.dbline 113
; Erase_IC_FLAG=0;
clr R2
sts _Erase_IC_FLAG,R2
.dbline 114
; Write_Card_Value();
rcall _Write_Card_Value
.dbline 115
; }
L28:
.dbline 116
; }
L18:
.dbline 117
L8:
.dbline -2
L6:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r Erase_flag 20 c
.dbsym r i 22 c
.dbsym r flag 10 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -