📄 ic_card.lst
字号:
04BD D608 RCALL pop_gset2
04BE 9508 RET
_Erase_Card:
Erase_flag --> R20
i --> R22
flag --> R10
04BF D612 RCALL push_gset3
(0057) }
(0058)
(0059) void Erase_Card(void) // 检测擦除位操作
(0060) {
(0061) //移位标志 // 擦除位置标志
(0062) unsigned char i=0 , flag=0 , Erase_flag=0 ;
04C0 2766 CLR R22
04C1 24AA CLR R10
04C2 2744 CLR R20
(0063)
(0064) flag=0x01 ;
04C3 24AA CLR R10
04C4 94A3 INC R10
(0065)
(0066) if( IC_Codes_8[11] != 0 )
04C5 90200234 LDS R2,0x234
04C7 2022 TST R2
04C8 F071 BEQ 0x04D7
(0067) { // 检测该位是否为0,不为0则擦除该位
(0068) for(i=0;i<8;i++)
04C9 C00A RJMP 0x04D4
(0069) {
(0070) if ( (IC_Codes_8[12]&flag) != 0 ) // 检测到不为0的位则进行下面操作
04CA 90200235 LDS R2,0x235
04CC 202A AND R2,R10
04CD F021 BEQ 0x04D2
(0071) {
(0072) Erase_flag = 95-i ; // 确定要擦除的位
04CE E54F LDI R20,0x5F
04CF 1B46 SUB R20,R22
(0073) Erase_bit(Erase_flag); // 擦除位
04D0 2F04 MOV R16,R20
04D1 DF91 RCALL _Erase_bit
(0074) }
(0075) flag=flag<<1;
04D2 0CAA LSL R10
04D3 9563 INC R22
04D4 3068 CPI R22,0x8
04D5 F3A0 BCS 0x04CA
(0076) }
(0077) }
04D6 C02E RJMP 0x0505
(0078)
(0079) else // 检测个位是否为0,为0则先擦除高字节数据再写位
(0080) {
(0081) flag=0x01 ;
04D7 24AA CLR R10
04D8 94A3 INC R10
(0082) if( IC_Codes_8[10] != 0 )
04D9 90200233 LDS R2,0x233
04DB 2022 TST R2
04DC F079 BEQ 0x04EC
(0083) { // 检测该位是否为0,不为0则擦除该位
(0084) for(i=0;i<8;i++)
04DD 2766 CLR R22
04DE C00A RJMP 0x04E9
(0085) {
(0086) if ( (IC_Codes_8[10]&flag) != 0 ) // 检测到不为0的位则进行下面操作
04DF 90200233 LDS R2,0x233
04E1 202A AND R2,R10
04E2 F021 BEQ 0x04E7
(0087) {
(0088) Erase_flag = 87-i ; // 确定要擦除的位
04E3 E547 LDI R20,0x57
04E4 1B46 SUB R20,R22
(0089) Erase_bit(Erase_flag); // 擦除位
04E5 2F04 MOV R16,R20
04E6 DF7C RCALL _Erase_bit
(0090) }
(0091) flag=flag<<1;
04E7 0CAA LSL R10
04E8 9563 INC R22
04E9 3068 CPI R22,0x8
04EA F3A0 BCS 0x04DF
(0092) }
(0093) }
04EB C019 RJMP 0x0505
(0094)
(0095) else // 检测个位是否为0,为0则先擦除高字节数据再写位
(0096) {
(0097) flag=0x01 ;
04EC 24AA CLR R10
04ED 94A3 INC R10
(0098) if( IC_Codes_8[9] != 0 )
04EE 90200232 LDS R2,0x232
04F0 2022 TST R2
04F1 F079 BEQ 0x0501
(0099) { // 检测该位是否为0,不为0则擦除该位
(0100) for(i=0;i<8;i++)
04F2 2766 CLR R22
04F3 C00A RJMP 0x04FE
(0101) {
(0102) if ( (IC_Codes_8[9]&flag) != 0 ) // 检测到不为0的位则进行下面操作
04F4 90200232 LDS R2,0x232
04F6 202A AND R2,R10
04F7 F021 BEQ 0x04FC
(0103) {
(0104) Erase_flag = 79-i ; // 确定要擦除的位
04F8 E44F LDI R20,0x4F
04F9 1B46 SUB R20,R22
(0105) Erase_bit(Erase_flag); // 擦除位
04FA 2F04 MOV R16,R20
04FB DF67 RCALL _Erase_bit
(0106) }
(0107) flag=flag<<1;
04FC 0CAA LSL R10
04FD 9563 INC R22
04FE 3068 CPI R22,0x8
04FF F3A0 BCS 0x04F4
(0108) }
(0109) }
0500 C004 RJMP 0x0505
(0110)
(0111) else // 若无数据可擦写,则显示0
(0112) {
(0113) Erase_IC_FLAG=0;
0501 2422 CLR R2
0502 922000F4 STS Erase_IC_FLAG,R2
(0114) Write_Card_Value();
0504 D530 RCALL _Write_Card_Value
(0115) }
(0116) }
(0117) }
0505 D5C2 RCALL pop_gset3
0506 9508 RET
_Key_Scan:
Key_1 --> R22
Key_2 --> R20
0507 D5CC RCALL push_gset2
FILE: D:\PROGRA~1\ICC\Pro(AVR)\环保型IC卡门禁系统\Key_Scan.C
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "lcd1602.h"
(0004)
(0005) unsigned char Key_Scan(void)
(0006) {
(0007) unsigned char Key_1 = 0 , Key_2 = 0 ;
0508 2766 CLR R22
0509 2744 CLR R20
(0008)
(0009) //CLI();
(0010)
(0011) if((PIND&0x04)==0)
050A 9982 SBIC 0x10,2
050B C002 RJMP 0x050E
(0012) Key_1 = 1 ;
050C E061 LDI R22,1
050D C007 RJMP 0x0515
(0013) else if((PIND&0x02)==0)
050E 9981 SBIC 0x10,1
050F C002 RJMP 0x0512
(0014) Key_1 = 2 ;
0510 E062 LDI R22,2
0511 C003 RJMP 0x0515
(0015) else if((PIND&0x01)==0)
0512 9980 SBIC 0x10,0
0513 C001 RJMP 0x0515
(0016) Key_1 = 3 ;
0514 E063 LDI R22,3
(0017)
(0018) PORTD = 0xf0 ;
0515 EF80 LDI R24,0xF0
0516 BB82 OUT 0x12,R24
(0019) DDRD = 0x0f ;
0517 E08F LDI R24,0xF
0518 BB81 OUT 0x11,R24
(0020)
(0021) if((PIND&0x80)==0)
0519 9987 SBIC 0x10,7
051A C001 RJMP 0x051C
(0022) Key_1 += 0 ;
051B C00B RJMP 0x0527
(0023) else if((PIND&0x40)==0)
051C 9986 SBIC 0x10,6
051D C002 RJMP 0x0520
(0024) Key_1 += 3 ;
051E 5F6D SUBI R22,0xFD
051F C007 RJMP 0x0527
(0025) else if((PIND&0x20)==0)
0520 9985 SBIC 0x10,5
0521 C002 RJMP 0x0524
(0026) Key_1 += 6 ;
0522 5F6A SUBI R22,0xFA
0523 C003 RJMP 0x0527
(0027) else if((PIND&0x10)==0)
0524 9984 SBIC 0x10,4
0525 C001 RJMP 0x0527
(0028) Key_1 += 9 ;
0526 5F67 SUBI R22,0xF7
(0029)
(0030) PORTD = 0x0f ; // 要先写 PORT , 后写 DDR
0527 E08F LDI R24,0xF
0528 BB82 OUT 0x12,R24
(0031) DDRD = 0xf0 ;
0529 EF80 LDI R24,0xF0
052A BB81 OUT 0x11,R24
(0032)
(0033) delay_nms(80);
052B E500 LDI R16,0x50
052C E010 LDI R17,0
052D DE69 RCALL _delay_nms
(0034)
(0035) if((PIND&0x04)==0)
052E 9982 SBIC 0x10,2
052F C002 RJMP 0x0532
(0036) Key_2 = 1 ;
0530 E041 LDI R20,1
0531 C007 RJMP 0x0539
(0037) else if((PIND&0x02)==0)
0532 9981 SBIC 0x10,1
0533 C002 RJMP 0x0536
(0038) Key_2 = 2 ;
0534 E042 LDI R20,2
0535 C003 RJMP 0x0539
(0039) else if((PIND&0x01)==0)
0536 9980 SBIC 0x10,0
0537 C001 RJMP 0x0539
(0040) Key_2 = 3 ;
0538 E043 LDI R20,3
(0041)
(0042) PORTD = 0xf0 ;
0539 EF80 LDI R24,0xF0
053A BB82 OUT 0x12,R24
(0043) DDRD = 0x0f ;
053B E08F LDI R24,0xF
053C BB81 OUT 0x11,R24
(0044)
(0045) if((PIND&0x80)==0)
053D 9987 SBIC 0x10,7
053E C001 RJMP 0x0540
(0046) Key_2 += 0 ;
053F C00B RJMP 0x054B
(0047) else if((PIND&0x40)==0)
0540 9986 SBIC 0x10,6
0541 C002 RJMP 0x0544
(0048) Key_2 += 3 ;
0542 5F4D SUBI R20,0xFD
0543 C007 RJMP 0x054B
(0049) else if((PIND&0x20)==0)
0544 9985 SBIC 0x10,5
0545 C002 RJMP 0x0548
(0050) Key_2 += 6 ;
0546 5F4A SUBI R20,0xFA
0547 C003 RJMP 0x054B
(0051) else if((PIND&0x10)==0)
0548 9984 SBIC 0x10,4
0549 C001 RJMP 0x054B
(0052) Key_2 += 9 ;
054A 5F47 SUBI R20,0xF7
(0053)
(0054) PORTD = 0x0f ; // 要先写 PORT , 后写 DDR
054B E08F LDI R24,0xF
054C BB82 OUT 0x12,R24
(0055) DDRD = 0xf0 ;
054D EF80 LDI R24,0xF0
054E BB81 OUT 0x11,R24
(0056)
(0057) //SEI();
(0058)
(0059) if(Key_1==Key_2)
054F 1764 CP R22,R20
0550 F411 BNE 0x0553
(0060) {
(0061) return Key_2 ;
0551 2F04 MOV R16,R20
0552 C001 RJMP 0x0554
(0062) }
(0063) else
(0064) {
(0065) return 0 ;
0553 2700 CLR R16
0554 D571 RCALL pop_gset2
0555 9508 RET
FILE: D:\PROGRA~1\ICC\Pro(AVR)\环保型IC卡门禁系统\lcd1602.c
(0001) //-----------------------------LCD1602 Function---------------------------------
(0002) #include <iom8v.h>
(0003) #include <macros.h>
(0004) #include "lcd1602.h"
(0005)
(0006) void LCD_init(void) //液晶初始化
(0007) {
(0008) delay_nms(2);
_LCD_init:
0556 E002 LDI R16,2
0557 E010 LDI R17,0
0558 DE3E RCALL _delay_nms
(0009)
(0010) LCD_write_char(0x28,0); //4位显示
0559 2722 CLR R18
055A 2733 CLR R19
055B E208 LDI R16,0x28
055C E010 LDI R17,0
055D D039 RCALL _LCD_write_char
(0011) LCD_write_char(0x0c,0); //显示开
055E 2722 CLR R18
055F 2733 CLR R19
0560 E00C LDI R16,0xC
0561 E010 LDI R17,0
0562 D034 RCALL _LCD_write_char
(0012) LCD_write_char(0x01,0); //清屏
0563 2722 CLR R18
0564 2733 CLR R19
0565 E001 LDI R16,1
0566 E010 LDI R17,0
0567 D02F RCALL _LCD_write_char
0568 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
0569 D568 RCALL push_gset3
056A 2EA2 MOV R10,R18
056B 2F60 MOV R22,R16
056C 814E LDD R20,Y+6
056D 815F LDD R21,Y+7
(0013) }
(0014)
(0015) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0016) {
(0017) LCD_set_xy( X, Y ); //写地址
056E 2D2A MOV R18,R10
056F 2F06 MOV R16,R22
0570 D00F RCALL _LCD_set_xy
0571 C008 RJMP 0x057A
(0018)
(0019) while (*s) // 写显示字符
(0020) {
(0021) LCD_write_char( 0, *s );
0572 01FA MOVW R30,R20
0573 8120 LDD R18,Z+0
0574 2733 CLR R19
0575 2700 CLR R16
0576 2711 CLR R17
0577 D01F RCALL _LCD_write_char
(0022) s ++;
0578 5F4F SUBI R20,0xFF
0579 4F5F SBCI R21,0xFF
057A 01FA MOVW R30,R20
057B 8020 LDD R2,Z+0
057C 2022 TST R2
057D F7A1 BNE 0x0572
057E D549 RCALL pop_gset3
057F 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
0580 D553 RCALL push_gset2
0581 2F42 MOV R20,R18
0582 2F60 MOV R22,R16
(0023) }
(0024) }
(0025)
(0026) void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
(0027) {
(0028) unsigned char address;
(0029)
(0030) if (y == 0)
0583 2344 TST R20
0584 F419 BNE 0x0588
(0031) address = 0x80 + x;
0585 2F46 MOV R20,R22
0586 5840 SUBI R20,0x80
0587 C002 RJMP 0x058A
(0032) else
(0033) address = 0xc0 + x;
0588 2F46 MOV R20,R22
0589 5440 SUBI R20,0x40
(0034) LCD_write_char( address, 0 );
058A 2722 CLR R18
058B 2733 CLR R19
058C 2F04 MOV R16,R20
058D 2711 CLR R17
058E D008 RCALL _LCD_write_char
058F D536 RCALL pop_gset2
0590 9508 RET
(0035) }
(0036)
(0037) void LCD_en_write(void) //液晶使能
(0038) {
(0039) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
0591 9AAC SBI 0x15,4
(0040) delay_nus(1);
0592 E001 LDI R16,1
0593 E010 LDI R17,0
0594 DDEB RCALL _delay_nus
(0041) LCD_EN_PORT&=~LCD_EN;
0595 98AC CBI 0x15,4
0596 9508 RET
_LCD_write_char:
data_temp --> R22
command_temp --> R20
data --> R12
command --> R10
0597 D538 RCALL push_gset4
0598 0169 MOVW R12,R18
0599 0158 MOVW R10,R16
(0042) }
(0043)
(0044) void LCD_write_char(unsigned command,unsigned data) // 写数据
(0045) {
(0046) unsigned command_temp,data_temp;
(0047)
(0048) command_temp=command;
059A 01A5 MOVW R20,R10
(0049) data_temp=data;
059B 01B6 MOVW R22,R12
(0050) delay_nus(16);
059C E100 LDI R16,0x10
059D E010 LDI R17,0
059E DDE1 RCALL _delay_nus
(0051)
(0052) if(command==0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -