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

📄 ex_support.s

📁 一个解决5个IO口扫描25个按键的解决方法,完整文件包,有参考意义,C51.
💻 S
📖 第 1 页 / 共 3 页
字号:
	clr R18
L35:
	tst R18
	brne L32
X12:
	.dbline 247
;    {
	.dbline 248
;        chTempKeyCode = 0x04;
	ldi R16,4
	.dbline 249
;    }
L32:
L29:
	.dbline 251
;    
;    CLR_C;
	in R24,0x15
	ori R24,56
	out 0x15,R24
	.dbline 251
	.dbline 251
	cbi 0x15,5
	.dbline 251
	nop
	.dbline 251
	.dbline 252
;    if (!READ_PINX)                                          
	sbis 0x13,1
	rjmp L38
X13:
	ldi R18,1
	rjmp L39
L38:
	clr R18
L39:
	tst R18
	brne L36
X14:
	.dbline 253
;    {
	.dbline 254
;        chTempKeyCode = 0x02;
	ldi R16,2
	.dbline 255
;    }
	rjmp L37
L36:
	.dbline 256
;    else if (!READ_PINY)
	sbis 0x13,2
	rjmp L42
X15:
	ldi R18,1
	rjmp L43
L42:
	clr R18
L43:
	tst R18
	brne L40
X16:
	.dbline 257
;    {
	.dbline 258
;        chTempKeyCode = 0x05;
	ldi R16,5
	.dbline 259
;    }
L40:
L37:
	.dbline 261
;    
;    return chTempKeyCode;
	.dbline -2
L19:
	.dbline 0 ; func end
	ret
	.dbsym r chTempKeyCode0 16 c
	.dbend
	.dbfunc e Key_Scan_New _Key_Scan_New fc
	.even
_Key_Scan_New::
	.dbline -1
	.dbline 265
; }
; ////////////////////////////////////////////////////////////////////////////
; UINT8 Key_Scan_New(void)
; {
	.dbline 266
;    UINT8 chTempKeyCode = KEY_NULL;						//为按键的编码设初值
	.dbline 270
;    
;    
;    //先对21-25按钮进行扫描
;    DDRC &= ~(BIT(1) | BIT(2) | BIT(3) |
	in R24,0x14
	andi R24,193
	out 0x14,R24
	.dbline 273
;              BIT(4) | BIT(5));							//把端口pc1-pc5都置为输入
; 			 
;    PORTC |=  BIT(1) | BIT(2) | BIT(3) |
	in R24,0x15
	ori R24,62
	out 0x15,R24
	.dbline 275
;    		     BIT(4) | BIT(5);			  				//全部端口拉高
;    NOP();
	nop
	.dbline 276
;    NOP();
	nop
	.dbline 279
;    
;    
;    if (!(PINC & (BIT(1))))     		//读取pc1端口,如果返回值是0则表明按键被按下,
	sbic 0x13,1
	rjmp L45
X17:
	.dbline 281
;                               	 	//则返回按键的值                              
;    {
	.dbline 282
;        chTempKeyCode = 21;
	.dbline 283
; 	   return chTempKeyCode;
	ldi R16,21
	rjmp L44
L45:
	.dbline 285
;    }
;    else if (!(PINC & (BIT(2))))  	//读取pc2端口,如果返回值是0则表明按键被按下,
	sbic 0x13,2
	rjmp L47
X18:
	.dbline 287
;                                  	//则返回按键的值,下面以此类推。              
;    {
	.dbline 288
;        chTempKeyCode = 22;
	.dbline 289
; 	   return chTempKeyCode;
	ldi R16,22
	rjmp L44
L47:
	.dbline 291
;    }
;    else if (!(PINC & (BIT(3))))
	sbic 0x13,3
	rjmp L49
X19:
	.dbline 292
;    {
	.dbline 293
;        chTempKeyCode = 23;
	.dbline 294
; 	   return chTempKeyCode;
	ldi R16,23
	rjmp L44
L49:
	.dbline 296
;    }
;    else if (!(PINC & (BIT(4))))
	sbic 0x13,4
	rjmp L51
X20:
	.dbline 297
;    {
	.dbline 298
;        chTempKeyCode = 24;
	.dbline 299
; 	   return chTempKeyCode;
	ldi R16,24
	rjmp L44
L51:
	.dbline 301
;    }
;    else if (!(PINC & (BIT(5))))
	sbic 0x13,5
	rjmp L53
X21:
	.dbline 302
;    {
	.dbline 303
;        chTempKeyCode = 25;
	.dbline 304
; 	   return chTempKeyCode;
	ldi R16,25
	rjmp L44
L53:
	.dbline 309
;    }
;    
;  //////////////////////////////////////////////////////////////
;    //对1-4按钮进行扫描   
;    DDRC &= ~(BIT(2) | BIT(3) | 
	in R24,0x14
	andi R24,195
	out 0x14,R24
	.dbline 311
;    			 BIT(4) | BIT(5));	//把端口pc2-pc5设置为输入
;    DDRC  |=  BIT(1);			//把pc1端口设为输出
	sbi 0x14,1
	.dbline 313
;    
;    PORTC |=  BIT(1) | BIT(2) | BIT(3) |
	in R24,0x15
	ori R24,62
	out 0x15,R24
	.dbline 316
;     		 BIT(4) | BIT(5);
; 			 
;    PORTC &=~ BIT(1); 			//把pc1端口拉低
	cbi 0x15,1
	.dbline 317
;    NOP();
	nop
	.dbline 318
;    NOP();
	nop
	.dbline 321
;    
;    
;    if (!(PINC & (BIT(2))))     //读取pc2端口,如果返回值是0则表明按键被按下,    
	sbic 0x13,2
	rjmp L55
X22:
	.dbline 325
;                                //则返回按键的值                                  
;                                //以下依次对pc3、pc4、pc5逐个读取值,如果返回值为0
;                                //则返回相应按键值                                
;    {
	.dbline 326
;        chTempKeyCode = 1;
	.dbline 327
; 	   return chTempKeyCode;
	ldi R16,1
	rjmp L44
L55:
	.dbline 329
;    }
;    else if (!(PINC & (BIT(3))))
	sbic 0x13,3
	rjmp L57
X23:
	.dbline 330
;    {
	.dbline 331
;        chTempKeyCode = 2;
	.dbline 332
; 	   return chTempKeyCode;
	ldi R16,2
	rjmp L44
L57:
	.dbline 334
;    }
;    else if (!(PINC & (BIT(4))))
	sbic 0x13,4
	rjmp L59
X24:
	.dbline 335
;    {
	.dbline 336
;        chTempKeyCode = 3;
	.dbline 337
; 	   return chTempKeyCode;
	ldi R16,3
	rjmp L44
L59:
	.dbline 339
;    }
;    else if (!(PINC & (BIT(5))))
	sbic 0x13,5
	rjmp L61
X25:
	.dbline 340
;    {
	.dbline 341
;        chTempKeyCode = 4;
	.dbline 342
; 	   return chTempKeyCode;
	ldi R16,4
	rjmp L44
L61:
	.dbline 349
;    }
;    
;    
; //////////////////////////////////////////////////////////////
;    
;    //对6-7按钮进行扫描   
;    DDRC &= ~(BIT(1) | BIT(3) | 
	in R24,0x14
	andi R24,197
	out 0x14,R24
	.dbline 352
;    			 BIT(4) | BIT(5));//把端口pc1,pc3-pc5设置为输入
; 			 
;    DDRC  |=  BIT(2);//把pc2端口设为输出
	sbi 0x14,2
	.dbline 354
;    
;    PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
	in R24,0x15
	ori R24,62
	out 0x15,R24
	.dbline 357
;    			 BIT(4) | BIT(5);
; 			 
;    PORTC &= ~BIT(2); //把pc2端口拉低
	cbi 0x15,2
	.dbline 358
;    NOP();
	nop
	.dbline 359
;    NOP();
	nop
	.dbline 362
;    
;    
;    if (!(PINC & (BIT(3))))     //读取pc3端口,如果返回值是0则表明按键被按下,    
	sbic 0x13,3
	rjmp L63
X26:
	.dbline 366
;                                //则返回按键的值                                  
;                                //以下依次对pc4、pc5逐个读取值,如果返回值为0     
;                                //则返回相应按键值                                
;    {
	.dbline 367
;        chTempKeyCode = 6;
	.dbline 368
; 	   return chTempKeyCode;
	ldi R16,6
	rjmp L44
L63:
	.dbline 370
;    }
;    else if (!(PINC & (BIT(4))))
	sbic 0x13,4
	rjmp L65
X27:
	.dbline 371
;    {
	.dbline 372
;        chTempKeyCode = 7;
	.dbline 373
; 	   return chTempKeyCode;
	ldi R16,7
	rjmp L44
L65:
	.dbline 375
;    }
;    else if (!(PINC & (BIT(5))))
	sbic 0x13,5
	rjmp L67
X28:
	.dbline 376
;    {
	.dbline 377
;        chTempKeyCode = 8;
	.dbline 378
; 	   return chTempKeyCode;
	ldi R16,8
	rjmp L44
L67:
	.dbline 384
;    }
;  
; //////////////////////////////////////////////////////////////
;    
;    //对11-12按钮进行扫描   
;    DDRC &= ~(BIT(2) | BIT(1) | 
	in R24,0x14
	andi R24,201
	out 0x14,R24
	.dbline 387
;    			 BIT(4) | BIT(5));//把端口pc1-pc2,pc4-pc5设置为输入
; 			 
;    DDRC  |=  BIT(3);//把pc3端口设为输出
	sbi 0x14,3
	.dbline 389
;    
;    PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
	in R24,0x15
	ori R24,62
	out 0x15,R24
	.dbline 392
;    			 BIT(4) | BIT(5);
; 			 
;    PORTC &= ~BIT(3);//把pc2端口拉低
	cbi 0x15,3
	.dbline 393
;    NOP();
	nop
	.dbline 394
;    NOP(); 
	nop
	.dbline 396
;    
;    if (!(PINC & (BIT(4))))     //读取pc4端口,如果返回值是0则表明按键被按下,    
	sbic 0x13,4
	rjmp L69
X29:
	.dbline 399
;                                //则返回按键的值                                  
;                                
;    {
	.dbline 400
;        chTempKeyCode = 11;
	.dbline 401
; 	   return chTempKeyCode;
	ldi R16,11
	rjmp L44
L69:
	.dbline 403
;    }
;    else if (!(PINC & (BIT(5))))//读取pc5端口,如果返回值是0则表明按键被按下,    
	sbic 0x13,5
	rjmp L71
X30:
	.dbline 405
;                                //则返回按键的值                                  
;    {
	.dbline 406
;        chTempKeyCode = 12;
	.dbline 407
; 	   return chTempKeyCode;
	ldi R16,12
	rjmp L44
L71:
	.dbline 411
;    }
;  ////////////////////////////////////////////////////////////////  
;    //对16按钮进行扫描   
;    DDRC &= ~(BIT(2) | BIT(1) | 
	in R24,0x14
	andi R24,209
	out 0x14,R24
	.dbline 414
;    			 BIT(3) | BIT(5));//把端口pc1-pc3、pc5设置为输入
; 			 
;    DDRC  |=  BIT(4);								//把pc4端口设为输出
	sbi 0x14,4
	.dbline 416
;    
;    PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
	in R24,0x15
	ori R24,62
	out 0x15,R24
	.dbline 419
;    			 BIT(4) | BIT(5);
; 			 
;    PORTC &=~ BIT(4);			//把pc4端口拉低 
	cbi 0x15,4
	.dbline 420
;    NOP();
	nop
	.dbline 421
;    NOP();
	nop
	.dbline 424
;    
;    
;    if (!(PINC & (BIT(5))))                                         
	sbic 0x13,5
	rjmp L73
X31:
	.dbline 425
;    {
	.dbline 426
;        chTempKeyCode = 16;
	.dbline 427
; 	   return chTempKeyCode;     //读取pc5端口,如果返回值是0则表明按键被按下,  
	ldi R16,16
	rjmp L44
L73:
	.dbline 434
;                                //则返回按键的值     
;    }   
;    
;    
;  //////////////////////////////////////////////////////////////
;   //对20-17按钮进行扫描  
;    DDRC &= ~(BIT(2) | BIT(3) | 
	in R24,0x14
	andi R24,225
	out 0x14,R24
	.dbline 437
;    			 BIT(4) | BIT(1));				//把端口pc1-pc4设置为输入
; 			 
;    DDRC  |=  BIT(5);						//把pc5端口设为输出
	sbi 0x14,5
	.dbline 439
;    
;    PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
	in R24,0x15
	ori R24,62
	out 0x15,R24
	.dbline 442
;    			 BIT(4) | BIT(5);
; 			 
;    PORTC &= ~BIT(5); 						//把pc5端口拉低 
	cbi 0x15,5
	.dbline 443
;    NOP();
	nop
	.dbline 444
;    NOP();
	nop
	.dbline 448
;    
;    
;    
;    if (!(PINC & (BIT(4))))     //读取pc4端口,如果返回值是0则表明按键被按下,    
	sbic 0x13,4
	rjmp L75
X32:
	.dbline 452
;                                //则返回按键的值                                  
;                                //以下依次对pc3-pc1逐个读取值,如果返回值为0     
;                                //则返回相应按键值                                
;    {
	.dbline 453
;        chTempKeyCode = 20;
	.dbline 454
; 	   return chTempKeyCode;

⌨️ 快捷键说明

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