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

📄 ex_support.s

📁 一个解决5个IO口扫描25个按键的解决方法,完整文件包,有参考意义,C51.
💻 S
📖 第 1 页 / 共 3 页
字号:
	ldi R16,20
	rjmp L44
L75:
	.dbline 456
;    }
;    else if (!(PINC & (BIT(3))))
	sbic 0x13,3
	rjmp L77
X33:
	.dbline 457
;    {
	.dbline 458
;        chTempKeyCode = 19;
	.dbline 459
; 	   return chTempKeyCode;
	ldi R16,19
	rjmp L44
L77:
	.dbline 461
;    }
;    else if (!(PINC & (BIT(2))))
	sbic 0x13,2
	rjmp L79
X34:
	.dbline 462
;    {
	.dbline 463
;        chTempKeyCode = 18;
	.dbline 464
; 	   return chTempKeyCode;
	ldi R16,18
	rjmp L44
L79:
	.dbline 466
;    }
;    else if (!(PINC & (BIT(1))))
	sbic 0x13,1
	rjmp L81
X35:
	.dbline 467
;    {
	.dbline 468
;        chTempKeyCode = 17;
	.dbline 469
; 	   return chTempKeyCode;
	ldi R16,17
	rjmp L44
L81:
	.dbline 477
;    }
;    
;    
;    
; //////////////////////////////////////////////////////////////
;     //对15-13按钮进行扫描  
;    
;    DDRC  &= ~(BIT(1) | BIT(3) | 
	in R24,0x14
	andi R24,209
	out 0x14,R24
	.dbline 480
;    			  BIT(2) | BIT(5));					//把端口pc1-pc3、pc5设置为输入
; 			  
;    DDRC  |=   BIT(4);							//把pc4端口设为输出
	sbi 0x14,4
	.dbline 482
;    
;    PORTC |=   BIT(1) | BIT(2) | BIT(3) | 
	in R24,0x15
	ori R24,62
	out 0x15,R24
	.dbline 485
;    		      BIT(4) | BIT(5);
; 			  
;    PORTC &=  ~BIT(4); 							//把pc4端口拉低 
	cbi 0x15,4
	.dbline 486
;    NOP();
	nop
	.dbline 487
;    NOP();
	nop
	.dbline 490
;    
;     
;    if (!(PINC & (BIT(3))))    	 //读取pc3端口,如果返回值是0则表明按键被按下,    
	sbic 0x13,3
	rjmp L83
X36:
	.dbline 494
;                               	 //则返回按键的值                                  
;                               	 //以下依次对pc2-pc1逐个读取值,如果返回值为0      
;                               	 //则返回相应按键值                                
;    {
	.dbline 495
;        chTempKeyCode = 15;
	.dbline 496
; 	   return chTempKeyCode;
	ldi R16,15
	rjmp L44
L83:
	.dbline 498
;    }
;    else if (!(PINC & (BIT(2))))
	sbic 0x13,2
	rjmp L85
X37:
	.dbline 499
;    {
	.dbline 500
;        chTempKeyCode = 14;
	.dbline 501
; 	   return chTempKeyCode;
	ldi R16,14
	rjmp L44
L85:
	.dbline 503
;    }
;    else if (!(PINC & (BIT(1))))
	sbic 0x13,1
	rjmp L87
X38:
	.dbline 504
;    {
	.dbline 505
;        chTempKeyCode = 13;
	.dbline 506
; 	   return chTempKeyCode;
	ldi R16,13
	rjmp L44
L87:
	.dbline 514
;    }
;  
;  
;  
; //////////////////////////////////////////////////////////////
;     //对10-9按钮进行扫描  
;    
;    DDRC  &= ~(BIT(2) | BIT(1) | 
	in R24,0x14
	andi R24,201
	out 0x14,R24
	.dbline 517
;    			  BIT(4) | BIT(5));		//把端口pc1-pc2、pc4-pc5设置为输入
;    
;    DDRC  |=   BIT(3);				//把pc3端口设为输出
	sbi 0x14,3
	.dbline 519
;    
;    PORTC |=   BIT(1) | BIT(2) | 
	in R24,0x15
	ori R24,62
	out 0x15,R24
	.dbline 522
;    			  BIT(3) | BIT(4) | BIT(5);
; 			  
;    PORTC &=  ~BIT(3);				//把pc3端口拉低 
	cbi 0x15,3
	.dbline 523
;    NOP();
	nop
	.dbline 524
;    NOP(); 
	nop
	.dbline 527
;    
;    
;    if (!(PINC & (BIT(2))))     		//读取pc2端口,如果返回值是0则表明按键被按下,    
	sbic 0x13,2
	rjmp L89
X39:
	.dbline 529
;                               		//则返回按键的值                                                            
;    {
	.dbline 530
;        chTempKeyCode = 10;
	.dbline 531
; 	   return chTempKeyCode;
	ldi R16,10
	rjmp L44
L89:
	.dbline 533
;    }
;    else if (!(PINC & (BIT(1))))		//读取pc1端口,如果返回值是0则表明按键被按下,    
	sbic 0x13,1
	rjmp L91
X40:
	.dbline 535
;                                		//则返回按键的值            
;    {
	.dbline 536
;        chTempKeyCode = 9;
	.dbline 537
; 	   return chTempKeyCode;
	ldi R16,9
	rjmp L44
L91:
	.dbline 543
;    }
;    
;    
;   ////////////////////////////////////////////////////// 
;    //对5按钮进行扫描  
;    DDRC  &= ~(BIT(4) | BIT(1) | 
	in R24,0x14
	andi R24,197
	out 0x14,R24
	.dbline 546
;    		      BIT(3) | BIT(5));		//把端口pc1、pc3-pc4设置为输入
; 			  
;    DDRC |= BIT(2);					//把pc2端口设为输出
	sbi 0x14,2
	.dbline 548
;    
;    PORTC |= BIT(1) | BIT(2) | BIT(3) |
	in R24,0x15
	ori R24,62
	out 0x15,R24
	.dbline 551
;    		    BIT(4) | BIT(5);
; 			
;    PORTC &= ~BIT(2); 				//把pc2端口拉低 
	cbi 0x15,2
	.dbline 552
;    NOP();
	nop
	.dbline 553
;    NOP();
	nop
	.dbline 555
;    
;    if (!(PINC & (BIT(1))))    		//读取pc1端口,如果返回值是0则表明按键被按下,    
	sbic 0x13,1
	rjmp L93
X41:
	.dbline 557
;                              		//则返回按键的值                                  
;    {
	.dbline 558
;        chTempKeyCode = 5;
	.dbline 559
; 	   return chTempKeyCode;
	ldi R16,5
	rjmp L44
L93:
	.dbline 563
;    }   
;    
; 
;    return chTempKeyCode;			//返回按键值
	ldi R16,255
	.dbline -2
L44:
	.dbline 0 ; func end
	ret
	.dbend
	.area lit(rom, con, rel)
L96:
	.byte 192,249
	.byte 164,176
	.byte 153,146
	.byte 130,248
	.byte 128,144
	.area text(rom, con, rel)
	.dbfile F:\AVR\按键扫描\EX_Support.c
	.dbfunc e Get_Code _Get_Code fc
	.area  func_lit(rom, con, rel)
L148:
	.word `L100
	.word `L102
	.word `L104
	.word `L106
	.word `L108
	.word `L110
	.word `L112
	.word `L114
	.word `L116
	.word `L118
	.word `L119
	.word `L121
	.word `L123
	.word `L125
	.word `L127
	.word `L129
	.word `L131
	.word `L133
	.word `L135
	.word `L137
	.word `L138
	.word `L140
	.word `L142
	.word `L144
	.word `L146
	.area text(rom, con, rel)
;          Table -> y+0
;           chj0 -> R20
;            chi -> R10
	.even
_Get_Code::
	st -y,R10
	st -y,R20
	mov R10,R16
	sbiw R28,10
	.dbline -1
	.dbline 567
; }
; 
; UINT8 Get_Code (UINT8 chi)
; {
	.dbline 569
; 	UINT8 chj;
; 	UINT8 Table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
	ldi R24,<L96
	ldi R25,>L96
	movw R30,R28
	ldi R16,10
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 570
; 	switch(chi)
	mov R20,R10
	cpi R20,1
	brsh X45
	rjmp L97
X45:
X42:
	ldi R24,25
	cp R24,R10
	brsh X46
	rjmp L97
X46:
X43:
	ldi R24,<L148
	ldi R25,>L148
	mov R30,R20
	subi R30,1
	clr R31
	lsl R30
	rol R31
	add R30,R24
	adc R31,R25
	lpm R2,Z+
	lpm R3,Z
	movw R30,R2
	 ijmp
X44:
	.dbfile F:\AVR\按键扫描\EX_Support.c
	.dbline 571
; 	{
L100:
	.dbline 572
; 		case 1:		chj = Table[1];break;
	ldd R20,y+1
	.dbline 572
	rjmp L98
L102:
	.dbline 573
; 		case 2:		chj = Table[2];break;
	ldd R20,y+2
	.dbline 573
	rjmp L98
L104:
	.dbline 574
; 		case 3:		chj = Table[3];break;
	ldd R20,y+3
	.dbline 574
	rjmp L98
L106:
	.dbline 575
; 		case 4:		chj = Table[4];break;
	ldd R20,y+4
	.dbline 575
	rjmp L98
L108:
	.dbline 576
; 		case 5:		chj = Table[5];break;
	ldd R20,y+5
	.dbline 576
	rjmp L98
L110:
	.dbline 577
; 		case 6:		chj = Table[6];break;
	ldd R20,y+6
	.dbline 577
	rjmp L98
L112:
	.dbline 578
; 		case 7:		chj = Table[7];break;
	ldd R20,y+7
	.dbline 578
	rjmp L98
L114:
	.dbline 579
; 		case 8:		chj = Table[8];break;
	ldd R20,y+8
	.dbline 579
	rjmp L98
L116:
	.dbline 580
; 		case 9:		chj = Table[9];break;
	ldd R20,y+9
	.dbline 580
	rjmp L98
L118:
	.dbline 581
; 		case 10:	chj = Table[0];break;
	ldd R20,y+0
	.dbline 581
	rjmp L98
L119:
	.dbline 582
; 		case 11:	chj = Table[1];break;
	ldd R20,y+1
	.dbline 582
	rjmp L98
L121:
	.dbline 583
; 		case 12:	chj = Table[2];break;
	ldd R20,y+2
	.dbline 583
	rjmp L98
L123:
	.dbline 584
; 		case 13:	chj = Table[3];break;
	ldd R20,y+3
	.dbline 584
	rjmp L98
L125:
	.dbline 585
; 		case 14:	chj = Table[4];break;
	ldd R20,y+4
	.dbline 585
	rjmp L98
L127:
	.dbline 586
; 		case 15:	chj = Table[5];break;
	ldd R20,y+5
	.dbline 586
	rjmp L98
L129:
	.dbline 587
; 		case 16:	chj = Table[6];break;
	ldd R20,y+6
	.dbline 587
	rjmp L98
L131:
	.dbline 588
; 		case 17:	chj = Table[7];break;
	ldd R20,y+7
	.dbline 588
	rjmp L98
L133:
	.dbline 589
; 		case 18:	chj = Table[8];break;
	ldd R20,y+8
	.dbline 589
	rjmp L98
L135:
	.dbline 590
; 		case 19:	chj = Table[9];break;
	ldd R20,y+9
	.dbline 590
	rjmp L98
L137:
	.dbline 591
; 		case 20:	chj = Table[0];break;
	ldd R20,y+0
	.dbline 591
	rjmp L98
L138:
	.dbline 592
; 		case 21:	chj = Table[1];break;
	ldd R20,y+1
	.dbline 592
	rjmp L98
L140:
	.dbline 593
; 		case 22:	chj = Table[2];break;
	ldd R20,y+2
	.dbline 593
	rjmp L98
L142:
	.dbline 594
; 		case 23:	chj = Table[3];break;
	ldd R20,y+3
	.dbline 594
	rjmp L98
L144:
	.dbline 595
; 		case 24:	chj = Table[4];break;
	ldd R20,y+4
	.dbline 595
	rjmp L98
L146:
	.dbline 596
; 		case 25:	chj = Table[5];break;
	ldd R20,y+5
	.dbline 596
	rjmp L98
L97:
	.dbline 597
; 		default:	chj = 0xFF;
	ldi R20,255
	.dbline 598
; 	}
L98:
	.dbline 599
; 	return chj;
	mov R16,R20
	.dbline -2
L95:
	.dbline 0 ; func end
	adiw R28,10
	ld R20,y+
	ld R10,y+
	ret
	.dbsym l Table 0 A[10:10]c
	.dbsym r chj0 20 c
	.dbsym r chi 10 c
	.dbend
; }

⌨️ 快捷键说明

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