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

📄 keyscan.lst

📁 一个解决5个IO口扫描25个按键的解决方法,完整文件包,有参考意义,C51.
💻 LST
📖 第 1 页 / 共 4 页
字号:
      C8 6388      ORI	R24,0x38
      C9 BB85      OUT	0x15,R24
      CA 98AC      CBI	0x15,4
      CB 0000      NOP
(0242)    if (!READ_PINX)                                         
      CC 9B99      SBIS	0x13,1
      CD C002      RJMP	0x00D0
      CE E021      LDI	R18,1
      CF C001      RJMP	0x00D1
      D0 2722      CLR	R18
      D1 2322      TST	R18
      D2 F411      BNE	0x00D5
(0243)    {
(0244)        chTempKeyCode = 0x01;
      D3 E001      LDI	R16,1
(0245)    }
      D4 C008      RJMP	0x00DD
(0246)    else if (!READ_PINY)
      D5 9B9A      SBIS	0x13,2
      D6 C002      RJMP	0x00D9
      D7 E021      LDI	R18,1
      D8 C001      RJMP	0x00DA
      D9 2722      CLR	R18
      DA 2322      TST	R18
      DB F409      BNE	0x00DD
(0247)    {
(0248)        chTempKeyCode = 0x04;
      DC E004      LDI	R16,4
(0249)    }
(0250)    
(0251)    CLR_C;
      DD B385      IN	R24,0x15
      DE 6388      ORI	R24,0x38
      DF BB85      OUT	0x15,R24
      E0 98AD      CBI	0x15,5
      E1 0000      NOP
(0252)    if (!READ_PINX)                                          
      E2 9B99      SBIS	0x13,1
      E3 C002      RJMP	0x00E6
      E4 E021      LDI	R18,1
      E5 C001      RJMP	0x00E7
      E6 2722      CLR	R18
      E7 2322      TST	R18
      E8 F411      BNE	0x00EB
(0253)    {
(0254)        chTempKeyCode = 0x02;
      E9 E002      LDI	R16,2
(0255)    }
      EA C008      RJMP	0x00F3
(0256)    else if (!READ_PINY)
      EB 9B9A      SBIS	0x13,2
      EC C002      RJMP	0x00EF
      ED E021      LDI	R18,1
      EE C001      RJMP	0x00F0
      EF 2722      CLR	R18
      F0 2322      TST	R18
      F1 F409      BNE	0x00F3
(0257)    {
(0258)        chTempKeyCode = 0x05;
      F2 E005      LDI	R16,5
(0259)    }
(0260)    
(0261)    return chTempKeyCode;
      F3 9508      RET
(0262) }
(0263) ////////////////////////////////////////////////////////////////////////////
(0264) UINT8 Key_Scan_New(void)
(0265) {
(0266)    UINT8 chTempKeyCode = KEY_NULL;						//为按键的编码设初值
(0267)    
(0268)    
(0269)    //先对21-25按钮进行扫描
(0270)    DDRC &= ~(BIT(1) | BIT(2) | BIT(3) |
_Key_Scan_New:
      F4 B384      IN	R24,0x14
      F5 7C81      ANDI	R24,0xC1
      F6 BB84      OUT	0x14,R24
(0271)              BIT(4) | BIT(5));							//把端口pc1-pc5都置为输入
(0272) 			 
(0273)    PORTC |=  BIT(1) | BIT(2) | BIT(3) |
      F7 B385      IN	R24,0x15
      F8 638E      ORI	R24,0x3E
      F9 BB85      OUT	0x15,R24
(0274)    		     BIT(4) | BIT(5);			  				//全部端口拉高
(0275)    NOP();
      FA 0000      NOP
(0276)    NOP();
      FB 0000      NOP
(0277)    
(0278)    
(0279)    if (!(PINC & (BIT(1))))     		//读取pc1端口,如果返回值是0则表明按键被按下,
      FC 9999      SBIC	0x13,1
      FD C002      RJMP	0x0100
(0280)                               	 	//则返回按键的值                              
(0281)    {
(0282)        chTempKeyCode = 21;
(0283) 	   return chTempKeyCode;
      FE E105      LDI	R16,0x15
      FF C0B1      RJMP	0x01B1
(0284)    }
(0285)    else if (!(PINC & (BIT(2))))  	//读取pc2端口,如果返回值是0则表明按键被按下,
     100 999A      SBIC	0x13,2
     101 C002      RJMP	0x0104
(0286)                                  	//则返回按键的值,下面以此类推。              
(0287)    {
(0288)        chTempKeyCode = 22;
(0289) 	   return chTempKeyCode;
     102 E106      LDI	R16,0x16
     103 C0AD      RJMP	0x01B1
(0290)    }
(0291)    else if (!(PINC & (BIT(3))))
     104 999B      SBIC	0x13,3
     105 C002      RJMP	0x0108
(0292)    {
(0293)        chTempKeyCode = 23;
(0294) 	   return chTempKeyCode;
     106 E107      LDI	R16,0x17
     107 C0A9      RJMP	0x01B1
(0295)    }
(0296)    else if (!(PINC & (BIT(4))))
     108 999C      SBIC	0x13,4
     109 C002      RJMP	0x010C
(0297)    {
(0298)        chTempKeyCode = 24;
(0299) 	   return chTempKeyCode;
     10A E108      LDI	R16,0x18
     10B C0A5      RJMP	0x01B1
(0300)    }
(0301)    else if (!(PINC & (BIT(5))))
     10C 999D      SBIC	0x13,5
     10D C002      RJMP	0x0110
(0302)    {
(0303)        chTempKeyCode = 25;
(0304) 	   return chTempKeyCode;
     10E E109      LDI	R16,0x19
     10F C0A1      RJMP	0x01B1
(0305)    }
(0306)    
(0307)  //////////////////////////////////////////////////////////////
(0308)    //对1-4按钮进行扫描   
(0309)    DDRC &= ~(BIT(2) | BIT(3) | 
     110 B384      IN	R24,0x14
     111 7C83      ANDI	R24,0xC3
     112 BB84      OUT	0x14,R24
(0310)    			 BIT(4) | BIT(5));	//把端口pc2-pc5设置为输入
(0311)    DDRC  |=  BIT(1);			//把pc1端口设为输出
     113 9AA1      SBI	0x14,1
(0312)    
(0313)    PORTC |=  BIT(1) | BIT(2) | BIT(3) |
     114 B385      IN	R24,0x15
     115 638E      ORI	R24,0x3E
     116 BB85      OUT	0x15,R24
(0314)     		 BIT(4) | BIT(5);
(0315) 			 
(0316)    PORTC &=~ BIT(1); 			//把pc1端口拉低
     117 98A9      CBI	0x15,1
(0317)    NOP();
     118 0000      NOP
(0318)    NOP();
     119 0000      NOP
(0319)    
(0320)    
(0321)    if (!(PINC & (BIT(2))))     //读取pc2端口,如果返回值是0则表明按键被按下,    
     11A 999A      SBIC	0x13,2
     11B C002      RJMP	0x011E
(0322)                                //则返回按键的值                                  
(0323)                                //以下依次对pc3、pc4、pc5逐个读取值,如果返回值为0
(0324)                                //则返回相应按键值                                
(0325)    {
(0326)        chTempKeyCode = 1;
(0327) 	   return chTempKeyCode;
     11C E001      LDI	R16,1
     11D C093      RJMP	0x01B1
(0328)    }
(0329)    else if (!(PINC & (BIT(3))))
     11E 999B      SBIC	0x13,3
     11F C002      RJMP	0x0122
(0330)    {
(0331)        chTempKeyCode = 2;
(0332) 	   return chTempKeyCode;
     120 E002      LDI	R16,2
     121 C08F      RJMP	0x01B1
(0333)    }
(0334)    else if (!(PINC & (BIT(4))))
     122 999C      SBIC	0x13,4
     123 C002      RJMP	0x0126
(0335)    {
(0336)        chTempKeyCode = 3;
(0337) 	   return chTempKeyCode;
     124 E003      LDI	R16,3
     125 C08B      RJMP	0x01B1
(0338)    }
(0339)    else if (!(PINC & (BIT(5))))
     126 999D      SBIC	0x13,5
     127 C002      RJMP	0x012A
(0340)    {
(0341)        chTempKeyCode = 4;
(0342) 	   return chTempKeyCode;
     128 E004      LDI	R16,4
     129 C087      RJMP	0x01B1
(0343)    }
(0344)    
(0345)    
(0346) //////////////////////////////////////////////////////////////
(0347)    
(0348)    //对6-7按钮进行扫描   
(0349)    DDRC &= ~(BIT(1) | BIT(3) | 
     12A B384      IN	R24,0x14
     12B 7C85      ANDI	R24,0xC5
     12C BB84      OUT	0x14,R24
(0350)    			 BIT(4) | BIT(5));//把端口pc1,pc3-pc5设置为输入
(0351) 			 
(0352)    DDRC  |=  BIT(2);//把pc2端口设为输出
     12D 9AA2      SBI	0x14,2
(0353)    
(0354)    PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
     12E B385      IN	R24,0x15
     12F 638E      ORI	R24,0x3E
     130 BB85      OUT	0x15,R24
(0355)    			 BIT(4) | BIT(5);
(0356) 			 
(0357)    PORTC &= ~BIT(2); //把pc2端口拉低
     131 98AA      CBI	0x15,2
(0358)    NOP();
     132 0000      NOP
(0359)    NOP();
     133 0000      NOP
(0360)    
(0361)    
(0362)    if (!(PINC & (BIT(3))))     //读取pc3端口,如果返回值是0则表明按键被按下,    
     134 999B      SBIC	0x13,3
     135 C002      RJMP	0x0138
(0363)                                //则返回按键的值                                  
(0364)                                //以下依次对pc4、pc5逐个读取值,如果返回值为0     
(0365)                                //则返回相应按键值                                
(0366)    {
(0367)        chTempKeyCode = 6;
(0368) 	   return chTempKeyCode;
     136 E006      LDI	R16,6
     137 C079      RJMP	0x01B1
(0369)    }
(0370)    else if (!(PINC & (BIT(4))))
     138 999C      SBIC	0x13,4
     139 C002      RJMP	0x013C
(0371)    {
(0372)        chTempKeyCode = 7;
(0373) 	   return chTempKeyCode;
     13A E007      LDI	R16,7
     13B C075      RJMP	0x01B1
(0374)    }
(0375)    else if (!(PINC & (BIT(5))))
     13C 999D      SBIC	0x13,5
     13D C002      RJMP	0x0140
(0376)    {
(0377)        chTempKeyCode = 8;
(0378) 	   return chTempKeyCode;
     13E E008      LDI	R16,0x8
     13F C071      RJMP	0x01B1
(0379)    }
(0380)  
(0381) //////////////////////////////////////////////////////////////
(0382)    
(0383)    //对11-12按钮进行扫描   
(0384)    DDRC &= ~(BIT(2) | BIT(1) | 
     140 B384      IN	R24,0x14
     141 7C89      ANDI	R24,0xC9
     142 BB84      OUT	0x14,R24
(0385)    			 BIT(4) | BIT(5));//把端口pc1-pc2,pc4-pc5设置为输入
(0386) 			 
(0387)    DDRC  |=  BIT(3);//把pc3端口设为输出
     143 9AA3      SBI	0x14,3
(0388)    
(0389)    PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
     144 B385      IN	R24,0x15
     145 638E      ORI	R24,0x3E
     146 BB85      OUT	0x15,R24
(0390)    			 BIT(4) | BIT(5);
(0391) 			 
(0392)    PORTC &= ~BIT(3);//把pc2端口拉低
     147 98AB      CBI	0x15,3
(0393)    NOP();
     148 0000      NOP
(0394)    NOP(); 
     149 0000      NOP
(0395)    
(0396)    if (!(PINC & (BIT(4))))     //读取pc4端口,如果返回值是0则表明按键被按下,    
     14A 999C      SBIC	0x13,4
     14B C002      RJMP	0x014E
(0397)                                //则返回按键的值                                  
(0398)                                
(0399)    {
(0400)        chTempKeyCode = 11;
(0401) 	   return chTempKeyCode;
     14C E00B      LDI	R16,0xB
     14D C063      RJMP	0x01B1
(0402)    }
(0403)    else if (!(PINC & (BIT(5))))//读取pc5端口,如果返回值是0则表明按键被按下,    
     14E 999D      SBIC	0x13,5
     14F C002      RJMP	0x0152
(0404)                                //则返回按键的值                                  
(0405)    {
(0406)        chTempKeyCode = 12;
(0407) 	   return chTempKeyCode;
     150 E00C      LDI	R16,0xC
     151 C05F      RJMP	0x01B1
(0408)    }
(0409)  ////////////////////////////////////////////////////////////////  
(0410)    //对16按钮进行扫描   
(0411)    DDRC &= ~(BIT(2) | BIT(1) | 
     152 B384      IN	R24,0x14
     153 7D81      ANDI	R24,0xD1
     154 BB84      OUT	0x14,R24
(0412)    			 BIT(3) | BIT(5));//把端口pc1-pc3、pc5设置为输入
(0413) 			 
(0414)    DDRC  |=  BIT(4);								//把pc4端口设为输出
     155 9AA4      SBI	0x14,4
(0415)    
(0416)    PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
     156 B385      IN	R24,0x15
     157 638E      ORI	R24,0x3E
     158 BB85      OUT	0x15,R24
(0417)    			 BIT(4) | BIT(5);
(0418) 			 
(0419)    PORTC &=~ BIT(4);			//把pc4端口拉低 
     159 98AC      CBI	0x15,4
(0420)    NOP();
     15A 0000      NOP
(0421)    NOP();
     15B 0000      NOP
(0422)    
(0423)    
(0424)    if (!(PINC & (BIT(5))))                                         
     15C 999D      SBIC	0x13,5
     15D C002      RJMP	0x0160
(0425)    {
(0426)        chTempKeyCode = 16;
(0427) 	   return chTempKeyCode;     //读取pc5端口,如果返回值是0则表明按键被按下,  
     15E E100      LDI	R16,0x10
     15F C051      RJMP	0x01B1
(0428)                                //则返回按键的值     
(0429)    }   
(0430)    
(0431)    
(0432)  //////////////////////////////////////////////////////////////
(0433)   //对20-17按钮进行扫描  
(0434)    DDRC &= ~(BIT(2) | BIT(3) | 
     160 B384      IN	R24,0x14
     161 7E81      ANDI	R24,0xE1
     162 BB84      OUT	0x14,R24
(0435)    			 BIT(4) | BIT(1));				//把端口pc1-pc4设置为输入
(0436) 			 
(0437)    DDRC  |=  BIT(5);						//把pc5端口设为输出
     163 9AA5      SBI	0x14,5
(0438)    
(0439)    PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
     164 B385      IN	R24,0x15
     165 638E      ORI	R24,0x3E
     166 BB85      OUT	0x15,R24
(0440)    			 BIT(4) | BIT(5);
(0441) 			 
(0442)    PORTC &= ~BIT(5); 						//把pc5端口拉低 
     167 98AD      CBI	0x15,5
(0443)    NOP();
     168 0000      NOP
(0444)    NOP();
     169 0000      NOP
(0445)    
(0446)    
(0447)    
(0448)    if (!(PINC & (BIT(4))))     //读取pc4端口,如果返回值是0则表明按键被按下,    
     16A 999C      SBIC	0x13,4
     16B C002      RJMP	0x016E
(0449)                                //则返回按键的值                                  
(0450)                                //以下依次对pc3-pc1逐个读取值,如果返回值为0     
(0451)                                //则返回相应按键值                                
(0452)    {
(0453)        chTempKeyCode = 20;
(0454) 	   return chTempKeyCode;
     16C E104      LDI	R16,0x14
     16D C043      RJMP	0x01B1
(0455)    }
(0456)    else if (!(PINC & (BIT(3))))
     16E 999B      SBIC	0x13,3
     16F C002      RJMP	0x0172
(0457)    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -