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

📄 ps2_kb.lst

📁 PS2_KEYBOARD for AVR
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    00CB E5CF      LDI	R28,0x5F
    00CC E0D4      LDI	R29,4
    00CD BFCD      OUT	P3D,R28
    00CE BFDE      OUT	P3E,R29
    00CF 51C0      SUBI	R28,0x10
    00D0 40D0      SBCI	R29,0
    00D1 EA0A      LDI	R16,0xAA
    00D2 8308      STD	R16,0+Y
    00D3 2400      CLR	R0
    00D4 EBEF      LDI	R30,0xBF
    00D5 E0F0      LDI	R31,0
    00D6 E011      LDI	R17,1
    00D7 30E4      CPI	R30,4
    00D8 07F1      CPC	R31,R17
    00D9 F011      BEQ	0x00DC
    00DA 9201      ST	R0,Z+
    00DB CFFB      RJMP	0x00D7
    00DC 8300      STD	R16,0+Z
    00DD E3E6      LDI	R30,0x36
    00DE E0F1      LDI	R31,1
    00DF E6A0      LDI	R26,0x60
    00E0 E0B0      LDI	R27,0
    00E1 E011      LDI	R17,1
    00E2 39E5      CPI	R30,0x95
    00E3 07F1      CPC	R31,R17
    00E4 F021      BEQ	0x00E9
    00E5 95C8      LPM
    00E6 9631      ADIW	R30,1
    00E7 920D      ST	R0,X+
    00E8 CFF9      RJMP	0x00E2
    00E9 D034      RCALL	_main
_exit:
    00EA CFFF      RJMP	_exit
FILE: C:\mega8\PS2_KEYBOARD\uart.c
(0001) /******************************************/
(0002) /*           广州天河双龙电子公司         */
(0003) /*           http://www.sl.com.cn         */
(0004) /*              PS2键盘演示程序           */
(0005) /*            作者:ntzwq@wx88.net         */
(0006) /*               2002年5月10日            */
(0007) /*  目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
(0008) /******************************************/
(0009) //  1、使用ICCAVR的终端调试窗口(Terminal),进行调试。
(0010) //  2、对ICCAVR的终端调试窗口进行设置,设置串口为com1或com2,
(0011) //     通信波特率为19200(Tools->Environment Options...)。
(0012) //  3、将PS2键盘插入SL-MEGA8开发板的PS2键盘插座。 
(0013) #include <iom8v.h>
(0014) #define fosc 8000000 //晶振8MHZ
(0015) #define baud 19200	 //波特率
(0016) extern unsigned char read_flash(unsigned int add);
(0017) extern void init_kb(void);
(0018) /*  		字符输出函数 		 */
(0019) void putchar(unsigned char c)
(0020) 	{	 
(0021)      while (!(UCSRA&(1<<UDRE)));
_putchar:
  c                    --> R16
    00EB 9B5D      SBIS	P0B,5
    00EC CFFE      RJMP	_putchar
(0022) 	 UDR=c;    
    00ED B90C      OUT	P0C,R16
(0023) 	}	
    00EE 9508      RET
_puts:
  s                    --> R20
    00EF D1A7      RCALL	push_gset1
    00F0 01A8      MOVW	R20,R16
(0024) extern unsigned char getchar(void);	
(0025) /*			字符串输出函数	   	 */	
(0026) int puts(char *s)
(0027) 	{
    00F1 C005      RJMP	0x00F7
(0028) 	while (*s)
(0029) 		{
(0030) 		putchar(*s);
    00F2 01FA      MOVW	R30,R20
    00F3 8100      LDD	R16,0+Z
    00F4 DFF6      RCALL	_putchar
(0031) 		s++;
    00F5 5F4F      SUBI	R20,0xFF
    00F6 4F5F      SBCI	R21,0xFF
    00F7 01FA      MOVW	R30,R20
    00F8 8020      LDD	R2,0+Z
    00F9 2022      TST	R2
    00FA F7B9      BNE	0x00F2
(0032) 		}	
(0033)     putchar(0x0a);//回车换行
    00FB E00A      LDI	R16,0xA
    00FC DFEE      RCALL	_putchar
(0034) 	putchar(0x0d);
    00FD E00D      LDI	R16,0xD
    00FE DFEC      RCALL	_putchar
(0035) 	return 1;
    00FF E001      LDI	R16,1
    0100 E010      LDI	R17,0
    0101 D198      RCALL	pop_gset1
    0102 9508      RET
_putstr:
  s                    --> R20
    0103 D193      RCALL	push_gset1
    0104 01A8      MOVW	R20,R16
(0036) 	}
(0037) /*	 	   不含回车换行的字符串输出函数 	 */	
(0038) void putstr(char *s)
(0039) 	{
    0105 C005      RJMP	0x010B
(0040) 	while (*s)
(0041) 		{
(0042) 		putchar(*s);
    0106 01FA      MOVW	R30,R20
    0107 8100      LDD	R16,0+Z
    0108 DFE2      RCALL	_putchar
(0043) 		s++;
    0109 5F4F      SUBI	R20,0xFF
    010A 4F5F      SBCI	R21,0xFF
    010B 01FA      MOVW	R30,R20
    010C 8020      LDD	R2,0+Z
    010D 2022      TST	R2
    010E F7B9      BNE	0x0106
(0044) 		}	
(0045) 	}	
    010F D18A      RCALL	pop_gset1
    0110 9508      RET
(0046) /*			UART初始化				*/	
(0047) void uart_init(void)
(0048) {
(0049)  OSCCAL=read_flash(0x1f20);
_uart_init:
    0111 E200      LDI	R16,0x20
    0112 E11F      LDI	R17,0x1F
    0113 D150      RCALL	_read_flash
    0114 BF01      OUT	P31,R16
(0050)  UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
    0115 E188      LDI	R24,0x18
    0116 B98A      OUT	P0A,R24
(0051)  UBRRL=(fosc/16/(baud+1))%256;
    0117 E18A      LDI	R24,0x1A
    0118 B989      OUT	P09,R24
(0052)  UBRRH=(fosc/16/(baud+1))/256;
    0119 2422      CLR	R2
    011A BC20      OUT	P20,R2
(0053)  UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
    011B E886      LDI	R24,0x86
    011C BD80      OUT	P20,R24
(0054) }
    011D 9508      RET
(0055) /*			RS232通信main函数		*/
(0056) void main(void)
(0057) {
(0058)  unsigned char i; 
(0059)  init_kb();
_main:
  i                    --> R20
    011E D05B      RCALL	_init_kb
(0060)  uart_init();
    011F DFF1      RCALL	_uart_init
(0061)  puts("广州天河双龙电子公司PS2键盘演示程序");
    0120 E909      LDI	R16,0x99
    0121 E010      LDI	R17,0
    0122 DFCC      RCALL	_puts
(0062)  puts("HTTP://WWW.SL.COM.CN");
    0123 E804      LDI	R16,0x84
    0124 E010      LDI	R17,0
    0125 DFC9      RCALL	_puts
(0063)  puts("MAIL TO:sllg@sl.com.cn");
    0126 E60D      LDI	R16,0x6D
    0127 E010      LDI	R17,0
    0128 DFC6      RCALL	_puts
(0064)  putchar(0x0a);
    0129 E00A      LDI	R16,0xA
    012A DFC0      RCALL	_putchar
(0065)  putchar(0x0d);//换行 
    012B E00D      LDI	R16,0xD
    012C DFBE      RCALL	_putchar
    012D C01A      RJMP	0x0148
(0066)  while(1)
(0067)     {
(0068) 	 i=getchar();
    012E D02F      RCALL	_getchar
    012F 2F40      MOV	R20,R16
(0069) 	 if (i!=0)//按PC键盘开始测试
    0130 2300      TST	R16
    0131 F0B1      BEQ	0x0148
(0070) 	   {
(0071) 	    putstr("当前按键是:");
    0132 E600      LDI	R16,0x60
    0133 E010      LDI	R17,0
    0134 DFCE      RCALL	_putstr
(0072) 		putchar(i);
    0135 2F04      MOV	R16,R20
    0136 DFB4      RCALL	_putchar
(0073) 		putchar(0x0a);
    0137 E00A      LDI	R16,0xA
    0138 DFB2      RCALL	_putchar
(0074) 		putchar(0x0d);
    0139 E00D      LDI	R16,0xD
    013A DFB0      RCALL	_putchar
(0075) 	    puts("广州天河双龙电子公司PS2键盘演示程序");
    013B E909      LDI	R16,0x99
    013C E010      LDI	R17,0
    013D DFB1      RCALL	_puts
(0076)  		puts("HTTP://WWW.SL.COM.CN");
    013E E804      LDI	R16,0x84
    013F E010      LDI	R17,0
    0140 DFAE      RCALL	_puts
(0077)   		puts("MAIL TO:sllg@sl.com.cn");
    0141 E60D      LDI	R16,0x6D
    0142 E010      LDI	R17,0
    0143 DFAB      RCALL	_puts
(0078) 		putchar(0x0a);
    0144 E00A      LDI	R16,0xA
    0145 DFA5      RCALL	_putchar
(0079) 		putchar(0x0d); 
    0146 E00D      LDI	R16,0xD
    0147 DFA3      RCALL	_putchar
    0148 CFE5      RJMP	0x012E
(0080) 	   }	 
(0081) 	}
(0082) }    0149 9508      RET
FILE: C:\mega8\PS2_KEYBOARD\keyboard.c
(0001) /******************************************/
(0002) /*           广州天河双龙电子公司         */
(0003) /*           http://www.sl.com.cn         */
(0004) /*              PS2键盘驱动程序           */
(0005) /*            作者:ntzwq@wx88.net         */
(0006) /*               2002年5月11日            */
(0007) /*  目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
(0008) /******************************************/
(0009) #include <iom8v.h>
(0010) #include "pindefs.h"
(0011) #include "scancodes.h"
(0012) #include <macros.h>
(0013) #define BUFF_SIZE 64
(0014) unsigned char bitcount;  
(0015) unsigned char kb_buffer[BUFF_SIZE];
(0016) unsigned char input=0;
(0017) unsigned char output=0;
(0018) void put_kbbuff(unsigned char c)
(0019)  {
(0020)   kb_buffer[input]=c;
_put_kbbuff:
  c                    --> R16
    014A EC83      LDI	R24,0xC3
    014B E090      LDI	R25,0
    014C 91E000BD  LDS	R30,0xBD
    014E 27FF      CLR	R31
    014F 0FE8      ADD	R30,R24
    0150 1FF9      ADC	R31,R25
    0151 8300      STD	R16,0+Z
(0021)   if (input<(BUFF_SIZE-1))
    0152 918000BD  LDS	R24,0xBD
    0154 338F      CPI	R24,0x3F
    0155 F420      BCC	0x015A
(0022)      input++; 
    0156 5F8F      SUBI	R24,0xFF
    0157 938000BD  STS	R24,0xBD
    0159 C003      RJMP	0x015D
(0023)   else
(0024)      input=0;	 
    015A 2422      CLR	R2
    015B 922000BD  STS	R2,0xBD
(0025)  }
    015D 9508      RET
(0026) unsigned char getchar(void)
(0027)   {
(0028)    unsigned char temp;
(0029)    if(output==input)
_getchar:
  temp                 --> R16
    015E 902000BD  LDS	R2,0xBD
    0160 903000BE  LDS	R3,0xBE
    0162 1432      CP	R3,R2
    0163 F411      BNE	0x0166
(0030)        return 0;
    0164 2700      CLR	R16
    0165 C013      RJMP	0x0179
(0031)    else
(0032)       {
(0033) 	   temp=kb_buffer[output];
    0166 EC83      LDI	R24,0xC3
    0167 E090      LDI	R25,0
    0168 91E000BE  LDS	R30,0xBE
    016A 27FF      CLR	R31
    016B 0FE8      ADD	R30,R24
    016C 1FF9      ADC	R31,R25
    016D 8100      LDD	R16,0+Z
(0034) 	   if(output<(BUFF_SIZE-1))
    016E 918000BE  LDS	R24,0xBE
    0170 338F      CPI	R24,0x3F
    0171 F420      BCC	0x0176
(0035) 	     {
(0036) 		  output++;
    0172 5F8F      SUBI	R24,0xFF
    0173 938000BE  STS	R24,0xBE
(0037) 		 }
    0175 C003      RJMP	0x0179
(0038) 	   else
(0039) 	     output=0;
    0176 2422      CLR	R2
    0177 922000BE  STS	R2,0xBE
(0040) 	   return temp;	  
    0179 9508      RET
(0041) 	  }	     
(0042)   }
(0043) void init_kb(void)
(0044)     {
(0045) 	 PIN_DIR&=~((1<<CLOCK)|(1<<DATAPIN));
_init_kb:
    017A B381      IN	R24,P11
    017B 7F83      ANDI	R24,0xF3
    017C BB81      OUT	P11,R24
(0046) 	 PORT_KB|=(1<<CLOCK)|(1<<DATAPIN);
    017D B382      IN	R24,P12
    017E 608C      ORI	R24,0xC
    017F BB82      OUT	P12,R24
(0047) 	 MCUCR = 0x08; 	
    0180 E088      LDI	R24,0x8
    0181 BF85      OUT	P35,R24
(0048)      GICR  = 0x80;
    0182 E880      LDI	R24,0x80
    0183 BF8B      OUT	P3B,R24
(0049)      SEI();
    0184 9478      BSET	7
(0050)      bitcount = 11;
    0185 E08B      LDI	R24,0xB
    0186 93800103  STS	R24,_bitcount
(0051)     }
    0188 9508      RET
_decode:
  i                    --> R20
  sc                   --> R22
    0189 D127      RCALL	push_gset3
    018A 2F60      MOV	R22,R16
(0052) void decode(unsigned char sc)
(0053)     {
(0054)       static unsigned char shift,up,shiftup;
(0055) 	  unsigned char i;
(0056) 	  if (sc==0xf0)
    018B 3F60      CPI	R22,0xF0
    018C F421      BNE	0x0191
(0057) 	      {
(0058) 		   up=1;
    018D E081      LDI	R24,1
    018E 938000C0  STS	R24,0xC0
(0059) 		   return;
    0190 C087      RJMP	0x0218
(0060) 		  }
(0061) 	  if (up==1)
    0191 918000C0  LDS	R24,0xC0
    0193 3081      CPI	R24,1
    0194 F4F1      BNE	0x01B3
(0062) 	  	  {

⌨️ 快捷键说明

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