?? ps2kb_uart.lst
字號:
__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 + -