?? pc_8515.lst
字號:
__start:
__text_start:
009E E5CF LDI R28,0x5F
009F E0D2 LDI R29,2
00A0 BFCD OUT P3D,R28
00A1 BFDE OUT P3E,R29
00A2 51C0 SUBI R28,0x10
00A3 40D0 SBCI R29,0
00A4 EA0A LDI R16,0xAA
00A5 8308 STD R16,0+Y
00A6 2400 CLR R0
00A7 E7E1 LDI R30,0x71
00A8 E0F0 LDI R31,0
00A9 E010 LDI R17,0
00AA 3BE8 CPI R30,0xB8
00AB 07F1 CPC R31,R17
00AC F011 BEQ 0x00AF
00AD 9201 ST R0,Z+
00AE CFFB RJMP 0x00AA
00AF 8300 STD R16,0+Z
00B0 E2EA LDI R30,0x2A
00B1 E0F1 LDI R31,1
00B2 E6A0 LDI R26,0x60
00B3 E0B0 LDI R27,0
00B4 E011 LDI R17,1
00B5 33EB CPI R30,0x3B
00B6 07F1 CPC R31,R17
00B7 F021 BEQ 0x00BC
00B8 95C8 LPM
00B9 9631 ADIW R30,1
00BA 920D ST R0,X+
00BB CFF9 RJMP 0x00B5
00BC D00C RCALL _main
_exit:
00BD CFFF RJMP _exit
FILE: D:\ICC-AVR\examples.sl\pc_8515\pc_8515.c
(0001) /*******************************************/
(0002) /* PC機鍵盤演示程序 */
(0003) /* 廣州雙龍電子有限公司 */
(0004) /* http://www.sl.com.cn */
(0005) /* 作者:詹衛(wèi)前 */
(0006) /* MCU:AT90S8515 晶振:8MHZ */
(0007) /* 使用ICCAVR的終端調(diào)試窗口觀察PC鍵盤數(shù)據(jù) */
(0008) /* 連線說明:SL-AVR+ */
(0009) /* 1、PC鍵盤clock--PD.2 */
(0010) /* 2、PC鍵盤data---PD.3 */
(0011) /* 3、D232.T-------PD.1 */
(0012) /* 4、D232.R-------PD.0 */
(0013) /*******************************************/
(0014) #include<io8515.h>
(0015) #include<stdio.h>
(0016) extern unsigned char get_char(void);
(0017) extern void init_kb(void);
(0018) //UART初始化
(0019) void uart0_init(void)
(0020) {
(0021) UCR = 0x00;
_uart0_init:
00BE 2422 CLR R2
00BF B82A OUT P0A,R2
(0022) UBRR = 0x19;//BAUD=19200
00C0 E189 LDI R24,0x19
00C1 B989 OUT P09,R24
(0023) UCR|=(1<<TXEN) ;//使能發(fā)送
00C2 9A53 SBI P0A,3
(0024) }
00C3 9508 RET
(0025) //端口初始化
(0026) void port_init(void)
(0027) {
(0028) DDRD=0x02;
_port_init:
00C4 E082 LDI R24,2
00C5 BB81 OUT P11,R24
(0029) PORTD=0xff;
00C6 EF8F LDI R24,0xFF
00C7 BB82 OUT P12,R24
(0030) }
00C8 9508 RET
(0031) //PC鍵盤演示程序,SHIFT鍵和按鍵同時按下時為大寫
(0032) void main(void)
(0033) {
(0034) unsigned char key;
(0035) port_init();
_main:
key --> R20
00C9 DFFA RCALL _port_init
(0036) uart0_init();
00CA DFF3 RCALL _uart0_init
(0037) init_kb();
00CB D045 RCALL _init_kb
(0038) puts("PC鍵盤演示程序");
00CC E600 LDI R16,0x60
00CD E010 LDI R17,0
00CE D15E RCALL _puts
(0039) putchar(0x0d);
00CF E00D LDI R16,0xD
00D0 D147 RCALL _putchar
00D1 C00D RJMP 0x00DF
(0040) while(1)
(0041) {
(0042) key=get_char();
00D2 D022 RCALL _get_char
00D3 2F40 MOV R20,R16
(0043) if(key!=0)
00D4 2300 TST R16
00D5 F049 BEQ 0x00DF
(0044) {
(0045) if (key==0x0d)//回車鍵處理
00D6 300D CPI R16,0xD
00D7 F429 BNE 0x00DD
(0046) {
(0047) putchar('\n');
00D8 E00A LDI R16,0xA
00D9 D13E RCALL _putchar
(0048) putchar(key);
00DA 2F04 MOV R16,R20
00DB D13C RCALL _putchar
(0049) }
00DC C002 RJMP 0x00DF
(0050) else
(0051) putchar(key);
00DD 2F04 MOV R16,R20
00DE D139 RCALL _putchar
(0052) }
(0053) }
00DF CFF2 RJMP 0x00D2
(0054) }
00E0 9508 RET
FILE: D:\ICC-AVR\examples.sl\pc_8515\kbc.c
(0001) #include <io8515.h>
(0002) #include <macros.h>
(0003) #include "pindefs.h"
(0004) #include "scancodes.h"
(0005) #define BUFF_SIZE 64
(0006) //const ascii[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,
(0007) // 0x39,0x41,0x42,0x43,0x44,0x45,0x46};
(0008) unsigned char bitcount;//PC鍵盤數(shù)據(jù)長度計數(shù)
(0009) unsigned char kb_buffer[BUFF_SIZE];//鍵盤緩沖區(qū)
(0010) unsigned char input=0;//緩沖區(qū)讀指針
(0011) unsigned char output=0;//緩沖區(qū)寫指針
(0012) //送鍵盤按鍵ASCII碼到鍵盤緩沖區(qū)
(0013) void put_kbbuff(unsigned char c)
(0014) {
(0015) kb_buffer[input]=c;
_put_kbbuff:
c --> R16
00E1 E785 LDI R24,0x75
00E2 E090 LDI R25,0
00E3 91E0006F LDS R30,0x6F
00E5 27FF CLR R31
00E6 0FE8 ADD R30,R24
00E7 1FF9 ADC R31,R25
00E8 8300 STD R16,0+Z
(0016) if (input<(BUFF_SIZE-1))
00E9 9180006F LDS R24,0x6F
00EB 338F CPI R24,0x3F
00EC F420 BCC 0x00F1
(0017) input++;
00ED 5F8F SUBI R24,0xFF
00EE 9380006F STS R24,0x6F
00F0 C003 RJMP 0x00F4
(0018) else
(0019) input=0;
00F1 2422 CLR R2
00F2 9220006F STS R2,0x6F
(0020) }
00F4 9508 RET
(0021) //從鍵盤緩沖區(qū)讀取按鍵的ASCII碼
(0022) unsigned char get_char(void)
(0023) {
(0024) unsigned char temp;
(0025) if(output==input)
_get_char:
temp --> R16
00F5 9020006F LDS R2,0x6F
00F7 90300070 LDS R3,0x70
00F9 1432 CP R3,R2
00FA F411 BNE 0x00FD
(0026) return 0;
00FB 2700 CLR R16
00FC C013 RJMP 0x0110
(0027) else
(0028) {
(0029) temp=kb_buffer[output];
00FD E785 LDI R24,0x75
00FE E090 LDI R25,0
00FF 91E00070 LDS R30,0x70
0101 27FF CLR R31
0102 0FE8 ADD R30,R24
0103 1FF9 ADC R31,R25
0104 8100 LDD R16,0+Z
(0030) if(output<(BUFF_SIZE-1))
0105 91800070 LDS R24,0x70
0107 338F CPI R24,0x3F
0108 F420 BCC 0x010D
(0031) {
(0032) output++;
0109 5F8F SUBI R24,0xFF
010A 93800070 STS R24,0x70
(0033) }
010C C003 RJMP 0x0110
(0034) else
(0035) output=0;
010D 2422 CLR R2
010E 92200070 STS R2,0x70
(0036) return temp;
0110 9508 RET
(0037) }
(0038) }
(0039) //為運行讀取PC鍵盤程序進行初始化
(0040) void init_kb(void)
(0041) {
(0042) MCUCR=0x02;//設置8515的INT0為下降沿觸發(fā)中斷
_init_kb:
0111 E082 LDI R24,2
0112 BF85 OUT P35,R24
(0043) GIMSK|=(1<<INT0);//使能INT0中斷
0113 B78B IN R24,P3B
0114 6480 ORI R24,0x40
0115 BF8B OUT P3B,R24
(0044) SEI(); //開中斷
0116 9478 BSET 7
(0045) bitcount = 11;
0117 E08B LDI R24,0xB
0118 938000B5 STS R24,_bitcount
(0046) }
011A 9508 RET
_decode:
i --> R20
sc --> R22
011B D0F7 RCALL push_gset3
011C 2F60 MOV R22,R16
(0047) //對PC鍵盤的掃描碼進行解碼
(0048) void decode(unsigned char sc)
(0049) {
(0050) static unsigned char shift,up,shiftup;
(0051) unsigned char i;
(0052) if (sc==0xf0)//按鍵釋放
011D 3F60 CPI R22,0xF0
011E F421 BNE 0x0123
(0053) {
(0054) up=1;
011F E081 LDI R24,1
0120 93800072 STS R24,0x72
(0055) return;
0122 C06C RJMP 0x018F
(0056) }
(0057) if (up==1)//SHIF鍵開關
0123 91800072 LDS R24,0x72
0125 3081 CPI R24,1
0126 F501 BNE 0x0147
(0058) {
(0059) up=0;
0127 2422 CLR R2
0128 92200072 STS R2,0x72
(0060) if ((sc==0x12)|(sc==0x59)) shift=0;
012A 3162 CPI R22,0x12
012B F429 BNE 0x0131
012C E081 LDI R24,1
012D E090 LDI R25,0
012E 2EA8 MOV R10,R24
012F 2EB9 MOV R11,R25
0130 C002 RJMP 0x0133
0131 24AA CLR R10
0132 24BB CLR R11
0133 3569 CPI R22,0x59
0134 F419 BNE 0x0138
0135 E041 LDI R20,1
0136 E050 LDI R21,0
0137 C002 RJMP 0x013A
0138 2744 CLR R20
0139 2755 CLR R21
013A 2C2A MOV R2,R10
013B 2C3B MOV R3,R11
013C 2A24 OR R2,R20
013D 2A35 OR R3,R21
013E 2022 TST R2
013F F419 BNE 0x0143
0140 2033 TST R3
0141 F409 BNE 0x0143
0142 C04C RJMP 0x018F
0143 2422 CLR R2
0144 92200071 STS R2,0x71
(0061) return;
0146 C048 RJMP 0x018F
(0062) }
(0063) switch (sc)
0147 2F46 MOV R20,R22
0148 2755 CLR R21
0149 3142 CPI R20,0x12
014A E0E0 LDI R30,0
014B 075E CPC R21,R30
014C F049 BEQ 0x0156
014D 3142 CPI R20,0x12
014E E0E0 LDI R30,0
014F 075E CPC R21,R30
0150 F03C BLT 0x0158
0151 3549 CPI R20,0x59
0152 E0E0 LDI R30,0
0153 075E CPC R21,R30
0154 F011 BEQ 0x0157
0155 C002 RJMP 0x0158
(0064) {
(0065) case 0x12:{//檢測左SHIF鍵
(0066) shift=1;
0156 D0FC RCALL 0x0253
0157 D0FB RCALL 0x0253
(0067) shiftup=1;
(0068) }
(0069) case 0x59:{//檢測右SHIF鍵
(0070) shift=1;
(0071) shiftup=1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -