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

📄 keyboard.s

📁 104键PS2接口标准键盘程序(C语言),通过测试可以!程序简单易懂。基于ICCAVR编译器
💻 S
📖 第 1 页 / 共 2 页
字号:
	ldi R24,1
	sts L22,R24
	.dbline 114
;             break;
	xjmp L26
L31:
	.dbline 117
; 
;           case 0x12 :        // Left SHIFT
;             shift = 1;
	ldi R24,1
	sts L23,R24
	.dbline 118
;             break;
	xjmp L26
L32:
	.dbline 121
; 
;           case 0x59 :        // Right SHIFT
;             shift = 1;
	ldi R24,1
	sts L23,R24
	.dbline 122
;             break;
	xjmp L26
L33:
	.dbline 125
; 
;           case 0x05 :        // F1
;             if(mode == 0)   mode = 1;    // Enter scan code mode
	lds R2,L24
	tst R2
	brne L34
	.dbline 125
	ldi R24,1
	sts L24,R24
L34:
	.dbline 126
;             if(mode == 2)   mode = 3;    // Leave scan code mode
	lds R24,L24
	cpi R24,2
	breq X3
	xjmp L26
X3:
	.dbline 126
	ldi R24,3
	sts L24,R24
	.dbline 127
;             break;
	xjmp L26
L27:
	.dbline 130
; 
;           default:
;             if(mode == 0 || mode == 3)        // If ASCII mode
	lds R2,L24
	tst R2
	breq L40
	mov R24,R2
	cpi R24,3
	breq X4
	xjmp L38
X4:
L40:
	.dbline 131
;             {
	.dbline 132
;                 if(!shift)                    // If shift is not pressed,
	lds R2,L23
	tst R2
	brne L41
	.dbline 133
;                 {                            // do a table look-up
	.dbline 134
	clr R22
	xjmp L46
L43:
	.dbline 134
L44:
	.dbline 134
	inc R22
L46:
	.dbline 134
;                     for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++);//???
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_unshifted
	ldi R25,>_unshifted
	add R30,R24
	adc R31,R25
	lpm R2,Z
	clr R3
	cp R2,R20
	breq L47
	tst R2
	brne L43
L47:
	.dbline 135
;                     if (unshifted[i][0] == sc) {
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_unshifted
	ldi R25,>_unshifted
	add R30,R24
	adc R31,R25
	lpm R30,Z
	cp R30,R20
	breq X5
	xjmp L26
X5:
	.dbline 135
	.dbline 136
;                         put_kbbuff(unshifted[i][1]);
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_unshifted+1
	ldi R25,>_unshifted+1
	add R30,R24
	adc R31,R25
	lpm R16,Z
	xcall _put_kbbuff
	.dbline 137
;                     }
	.dbline 138
	xjmp L26
L41:
	.dbline 138
;                 } else {                    // If shift is pressed
	.dbline 139
	clr R22
	xjmp L54
L51:
	.dbline 139
L52:
	.dbline 139
	inc R22
L54:
	.dbline 139
;                     for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_shifted
	ldi R25,>_shifted
	add R30,R24
	adc R31,R25
	lpm R2,Z
	clr R3
	cp R2,R20
	breq L55
	tst R2
	brne L51
L55:
	.dbline 140
;                     if (shifted[i][0] == sc) {
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_shifted
	ldi R25,>_shifted
	add R30,R24
	adc R31,R25
	lpm R30,Z
	cp R30,R20
	breq X6
	xjmp L26
X6:
	.dbline 140
	.dbline 141
;                         put_kbbuff(shifted[i][1]);
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_shifted+1
	ldi R25,>_shifted+1
	add R30,R24
	adc R31,R25
	lpm R16,Z
	xcall _put_kbbuff
	.dbline 142
;                     }
	.dbline 143
;                 }
	.dbline 144
	xjmp L26
L38:
	.dbline 144
;             } else{                            // Scan code mode
	.dbline 145
;                 print_hexbyte(sc);            // Print scan code
	mov R16,R20
	xcall _print_hexbyte
	.dbline 146
;                 put_kbbuff(' ');
	ldi R16,32
	xcall _put_kbbuff
	.dbline 148
; 
;             }
	.dbline 149
;             break;
	.dbline 151
	xjmp L26
L25:
	.dbline 151
;         }
;     } else {
	.dbline 152
;         is_up = 0;                            // Two 0xF0 in a row not allowed
	clr R2
	sts L22,R2
	.dbline 153
;         switch (sc)
	clr R21
	cpi R20,18
	ldi R30,0
	cpc R21,R30
	breq L65
	ldi R24,18
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L74
L73:
	cpi R20,5
	ldi R30,0
	cpc R21,R30
	breq L67
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	breq L63
	xjmp L62
L74:
	cpi R20,89
	ldi R30,0
	cpc R21,R30
	breq L66
	xjmp L62
X1:
	.dbline 154
;         {
L65:
	.dbline 156
;           case 0x12 :                        // Left SHIFT
;             shift = 0;
	clr R2
	sts L23,R2
	.dbline 157
;             break;
	xjmp L63
L66:
	.dbline 160
;             
;           case 0x59 :                        // Right SHIFT
;             shift = 0;
	clr R2
	sts L23,R2
	.dbline 161
;             break;
	xjmp L63
L67:
	.dbline 164
; 
;           case 0x05 :                        // F1
;             if(mode == 1)
	lds R24,L24
	cpi R24,1
	brne L68
	.dbline 165
;                 mode = 2;
	ldi R24,2
	sts L24,R24
L68:
	.dbline 166
;             if(mode == 3)
	lds R24,L24
	cpi R24,3
	brne L63
	.dbline 167
;                 mode = 0;
	clr R2
	sts L24,R2
	.dbline 168
;             break;
	.dbline 171
;           case 0x06 :                        // F2
;            // clr();
;             break;  
L62:
L63:
	.dbline 174
L26:
	.dbline -2
L21:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 22 c
	.dbsym r sc 20 c
	.dbend
	.area vector(rom, abs)
	.org 4
	jmp _int0_isr
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
	.area bss(ram, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
L76:
	.blkb 1
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
	.dbfunc e int0_isr _int0_isr fV
	.dbsym s data L76 c
	.even
_int0_isr::
	xcall push_lset
	.dbline -1
	.dbline 180
;             
;         } 
;     }    
; } 
; 
; 
; #pragma interrupt_handler int0_isr:iv_INT0
; void int0_isr(void)
; {
	.dbline 184
;  //external interupt on INT0
;  static unsigned char data;                // Holds the received scan code
; 
;         if(bitcount < 11 && bitcount > 2)    // Bit 3 to 10 is data. Parity bit,
	lds R24,_bitcount
	cpi R24,11
	brsh L77
	ldi R24,2
	lds R2,_bitcount
	cp R24,R2
	brsh L77
	.dbline 185
;         {                                    // start and stop bits are ignored.
	.dbline 186
;             data = (data >> 1);
	lds R2,L76
	lsr R2
	sts L76,R2
	.dbline 187
;             if(PIND & 8)            //first receive lsb
	sbis 0x10,3
	rjmp L79
	.dbline 188
;                 data = data | 0x80;            // Store a '1'
	mov R24,R2
	ori R24,128
	sts L76,R24
L79:
	.dbline 189
;         }
L77:
	.dbline 191
	lds R24,_bitcount
	subi R24,1
	mov R2,R24
	sts _bitcount,R2
	tst R24
	brne L81
	.dbline 192
	.dbline 193
	lds R16,L76
	xcall _decode
	.dbline 194
	ldi R24,11
	sts _bitcount,R24
	.dbline 195
L81:
	.dbline -2
L75:
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e delay_ms _delay_ms fV
;              i -> R20,R21
;             ms -> R16
	.even
_delay_ms::
	xcall push_gset1
	.dbline -1
	.dbline 201
; 
;         if(--bitcount == 0)                    // All bits received
;         {
;             decode(data);
;             bitcount = 11;
;         }
; }
; 
; 
; 
; void delay_ms(unsigned char ms)
; {
	xjmp L85
L84:
	.dbline 204
	ldi R20,11059
	ldi R21,43
	xjmp L90
L87:
	.dbline 204
L88:
	.dbline 204
	subi R20,1
	sbci R21,0
L90:
	.dbline 204
	clr R20
	clr R21
	clr R2
	brne L87
L85:
	.dbline 203
;       unsigned int i;
; 	  while(ms--)
	mov R2,R16
	clr R3
	subi R16,1
	tst R2
	brne L84
	.dbline -2
L83:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r ms 16 c
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 209
; 	  for(i=11059;i=0;i--);
; }
; 
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
	.dbline 211
;  //stop errant interrupts until set up
;  CLI(); //disable all interrupts
	cli
	.dbline 212
;  port_init();
	xcall _port_init
	.dbline 213
; InitKeyBoard();
	xcall _InitKeyBoard
	.dbline 215
; 
;  MCUCR = 0x02;
	ldi R24,2
	out 0x35,R24
	.dbline 216
;  GICR  = 0x40;
	ldi R24,64
	out 0x3b,R24
	.dbline 217
;  TIMSK = 0x00; //timer interrupt sources
	clr R2
	out 0x39,R2
	.dbline 218
;  SEI(); //re-enable interrupts
	sei
	.dbline -2
L91:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;            key -> R20
	.even
_main::
	.dbline -1
	.dbline 228
;  //all peripherals are now initialized
; }
; 
; //#include <delay.h>   
; 
; //#include <lcd.h>
; 
; 
; void main(void)
; {
	xjmp L94
L93:
	.dbline 234
	.dbline 235
	xcall _getchar_kb
	mov R20,R16
	.dbline 237
	ldi R16,5
	xcall _delay_ms
	.dbline 239
L94:
	.dbline 233
	xjmp L93
X7:
	.dbline -2
L92:
	.dbline 0 ; func end
	ret
	.dbsym r key 20 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\ps2\keyboard.c
_buffcnt::
	.blkb 1
	.dbsym e buffcnt _buffcnt c
_outpt::
	.blkb 2
	.dbsym e outpt _outpt pc
_inpt::
	.blkb 2
	.dbsym e inpt _inpt pc
_kb_buffer::
	.blkb 64
	.dbsym e kb_buffer _kb_buffer A[64:64]c
_bitcount::
	.blkb 1
	.dbsym e bitcount _bitcount c
_edge::
	.blkb 1
	.dbsym e edge _edge c

⌨️ 快捷键说明

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