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

📄 ps2kb_uart.lst

📁 meg16 的所有功能实例
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    00DE E5CF      LDI	R28,0x5F
    00DF E0D4      LDI	R29,4
    00E0 BFCD      OUT	0x3D,R28
    00E1 BFDE      OUT	0x3E,R29
    00E2 51C0      SUBI	R28,0x10
    00E3 40D0      SBCI	R29,0
    00E4 EA0A      LDI	R16,0xAA
    00E5 8308      STD	Y+0,R16
    00E6 2400      CLR	R0
    00E7 EDEB      LDI	R30,0xDB
    00E8 E0F0      LDI	R31,0
    00E9 E010      LDI	R17,0
    00EA 3DEB      CPI	R30,0xDB
    00EB 07F1      CPC	R31,R17
    00EC F011      BEQ	0x00EF
    00ED 9201      ST	R0,Z+
    00EE CFFB      RJMP	0x00EA
    00EF 8300      STD	Z+0,R16
    00F0 E4E0      LDI	R30,0x40
    00F1 E0F1      LDI	R31,1
    00F2 E6A0      LDI	R26,0x60
    00F3 E0B0      LDI	R27,0
    00F4 E011      LDI	R17,1
    00F5 3BEB      CPI	R30,0xBB
    00F6 07F1      CPC	R31,R17
    00F7 F021      BEQ	0x00FC
    00F8 95C8      LPM
    00F9 9631      ADIW	R30,1
    00FA 920D      ST	R0,X+
    00FB CFF9      RJMP	0x00F5
    00FC 940E01F4  CALL	_main
_exit:
    00FE CFFF      RJMP	_exit
FILE: E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\ps2\v1.2\PS2KB_UART\PS2KB_UART.c
(0001) /****************************************Copyright (c)**************************************************
(0002) **                               ADEmbed Development Co.,LTD.                                    
(0003) **                                 http://www.adembed.com
(0004) **--------------File Info-------------------------------------------------------------------------------
(0005) ** File name:			ps2KB_UART.c
(0006) ** Last modified Date:  2008-12-13
(0007) ** Last Version:		1.0
(0008) ** Descriptions:		ps2 test.
(0009) ** 
(0010) **------------------------------------------------------------------------------------------------------
(0011) ** Created by:			junbolu
(0012) ** Created date:		2008-12-13
(0013) ** Version:				1.0
(0014) ** Descriptions:		
(0015) **
(0016) **------------------------------------------------------------------------------------------------------
(0017) ** Modified by:
(0018) ** Modified date:
(0019) ** Version:
(0020) ** Descriptions:
(0021) **
(0022) **------------------------------------------------------------------------------------------------------
(0023) **ICC-AVR application builder : 2008-12-13
(0024) **Target : M16
(0025) **Crystal: 7.3728Mhz
(0026) **SCK   ----  INT1
(0027) **DATA  ----  PD3  
(0028) **描述:读取PS2键盘编码,并且解码以后发送到串口显示。
(0029) **      
(0030) **
(0031) **涉及知识点:
(0032) **          
(0033) **          
(0034) **          
(0035) *******************************************************************************************************/
(0036) 
(0037) #include<iom16v.h>
(0038) #include<macros.h>
(0039) #include "scancodes.h"
(0040) 
(0041) #define BAUD  9600
(0042) #define BARR  (7372800/(16*BAUD)-1)
(0043) 
(0044) 
(0045) volatile unsigned char keycode=0;
(0046) volatile unsigned char step=0;
(0047) volatile char flag=0;
(0048) 
(0049) static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
(0050) static unsigned char BF = 0; //标识是否有字符被收到
(0051) 
(0052) void port_init(void)
(0053) {
(0054) 	DDRD =  0Xe7;
_port_init:
    00FF EE87      LDI	R24,0xE7
    0100 BB81      OUT	0x11,R24
(0055)     PORTD = 0XFF;
    0101 EF8F      LDI	R24,0xFF
    0102 BB82      OUT	0x12,R24
    0103 9508      RET
(0056) 
(0057) }
(0058) 
(0059) void UART_init( void )
(0060) {
(0061) 	UBRRH = (unsigned char)(BARR>>8);
_UART_init:
    0104 2422      CLR	R2
    0105 BC20      OUT	0x20,R2
(0062) 	UBRRL = (unsigned char)BARR;
    0106 E28F      LDI	R24,0x2F
    0107 B989      OUT	0x09,R24
(0063) 	UCSRB = (1<<RXEN)|(1<<TXEN);
    0108 E188      LDI	R24,0x18
    0109 B98A      OUT	0x0A,R24
(0064) 	UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);       
    010A E886      LDI	R24,0x86
    010B BD80      OUT	0x20,R24
    010C 9508      RET
(0065) }
(0066) 
(0067) void uart_transmit(unsigned char data)
(0068) {
(0069) 	while(!(UCSRA&(1<<UDRE)));
_uart_transmit:
  data                 --> R16
    010D 9B5D      SBIS	0x0B,5
    010E CFFE      RJMP	_uart_transmit
(0070) 	
(0071) 	UDR = data;
    010F B90C      OUT	0x0C,R16
    0110 9508      RET
_uart_trans_str:
  s                    --> R20
    0111 940E0238  CALL	push_gset1
    0113 01A8      MOVW	R20,R16
(0072) }
(0073) 
(0074) void uart_trans_str(unsigned char *s)
(0075) {
    0114 C005      RJMP	0x011A
(0076)  	while(*s)
(0077) 	{
(0078) 	 uart_transmit(*s);
    0115 01FA      MOVW	R30,R20
    0116 8100      LDD	R16,Z+0
    0117 DFF5      RCALL	_uart_transmit
(0079) 	 s++;
    0118 5F4F      SUBI	R20,0xFF
    0119 4F5F      SBCI	R21,0xFF
    011A 01FA      MOVW	R30,R20
    011B 8020      LDD	R2,Z+0
    011C 2022      TST	R2
    011D F7B9      BNE	0x0115
    011E 940E023B  CALL	pop_gset1
    0120 9508      RET
_int1_scr:
    0121 922A      ST	R2,-Y
    0122 938A      ST	R24,-Y
    0123 939A      ST	R25,-Y
    0124 B62F      IN	R2,0x3F
    0125 922A      ST	R2,-Y
(0080) 	}
(0081) }
(0082) #pragma interrupt_handler int1_scr:3
(0083) void int1_scr(void)
(0084) {
(0085) 	step++;
    0126 91800061  LDS	R24,step
    0128 5F8F      SUBI	R24,0xFF
    0129 93800061  STS	step,R24
(0086) 	
(0087) 	if(step==1)
    012B 91800061  LDS	R24,step
    012D 3081      CPI	R24,1
    012E F441      BNE	0x0137
(0088) 	{
(0089) 		if((PIND&0X10)==1)
    012F B380      IN	R24,0x10
    0130 7180      ANDI	R24,0x10
    0131 3081      CPI	R24,1
    0132 F549      BNE	0x015C
(0090) 		{
(0091) 			step = 0;
    0133 2422      CLR	R2
    0134 92200061  STS	step,R2
(0092) 		}
(0093) 	}
    0136 C025      RJMP	0x015C
(0094) 	else if((step>=2)&&(step<=9))
    0137 91800061  LDS	R24,step
    0139 3082      CPI	R24,2
    013A F0B8      BCS	0x0152
    013B E089      LDI	R24,0x9
    013C 90200061  LDS	R2,step
    013E 1582      CP	R24,R2
    013F F090      BCS	0x0152
(0095) 	{	
(0096) 		keycode>>=1;
    0140 90200060  LDS	R2,keycode
    0142 9426      LSR	R2
    0143 92200060  STS	keycode,R2
(0097) 		
(0098) 		if((PIND&0X10)==0)
    0145 9984      SBIC	0x10,4
    0146 C005      RJMP	0x014C
(0099) 		{
(0100) 			keycode|=0x00;
    0147 90200060  LDS	R2,keycode
    0149 92200060  STS	keycode,R2
(0101) 		}
    014B C010      RJMP	0x015C
(0102) 		else 
(0103) 		{
(0104) 			keycode|=0x80;
    014C 91800060  LDS	R24,keycode
    014E 6880      ORI	R24,0x80
    014F 93800060  STS	keycode,R24
(0105) 		}	   
(0106) 	}
    0151 C00A      RJMP	0x015C
(0107) 	else if(step == 11)
    0152 91800061  LDS	R24,step
    0154 308B      CPI	R24,0xB
    0155 F431      BNE	0x015C
(0108) 	{
(0109) 		flag = 1;
    0156 E081      LDI	R24,1
    0157 93800062  STS	flag,R24
(0110) 		step = 0;
    0159 2422      CLR	R2
    015A 92200061  STS	step,R2
(0111) 	}
    015C 9029      LD	R2,Y+
    015D BE2F      OUT	0x3F,R2
    015E 9199      LD	R25,Y+
    015F 9189      LD	R24,Y+
    0160 9029      LD	R2,Y+
    0161 9518      RETI
_Decode:
  TempCyc              --> R22
  ScanCode             --> R20
    0162 940E0236  CALL	push_gset2
    0164 2F40      MOV	R20,R16
(0112) }
(0113) 
(0114) void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
(0115) {
(0116) 	unsigned char TempCyc;	
(0117) 
(0118) 	if (!Key_UP)                //当键盘松开时
    0165 90200063  LDS	R2,Key_UP
    0167 2022      TST	R2
    0168 F009      BEQ	0x016A
    0169 C06C      RJMP	0x01D6
(0119) 		{
(0120) 			switch (ScanCode)
    016A 2F64      MOV	R22,R20
    016B 2777      CLR	R23
    016C 3569      CPI	R22,0x59
    016D E0E0      LDI	R30,0
    016E 077E      CPC	R23,R30
    016F F0B9      BEQ	0x0187
    0170 E589      LDI	R24,0x59
    0171 E090      LDI	R25,0
    0172 1786      CP	R24,R22
    0173 0797      CPC	R25,R23
    0174 F02C      BLT	0x017A
    0175 3162      CPI	R22,0x12
    0176 E0E0      LDI	R30,0
    0177 077E      CPC	R23,R30
    0178 F051      BEQ	0x0183
    0179 C011      RJMP	0x018B
    017A 3F60      CPI	R22,0xF0
    017B E0E0      LDI	R30,0
    017C 077E      CPC	R23,R30
    017D F009      BEQ	0x017F
    017E C00C      RJMP	0x018B
(0121) 				{
(0122) 					case 0xF0 :	// 当收到0xF0,Key_UP置1表示断码开始
(0123) 						Key_UP = 1;
    017F E081      LDI	R24,1
    0180 93800063  STS	Key_UP,R24
(0124) 					break;

⌨️ 快捷键说明

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