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

📄 课程设计.s

📁 PS2控制代码123456789
💻 S
📖 第 1 页 / 共 5 页
字号:
	ldi R24,255
	out 0x18,R24
	.dbline 437
;  for(i=0;i<4;i++)
	clr R22
	xjmp L78
L75:
	.dbline 438
;   {
	.dbline 439
;    PORTB=~(1<<i); //键盘线扫描
	ldi R16,1
	mov R17,R22
	xcall lsl8
	mov R2,R16
	com R2
	out 0x18,R2
	.dbline 440
;    delay_ms(20);  //等待低电平稳定
	ldi R16,20
	ldi R17,0
	xcall _delay_ms
	.dbline 441
;    temp1=PINB&0xf0;//读取键盘扫描信号,屏蔽低四位
	in R24,0x16
	andi R24,240
	sts _temp1,R24
	.dbline 442
;    if (temp1!=0xf0)//如果有键按下,延时10ms消抖
	cpi R24,240
	brne X3
	xjmp L79
X3:
	.dbline 443
;     {              //本程序用display代替10ms延时,
	.dbline 444
;     delay_ms(30); //可消除显示抖动
	ldi R16,30
	ldi R17,0
	xcall _delay_ms
	.dbline 445
;      temp1=PINB&0xf0;//再读键盘
	in R24,0x16
	andi R24,240
	sts _temp1,R24
	.dbline 446
;      if (temp1!=0xf0)
	cpi R24,240
	brne X4
	xjmp L81
X4:
	.dbline 447
;       {
	.dbline 448
;         temp1&=0xf0;
	andi R24,240
	sts _temp1,R24
	.dbline 449
;         switch(temp1) //计算键值
	mov R20,R24
	clr R21
	cpi R20,176
	ldi R30,0
	cpc R21,R30
	breq L87
	ldi R24,176
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L91
L90:
	cpi R20,112
	ldi R30,0
	cpc R21,R30
	breq L86
	xjmp L84
L91:
	cpi R20,208
	ldi R30,0
	cpc R21,R30
	breq L88
	cpi R20,208
	ldi R30,0
	cpc R21,R30
	brlt L84
L92:
	cpi R20,224
	ldi R30,0
	cpc R21,R30
	breq L89
	xjmp L84
X2:
	.dbline 450
;          {
L86:
	.dbline 451
; 		  case 0x70:temp1=15-(3-i)*4;break;
	ldi R17,3
	sub R17,R22
	ldi R16,4
	muls R16,R17
	ldi R24,15
	sub R24,R0
	sts _temp1,R24
	.dbline 451
	xjmp L84
L87:
	.dbline 452
;           case 0xb0:temp1=14-(3-i)*4;break;
	ldi R17,3
	sub R17,R22
	ldi R16,4
	muls R16,R17
	ldi R24,14
	sub R24,R0
	sts _temp1,R24
	.dbline 452
	xjmp L84
L88:
	.dbline 453
;           case 0xd0:temp1=13-(3-i)*4;break;
	ldi R17,3
	sub R17,R22
	ldi R16,4
	muls R16,R17
	ldi R24,13
	sub R24,R0
	sts _temp1,R24
	.dbline 453
	xjmp L84
L89:
	.dbline 454
;           case 0xe0:temp1=12-(3-i)*4;break;
	ldi R17,3
	sub R17,R22
	ldi R16,4
	muls R16,R17
	ldi R24,12
	sub R24,R0
	sts _temp1,R24
	.dbline 454
	.dbline 455
;           default:break;				
L84:
	.dbline 457
;           }
; 		 return temp1;
	lds R16,_temp1
	xjmp L74
L81:
	.dbline 459
; 		}
; 	  }
L79:
	.dbline 460
L76:
	.dbline 437
	inc R22
L78:
	.dbline 437
	cpi R22,4
	brsh X5
	xjmp L75
X5:
	.dbline 461
;     }
;    return 0x00;//无键按下
	clr R16
	.dbline -2
L74:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 22 c
	.dbend
	.dbfunc e ks _ks fc
;              m -> R20
;              n -> R22
	.even
_ks::
	xcall push_gset2
	.dbline -1
	.dbline 467
; }	
; /**********************************************/
; 	          /*查键盘*/
; /**********************************************/	
; unsigned char ks(void)
; {
	.dbline 469
;  unsigned char m,n;
;  DDRB=0x0f;	
	ldi R24,15
	out 0x17,R24
	.dbline 470
;  PORTB=0xff;
	ldi R24,255
	out 0x18,R24
	.dbline 471
;  for(n=0;n<4;n++)
	clr R22
	xjmp L97
L94:
	.dbline 472
;  {
	.dbline 473
;  PORTB=~(1<<n);
	ldi R16,1
	mov R17,R22
	xcall lsl8
	mov R2,R16
	com R2
	out 0x18,R2
	.dbline 474
;  delay_ms(10);
	ldi R16,10
	ldi R17,0
	xcall _delay_ms
	.dbline 475
;  m=PINB&0xf0;
	in R20,0x16
	andi R20,240
	.dbline 476
;  if(m!=0xf0)
	cpi R20,240
	breq L98
	.dbline 477
;   return 0xff;
	ldi R16,255
	xjmp L93
L98:
	.dbline 478
L95:
	.dbline 471
	inc R22
L97:
	.dbline 471
	cpi R22,4
	brlo L94
	.dbline 479
;  }
;  return 0x00;
	clr R16
	.dbline -2
L93:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r m 20 c
	.dbsym r n 22 c
	.dbend
	.area vector(rom, abs)
	.org 20
	jmp _PS2_KEY
	.area text(rom, con, rel)
	.dbfile F:\调试\计算器\课程设计.c
	.dbfunc e PS2_KEY _PS2_KEY fV
	.even
_PS2_KEY::
	st -y,R2
	st -y,R3
	st -y,R24
	st -y,R25
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 489
; }
; 
; //*********************************************************//
; 
; //******************************************************** //
;    
; #pragma interrupt_handler PS2_KEY:6
;  
;   void PS2_KEY(void)
;   {
	.dbline 491
;    
;     if((count_jiema>0)&&(count_jiema<9))
	clr R2
	lds R3,_count_jiema
	cp R2,R3
	brsh L101
	mov R24,R3
	cpi R24,9
	brsh L101
	.dbline 492
;               {  
	.dbline 493
; 			    data=data>>1;
	lds R2,_data
	lsr R2
	sts _data,R2
	.dbline 494
;                  if(PINE&DATA1)
	sbis 0x1,5
	rjmp L103
	.dbline 495
; 	              data|=0x80;
	mov R24,R2
	ori R24,128
	sts _data,R24
L103:
	.dbline 496
;               }
L101:
	.dbline 497
;          count_jiema++;
	lds R24,_count_jiema
	subi R24,255    ; addi 1
	sts _count_jiema,R24
L105:
	.dbline 499
L106:
	.dbline 499
	sbis 0x1,4
	rjmp L105
	.dbline 501
	ldi R24,10
	lds R2,_count_jiema
	cp R24,R2
	brsh L108
	.dbline 502
	.dbline 504
	clr R2
	sts _count_jiema,R2
	.dbline 505
	ldi R24,1
	sts _flag,R24
	.dbline 506
	out 0x39,R2
	.dbline 508
L108:
	.dbline -2
L100:
	ld R2,y+
	out 0x3f,R2
	ld R25,y+
	ld R24,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e Decode _Decode fV
;        TempCyc -> R22
;       ScanCode -> R20
	.even
_Decode::
	xcall push_gset2
	mov R20,R16
	sbiw R28,1
	.dbline -1
	.dbline 516
; 		
; 		 while(!(PINE&0X10));	//
; 
;     if(count_jiema>10)
;              {
; 			//  putchar0(data);//测试键盘码用
;               count_jiema=0;
;               flag=1;
;               EIMSK=0x00;
; 			
;            }		 
;   }
; 
;  //*********************************************************//
;                      /*译码*/
;  //******************************************************** // 
;  
;    void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
;    {
	.dbline 519
; 	unsigned char TempCyc;	
; 
; 	if (!Key_UP)                //
	lds R2,_Key_UP
	tst R2
	breq X8
	xjmp L111
X8:
	.dbline 520
; 		{
	.dbline 521
; 			switch (ScanCode)
	mov R22,R20
	clr R23
	cpi R22,88
	ldi R30,0
	cpc R23,R30
	breq L118
	cpi R22,89
	ldi R30,0
	cpc R23,R30
	breq L119
	ldi R24,89
	ldi R25,0
	cp R24,R22
	cpc R25,R23
	brlt L148
L147:
	cpi R22,18
	ldi R30,0
	cpc R23,R30
	breq L117
	xjmp L113
L148:
	cpi R22,102
	ldi R30,0
	cpc R23,R30
	breq L120
	cpi R22,102
	ldi R30,0
	cpc R23,R30
	brlt L113
L149:
	cpi R22,240
	ldi R30,0
	cpc R23,R30
	breq L116
	xjmp L113
X6:
	.dbline 522
; 				{
L116:
	.dbline 524
; 					case 0xF0 :	                // 当收到0xF0,Key_UP置1表示断码开始,把Shift = 1;解锁。否则下次总是显示大写字母
; 					Key_UP = 1;
	ldi R24,1
	sts _Key_UP,R24
	.dbline 525
; 					break;
	xjmp L112
L117:
	.dbline 528
; 
; 					case 0x12 :	                  // 左 SHIFT
; 						  Shift = 1;
	ldi R24,1
	sts _Shift,R24
	.dbline 529
; 					         break;
	xjmp L112
L118:
	.dbline 531
; 							 
;                     case 0x58 :	  Shift=~Shift;break;
	lds R2,_Shift
	com R2
	sts _Shift,R2
	.dbline 531
	xjmp L112
L119:
	.dbline 533
; 					case 0x59 :	                 // 右 SHIFT
; 						      Shift = 1;
	ldi R24,1
	sts _Shift,R24
	.dbline 534
; 					            break;
	xjmp L112
L120:
	.dbline 536
; 					case 0x66 :		//DEL键	
; 	                 if (DisNumx==-1)
	lds R24,_DisNumx
	cpi R24,255
	brne L121
	.dbline 537
; 					  {
	.dbline 538
; 					    DisNumy=DisNumy-8;
	lds R24,_DisNumy
	subi R24,8
	sts _DisNumy,R24
	.dbline 539
; 					    DisNumx=15;
	ldi R24,15
	sts _DisNumx,R24
	.dbline 540
; 					  }
	xjmp L112
L121:
	.dbline 542
; 					 else  
; 					  {  
	.dbline 543
; 					    write_asiic(DisNumx, DisNumy, UnShifted[40][1]);
	lds R2,_UnShifted+80+1
	std y+0,R2
	lds R18,_DisNumy
	lds R16,_DisNumx
	xcall _write_asiic
	.dbline 544
; 					    DisNumx--;   
	lds R24,_DisNumx
	subi R24,1
	sts _DisNumx,R24
	.dbline 545
; 					  }	
	.dbline 546
;                        break;
	xjmp L112
L113:
	.dbline 548
; 					default:						
; 							if (DisNumx > 15)
	ldi R24,15
	lds R2,_DisNumx
	cp R24,R2
	brsh L125
	.dbline 549
; 							{
	.dbline 550
;                                DisNumy=DisNumy+8;
	lds R24,_DisNumy
	subi R24,248    ; addi 8
	sts _DisNumy,R24
	.dbline 551
;                                 if( DisNumy==64)DisNumy=0;
	cpi R24,64
	brne L127
	.dbline 551
	clr R2
	sts _DisNumy,R2
L127:
	.dbline 552
; 								DisplayListChar(0, DisNumy);//清LCD第二行
	lds R18,_DisNumy
	clr R16
	xcall _DisplayListChar
	.dbline 553
;                                  DisNumx=0;
	clr R2
	sts _DisNumx,R2
	.dbline 556
; 								 
; 								                 
;                              }
L125:
	.dbline 557
; 				    if(!Shift)	//如果SHIFT没按下
	lds R2,_Shift
	tst R2
	breq X9
	xjmp L129
X9:
	.dbline 558
; 							{
	.dbline 559
	clr R22
	xjmp L134
L131:
	.dbline 559
L132:
	.dbline 559
	inc R22
L134:
	.dbline 559
; 								for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<71); TempCyc++); //查表显示
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_UnShifted
	ldi R25,>_UnShifted
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	cp R2,R20
	breq L135
	cpi R22,71
	brlo L131
L135:
	.dbline 560
; 								if (UnShifted[TempCyc][0] == ScanCode) 
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_UnShifted
	ldi R25,>_UnShifted
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	cp R2,R20
	breq X10
	xjmp L112
X10:
	.dbline 561
;                                    {  write_asiic(DisNumx, DisNumy, UnShifted[TempCyc][1]);
	.dbline 561
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_UnShifted+1
	ldi R25,>_UnShifted+1
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	std y+0,R2
	lds R18,_DisNumy
	lds R16,_DisNumx
	xcall _write_asiic
	.dbline 562
; 									  DisNumx++;
	lds R24,_DisNumx
	subi R24,255    ; addi 1
	sts _DisNumx,R24
	.dbline 564
; 																	 
;                                   }
	.dbline 565
; 							} 
	xjmp L112
L129:
	.dbline 567
; 						else  //按下SHIFT
; 							{
	.dbline 568
	clr R22
	xjmp L142
L139:
	.dbline 568
L140:
	.dbline 568
	inc R22
L142:
	.dbline 568
; 								for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_Shifted
	ldi R25,>_Shifted
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	cp R2,R20
	breq L143
	cpi R22,59
	brlo L139
L143:
	.dbline 569
; 								if (Shifted[TempCyc][0] == ScanCode) 
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_Shifted
	ldi R25,>_Shifted
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	cp R2,R20
	brne L112
	.dbline 570
;                                      {  write_asiic(DisNumx, DisNumy, Shifted[TempCyc][1]);
	.dbline 570
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_Shifted+1
	ldi R25,>_Shifted+1
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	std y+0,R2
	lds R18,_DisNumy
	lds R16,_DisNumx
	xcall _write_asiic
	.dbline 571
; 								        DisNumx++;
	lds R24,_DisNumx
	subi R24,255    ; addi 1
	sts _DisNumx,R24
	.dbline 573
; 										
;                                      } 
	.dbline 574
; 							}
	.dbline 576
; 
; 					break;
	.dbline 578
; 				}
; 		}
	xjmp L112
L111:
	.dbline 580
; 	else
; 		{	
	.dbline 581
; 			Key_UP = 0;
	clr R2
	sts _Key_UP,R2
	.dbline 582
; 			switch (ScanCode) //当键松开时不处理断码,SHIFT+G为12H 34H F0H 34H F0H 12H,按下(12H 34H),松开(F0H 34H F0H 12H)
	clr R21
	cpi R20,18
	ldi R30,0
	cpc R21,R30
	breq L153
	cpi R20,18
	ldi R30,0
	cpc R21,R30
	brlt L150
L155:
	cpi R20,89
	ldi R30,0
	cpc R21,R30
	breq L154
	xjmp L150
X7:
	.dbline 583
; 				{
L153:

⌨️ 快捷键说明

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