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

📄 ps2.lst

📁 AVR单片机(Atmega16)的PS2键盘驱动程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0011) uchar Key_Up=0;                //键盘被释放标志;
(0012) uchar Finish=0;              //键盘编码接收完成标志
(0013) 
(0014) unsigned char const KeyCode[59][2] = {
(0015) 0x1C, 'A',
(0016) 0x32, 'B',
(0017) 0x21, 'C',
(0018) 0x23, 'D',
(0019) 0x24, 'E',
(0020) 0x2B, 'F',
(0021) 0x34, 'G',
(0022) 0x33, 'H',
(0023) 0x43, 'I',
(0024) 0x3B, 'J',
(0025) 0x42, 'K',
(0026) 0x4B, 'L',
(0027) 0x3A, 'M',
(0028) 0x31, 'N',
(0029) 0x44, 'O',
(0030) 0x4D, 'P',
(0031) 0x15, 'Q',
(0032) 0x2D, 'R',
(0033) 0x1B, 'S',
(0034) 0x2C, 'T',
(0035) 0x3C, 'U',
(0036) 0x2A, 'V',
(0037) 0x1D, 'W',
(0038) 0x22, 'X',
(0039) 0x35, 'Y',
(0040) 0x1A, 'Z',
(0041) 0x45, '0',//48
(0042) 0x16, '1',//49
(0043) 0x1E, '2',//50
(0044) 0x26, '3',//51
(0045) 0x25, '4',//52
(0046) 0x2E, '5',//53
(0047) 0x36, '6',//54
(0048) 0x3D, '7',//55
(0049) 0x3E, '8',//56
(0050) 0x46, '9',//57
(0051) 0x0E, '~',
(0052) 0x7B, 62, //'_',
(0053) 0x79, 61, //'+',
(0054) 0x7C, 63, //'*',
(0055) 0x77, 64, //'NUM',
(0056) 0x54, '{',
(0057) 0x5B, '}',
(0058) 0x4C, ':',
(0059) 0x52, '"',
(0060) 0x41, '<',
(0061) //0x49, '>',
(0062) 0xE0, 60,//回车
(0063) //0x4A, '?',
(0064) 0x5a, 59, //59, //定义回车开始键;
(0065) 0x71, 58, //定义删除键;
(0066) 0x70, '0',//48
(0067) 0x69, '1',//49
(0068) 0x72, '2',//50
(0069) 0x7A, '3',//51
(0070) 0x6B, '4',//52
(0071) 0x73, '5',//53
(0072) 0x74, '6',//54
(0073) 0x6C, '7',//55
(0074) 0x75, '8',//56
(0075) 0x7D, '9',//57
(0076) };
(0077) 
(0078) //***************************PS/2键盘译码******************//
(0079) //参数说明:ScanCode:扫描码;返回值:按键号:0~9,Enter,Del..
(0080) uchar Decode(uchar ScanCode) 
(0081) {uchar temp; 
(0082)  uchar i;	
(0083)  switch (ScanCode)
    0170 2F40      MOV	R20,R16
    0171 2755      CLR	R21
    0172 3E40      CPI	R20,0xE0
    0173 E0E0      LDI	R30,0
    0174 075E      CPC	R21,R30
    0175 F009      BEQ	0x0177
    0176 C005      RJMP	0x017C
(0084)     {case 0xE0:
(0085) 	    {Key_Up = 1;i=12;break;}    // 当收到0xF0,Key_UP置1表示断码开始
    0177 E081      LDI	R24,1
    0178 93800060  STS	Key_Up,R24
    017A E04C      LDI	R20,0xC
    017B C022      RJMP	0x019E
(0086) 	 default: 	                   //查表显示
(0087) 	    for(temp=0;(KeyCode[temp][0]!=ScanCode)&&(temp<59);temp++);	                     
    017C 2766      CLR	R22
    017D C001      RJMP	0x017F
    017E 9563      INC	R22
    017F E082      LDI	R24,2
    0180 9F86      MUL	R24,R22
    0181 01F0      MOVW	R30,R0
    0182 E584      LDI	R24,0x54
    0183 E090      LDI	R25,0
    0184 0FE8      ADD	R30,R24
    0185 1FF9      ADC	R31,R25
    0186 91E4      LPM	R30,0(Z)
    0187 17E0      CP	R30,R16
    0188 F011      BEQ	0x018B
    0189 336B      CPI	R22,0x3B
    018A F398      BCS	0x017E
(0088) 		if (KeyCode[temp][0]==ScanCode)
    018B E082      LDI	R24,2
    018C 9F86      MUL	R24,R22
    018D 01F0      MOVW	R30,R0
    018E E584      LDI	R24,0x54
    018F E090      LDI	R25,0
    0190 0FE8      ADD	R30,R24
    0191 1FF9      ADC	R31,R25
    0192 91E4      LPM	R30,0(Z)
    0193 17E0      CP	R30,R16
    0194 F449      BNE	0x019E
(0089) 			 	i=KeyCode[temp][1]-48; 
    0195 E082      LDI	R24,2
    0196 9F86      MUL	R24,R22
    0197 01F0      MOVW	R30,R0
    0198 E585      LDI	R24,0x55
    0199 E090      LDI	R25,0
    019A 0FE8      ADD	R30,R24
    019B 1FF9      ADC	R31,R25
    019C 9144      LPM	R20,0(Z)
    019D 5340      SUBI	R20,0x30
(0090) 	}
(0091)  Finish = 0;          //标识字符处理完了
    019E 2422      CLR	R2
    019F 92200061  STS	Finish,R2
(0092)  return i;
    01A1 2F04      MOV	R16,R20
    01A2 940E0267  CALL	pop_gset2
    01A4 9508      RET
FILE: C:\DOCUME~1\wpzhao.USTC\MYDOCU~1\我的文档\我的ICC\我的PS2\ps2main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "1602.h"
(0004) #include "KeyCode.h"
(0005) 
(0006) #define uchar unsigned char
(0007) #define uint  unsigned int
(0008) 
(0009) uchar Int_Number=0;               //中断计数器;
(0010) uchar Key_Value=0;             //键盘编码值;
(0011) //extern Finish;
(0012) //extern Key_Up;
(0013) 
(0014) void Init()
(0015) {PORTD = 0x06;
_Init:
    01A5 E086      LDI	R24,6
    01A6 BB82      OUT	0x12,R24
(0016)  DDRD  = 0x00;
    01A7 2422      CLR	R2
    01A8 BA21      OUT	0x11,R2
(0017) // DDRD&=~0x06;             //110b,
(0018)  //PORTD|=0x06;             //110b,PD1,PD2输入,上拉  
(0019)  MCUCR=MCUCR&0xfc;       //INT0低电平中断
    01A9 B785      IN	R24,0x35
    01AA 7F8C      ANDI	R24,0xFC
    01AB BF85      OUT	0x35,R24
(0020)  GICR|=(1<<INT0);       //INT0中断使能
    01AC B78B      IN	R24,0x3B
    01AD 6480      ORI	R24,0x40
    01AE BF8B      OUT	0x3B,R24
(0021)  SEI();
    01AF 9478      BSET	7
(0022)  LCD_Init();
    01B0 DFA8      RCALL	_LCD_Init
    01B1 9508      RET
_main:
  j                    --> R20
  i                    --> R22
    01B2 9722      SBIW	R28,2
(0023) }
(0024) 
(0025) void main()
(0026) {uchar i,j;
(0027)  j=0;
    01B3 2744      CLR	R20
(0028)  Init();
    01B4 DFF0      RCALL	_Init
(0029)  LCD_Write_String(0,1,"Please input");
    01B5 E980      LDI	R24,0x90
    01B6 E090      LDI	R25,0
    01B7 8399      STD	Y+1,R25
    01B8 8388      STD	Y+0,R24
    01B9 E021      LDI	R18,1
    01BA 2700      CLR	R16
    01BB DF87      RCALL	_LCD_Write_String
(0030)  LCD_SetXY(0,2);
    01BC E022      LDI	R18,2
    01BD 2700      CLR	R16
    01BE DF54      RCALL	_LCD_SetXY
    01BF C028      RJMP	0x01E8
(0031)  while(1){
(0032)    if(Finish)                //检测到键盘输入
    01C0 90200061  LDS	R2,Finish
    01C2 2022      TST	R2
    01C3 F121      BEQ	0x01E8
(0033) 	{Finish=0;            //清除检测标志
    01C4 2422      CLR	R2
    01C5 92200061  STS	Finish,R2
(0034) 	 i=Decode(Key_Value);    //键盘译码
    01C7 91000063  LDS	R16,Key_Value
    01C9 DFA4      RCALL	_Decode
    01CA 2F60      MOV	R22,R16
(0035)      if((i>=0)&&(i<=9)){//数字键处理	         
    01CB 3000      CPI	R16,0
    01CC F080      BCS	0x01DD
    01CD E089      LDI	R24,0x9
    01CE 1780      CP	R24,R16
    01CF F068      BCS	0x01DD
(0036) 	    LCD_Write_String(0,1,"Success!     ");
    01D0 E882      LDI	R24,0x82
    01D1 E090      LDI	R25,0
    01D2 8399      STD	Y+1,R25
    01D3 8388      STD	Y+0,R24
    01D4 E021      LDI	R18,1
    01D5 2700      CLR	R16
    01D6 DF6C      RCALL	_LCD_Write_String
(0037) 		LCD_Write_Char(j,2,0x30+i);}     //显示
    01D7 2F86      MOV	R24,R22
    01D8 5D80      SUBI	R24,0xD0
    01D9 8388      STD	Y+0,R24
    01DA E022      LDI	R18,2
    01DB 2F04      MOV	R16,R20
    01DC DF5A      RCALL	_LCD_Write_Char
(0038) 	 j++;
    01DD 9543      INC	R20
(0039) 	 if(j==16) { 
    01DE 3140      CPI	R20,0x10
    01DF F441      BNE	0x01E8
(0040) 	     j=0;LCD_Write_String(0,2,"                             ");}		 
    01E0 2744      CLR	R20
    01E1 E684      LDI	R24,0x64
    01E2 E090      LDI	R25,0
    01E3 8399      STD	Y+1,R25
    01E4 8388      STD	Y+0,R24
    01E5 E022      LDI	R18,2
    01E6 2700      CLR	R16
    01E7 DF5B      RCALL	_LCD_Write_String
    01E8 CFD7      RJMP	0x01C0
    01E9 9622      ADIW	R28,2
    01EA 9508      RET
_Serve1:
    01EB 922A      ST	R2,-Y
    01EC 923A      ST	R3,-Y
    01ED 938A      ST	R24,-Y
    01EE 939A      ST	R25,-Y
    01EF B62F      IN	R2,0x3F
    01F0 922A      ST	R2,-Y
(0041) 	 }}
(0042) }
(0043) 
(0044)  
(0045) 
(0046) 
(0047) #pragma interrupt_handler Serve1:INT0  //2
(0048) void Serve1(void)
(0049) {if(!Key_Up)
    01F1 90200060  LDS	R2,Key_Up
    01F3 2022      TST	R2
    01F4 F549      BNE	0x021E
(0050)   {if ((Int_Number > 0) && (Int_Number < 9))  //接受只有一字节通码字符
    01F5 2422      CLR	R2
    01F6 90300062  LDS	R3,Int_Number
    01F8 1423      CP	R2,R3
    01F9 F470      BCC	0x0208
    01FA 2D83      MOV	R24,R3
    01FB 3089      CPI	R24,0x9
    01FC F458      BCC	0x0208
(0051) 	{Key_Value = Key_Value >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
    01FD 90200063  LDS	R2,Key_Value
    01FF 9426      LSR	R2
    0200 92200063  STS	Key_Value,R2
(0052) 	 if (PIND&0x02) Key_Value = Key_Value|0x80;} //当键盘数据线为1时为1到最高位
    0202 9B81      SBIS	0x10,1
    0203 C004      RJMP	0x0208
    0204 2D82      MOV	R24,R2
    0205 6880      ORI	R24,0x80
    0206 93800063  STS	Key_Value,R24
(0053)   if(Int_Number==10) Finish=1;//收到第10个脉冲表示一字节传送完成
    0208 91800062  LDS	R24,Int_Number
    020A 308A      CPI	R24,0xA
    020B F419      BNE	0x020F
    020C E081      LDI	R24,1
    020D 93800061  STS	Finish,R24
(0054)   if(Int_Number==33) Int_Number=0;//收到第33个脉冲表示按键断码传送完成
    020F 91800062  LDS	R24,Int_Number
    0211 3281      CPI	R24,0x21
    0212 F419      BNE	0x0216
    0213 2422      CLR	R2
    0214 92200062  STS	Int_Number,R2
(0055)   while (!(PIND&0x04)); //等待PS/2CLK拉高
    0216 9B82      SBIS	0x10,2
    0217 CFFE      RJMP	0x0216
(0056)      Int_Number++;}
    0218 91800062  LDS	R24,Int_Number
    021A 5F8F      SUBI	R24,0xFF
    021B 93800062  STS	Int_Number,R24
    021D C02A      RJMP	0x0248
(0057)  else
(0058)   {if ((Int_Number > 0) && (Int_Number < 9)) //接受双字节通码字符
    021E 2422      CLR	R2
    021F 90300062  LDS	R3,Int_Number
    0221 1423      CP	R2,R3
    0222 F470      BCC	0x0231
    0223 2D83      MOV	R24,R3
    0224 3089      CPI	R24,0x9
    0225 F458      BCC	0x0231
(0059) 	{Key_Value = Key_Value >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
    0226 90200063  LDS	R2,Key_Value
    0228 9426      LSR	R2
    0229 92200063  STS	Key_Value,R2
(0060) 	 if (PIND&0x02) Key_Value = Key_Value|0x80;} //当键盘数据线为1时为1到最高位
    022B 9B81      SBIS	0x10,1
    022C C004      RJMP	0x0231
    022D 2D82      MOV	R24,R2
    022E 6880      ORI	R24,0x80
    022F 93800063  STS	Key_Value,R24
(0061)    if(Int_Number==10) Finish=1;
    0231 91800062  LDS	R24,Int_Number
    0233 308A      CPI	R24,0xA
    0234 F419      BNE	0x0238
    0235 E081      LDI	R24,1
    0236 93800061  STS	Finish,R24
(0062)    if(Int_Number==55) {Int_Number=0;Key_Up=0;}
    0238 91800062  LDS	R24,Int_Number
    023A 3387      CPI	R24,0x37
    023B F429      BNE	0x0241
    023C 2422      CLR	R2
    023D 92200062  STS	Int_Number,R2
    023F 92200060  STS	Key_Up,R2
(0063)    while (!(PIND&0x04)); //等待PS/2CLK拉高
    0241 9B82      SBIS	0x10,2
    0242 CFFE      RJMP	0x0241
(0064)      Int_Number++;}	
FILE: <library>
    0243 91800062  LDS	R24,Int_Number
    0245 5F8F      SUBI	R24,0xFF
    0246 93800062  STS	Int_Number,R24
    0248 9029      LD	R2,Y+
    0249 BE2F      OUT	0x3F,R2
    024A 9199      LD	R25,Y+
    024B 9189      LD	R24,Y+
    024C 9039      LD	R3,Y+
    024D 9029      LD	R2,Y+
    024E 9518      RETI
mod8u:
    024F 9468      BSET	6
    0250 C001      RJMP	xdiv8u
div8u:
    0251 94E8      BCLR	6
xdiv8u:
    0252 932A      ST	R18,-Y
    0253 92FA      ST	R15,-Y
    0254 92EA      ST	R14,-Y
    0255 24FF      CLR	R15
    0256 24EE      CLR	R14
    0257 E120      LDI	R18,0x10
    0258 0F00      LSL	R16
    0259 1CFF      ROL	R15
    025A 1CEE      ROL	R14
    025B 16E1      CP	R14,R17
    025C F010      BCS	0x025F
    025D 1AE1      SUB	R14,R17
    025E 9503      INC	R16
    025F 952A      DEC	R18
    0260 F7B9      BNE	0x0258
    0261 F40E      BRTC	0x0263
    0262 2D0E      MOV	R16,R14
    0263 90E9      LD	R14,Y+
    0264 90F9      LD	R15,Y+
    0265 9129      LD	R18,Y+
    0266 9508      RET
pop_gset2:
    0267 E0E2      LDI	R30,2
    0268 940C0279  JMP	pop
pop_gset3:
    026A E0E4      LDI	R30,4
    026B 940C0279  JMP	pop
push_gset5:
    026D 92FA      ST	R15,-Y
    026E 92EA      ST	R14,-Y
push_gset4:
    026F 92DA      ST	R13,-Y
    0270 92CA      ST	R12,-Y
push_gset3:
    0271 92BA      ST	R11,-Y
    0272 92AA      ST	R10,-Y
push_gset2:
    0273 937A      ST	R23,-Y
    0274 936A      ST	R22,-Y
push_gset1:
    0275 935A      ST	R21,-Y
    0276 934A      ST	R20,-Y
    0277 9508      RET
pop_gset1:
    0278 E0E1      LDI	R30,1
pop:
    0279 9149      LD	R20,Y+
    027A 9159      LD	R21,Y+
    027B FDE0      SBRC	R30,0
    027C 9508      RET
    027D 9169      LD	R22,Y+
    027E 9179      LD	R23,Y+
    027F FDE1      SBRC	R30,1
    0280 9508      RET
    0281 90A9      LD	R10,Y+
    0282 90B9      LD	R11,Y+
    0283 FDE2      SBRC	R30,2
    0284 9508      RET
    0285 90C9      LD	R12,Y+
    0286 90D9      LD	R13,Y+
    0287 FDE3      SBRC	R30,3
    0288 9508      RET
    0289 90E9      LD	R14,Y+
    028A 90F9      LD	R15,Y+
    028B 9508      RET

⌨️ 快捷键说明

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