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

📄 ps2_kb.lst

📁 AVR单片机C语言编程及应用实例 适合初学者的学习研究 其中包含Atmega16中文资料及Protel部分电路图
💻 LST
📖 第 1 页 / 共 3 页
字号:
    01E5 9BC8      SBIS	P19,0
    01E6 C004      RJMP	0x01EB
(0204) 	{
(0205) 	  data|=0x80;					   //存储一个'1'
    01E7 2D82      MOV	R24,R2
    01E8 6880      ORI	R24,0x80
    01E9 9380006E  STS	R24,0x6E
(0206) 	}
(0207)   }
(0208)   MCUCR=3;				 //设置INT0为上升沿触发中断
    01EB E083      LDI	R24,3
    01EC BF85      OUT	P35,R24
(0209)   edge=1;				 //设置上升沿中断标志
    01ED E081      LDI	R24,1
    01EE 93800070  STS	R24,_edge
(0210)  } 
    01F0 C013      RJMP	0x0204
(0211)  else 					 //如果是上升沿触发中断
(0212)  { 
(0213)   MCUCR=2;				 //设置INT0为下降沿触发中断
    01F1 E082      LDI	R24,2
    01F2 BF85      OUT	P35,R24
(0214)   edge=0;				 //设置下降沿中断标志 
    01F3 2422      CLR	R2
    01F4 92200070  STS	R2,_edge
(0215)   if(--bitcount==0)		 //如果11位全部接收完毕
    01F6 9180006F  LDS	R24,_bitcount
    01F8 5081      SUBI	R24,1
    01F9 2E28      MOV	R2,R24
    01FA 9220006F  STS	R2,_bitcount
    01FC 2388      TST	R24
    01FD F431      BNE	0x0204
(0216)   {
(0217)    Decode(data);	 //将扫描码翻译成ASCII码   
    01FE 9100006E  LDS	R16,0x6E
    0200 D006      RCALL	_Decode
(0218)    bitcount = 11;		 //重新设为11位数据
    0201 E08B      LDI	R24,0xB
    0202 9380006F  STS	R24,_bitcount
(0219)   }
(0220)  }
(0221) }
    0204 940E02CA  CALL	pop_lset
    0206 9518      RETI
_Decode:
  i                    --> R20
  scancode             --> R16
    0207 940E02E1  CALL	push_gset1
(0222) /*******************************************
(0223) 函数名称: Decode
(0224) 功    能: 
(0225) 参    数: scancode--需要翻译的扫描码
(0226) 返回值  : 无
(0227) /********************************************/
(0228) void Decode(uchar scancode)
(0229) {
(0230)  static uchar up=0,shift=0;	//up为通、断码标志,shift为shift键按下标志
(0231)  uchar i;
(0232)  if (!up)	  	   //已接收的11位数据是通码(up为0)
    0209 90200061  LDS	R2,0x61
    020B 2022      TST	R2
    020C F009      BEQ	0x020E
    020D C070      RJMP	0x027E
(0233)  {
(0234)   switch (scancode)//开始翻译扫描码
    020E 2F40      MOV	R20,R16
    020F 2755      CLR	R21
    0210 3549      CPI	R20,0x59
    0211 E0E0      LDI	R30,0
    0212 075E      CPC	R21,R30
    0213 F0B9      BEQ	0x022B
    0214 E589      LDI	R24,0x59
    0215 E090      LDI	R25,0
    0216 1784      CP	R24,R20
    0217 0795      CPC	R25,R21
    0218 F02C      BLT	0x021E
    0219 3142      CPI	R20,0x12
    021A E0E0      LDI	R30,0
    021B 075E      CPC	R21,R30
    021C F051      BEQ	0x0227
    021D C011      RJMP	0x022F
    021E 3F40      CPI	R20,0xF0
    021F E0E0      LDI	R30,0
    0220 075E      CPC	R21,R30
    0221 F009      BEQ	0x0223
    0222 C00C      RJMP	0x022F
(0235)   {
(0236)    case 0xF0:	   //键盘释放标志(随后的一个字节是断码)
(0237)    		up=1;	   //设置up为断码标志
    0223 E081      LDI	R24,1
    0224 93800061  STS	R24,0x61
(0238)    		break;
    0226 C070      RJMP	0x0297
(0239)    case 0x12:	   //左shift键按下
(0240)    		shift=1;   //设置shift为按下标志
    0227 E081      LDI	R24,1
    0228 93800062  STS	R24,0x62
(0241)    		break;
    022A C06C      RJMP	0x0297
(0242)    case 0x59:	   //右shift键按下
(0243)    		shift=1;   //设置shift为按下标志
    022B E081      LDI	R24,1
    022C 93800062  STS	R24,0x62
(0244)    		break;   
    022E C068      RJMP	0x0297
(0245)    default:        
(0246)    		if(!shift)			  //如果shift键没有按下
    022F 90200062  LDS	R2,0x62
    0231 2022      TST	R2
    0232 F531      BNE	0x0259
(0247) 		{ 					  //查找unshifted表,表中左列是扫描码,右列是对应的ASCII码
(0248) 	  	   for(i=0;unshifted[i][0]!=scancode&&unshifted[i][0];i++);
    0233 2744      CLR	R20
    0234 C001      RJMP	0x0236
    0235 9543      INC	R20
    0236 E082      LDI	R24,2
    0237 9F84      MUL	R24,R20
    0238 01F0      MOVW	R30,R0
    0239 E680      LDI	R24,0x60
    023A E090      LDI	R25,0
    023B 0FE8      ADD	R30,R24
    023C 1FF9      ADC	R31,R25
    023D 9024      LD	R2,R2
    023E 2433      CLR	R3
    023F 1620      CP	R2,R16
    0240 F011      BEQ	0x0243
    0241 2022      TST	R2
    0242 F791      BNE	0x0235
(0249) 	  	   if(unshifted[i][0]==scancode) 
    0243 E082      LDI	R24,2
    0244 9F84      MUL	R24,R20
    0245 01F0      MOVW	R30,R0
    0246 E680      LDI	R24,0x60
    0247 E090      LDI	R25,0
    0248 0FE8      ADD	R30,R24
    0249 1FF9      ADC	R31,R25
    024A 91E4      LD	R30,R30
    024B 17E0      CP	R30,R16
    024C F009      BEQ	0x024E
    024D C049      RJMP	0x0297
(0250) 	  	   {
(0251) 	   	   	ascii=unshifted[i][1];
    024E E082      LDI	R24,2
    024F 9F84      MUL	R24,R20
    0250 01F0      MOVW	R30,R0
    0251 E681      LDI	R24,0x61
    0252 E090      LDI	R25,0
    0253 0FE8      ADD	R30,R24
    0254 1FF9      ADC	R31,R25
    0255 91E4      LD	R30,R30
    0256 93E00060  STS	R30,0x60
(0252) 	  	   }
(0253) 		} 
    0258 C03E      RJMP	0x0297
(0254) 		else 				  //如果shift键按下
(0255) 		{	 				  //查找shifted表
(0256) 	  	   for(i=0;shifted[i][0]!=scancode&&shifted[i][0];i++);
    0259 2744      CLR	R20
    025A C001      RJMP	0x025C
    025B 9543      INC	R20
    025C E082      LDI	R24,2
    025D 9F84      MUL	R24,R20
    025E 01F0      MOVW	R30,R0
    025F EE82      LDI	R24,0xE2
    0260 E090      LDI	R25,0
    0261 0FE8      ADD	R30,R24
    0262 1FF9      ADC	R31,R25
    0263 9024      LD	R2,R2
    0264 2433      CLR	R3
    0265 1620      CP	R2,R16
    0266 F011      BEQ	0x0269
    0267 2022      TST	R2
    0268 F791      BNE	0x025B
(0257) 	  	   if(shifted[i][0]==scancode) 
    0269 E082      LDI	R24,2
    026A 9F84      MUL	R24,R20
    026B 01F0      MOVW	R30,R0
    026C EE82      LDI	R24,0xE2
    026D E090      LDI	R25,0
    026E 0FE8      ADD	R30,R24
    026F 1FF9      ADC	R31,R25
    0270 91E4      LD	R30,R30
    0271 17E0      CP	R30,R16
    0272 F521      BNE	0x0297
(0258) 	  	   {
(0259) 	   	   	ascii=shifted[i][1];
    0273 E082      LDI	R24,2
    0274 9F84      MUL	R24,R20
    0275 01F0      MOVW	R30,R0
    0276 EE83      LDI	R24,0xE3
    0277 E090      LDI	R25,0
    0278 0FE8      ADD	R30,R24
    0279 1FF9      ADC	R31,R25
    027A 91E4      LD	R30,R30
    027B 93E00060  STS	R30,0x60
(0260) 	  	   }
(0261) 		}   
(0262)    		break;
(0263)   }
(0264)  } 
    027D C019      RJMP	0x0297
(0265)  else 		  			//已接收的11位数据是断码(up为1)
(0266)  {
(0267)   up = 0;   	  	 	//将断码标志复位
    027E 2422      CLR	R2
    027F 92200061  STS	R2,0x61
(0268)   switch (scancode)		//检测shift键释放
    0281 2F40      MOV	R20,R16
    0282 2755      CLR	R21
    0283 3142      CPI	R20,0x12
    0284 E0E0      LDI	R30,0
    0285 075E      CPC	R21,R30
    0286 F049      BEQ	0x0290
    0287 3142      CPI	R20,0x12
    0288 E0E0      LDI	R30,0
    0289 075E      CPC	R21,R30
    028A F064      BLT	0x0297
    028B 3549      CPI	R20,0x59
    028C E0E0      LDI	R30,0
    028D 075E      CPC	R21,R30
    028E F029      BEQ	0x0294
    028F C007      RJMP	0x0297
(0269)   {
(0270)    case 0x12 :	   		//左shift键
(0271)    		shift = 0;
    0290 2422      CLR	R2
    0291 92200062  STS	R2,0x62
(0272)    		break;
    0293 C003      RJMP	0x0297
(0273)    case 0x59 :			//右shift键
(0274)    		shift = 0;
    0294 2422      CLR	R2
    0295 92200062  STS	R2,0x62
(0275)    		break;
(0276)    default:
(0277)    		break;
(0278)   }
(0279)  }
(0280) }
    0297 940E02E4  CALL	pop_gset1
    0299 9508      RET
(0281) /*******************************************
(0282) 函数名称: main
(0283) 功    能: 实现PS2键盘的驱动,在1602液晶上显示键盘上的ASCII码
(0284) 参    数: 无
(0285) 返回值  : 无
(0286) /********************************************/
(0287) void main(void)
(0288) {
(0289)  Board_init( );	   			//初始化开发板
_main:
    029A DE6D      RCALL	_Board_init
(0290)  LCD1602_initial( ); 		//初始化1602
    029B DEFE      RCALL	_LCD1602_initial
(0291)  Init_kb();		  			//初始化PS2键盘接口
    029C DF14      RCALL	_Init_kb
    029D C003      RJMP	0x02A1
(0292)  while(1)
(0293)  {
(0294)   Disp_ascii(ascii);    //显示翻译后的ASCII码
    029E 91000060  LDS	R16,0x60
    02A0 DF21      RCALL	_Disp_ascii
    02A1 CFFC      RJMP	0x029E
(0295)  }
(0296) }
FILE: <library>
    02A2 9508      RET
empy16s:
    02A3 920A      ST	R0,-Y
    02A4 921A      ST	R1,-Y
    02A5 938A      ST	R24,-Y
    02A6 939A      ST	R25,-Y
    02A7 9F02      MUL	R16,R18
    02A8 01C0      MOVW	R24,R0
    02A9 9F12      MUL	R17,R18
    02AA 0D90      ADD	R25,R0
    02AB 9F03      MUL	R16,R19
    02AC 0D90      ADD	R25,R0
    02AD 018C      MOVW	R16,R24
    02AE 9199      LD	R25,Y+
    02AF 9189      LD	R24,Y+
    02B0 9019      LD	R1,Y+
    02B1 9009      LD	R0,Y+
    02B2 9508      RET
push_lset:
    02B3 93FA      ST	R31,-Y
    02B4 93EA      ST	R30,-Y
    02B5 93BA      ST	R27,-Y
    02B6 93AA      ST	R26,-Y
    02B7 939A      ST	R25,-Y
    02B8 938A      ST	R24,-Y
    02B9 933A      ST	R19,-Y
    02BA 932A      ST	R18,-Y
    02BB 931A      ST	R17,-Y
    02BC 930A      ST	R16,-Y
    02BD 929A      ST	R9,-Y
    02BE 928A      ST	R8,-Y
    02BF 927A      ST	R7,-Y
    02C0 926A      ST	R6,-Y
    02C1 925A      ST	R5,-Y
    02C2 924A      ST	R4,-Y
    02C3 923A      ST	R3,-Y
    02C4 922A      ST	R2,-Y
    02C5 921A      ST	R1,-Y
    02C6 920A      ST	R0,-Y
    02C7 B60F      IN	R0,P3F
    02C8 920A      ST	R0,-Y
    02C9 9508      RET
pop_lset:
    02CA 9009      LD	R0,Y+
    02CB BE0F      OUT	P3F,R0
    02CC 9009      LD	R0,Y+
    02CD 9019      LD	R1,Y+
    02CE 9029      LD	R2,Y+
    02CF 9039      LD	R3,Y+
    02D0 9049      LD	R4,Y+
    02D1 9059      LD	R5,Y+
    02D2 9069      LD	R6,Y+
    02D3 9079      LD	R7,Y+
    02D4 9089      LD	R8,Y+
    02D5 9099      LD	R9,Y+
    02D6 9109      LD	R16,Y+
    02D7 9119      LD	R17,Y+
    02D8 9129      LD	R18,Y+
    02D9 9139      LD	R19,Y+
    02DA 9189      LD	R24,Y+
    02DB 9199      LD	R25,Y+
    02DC 91A9      LD	R26,Y+
    02DD 91B9      LD	R27,Y+
    02DE 91E9      LD	R30,Y+
    02DF 91F9      LD	R31,Y+
    02E0 9508      RET
push_gset1:
    02E1 935A      ST	R21,-Y
    02E2 934A      ST	R20,-Y
    02E3 9508      RET
pop_gset1:
    02E4 E0E1      LDI	R30,1
pop:
    02E5 9149      LD	R20,Y+
    02E6 9159      LD	R21,Y+
    02E7 FDE0      SBRC	R30,0
    02E8 9508      RET
    02E9 9169      LD	R22,Y+
    02EA 9179      LD	R23,Y+
    02EB FDE1      SBRC	R30,1
    02EC 9508      RET
    02ED 90A9      LD	R10,Y+
    02EE 90B9      LD	R11,Y+
    02EF FDE2      SBRC	R30,2
    02F0 9508      RET
    02F1 90C9      LD	R12,Y+
    02F2 90D9      LD	R13,Y+
    02F3 FDE3      SBRC	R30,3
    02F4 9508      RET
    02F5 90E9      LD	R14,Y+
    02F6 90F9      LD	R15,Y+
    02F7 9508      RET
push_gset2:
    02F8 937A      ST	R23,-Y
    02F9 936A      ST	R22,-Y
    02FA 940C02E1  JMP	push_gset1
pop_gset2:
    02FC E0E2      LDI	R30,2
    02FD 940C02E5  JMP	pop

⌨️ 快捷键说明

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