📄 ps2test.s
字号:
; **********************************************************************/
; void portinitial(void)
; {
.dbline 89
; PORTA=0XFF;
ldi R24,255
out 0x1b,R24
.dbline 90
; DDRA=0XFF; //OUT
out 0x1a,R24
.dbline 91
; PORTB=0XFF;
out 0x18,R24
.dbline 92
; DDRB=0X0F; //high fout bit in , low four bits out
ldi R24,15
out 0x17,R24
.dbline 93
; PORTC=0XFF; //pull up
ldi R24,255
out 0x15,R24
.dbline 94
; PORTD=0XFF; //pull up
out 0x12,R24
.dbline -2
L36:
.dbline 0 ; func end
ret
.dbend
.dbfunc e intinitial _intinitial fV
.even
_intinitial::
.dbline -1
.dbline 101
; }
;
; /*********************************************************************
; fuction: ext interrupt initialize
; **********************************************************************/
; void intinitial(void) //int1 ,int0下降沿中断
; {
.dbline 102
; MCUCR=(1<<ISC10); //falling edge interrup
ldi R24,4
out 0x35,R24
.dbline 103
; GICR |=(1<<INT1); //enable ext0,ext1 interrupt
in R24,0x3b
ori R24,128
out 0x3b,R24
.dbline 104
; bitcount = 11;
ldi R24,11
sts _bitcount,R24
.dbline -2
L37:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 8
jmp _int1pro
.area text(rom, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\ps2test\ps2test.c
.dbfunc e int1pro _int1pro fV
; code -> R20
; i -> R22
.even
_int1pro::
xcall push_lset
xcall push_gset2
.dbline -1
.dbline 112
; }
;
; /*********************************************************************
; fuction: ext1 interrupt service routine
; **********************************************************************/
; #pragma interrupt_handler int1pro: iv_INT1
; void int1pro(void)
; {
.dbline 114
; unsigned char i,code;
; if ((PIN_KB&(1<<DATAPIN))==0)
sbic 0x10,2
rjmp L39
.dbline 115
; {
L41:
.dbline 116
L42:
.dbline 116
; while((PIN_KB&(1<<CLOCK))==0);
sbis 0x10,3
rjmp L41
.dbline 117
; for(i=0;i<8;i++)
clr R22
xjmp L47
X1:
.dbline 118
; {
L48:
.dbline 119
L49:
.dbline 119
; while(PIN_KB&(1<<CLOCK));
sbic 0x10,3
rjmp L48
.dbline 120
; code>>=1;
lsr R20
.dbline 121
; if ((PIN_KB&(1<<DATAPIN))!=0)
sbis 0x10,2
rjmp L54
.dbline 122
; code|=0x80;
ori R20,128
L53:
.dbline 123
L54:
.dbline 123
sbis 0x10,3
rjmp L53
.dbline 124
L45:
.dbline 117
inc R22
L47:
.dbline 117
cpi R22,8
brlo L49
L56:
.dbline 125
L57:
.dbline 125
; while((PIN_KB&(1<<CLOCK))==0);
; }
; while(PIN_KB&(1<<CLOCK));
sbic 0x10,3
rjmp L56
L59:
.dbline 126
L60:
.dbline 126
; while((PIN_KB&(1<<CLOCK))==0);
sbis 0x10,3
rjmp L59
L62:
.dbline 127
L63:
.dbline 127
; while(PIN_KB&(1<<CLOCK));
sbic 0x10,3
rjmp L62
.dbline 128
; if ((PIN_KB&(1<<DATAPIN))!=0)
sbis 0x10,2
rjmp L65
.dbline 129
; {
.dbline 130
; origialcode=code;
sts _origialcode,R20
.dbline 131
; code=decode(code);
mov R16,R20
xcall _decode
mov R20,R16
.dbline 132
; if(code!=0)
tst R16
breq L67
.dbline 133
; put_c(code);
xcall _put_c
L67:
.dbline 134
; }
L65:
.dbline 135
L39:
.dbline -2
L38:
xcall pop_gset2
xcall pop_lset
.dbline 0 ; func end
reti
.dbsym r code 20 c
.dbsym r i 22 c
.dbend
.dbfunc e init_USART _init_USART fV
.even
_init_USART::
.dbline -1
.dbline 142
; }
; }
;
; /*-------------------------------------------------------------------
; function: initialize uart
; --------------------------------------------------------------------*/
; void init_USART(void)//USART 初始化
; {
.dbline 145
;
; //USART 9600 8, n,1 PC上位机软件(超级终端等)也要设成同样的设置才能通讯
; UCSRC = (1<<URSEL) | 0x06;
ldi R24,134
out 0x20,R24
.dbline 161
; //异步,8位数据,无奇偶校验,一个停止位,无倍速
; /*
; UBRRH与UCSRC共用I/O 地址。因此访问该地址时需注意以下问题。
; 写访问
; 当在该地址执行写访问时, USART 寄存器选择位(URSEL)控制被写入的寄存器。
; 若URSEL为0,对UBRRH值更新;若URSEL为1,对UCSRC设置更新
;
; 读访问
; 对UBRRH 或UCSRC 寄存器的读访问则较为复杂。但在大多数应用中,基本不需要读这些寄存器
;
;
; 没有UBRR这个16位寄存器,因为UBRRL(0x09)/UBRRH(0x20)的地址不连续,而且UBRRH跟UCSRC共用地址
; */
;
; //U2X=0时的公式计算
; UBRRL= (F_CPU/BAUDRATE/16-1)%256;
ldi R24,51
out 0x9,R24
.dbline 162
; UBRRH= (F_CPU/BAUDRATE/16-1)/256;
clr R2
out 0x20,R2
.dbline 169
; //U2X=1时的公式计算
; //UBRRL= (F_CPU/BAUDRATE/8-1)%256;
; //UBRRH= (F_CPU/BAUDRATE/8-1)/256;
; //也可根据数据手册的[波特率设置的例子]查得
; //UBRRL = 0x2F; //set baud rate lo
; //UBRRH = 0x00; //set baud rate hi
; UCSRA = 0x00; //无倍速
out 0xb,R2
.dbline 170
; UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
ldi R24,152
out 0xa,R24
.dbline -2
L69:
.dbline 0 ; func end
ret
.dbend
.area data(ram, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\ps2test\ps2test.c
L71:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\ps2test\ps2test.c
L72:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\ps2test\ps2test.c
L73:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\ps2test\ps2test.c
.area text(rom, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\ps2test\ps2test.c
.dbfunc e decode _decode fc
.dbsym s shiftup L73 c
.dbsym s up L72 c
.dbsym s shift L71 c
; i -> R20
; sc -> R16
.even
_decode::
xcall push_gset2
.dbline -1
.dbline 180
; //使能接收中断,使能接收,使能发送
; }
;
; /*--------------------------------------------------------------------------
; function: decode the ps2 code to ASCII
; para: sr----ps2 code
; return ASCII code
; --------------------------------------------------------------------------*/
; unsigned char decode(unsigned char sc)
; {
.dbline 183
; static unsigned char shift=0,up=0,shiftup=0;
; unsigned char i;
; if (sc==0xf0)
cpi R16,240
brne L74
.dbline 184
; {
.dbline 185
; up=1;
ldi R24,1
sts L72,R24
.dbline 186
; return 0;
clr R16
xjmp L70
L74:
.dbline 188
; }
; if (up==1)
lds R24,L72
cpi R24,1
brne L76
.dbline 189
; {
.dbline 190
; up=0;
clr R2
sts L72,R2
.dbline 191
; if ((sc==0x12)|(sc==0x59)) shift=0;
cpi R16,18
brne L80
ldi R22,1
ldi R23,0
xjmp L81
L80:
clr R22
clr R23
L81:
cpi R16,89
brne L82
ldi R20,1
ldi R21,0
xjmp L83
L82:
clr R20
clr R21
L83:
movw R2,R22
or R2,R20
or R3,R21
tst R2
brne X2
tst R3
breq L78
X2:
.dbline 191
clr R2
sts L71,R2
L78:
.dbline 192
; return 0;
clr R16
xjmp L70
L76:
.dbline 194
; }
; switch (sc)
mov R20,R16
clr R21
cpi R20,18
ldi R30,0
cpc R21,R30
breq L87
cpi R20,18
ldi R30,0
cpc R21,R30
brlt L84
L107:
cpi R20,89
ldi R30,0
cpc R21,R30
breq L88
xjmp L84
X3:
.dbline 195
; {
L87:
.dbline 196
; case 0x12:{
.dbline 197
; shift=1;
ldi R24,1
sts L71,R24
.dbline 198
; shiftup=1;
sts L73,R24
.dbline 199
; }
L88:
.dbline 200
; case 0x59:{
.dbline 201
; shift=1;
ldi R24,1
sts L71,R24
.dbline 202
; shiftup=1;
sts L73,R24
.dbline 203
; }
L84:
.dbline 204
; default:{
.dbline 205
; if (shift==0)
lds R2,L71
tst R2
brne L89
.dbline 206
; {
.dbline 207
clr R20
xjmp L94
L91:
.dbline 207
L92:
.dbline 207
inc R20
L94:
.dbline 207
; for(i = 0;unshifted[i][0]!=sc && unshifted[i][0]; i++);
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_unshifted
ldi R25,>_unshifted
add R30,R24
adc R31,R25
lpm R2,Z
clr R3
cp R2,R16
breq L95
tst R2
brne L91
L95:
.dbline 208
; if (unshifted[i][0] == sc)
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_unshifted
ldi R25,>_unshifted
add R30,R24
adc R31,R25
lpm R30,Z
cp R30,R16
breq X5
xjmp L90
X5:
.dbline 209
; return unshifted[i][1];
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_unshifted+1
ldi R25,>_unshifted+1
add R30,R24
adc R31,R25
lpm R16,Z
xjmp L70
X4:
.dbline 210
; }
L89:
.dbline 212
; else
; {
.dbline 213
clr R20
xjmp L102
L99:
.dbline 213
L100:
.dbline 213
inc R20
L102:
.dbline 213
; for(i = 0;shifted[i][0]!=sc && shifted[i][0]; i++);
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_shifted
ldi R25,>_shifted
add R30,R24
adc R31,R25
lpm R2,Z
clr R3
cp R2,R16
breq L103
tst R2
brne L99
L103:
.dbline 214
; if (shifted[i][0] == sc)
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_shifted
ldi R25,>_shifted
add R30,R24
adc R31,R25
lpm R30,Z
cp R30,R16
brne L104
.dbline 215
; {
.dbline 216
; return shifted[i][1];
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_shifted+1
ldi R25,>_shifted+1
add R30,R24
adc R31,R25
lpm R16,Z
xjmp L70
L104:
.dbline 218
; }
; }
L90:
.dbline 219
; }
.dbline 220
; return 0;
clr R16
.dbline -2
L70:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r sc 16 c
.dbend
.area bss(ram, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\ps2test\ps2test.c
_bitcount::
.blkb 1
.dbsym e bitcount _bitcount c
.area data(ram, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\ps2test\ps2test.c
L32:
.blkb 18
.area idata
.byte 'd,'u,'s,'h,'i,'b,'i,'a,'o,64,49,50,54,46,'c,'o
.byte 'm,0
.area data(ram, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\ps2test\ps2test.c
L31:
.blkb 10
.area idata
.byte 'd,'u,'s,'h,'i,'b,'i,'a,'o,0
.area data(ram, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\ps2test\ps2test.c
L30:
.blkb 18
.area idata
.byte 'P,'S,50,45,45,'K,'E,'Y,'O,'A,'R,'D,32,'t,'e,'s
.byte 't,0
.area data(ram, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\ps2test\ps2test.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -