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

📄 ps20317.lst

📁 104键PS2接口标准键盘程序(C语言),通过测试可以!程序简单易懂。基于ICCAVR编译器
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    00B4 E5CF      LDI	R28,0x5F
    00B5 E0D4      LDI	R29,4
    00B6 BFCD      OUT	0x3D,R28
    00B7 BFDE      OUT	0x3E,R29
    00B8 51C0      SUBI	R28,0x10
    00B9 40D0      SBCI	R29,0
    00BA EA0A      LDI	R16,0xAA
    00BB 8308      STD	Y+0,R16
    00BC 2400      CLR	R0
    00BD E6E3      LDI	R30,0x63
    00BE E0F0      LDI	R31,0
    00BF E010      LDI	R17,0
    00C0 3AEB      CPI	R30,0xAB
    00C1 07F1      CPC	R31,R17
    00C2 F011      BEQ	0x00C5
    00C3 9201      ST	R0,Z+
    00C4 CFFB      RJMP	0x00C0
    00C5 8300      STD	Z+0,R16
    00C6 E6E4      LDI	R30,0x64
    00C7 E0F1      LDI	R31,1
    00C8 E6A0      LDI	R26,0x60
    00C9 E0B0      LDI	R27,0
    00CA E011      LDI	R17,1
    00CB 36E7      CPI	R30,0x67
    00CC 07F1      CPC	R31,R17
    00CD F021      BEQ	0x00D2
    00CE 95C8      LPM
    00CF 9631      ADIW	R30,1
    00D0 920D      ST	R0,X+
    00D1 CFF9      RJMP	0x00CB
    00D2 940E0271  CALL	_main
_exit:
    00D4 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
(0001) /*****************************
(0002) ** low level kexboard routines                VERSION 1.0
(0003) ******************************/
(0004) //ICC-AVR application builder : 2009-3-13 23:41:54
(0005) // Target : M16
(0006) // Crystal: 11.059Mhz
(0007) 
(0008) #include <iom16v.h>
(0009) #include <macros.h>
(0010) 
(0011) // "kb.h"
(0012) #include "scancode.h"
(0013) 
(0014) #define BUFF_SIZE 64
(0015) #define CLOCK   2
(0016) #define DATAPIN 3
(0017) 
(0018) #define ISC00 0
(0019) #define ISC01 1
(0020) 
(0021) // Declare your global variables here
(0022) unsigned char edge, bitcount;                // 0 = neg.  1 = pos.
(0023) 
(0024) unsigned char kb_buffer[BUFF_SIZE];
(0025) unsigned char *inpt, *outpt;
(0026) unsigned char buffcnt;
(0027) 
(0028) void port_init(void)
(0029) {
(0030)  PORTA = 0x00;
_port_init:
    00D5 2422      CLR	R2
    00D6 BA2B      OUT	0x1B,R2
(0031)  DDRA  = 0x00;
    00D7 BA2A      OUT	0x1A,R2
(0032)  PORTB = 0x00;
    00D8 BA28      OUT	0x18,R2
(0033)  DDRB  = 0x00;
    00D9 BA27      OUT	0x17,R2
(0034)  PORTC = 0x00; //m103 output only
    00DA BA25      OUT	0x15,R2
(0035)  DDRC  = 0x00;
    00DB BA24      OUT	0x14,R2
(0036)  PORTD = 0x00;
    00DC BA22      OUT	0x12,R2
(0037)  DDRD  = 0x00;
    00DD BA21      OUT	0x11,R2
    00DE 9508      RET
(0038) }
(0039) 
(0040) 
(0041) void InitKeyBoard(void)
(0042) {
(0043)     inpt =  kb_buffer;                        // Initialize buffer
_InitKeyBoard:
    00DF E689      LDI	R24,0x69
    00E0 E090      LDI	R25,0
    00E1 93900068  STS	inpt+1,R25
    00E3 93800067  STS	inpt,R24
(0044)     outpt = kb_buffer;
    00E5 93900066  STS	outpt+1,R25
    00E7 93800065  STS	outpt,R24
(0045)     buffcnt = 0;
    00E9 2422      CLR	R2
    00EA 92200064  STS	buffcnt,R2
(0046) 
(0047)     //MCUCR = 2;                                // INT0 interrupt on falling edge
(0048)     edge = 0;                                // 0 = falling edge  1 = rising edge
    00EC 922000AA  STS	edge,R2
(0049)     bitcount = 11;               
    00EE E08B      LDI	R24,0xB
    00EF 938000A9  STS	bitcount,R24
    00F1 9508      RET
(0050)     //#asm("sei")                              // interrupt enable
(0051) }
(0052) 
(0053) 
(0054) void put_kbbuff(unsigned char c)
(0055) {
(0056)     if (buffcnt<BUFF_SIZE)                        // If buffer not full
_put_kbbuff:
  c                    --> R16
    00F2 91800064  LDS	R24,buffcnt
    00F4 3480      CPI	R24,0x40
    00F5 F510      BCC	0x0118
(0057)     {
(0058)         *inpt = c;                                // Put character into buffer
    00F6 91E00067  LDS	R30,inpt
    00F8 91F00068  LDS	R31,inpt+1
    00FA 8300      STD	Z+0,R16
(0059)         inpt++;                                    // Increment pointer
    00FB 91800067  LDS	R24,inpt
    00FD 91900068  LDS	R25,inpt+1
    00FF 9601      ADIW	R24,1
    0100 93900068  STS	inpt+1,R25
    0102 93800067  STS	inpt,R24
(0060) 
(0061)         buffcnt++;
    0104 91800064  LDS	R24,buffcnt
    0106 5F8F      SUBI	R24,0xFF
    0107 93800064  STS	buffcnt,R24
(0062) 
(0063)         if (inpt >= kb_buffer + BUFF_SIZE)        // Pointer wrapping
    0109 EA89      LDI	R24,0xA9
    010A E090      LDI	R25,0
    010B 90200067  LDS	R2,inpt
    010D 90300068  LDS	R3,inpt+1
    010F 1628      CP	R2,R24
    0110 0639      CPC	R3,R25
    0111 F030      BCS	0x0118
(0064)             inpt = kb_buffer;
    0112 E689      LDI	R24,0x69
    0113 E090      LDI	R25,0
    0114 93900068  STS	inpt+1,R25
    0116 93800067  STS	inpt,R24
(0065)     }
    0118 9508      RET
(0066) }
(0067) 
(0068) int getchar_kb(void)
(0069) {
(0070)     int byte;
(0071)     while(buffcnt == 0);                        // Wait for data
_getchar_kb:
  byte                 --> R16
    0119 90200064  LDS	R2,buffcnt
    011B 2022      TST	R2
    011C F3E1      BEQ	0x0119
(0072) 
(0073)     byte = *outpt;                                // Get byte
    011D 91E00065  LDS	R30,outpt
    011F 91F00066  LDS	R31,outpt+1
    0121 8100      LDD	R16,Z+0
    0122 2711      CLR	R17
(0074)     outpt++;                                    // Increment pointer
    0123 01CF      MOVW	R24,R30
    0124 9601      ADIW	R24,1
    0125 93900066  STS	outpt+1,R25
    0127 93800065  STS	outpt,R24
(0075) 
(0076)     if (outpt >= kb_buffer + BUFF_SIZE)            // Pointer wrapping
    0129 EA89      LDI	R24,0xA9
    012A E090      LDI	R25,0
    012B 90200065  LDS	R2,outpt
    012D 90300066  LDS	R3,outpt+1
    012F 1628      CP	R2,R24
    0130 0639      CPC	R3,R25
    0131 F030      BCS	0x0138
(0077)         outpt = kb_buffer;
    0132 E689      LDI	R24,0x69
    0133 E090      LDI	R25,0
    0134 93900066  STS	outpt+1,R25
    0136 93800065  STS	outpt,R24
(0078)     
(0079)     buffcnt--;                                    // Decrement buffer count
    0138 91800064  LDS	R24,buffcnt
    013A 5081      SUBI	R24,1
    013B 93800064  STS	buffcnt,R24
(0080) 
(0081)     return byte;
    013D 9508      RET
_print_hexbyte:
  l                    --> R20
  h                    --> R22
  i                    --> R20
    013E 940E0281  CALL	push_gset2
    0140 2F40      MOV	R20,R16
(0082) }
(0083) 
(0084) void print_hexbyte(unsigned char i)   //???
(0085) {
(0086)     unsigned char h, l;
(0087)     
(0088)     h = i & 0xF0;               // High nibble
    0141 2F64      MOV	R22,R20
    0142 7F60      ANDI	R22,0xF0
(0089)     h = h>>4;
    0143 2F86      MOV	R24,R22
    0144 9582      SWAP	R24
    0145 708F      ANDI	R24,0xF
    0146 2F68      MOV	R22,R24
(0090)     h = h + '0';
    0147 5D60      SUBI	R22,0xD0
(0091)     
(0092)     if (h > '9')
    0148 E389      LDI	R24,0x39
    0149 1786      CP	R24,R22
    014A F408      BCC	0x014C
(0093)         h = h + 7;
    014B 5F69      SUBI	R22,0xF9
(0094) 
(0095)     l = (i & 0x0F)+'0';         // Low nibble
    014C 2F84      MOV	R24,R20
    014D 708F      ANDI	R24,0xF
    014E 5D80      SUBI	R24,0xD0
    014F 2F48      MOV	R20,R24
(0096)     if (l > '9')
    0150 E389      LDI	R24,0x39
    0151 1784      CP	R24,R20
    0152 F408      BCC	0x0154
(0097)         l = l + 7;
    0153 5F49      SUBI	R20,0xF9
(0098) 
(0099)     put_kbbuff(h);
    0154 2F06      MOV	R16,R22
    0155 DF9C      RCALL	_put_kbbuff
(0100)     put_kbbuff(l);
    0156 2F04      MOV	R16,R20
    0157 DF9A      RCALL	_put_kbbuff
    0158 940E0278  CALL	pop_gset2
    015A 9508      RET
_decode:
  i                    --> R22
  sc                   --> R20
    015B 940E0281  CALL	push_gset2
    015D 2F40      MOV	R20,R16
(0101) }
(0102)  
(0103) void decode(unsigned char sc)
(0104) {
(0105)     static unsigned char is_up=0, shift = 0, mode = 0;
(0106)     unsigned char i;
(0107)  
(0108)     if (!is_up)                // Last data received was the up-key identifier
    015E 90200060  LDS	R2,is_up
    0160 2022      TST	R2
    0161 F009      BEQ	0x0163
    0162 C094      RJMP	0x01F7
(0109)     {
(0110)         switch (sc)
    0163 2F64      MOV	R22,R20
    0164 2777      CLR	R23
    0165 3162      CPI	R22,0x12
    0166 E0E0      LDI	R30,0
    0167 077E      CPC	R23,R30
    0168 F0D9      BEQ	0x0184
    0169 E182      LDI	R24,0x12
    016A E090      LDI	R25,0
    016B 1786      CP	R24,R22
    016C 0797      CPC	R25,R23
    016D F02C      BLT	0x0173
    016E 3065      CPI	R22,5
    016F E0E0      LDI	R30,0
    0170 077E      CPC	R23,R30
    0171 F0D1      BEQ	0x018C
    0172 C029      RJMP	0x019C
    0173 3569      CPI	R22,0x59
    0174 E0E0      LDI	R30,0
    0175 077E      CPC	R23,R30
    0176 F089      BEQ	0x0188
    0177 3569      CPI	R22,0x59
    0178 E0E0      LDI	R30,0
    0179 077E      CPC	R23,R30
    017A F10C      BLT	0x019C
    017B 3F60      CPI	R22,0xF0
    017C E0E0      LDI	R30,0
    017D 077E      CPC	R23,R30
    017E F009      BEQ	0x0180
    017F C01C      RJMP	0x019C
(0111)         {
(0112)           case 0xF0 :        // The up-key identifier
(0113)             is_up = 1;
    0180 E081      LDI	R24,1
    0181 93800060  STS	is_up,R24
(0114)             break;
    0183 C0A4      RJMP	0x0228
(0115) 
(0116)           case 0x12 :        // Left SHIFT
(0117)             shift = 1;
    0184 E081      LDI	R24,1
    0185 93800061  STS	shift,R24
(0118)             break;
    0187 C0A0      RJMP	0x0228
(0119) 
(0120)           case 0x59 :        // Right SHIFT
(0121)             shift = 1;
    0188 E081      LDI	R24,1
    0189 93800061  STS	shift,R24
(0122)             break;
    018B C09C      RJMP	0x0228
(0123) 
(0124)           case 0x05 :        // F1
(0125)             if(mode == 0)   mode = 1;    // Enter scan code mode
    018C 90200062  LDS	R2,mode
    018E 2022      TST	R2
    018F F419      BNE	0x0193
    0190 E081      LDI	R24,1
    0191 93800062  STS	mode,R24
(0126)             if(mode == 2)   mode = 3;    // Leave scan code mode
    0193 91800062  LDS	R24,mode
    0195 3082      CPI	R24,2
    0196 F009      BEQ	0x0198
    0197 C090      RJMP	0x0228
    0198 E083      LDI	R24,3
    0199 93800062  STS	mode,R24
(0127)             break;
    019B C08C      RJMP	0x0228
(0128) 
(0129)           default:
(0130)             if(mode == 0 || mode == 3)        // If ASCII mode
    019C 90200062  LDS	R2,mode
    019E 2022      TST	R2
    019F F021      BEQ	0x01A4
    01A0 2D82      MOV	R24,R2
    01A1 3083      CPI	R24,3
    01A2 F009      BEQ	0x01A4
    01A3 C04E      RJMP	0x01F2
(0131)             {
(0132)                 if(!shift)                    // If shift is not pressed,
    01A4 90200061  LDS	R2,shift
    01A6 2022      TST	R2
    01A7 F529      BNE	0x01CD
(0133)                 {                            // do a table look-up
(0134)                     for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++);//???
    01A8 2766      CLR	R22
    01A9 C001      RJMP	0x01AB
    01AA 9563      INC	R22
    01AB E082      LDI	R24,2
    01AC 9F86      MUL	R24,R22
    01AD 01F0      MOVW	R30,R0
    01AE E584      LDI	R24,0x54
    01AF E090      LDI	R25,0
    01B0 0FE8      ADD	R30,R24
    01B1 1FF9      ADC	R31,R25
    01B2 9024      LPM	R2,0(Z)
    01B3 2433      CLR	R3
    01B4 1624      CP	R2,R20
    01B5 F011      BEQ	0x01B8
    01B6 2022      TST	R2
    01B7 F791      BNE	0x01AA
(0135)                     if (unshifted[i][0] == sc) {
    01B8 E082      LDI	R24,2
    01B9 9F86      MUL	R24,R22

⌨️ 快捷键说明

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