write_card.s
来自「环保型IC卡门禁系统的C程序」· S 代码 · 共 494 行
S
494 行
.module Write_Card.c
.area text(rom, con, rel)
.dbfile D:\PROGRA~1\ICC\Pro(AVR)\环保型IC卡门禁系统\Write_Card.c
.dbfunc e Write_bit _Write_bit fV
; i -> R20
; Write_flag -> R22
.even
_Write_bit::
rcall push_gset2
mov R22,R16
.dbline -1
.dbline 12
; /*******************************************************************************
;
; 写卡 函数
;
; *******************************************************************************/
;
; #include <iom8v.h>
; #include <macros.h>
; #include "lcd1602.h"
;
; void Write_bit(unsigned char Write_flag) // 写卡位标志
; {
.dbline 13
; unsigned char i=0 ;
clr R20
.dbline 15
;
; Reset_0 ;
in R24,0x18
andi R24,191
out 0x18,R24
.dbline 16
; CLK_0 ; // IC_Card 卡复位
in R24,0x18
andi R24,127
out 0x18,R24
.dbline 17
; delay_nms(10);
ldi R16,10
ldi R17,0
rcall _delay_nms
.dbline 19
;
; Reset_1 ; // 把
sbi 0x18,6
.dbline 20
; delay_nus(8) ;
ldi R16,8
ldi R17,0
rcall _delay_nus
.dbline 21
; CLK_1 ; // 地
sbi 0x18,7
.dbline 22
; delay_nus(44) ;
ldi R16,44
ldi R17,0
rcall _delay_nus
.dbline 23
; CLK_0 ; // 址
in R24,0x18
andi R24,127
out 0x18,R24
.dbline 24
; delay_nus(8) ;
ldi R16,8
ldi R17,0
rcall _delay_nus
.dbline 25
; Reset_0 ; // 加
in R24,0x18
andi R24,191
out 0x18,R24
.dbline 26
; delay_nus(10) ;
ldi R16,10
ldi R17,0
rcall _delay_nus
.dbline 27
; delay_nus(27) ; // 到
ldi R16,27
ldi R17,0
rcall _delay_nus
.dbline 29
;
; for (i=1;i<Write_flag;i++) // 要
ldi R20,1
rjmp L5
L2:
.dbline 30
.dbline 31
sbi 0x18,7
.dbline 32
ldi R16,40
ldi R17,0
rcall _delay_nus
.dbline 33
in R24,0x18
andi R24,127
out 0x18,R24
.dbline 34
ldi R16,25
ldi R17,0
rcall _delay_nus
.dbline 35
ldi R16,20
ldi R17,0
rcall _delay_nus
.dbline 36
L3:
.dbline 29
inc R20
L5:
.dbline 29
cp R20,R22
brlo L2
.dbline 38
; {
; CLK_1 ; // 写
; delay_nus(40) ;
; CLK_0 ; // 的
; delay_nus(25) ;
; delay_nus(20) ; // 位
; }
;
; Reset_1 ; // 写
sbi 0x18,6
.dbline 39
; delay_nus(50) ; //
ldi R16,50
ldi R17,0
rcall _delay_nus
.dbline 40
; Reset_0 ; // 位
in R24,0x18
andi R24,191
out 0x18,R24
.dbline 41
; delay_nus(10) ; //
ldi R16,10
ldi R17,0
rcall _delay_nus
.dbline 42
; CLK_1 ; // 时
sbi 0x18,7
.dbline 43
; delay_nus(15000) ; //
ldi R16,15000
ldi R17,58
rcall _delay_nus
.dbline 44
; CLK_0 ; // 序
in R24,0x18
andi R24,127
out 0x18,R24
.dbline 46
;
; Read_Card(); // 读卡
rcall _Read_Card
.dbline -2
L1:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r Write_flag 22 c
.dbend
.dbfunc e Write_Card _Write_Card fV
; j -> R20
; Write_flag -> R22
; i -> R10
; flag -> R12
; Write_Value -> R14
.even
_Write_Card::
rcall push_gset5
mov R14,R16
.dbline -1
.dbline 50
; }
;
; void Write_Card(unsigned char Write_Value) // 检测写位操作
; {
.dbline 52
; //移位标志 //写位位置
; unsigned char i=0 , j = 0 , flag=0 , Write_flag=0 ;
clr R10
.dbline 52
clr R20
.dbline 52
clr R12
.dbline 52
clr R22
.dbline 54
;
; for(j=0;j<Write_Value;j++)
rjmp L10
L7:
.dbline 55
; {
.dbline 56
; flag=0x01 ;
clr R12
inc R12
.dbline 58
;
; if( IC_Codes_8[12] != 0 ) // 检测个位是否为0,不为0则写该位
lds R2,_IC_Codes_8+12
tst R2
breq L11
.dbline 59
; {
.dbline 60
; for(i=0;i<8;i++)
clr R10
rjmp L17
L14:
.dbline 61
; {
.dbline 62
; if ( (IC_Codes_8[12]&flag) != 0 ) // 检测到不为0的位则进行下面操作
lds R2,_IC_Codes_8+12
and R2,R12
breq L18
.dbline 63
; {
.dbline 64
; Write_flag = 104-i ; // 确定要写的位
ldi R22,104
sub R22,R10
.dbline 65
; Write_bit(Write_flag); // 写位
mov R16,R22
rcall _Write_bit
.dbline 66
; }
L18:
.dbline 67
lsl R12
.dbline 68
L15:
.dbline 60
inc R10
L17:
.dbline 60
mov R24,R10
cpi R24,8
brlo L14
.dbline 69
; flag=flag<<1;
; }
; }
rjmp L12
L11:
.dbline 72
;
; else
; {
.dbline 73
; Erase_IC_FLAG=1 ; // 检测个位是否为0,为0则先擦除高字节数据再写位
ldi R24,1
sts _Erase_IC_FLAG,R24
.dbline 74
; Erase_Card();
rcall _Erase_Card
.dbline 75
; }
L12:
.dbline 76
L8:
.dbline 54
inc R20
L10:
.dbline 54
cp R20,R14
brlo L7
.dbline 78
; }
;
; Write_Card_Value();
rcall _Write_Card_Value
.dbline -2
L6:
rcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r Write_flag 22 c
.dbsym r i 10 c
.dbsym r flag 12 c
.dbsym r Write_Value 14 c
.dbend
.dbfunc e Write_Card_Value _Write_Card_Value fV
; Write_Value -> R20
; Key -> R22
.even
_Write_Card_Value::
rcall push_gset2
sbiw R28,2
.dbline -1
.dbline 82
; }
;
; void Write_Card_Value(void)
; {
.dbline 83
; unsigned char Key = 0 , Write_Value = 0 ;
clr R22
.dbline 83
clr R20
.dbline 85
;
; LCD_write_char(0x01,0); //清屏
clr R18
clr R19
ldi R16,1
ldi R17,0
rcall _LCD_write_char
.dbline 86
; delay_nms(2);
ldi R16,2
ldi R17,0
rcall _delay_nms
.dbline 88
;
; LCD_write_string(0,1,"Balance $: . ");
ldi R24,<L22
ldi R25,>L22
std y+1,R25
std y+0,R24
ldi R18,1
clr R16
rcall _LCD_write_string
.dbline 89
; Balance_dis();
rcall _Balance_dis
.dbline 90
; LCD_write_char(0x0f,0); // 显示光标
clr R18
clr R19
ldi R16,15
ldi R17,0
rcall _LCD_write_char
.dbline 91
; LCD_write_string(0,0,"Subtract $ : 0.");
ldi R24,<L23
ldi R25,>L23
std y+1,R25
std y+0,R24
clr R18
clr R16
rcall _LCD_write_string
rjmp L25
L24:
.dbline 94
;
; while(1)
; {
.dbline 95
; Key = Key_Scan() ;
rcall _Key_Scan
mov R22,R16
.dbline 97
;
; if(Key!=0)
tst R16
breq L27
.dbline 98
; {
.dbline 99
; if(Key<10)
cpi R16,10
brsh L29
.dbline 100
; {
.dbline 101
; Write_Value = Key ;
mov R20,R22
.dbline 102
; display(Key , 15);
ldi R18,15
rcall _display
.dbline 103
; }
L29:
.dbline 105
;
; if(Key==11)
cpi R22,11
brne L31
.dbline 106
; {
.dbline 107
; LCD_write_char(0x0c,0); // 关闭光标
clr R18
clr R19
ldi R16,12
ldi R17,0
rcall _LCD_write_char
.dbline 108
; menu_Init() ;
rcall _menu_Init
.dbline 109
; }
L31:
.dbline 111
;
; if(Key==12)
cpi R22,12
brne L33
.dbline 112
; {
.dbline 113
; LCD_write_char(0x0c,0); // 关闭光标
clr R18
clr R19
ldi R16,12
ldi R17,0
rcall _LCD_write_char
.dbline 114
; Write_Card(Write_Value);
mov R16,R20
rcall _Write_Card
.dbline 115
; }
L33:
.dbline 116
; }
L27:
.dbline 118
;
; if(IC_SW!=0)
in R24,0x10
andi R24,8
out 0x10,R24
tst R24
breq L35
.dbline 119
; {
.dbline 120
; delay_nms(50); // 检测是否有卡插入
ldi R16,50
ldi R17,0
rcall _delay_nms
.dbline 121
; if(IC_SW!=0)
in R24,0x10
andi R24,8
out 0x10,R24
tst R24
breq L37
.dbline 122
; {
.dbline 123
; menu_Init();
rcall _menu_Init
.dbline 124
; }
L37:
.dbline 125
; }
L35:
.dbline 126
L25:
.dbline 93
rjmp L24
X0:
.dbline -2
L21:
adiw R28,2
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Write_Value 20 c
.dbsym r Key 22 c
.dbend
.area data(ram, con, rel)
.dbfile D:\PROGRA~1\ICC\Pro(AVR)\环保型IC卡门禁系统\Write_Card.c
L23:
.blkb 16
.area idata
.byte 'S,'u,'b,'t,'r,'a,'c,'t,32,36,32,58,32,48,46,0
.area data(ram, con, rel)
.dbfile D:\PROGRA~1\ICC\Pro(AVR)\环保型IC卡门禁系统\Write_Card.c
L22:
.blkb 17
.area idata
.byte 'B,'a,'l,'a,'n,'c,'e,32,36,58,32,32,32,32,46,32
.byte 0
.area data(ram, con, rel)
.dbfile D:\PROGRA~1\ICC\Pro(AVR)\环保型IC卡门禁系统\Write_Card.c
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?