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

📄 keyscan.lst

📁 一个解决5个IO口扫描25个按键的解决方法,完整文件包,有参考意义,C51.
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0458)        chTempKeyCode = 19;
(0459) 	   return chTempKeyCode;
     170 E103      LDI	R16,0x13
     171 C03F      RJMP	0x01B1
(0460)    }
(0461)    else if (!(PINC & (BIT(2))))
     172 999A      SBIC	0x13,2
     173 C002      RJMP	0x0176
(0462)    {
(0463)        chTempKeyCode = 18;
(0464) 	   return chTempKeyCode;
     174 E102      LDI	R16,0x12
     175 C03B      RJMP	0x01B1
(0465)    }
(0466)    else if (!(PINC & (BIT(1))))
     176 9999      SBIC	0x13,1
     177 C002      RJMP	0x017A
(0467)    {
(0468)        chTempKeyCode = 17;
(0469) 	   return chTempKeyCode;
     178 E101      LDI	R16,0x11
     179 C037      RJMP	0x01B1
(0470)    }
(0471)    
(0472)    
(0473)    
(0474) //////////////////////////////////////////////////////////////
(0475)     //对15-13按钮进行扫描  
(0476)    
(0477)    DDRC  &= ~(BIT(1) | BIT(3) | 
     17A B384      IN	R24,0x14
     17B 7D81      ANDI	R24,0xD1
     17C BB84      OUT	0x14,R24
(0478)    			  BIT(2) | BIT(5));					//把端口pc1-pc3、pc5设置为输入
(0479) 			  
(0480)    DDRC  |=   BIT(4);							//把pc4端口设为输出
     17D 9AA4      SBI	0x14,4
(0481)    
(0482)    PORTC |=   BIT(1) | BIT(2) | BIT(3) | 
     17E B385      IN	R24,0x15
     17F 638E      ORI	R24,0x3E
     180 BB85      OUT	0x15,R24
(0483)    		      BIT(4) | BIT(5);
(0484) 			  
(0485)    PORTC &=  ~BIT(4); 							//把pc4端口拉低 
     181 98AC      CBI	0x15,4
(0486)    NOP();
     182 0000      NOP
(0487)    NOP();
     183 0000      NOP
(0488)    
(0489)     
(0490)    if (!(PINC & (BIT(3))))    	 //读取pc3端口,如果返回值是0则表明按键被按下,    
     184 999B      SBIC	0x13,3
     185 C002      RJMP	0x0188
(0491)                               	 //则返回按键的值                                  
(0492)                               	 //以下依次对pc2-pc1逐个读取值,如果返回值为0      
(0493)                               	 //则返回相应按键值                                
(0494)    {
(0495)        chTempKeyCode = 15;
(0496) 	   return chTempKeyCode;
     186 E00F      LDI	R16,0xF
     187 C029      RJMP	0x01B1
(0497)    }
(0498)    else if (!(PINC & (BIT(2))))
     188 999A      SBIC	0x13,2
     189 C002      RJMP	0x018C
(0499)    {
(0500)        chTempKeyCode = 14;
(0501) 	   return chTempKeyCode;
     18A E00E      LDI	R16,0xE
     18B C025      RJMP	0x01B1
(0502)    }
(0503)    else if (!(PINC & (BIT(1))))
     18C 9999      SBIC	0x13,1
     18D C002      RJMP	0x0190
(0504)    {
(0505)        chTempKeyCode = 13;
(0506) 	   return chTempKeyCode;
     18E E00D      LDI	R16,0xD
     18F C021      RJMP	0x01B1
(0507)    }
(0508)  
(0509)  
(0510)  
(0511) //////////////////////////////////////////////////////////////
(0512)     //对10-9按钮进行扫描  
(0513)    
(0514)    DDRC  &= ~(BIT(2) | BIT(1) | 
     190 B384      IN	R24,0x14
     191 7C89      ANDI	R24,0xC9
     192 BB84      OUT	0x14,R24
(0515)    			  BIT(4) | BIT(5));		//把端口pc1-pc2、pc4-pc5设置为输入
(0516)    
(0517)    DDRC  |=   BIT(3);				//把pc3端口设为输出
     193 9AA3      SBI	0x14,3
(0518)    
(0519)    PORTC |=   BIT(1) | BIT(2) | 
     194 B385      IN	R24,0x15
     195 638E      ORI	R24,0x3E
     196 BB85      OUT	0x15,R24
(0520)    			  BIT(3) | BIT(4) | BIT(5);
(0521) 			  
(0522)    PORTC &=  ~BIT(3);				//把pc3端口拉低 
     197 98AB      CBI	0x15,3
(0523)    NOP();
     198 0000      NOP
(0524)    NOP(); 
     199 0000      NOP
(0525)    
(0526)    
(0527)    if (!(PINC & (BIT(2))))     		//读取pc2端口,如果返回值是0则表明按键被按下,    
     19A 999A      SBIC	0x13,2
     19B C002      RJMP	0x019E
(0528)                               		//则返回按键的值                                                            
(0529)    {
(0530)        chTempKeyCode = 10;
(0531) 	   return chTempKeyCode;
     19C E00A      LDI	R16,0xA
     19D C013      RJMP	0x01B1
(0532)    }
(0533)    else if (!(PINC & (BIT(1))))		//读取pc1端口,如果返回值是0则表明按键被按下,    
     19E 9999      SBIC	0x13,1
     19F C002      RJMP	0x01A2
(0534)                                		//则返回按键的值            
(0535)    {
(0536)        chTempKeyCode = 9;
(0537) 	   return chTempKeyCode;
     1A0 E009      LDI	R16,0x9
     1A1 C00F      RJMP	0x01B1
(0538)    }
(0539)    
(0540)    
(0541)   ////////////////////////////////////////////////////// 
(0542)    //对5按钮进行扫描  
(0543)    DDRC  &= ~(BIT(4) | BIT(1) | 
     1A2 B384      IN	R24,0x14
     1A3 7C85      ANDI	R24,0xC5
     1A4 BB84      OUT	0x14,R24
(0544)    		      BIT(3) | BIT(5));		//把端口pc1、pc3-pc4设置为输入
(0545) 			  
(0546)    DDRC |= BIT(2);					//把pc2端口设为输出
     1A5 9AA2      SBI	0x14,2
(0547)    
(0548)    PORTC |= BIT(1) | BIT(2) | BIT(3) |
     1A6 B385      IN	R24,0x15
     1A7 638E      ORI	R24,0x3E
     1A8 BB85      OUT	0x15,R24
(0549)    		    BIT(4) | BIT(5);
(0550) 			
(0551)    PORTC &= ~BIT(2); 				//把pc2端口拉低 
     1A9 98AA      CBI	0x15,2
(0552)    NOP();
     1AA 0000      NOP
(0553)    NOP();
     1AB 0000      NOP
(0554)    
(0555)    if (!(PINC & (BIT(1))))    		//读取pc1端口,如果返回值是0则表明按键被按下,    
     1AC 9999      SBIC	0x13,1
     1AD C002      RJMP	0x01B0
(0556)                              		//则返回按键的值                                  
(0557)    {
(0558)        chTempKeyCode = 5;
(0559) 	   return chTempKeyCode;
     1AE E005      LDI	R16,5
     1AF C001      RJMP	0x01B1
(0560)    }   
(0561)    
(0562) 
(0563)    return chTempKeyCode;			//返回按键值
     1B0 EF0F      LDI	R16,0xFF
     1B1 9508      RET
_Get_Code:
  Table                --> Y,+0
  chj0                 --> R20
  chi                  --> R10
     1B2 92AA      ST	R10,-Y
     1B3 934A      ST	R20,-Y
     1B4 2EA0      MOV	R10,R16
     1B5 972A      SBIW	R28,0xA
(0564) }
(0565) 
(0566) UINT8 Get_Code (UINT8 chi)
(0567) {
(0568) 	UINT8 chj;
(0569) 	UINT8 Table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
     1B6 E588      LDI	R24,0x58
     1B7 E090      LDI	R25,0
     1B8 01FE      MOVW	R30,R28
     1B9 E00A      LDI	R16,0xA
     1BA E010      LDI	R17,0
     1BB 93FA      ST	R31,-Y
     1BC 93EA      ST	R30,-Y
     1BD 939A      ST	R25,-Y
     1BE 938A      ST	R24,-Y
     1BF D0B4      RCALL	asgncblk
(0570) 	switch(chi)
     1C0 2D4A      MOV	R20,R10
     1C1 3041      CPI	R20,1
     1C2 F408      BCC	0x01C4
     1C3 C043      RJMP	0x0207
     1C4 E189      LDI	R24,0x19
     1C5 158A      CP	R24,R10
     1C6 F408      BCC	0x01C8
     1C7 C03F      RJMP	0x0207
     1C8 E286      LDI	R24,0x26
     1C9 E090      LDI	R25,0
     1CA 2FE4      MOV	R30,R20
     1CB 50E1      SUBI	R30,1
     1CC 27FF      CLR	R31
     1CD 0FEE      LSL	R30
     1CE 1FFF      ROL	R31
     1CF 0FE8      ADD	R30,R24
     1D0 1FF9      ADC	R31,R25
     1D1 9025      LPM	R2,Z+
     1D2 9034      LPM	R3,1(Z)
     1D3 01F1      MOVW	R30,R2
     1D4 9409      IJMP
(0571) 	{
(0572) 		case 1:		chj = Table[1];break;
     1D5 8149      LDD	R20,Y+1
     1D6 C031      RJMP	0x0208
(0573) 		case 2:		chj = Table[2];break;
     1D7 814A      LDD	R20,Y+2
     1D8 C02F      RJMP	0x0208
(0574) 		case 3:		chj = Table[3];break;
     1D9 814B      LDD	R20,Y+3
     1DA C02D      RJMP	0x0208
(0575) 		case 4:		chj = Table[4];break;
     1DB 814C      LDD	R20,Y+4
     1DC C02B      RJMP	0x0208
(0576) 		case 5:		chj = Table[5];break;
     1DD 814D      LDD	R20,Y+5
     1DE C029      RJMP	0x0208
(0577) 		case 6:		chj = Table[6];break;
     1DF 814E      LDD	R20,Y+6
     1E0 C027      RJMP	0x0208
(0578) 		case 7:		chj = Table[7];break;
     1E1 814F      LDD	R20,Y+7
     1E2 C025      RJMP	0x0208
(0579) 		case 8:		chj = Table[8];break;
     1E3 8548      LDD	R20,Y+8
     1E4 C023      RJMP	0x0208
(0580) 		case 9:		chj = Table[9];break;
     1E5 8549      LDD	R20,Y+9
     1E6 C021      RJMP	0x0208
(0581) 		case 10:	chj = Table[0];break;
     1E7 8148      LDD	R20,Y+0
     1E8 C01F      RJMP	0x0208
(0582) 		case 11:	chj = Table[1];break;
     1E9 8149      LDD	R20,Y+1
     1EA C01D      RJMP	0x0208
(0583) 		case 12:	chj = Table[2];break;
     1EB 814A      LDD	R20,Y+2
     1EC C01B      RJMP	0x0208
(0584) 		case 13:	chj = Table[3];break;
     1ED 814B      LDD	R20,Y+3
     1EE C019      RJMP	0x0208
(0585) 		case 14:	chj = Table[4];break;
     1EF 814C      LDD	R20,Y+4
     1F0 C017      RJMP	0x0208
(0586) 		case 15:	chj = Table[5];break;
     1F1 814D      LDD	R20,Y+5
     1F2 C015      RJMP	0x0208
(0587) 		case 16:	chj = Table[6];break;
     1F3 814E      LDD	R20,Y+6
     1F4 C013      RJMP	0x0208
(0588) 		case 17:	chj = Table[7];break;
     1F5 814F      LDD	R20,Y+7
     1F6 C011      RJMP	0x0208
(0589) 		case 18:	chj = Table[8];break;
     1F7 8548      LDD	R20,Y+8
     1F8 C00F      RJMP	0x0208
(0590) 		case 19:	chj = Table[9];break;
     1F9 8549      LDD	R20,Y+9
     1FA C00D      RJMP	0x0208
(0591) 		case 20:	chj = Table[0];break;
     1FB 8148      LDD	R20,Y+0
     1FC C00B      RJMP	0x0208
(0592) 		case 21:	chj = Table[1];break;
     1FD 8149      LDD	R20,Y+1
     1FE C009      RJMP	0x0208
(0593) 		case 22:	chj = Table[2];break;
     1FF 814A      LDD	R20,Y+2
     200 C007      RJMP	0x0208
(0594) 		case 23:	chj = Table[3];break;
     201 814B      LDD	R20,Y+3
     202 C005      RJMP	0x0208
(0595) 		case 24:	chj = Table[4];break;
     203 814C      LDD	R20,Y+4
     204 C003      RJMP	0x0208
(0596) 		case 25:	chj = Table[5];break;
     205 814D      LDD	R20,Y+5
     206 C001      RJMP	0x0208
(0597) 		default:	chj = 0xFF;
     207 EF4F      LDI	R20,0xFF
(0598) 	}
(0599) 	return chj;
     208 2F04      MOV	R16,R20
     209 962A      ADIW	R28,0xA
     20A 9149      LD	R20,Y+
     20B 90A9      LD	R10,Y+
     20C 9508      RET
FILE: F:\AVR\按键扫描\HD_Support.c
(0001) /***********************************************************
(0002) *   函数库说明:底层硬件初始化函数库                       *
(0003) *   版本:                                                 *
(0004) *   作者:                                                 *
(0005) *   创建日期:                                             *
(0006) * -------------------------------------------------------- *
(0007) *  [硬件说明]                                              *
(0008) *   处理器:                                               *
(0009) *   系统时钟:                                             *
(0010) * -------------------------------------------------------- *
(0011) *  [支 持 库]                                              *
(0012) *   支持库名称:HD_Support.h                               *
(0013) *   需要版本:  -----                                      *
(0014) *   支持库说明:底层硬件初始化声明库                       *
(0015) *                                                          *
(0016) *   支持库名称:PF_Config.h                                *
(0017) *   需要版本:  -----                                      *
(0018) *   支持库说明:硬件平台配置声明库                         *
(0019) * -------------------------------------------------------- *
(0020) *  [版本更新]                                              *
(0021) *   修改:                                                 *
(0022) *   修改日期:                                             *
(0023) *   版本:                                                 *
(0024) * -------------------------------------------------------- *
(0025) *  [版本历史]                                              *
(0026) * -------------------------------------------------------- *
(0027) *  [使用说明]                                              *
(0028) ***********************************************************/
(0029) 
(0030) /********************
(0031) * 头 文 件 配 置 区 *
(0032) ********************/
(0033) # include "PF_Config.h"
(0034) # include "HD_Support.h"
(0035) 
(0036) /********************
(0037) *   系 统 宏 定 义  *
(0038) ********************/
(0039) # pragma interrupt_handler Timer0_OVF_ISR:iv_TIMER0_OVF
(0040) 
(0041) /*------------------*
(0042) *   常 数 宏 定 义  *
(0043) *------------------*/
(0044) 
(0045) /*------------------*
(0046) *   动 作 宏 定 义  *
(0047) *------------------*/
(0048) #ifndef INSERT_TIMER0_OVF_ISR_CODE
(0049)     # define INSERT_TIMER0_OVF_ISR_CODE
(0050)     # warning "TIMER0_OVF_ISR haven`t been used but initialed!"
(0051) #endif
(0052) 
(0053) /********************
(0054) *  模块结构体定义区 *
(0055) ********************/
(0056) 
(0057) /********************
(0058) *   函 数 声 明 区  *
(0059) ********************/
(0060) void Device_INIT(void);
(0061) 
(0062) /********************
(0063) *   模块函数声明区  *
(0064) ********************/
(0065) static void Port_INIT(void);
(0066) static void Timer0_INIT(void);
(0067) 
(0068) /********************
(0069) *   模块变量声明区  *
(0070) ********************/
(0071) 
(0072) /********************
(0073) *   全局变量声明区  *
(0074) ********************/
(0075) 
(0076) 
(0077) /***********************************************************
(0078) *   函数说明:系统硬件初始化函数                           *
(0079) *   输入:    无                                           *
(0080) *   输出:    无                                           *
(0081) *   调用函数:Port_INIT()   Timer0_INIT()                  *

⌨️ 快捷键说明

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