📄 ps2_kb.lst
字号:
__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 + -