⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ic_card.lst

📁 环保型IC卡门禁系统的C程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -