📄 ps2.lst
字号:
__start:
__text_start:
002C E5CF LDI R28,0x5F
002D E0D4 LDI R29,4
002E BFCD OUT 0x3D,R28
002F BFDE OUT 0x3E,R29
0030 51C0 SUBI R28,0x10
0031 40D0 SBCI R29,0
0032 EA0A LDI R16,0xAA
0033 8308 STD Y+0,R16
0034 2400 CLR R0
0035 E6E3 LDI R30,0x63
0036 E0F0 LDI R31,0
0037 E010 LDI R17,0
0038 36E3 CPI R30,0x63
0039 07F1 CPC R31,R17
003A F011 BEQ 0x003D
003B 9201 ST R0,Z+
003C CFFB RJMP 0x0038
003D 8300 STD Z+0,R16
003E E5E4 LDI R30,0x54
003F E0F0 LDI R31,0
0040 E6A0 LDI R26,0x60
0041 E0B0 LDI R27,0
0042 E010 LDI R17,0
0043 35E7 CPI R30,0x57
0044 07F1 CPC R31,R17
0045 F021 BEQ 0x004A
0046 95C8 LPM
0047 9631 ADIW R30,1
0048 920D ST R0,X+
0049 CFF9 RJMP 0x0043
004A 940E00A0 CALL _main
_exit:
004C CFFF RJMP _exit
FILE: E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\ps2\v1.0\ps2_key.c
(0001) /****************************************Copyright (c)**************************************************
(0002) ** ADEmbed Development Co.,LTD.
(0003) ** http://www.adembed.com
(0004) **--------------File Info-------------------------------------------------------------------------------
(0005) ** File name: ps2_key.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)
(0038) #include<iom16v.h>
(0039) #include<macros.h>
(0040)
(0041) #define BAUD 9600
(0042) #define BARR (7372800/(16*BAUD)-1)
(0043)
(0044) volatile unsigned char keycode=0;
(0045) volatile unsigned char step=0;
(0046) volatile char flag=0;
(0047)
(0048)
(0049)
(0050) void port_init(void)
(0051) {
(0052) DDRD = 0Xe7;
_port_init:
004D EE87 LDI R24,0xE7
004E BB81 OUT 0x11,R24
(0053) PORTD = 0XFF;
004F EF8F LDI R24,0xFF
0050 BB82 OUT 0x12,R24
0051 9508 RET
(0054) }
(0055)
(0056) void UART_init( void )
(0057) {
(0058) UBRRH = (unsigned char)(BARR>>8);
_UART_init:
0052 2422 CLR R2
0053 BC20 OUT 0x20,R2
(0059) UBRRL = (unsigned char)BARR;
0054 E28F LDI R24,0x2F
0055 B989 OUT 0x09,R24
(0060) UCSRB = (1<<RXEN)|(1<<TXEN);
0056 E188 LDI R24,0x18
0057 B98A OUT 0x0A,R24
(0061) UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
0058 E886 LDI R24,0x86
0059 BD80 OUT 0x20,R24
005A 9508 RET
(0062) }
(0063)
(0064) void uart_transmit(unsigned char data)
(0065) {
(0066) while(!(UCSRA&(1<<UDRE)));
_uart_transmit:
data --> R16
005B 9B5D SBIS 0x0B,5
005C CFFE RJMP _uart_transmit
(0067)
(0068) UDR = data;
005D B90C OUT 0x0C,R16
005E 9508 RET
_int1_scr:
005F 922A ST R2,-Y
0060 938A ST R24,-Y
0061 939A ST R25,-Y
0062 B62F IN R2,0x3F
0063 922A ST R2,-Y
(0069)
(0070) }
(0071)
(0072)
(0073) #pragma interrupt_handler int1_scr:3
(0074) void int1_scr(void)
(0075) {
(0076) step++;
0064 91800061 LDS R24,step
0066 5F8F SUBI R24,0xFF
0067 93800061 STS step,R24
(0077)
(0078) if(step==1)
0069 91800061 LDS R24,step
006B 3081 CPI R24,1
006C F441 BNE 0x0075
(0079) {
(0080) if((PIND&0X10)==1)
006D B380 IN R24,0x10
006E 7180 ANDI R24,0x10
006F 3081 CPI R24,1
0070 F549 BNE 0x009A
(0081) {
(0082) step = 0;
0071 2422 CLR R2
0072 92200061 STS step,R2
(0083) }
(0084) }
0074 C025 RJMP 0x009A
(0085)
(0086) else if((step>=2)&&(step<=9))
0075 91800061 LDS R24,step
0077 3082 CPI R24,2
0078 F0B8 BCS 0x0090
0079 E089 LDI R24,0x9
007A 90200061 LDS R2,step
007C 1582 CP R24,R2
007D F090 BCS 0x0090
(0087) {
(0088)
(0089) keycode>>=1;
007E 90200060 LDS R2,keycode
0080 9426 LSR R2
0081 92200060 STS keycode,R2
(0090)
(0091) if((PIND&0X10)==0)
0083 9984 SBIC 0x10,4
0084 C005 RJMP 0x008A
(0092) {
(0093) keycode|=0x00;
0085 90200060 LDS R2,keycode
0087 92200060 STS keycode,R2
(0094) }
0089 C010 RJMP 0x009A
(0095) else
(0096) {
(0097) keycode|=0x80;
008A 91800060 LDS R24,keycode
008C 6880 ORI R24,0x80
008D 93800060 STS keycode,R24
(0098) }
(0099)
(0100) }
008F C00A RJMP 0x009A
(0101) else if(step == 11)
0090 91800061 LDS R24,step
0092 308B CPI R24,0xB
0093 F431 BNE 0x009A
(0102) {
(0103) flag = 1;
0094 E081 LDI R24,1
0095 93800062 STS flag,R24
(0104) step = 0;
0097 2422 CLR R2
0098 92200061 STS step,R2
(0105)
(0106) }
009A 9029 LD R2,Y+
009B BE2F OUT 0x3F,R2
009C 9199 LD R25,Y+
009D 9189 LD R24,Y+
009E 9029 LD R2,Y+
009F 9518 RETI
(0107)
(0108)
(0109) }
(0110)
(0111) void main(void)
(0112) {
(0113)
(0114) CLI(); //disable all interrupts
_main:
00A0 94F8 BCLR 7
(0115) port_init();
00A1 DFAB RCALL _port_init
(0116) UART_init();
00A2 DFAF RCALL _UART_init
(0117) MCUCR = 0x08;
00A3 E088 LDI R24,0x8
00A4 BF85 OUT 0x35,R24
(0118) GICR = 0x80;
00A5 E880 LDI R24,0x80
00A6 BF8B OUT 0x3B,R24
(0119) SEI();
00A7 9478 BSET 7
00A8 C00C RJMP 0x00B5
(0120)
(0121) while(1)
(0122) {
(0123) if(flag ==1)
00A9 91800062 LDS R24,flag
00AB 3081 CPI R24,1
00AC F441 BNE 0x00B5
(0124) {
(0125) uart_transmit(keycode);
00AD 91000060 LDS R16,keycode
00AF DFAB RCALL _uart_transmit
(0126)
(0127) keycode = 0;
00B0 2422 CLR R2
00B1 92200060 STS keycode,R2
(0128)
(0129) flag = 0;
FILE: <library>
00B3 92200062 STS flag,R2
00B5 CFF3 RJMP 0x00A9
00B6 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -