📄 ps2_kb.lis
字号:
007C 7C2A .byte 124,42
007E 7D39 .byte 125,57
0080 0000 .byte 0,0
0082 .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\PS2_KB.C
0082 .dbsym e unshifted _unshifted A[130:65:2]c
0082 _shifted::
0082 0E7E .byte 14,126
0084 1551 .byte 21,'Q
0086 1621 .byte 22,33
0088 1A5A .byte 26,'Z
008A 1B53 .byte 27,'S
008C 1C41 .byte 28,'A
008E 1D57 .byte 29,'W
0090 1E40 .byte 30,64
0092 2143 .byte 33,'C
0094 2258 .byte 34,'X
0096 2344 .byte 35,'D
0098 2445 .byte 36,'E
009A 2524 .byte 37,36
009C 2623 .byte 38,35
009E 2920 .byte 41,32
00A0 2A56 .byte 42,'V
00A2 2B46 .byte 43,'F
00A4 2C54 .byte 44,'T
00A6 2D52 .byte 45,'R
00A8 2E25 .byte 46,37
00AA 314E .byte 49,'N
00AC 3242 .byte 50,'B
00AE 3348 .byte 51,'H
00B0 3447 .byte 52,'G
00B2 3559 .byte 53,'Y
00B4 365E .byte 54,94
00B6 394C .byte 57,'L
00B8 3A4D .byte 58,'M
00BA 3B4A .byte 59,'J
00BC 3C55 .byte 60,'U
00BE 3D26 .byte 61,38
00C0 3E2A .byte 62,42
00C2 413C .byte 'A,60
00C4 424B .byte 'B,'K
00C6 4349 .byte 'C,'I
00C8 444F .byte 'D,'O
00CA 4529 .byte 'E,41
00CC 4628 .byte 'F,40
00CE 493E .byte 'I,62
00D0 4A3F .byte 'J,63
00D2 4B4C .byte 'K,'L
00D4 4C3A .byte 'L,58
00D6 4D50 .byte 'M,'P
00D8 4E5F .byte 'N,95
00DA 5222 .byte 'R,34
00DC 547B .byte 'T,123
00DE 552B .byte 'U,43
00E0 5B7D .byte 91,125
00E2 5D7C .byte 93,124
00E4 613E .byte 'a,62
00E6 6931 .byte 'i,49
00E8 6B34 .byte 'k,52
00EA 6C37 .byte 'l,55
00EC 7030 .byte 'p,48
00EE 712E .byte 'q,46
00F0 7232 .byte 'r,50
00F2 7335 .byte 's,53
00F4 7436 .byte 't,54
00F6 7538 .byte 'u,56
00F8 792B .byte 'y,43
00FA 7A33 .byte 'z,51
00FC 7B2D .byte 123,45
00FE 7C2A .byte 124,42
0100 7D39 .byte 125,57
0102 0000 .byte 0,0
0104 .dbsym e shifted _shifted A[130:65:2]c
.area data(ram, con, rel)
0000 .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\PS2_KB.C
0000 _ascii::
0000 .blkb 1
.area idata
0000 20 .byte 32
.area data(ram, con, rel)
0001 .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\PS2_KB.C
0001 .dbsym e ascii _ascii c
.area text(rom, con, rel)
01AE .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\PS2_KB.C
01AE .dbfunc e Init_kb _Init_kb fV
.even
01AE _Init_kb::
01AE .dbline -1
01AE .dbline 166
01AE ; 0x73,'5',
01AE ; 0x74,'6',
01AE ; 0x75,'8',
01AE ; 0x79,'+',
01AE ; 0x7a,'3',
01AE ; 0x7b,'-',
01AE ; 0x7c,'*',
01AE ; 0x7d,'9',
01AE ; 0,0
01AE ; };
01AE ; #pragma data:data //将以后的变量放在RAM
01AE ; void Decode(uchar scancode);//声明函数原型
01AE ; uchar edge, bitcount,ascii=' '; //edge为0下降沿中断,为1上升沿中断
01AE ; //bitcount为位计数值
01AE ; //ascii为翻译后的ASCII码,初值为空格
01AE ;
01AE ; /*******************************************
01AE ; 函数名称: Init_kb
01AE ; 功 能: 初始化PS2函数
01AE ; 参 数: 无
01AE ; 返回值 : 无
01AE ; /********************************************/
01AE ; void Init_kb(void)
01AE ; {
01AE .dbline 167
01AE ; MCUCR = 2; //设置INT0为下降沿触发中断
01AE 82E0 ldi R24,2
01B0 85BF out 0x35,R24
01B2 .dbline 168
01B2 ; edge = 0; //0为下降沿中断标志,1为上升沿中断标志
01B2 2224 clr R2
01B4 20920200 sts _edge,R2
01B8 .dbline 169
01B8 ; bitcount = 11; //每次11位数据,一个起始位(0),8个数据位,一个奇偶校验位,一个停止位(1)
01B8 8BE0 ldi R24,11
01BA 80930100 sts _bitcount,R24
01BE .dbline 170
01BE ; DDRD&=~BIT(PD2); //配置中断管脚为输入
01BE 8A98 cbi 0x11,2
01C0 .dbline 171
01C0 ; PORTD|=BIT(PD2); //使能中断管脚的上拉
01C0 929A sbi 0x12,2
01C2 .dbline 172
01C2 ; DDRA&=~BIT(PA0); //配置键盘数据输入口为输入
01C2 D098 cbi 0x1a,0
01C4 .dbline 173
01C4 ; PORTA|=BIT(PA0); //使能数据输入管脚的上拉
01C4 D89A sbi 0x1b,0
01C6 .dbline 174
01C6 ; SREG|=BIT(GLOBAL);//打开全局中断
01C6 7894 bset 7
01C8 .dbline 175
01C8 ; GICR|=BIT(EXTINT0);
01C8 8BB7 in R24,0x3b
01CA 8064 ori R24,64
01CC 8BBF out 0x3b,R24
01CE .dbline -2
01CE .dbline 176
01CE ; }
01CE L46:
01CE .dbline 0 ; func end
01CE 0895 ret
01D0 .dbend
01D0 .dbfunc e Disp_ascii _Disp_ascii fV
01D0 ; ascii -> R20
.even
01D0 _Disp_ascii::
01D0 0E940000 xcall push_gset1
01D4 402F mov R20,R16
01D6 .dbline -1
01D6 .dbline 184
01D6 ; /*******************************************
01D6 ; 函数名称: Disp_ascii
01D6 ; 功 能: 在1602液晶上显示键盘上的ASCII码
01D6 ; 参 数: ascii--将要显示的ASCII码
01D6 ; 返回值 : 无
01D6 ; /********************************************/
01D6 ; void Disp_ascii(uchar ascii)
01D6 ; {
01D6 .dbline 185
01D6 ; LCD1602_gotoXY(1,2);
01D6 22E0 ldi R18,2
01D8 01E0 ldi R16,1
01DA BCDF xcall _LCD1602_gotoXY
01DC .dbline 186
01DC ; LCD1602_sendstr("KEY_ASCII:");
01DC 00E0 ldi R16,<L48
01DE 10E0 ldi R17,>L48
01E0 95DF xcall _LCD1602_sendstr
01E2 .dbline 187
01E2 ; LCD1602_sendbyte(iDat,ascii);
01E2 242F mov R18,R20
01E4 01E0 ldi R16,1
01E6 7FDF xcall _LCD1602_sendbyte
01E8 .dbline -2
01E8 .dbline 188
01E8 ; }
01E8 L47:
01E8 0E940000 xcall pop_gset1
01EC .dbline 0 ; func end
01EC 0895 ret
01EE .dbsym r ascii 20 c
01EE .dbend
.area bss(ram, con, rel)
0000 .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\PS2_KB.C
0000 L50:
0000 .blkb 1
.area text(rom, con, rel)
01EE .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\PS2_KB.C
01EE .dbfunc e Int0 _Int0 fV
01EE .dbsym s data L50 c
.even
01EE _Int0::
01EE 0E940000 xcall push_lset
01F2 .dbline -1
01F2 .dbline 196
01F2 ; /*******************************************
01F2 ; 函数名称: Int0
01F2 ; 功 能: 外部中断0的中断服务函数,上升沿中断读入11位数据,下降沿调用解码程序
01F2 ; 参 数: 无
01F2 ; 返回值 : 无
01F2 ; /********************************************/
01F2 ; void Int0(void)
01F2 ; {
01F2 .dbline 198
01F2 ; static uchar data; // 声明局部静态变量来保存扫描码
01F2 ; if (!edge) // 如果是下降沿触发中断
01F2 20900200 lds R2,_edge
01F6 2220 tst R2
01F8 D1F4 brne L51
01FA .dbline 199
01FA ; {
01FA .dbline 200
01FA ; if(bitcount < 11 && bitcount > 2) //3到10位是数据,起始位,校验位和停止位忽略
01FA 80910100 lds R24,_bitcount
01FE 8B30 cpi R24,11
0200 80F4 brsh L53
0202 82E0 ldi R24,2
0204 20900100 lds R2,_bitcount
0208 8215 cp R24,R2
020A 58F4 brsh L53
020C .dbline 201
020C ; {
020C .dbline 202
020C ; data = (data >> 1); //右移保存数据
020C 20900000 lds R2,L50
0210 2694 lsr R2
0212 20920000 sts L50,R2
0216 .dbline 203
0216 ; if(PINA&0x01)
0216 C89B sbis 0x19,0
0218 04C0 rjmp L55
021A .dbline 204
021A ; {
021A .dbline 205
021A ; data|=0x80; //存储一个'1'
021A 822D mov R24,R2
021C 8068 ori R24,128
021E 80930000 sts L50,R24
0222 .dbline 206
0222 ; }
0222 L55:
0222 .dbline 207
0222 ; }
0222 L53:
0222 .dbline 208
0222 ; MCUCR=3; //设置INT0为上升沿触发中断
0222 83E0 ldi R24,3
0224 85BF out 0x35,R24
0226 .dbline 209
0226 ; edge=1; //设置上升沿中断标志
0226 81E0 ldi R24,1
0228 80930200 sts _edge,R24
022C .dbline 210
022C ; }
022C 13C0 xjmp L52
022E L51:
022E .dbline 212
022E ; else //如果是上升沿触发中断
022E ; {
022E .dbline 213
022E ; MCUCR=2; //设置INT0为下降沿触发中断
022E 82E0 ldi R24,2
0230 85BF out 0x35,R24
0232 .dbline 214
0232 ; edge=0; //设置下降沿中断标志
0232 2224 clr R2
0234 20920200 sts _edge,R2
0238 .dbline 215
0238 ; if(--bitcount==0) //如果11位全部接收完毕
0238 80910100 lds R24,_bitcount
023C 8150 subi R24,1
023E 282E mov R2,R24
0240 20920100 sts _bitcount,R2
0244 8823 tst R24
0246 31F4 brne L57
0248 .dbline 216
0248 ; {
0248 .dbline 217
0248 ; Decode(data); //将扫描码翻译成ASCII码
0248 00910000 lds R16,L50
024C 06D0 xcall _Decode
024E .dbline 218
024E ; bitcount = 11; //重新设为11位数据
024E 8BE0 ldi R24,11
0250 80930100 sts _bitcount,R24
0254 .dbline 219
0254 ; }
0254 L57:
0254 .dbline 220
0254 L52:
0254 .dbline -2
0254 .dbline 221
0254 ; }
0254 ; }
0254 L49:
0254 0E940000 xcall pop_lset
0258 .dbline 0 ; func end
0258 1895 reti
025A .dbend
.area data(ram, con, rel)
0001 .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\PS2_KB.C
0001 L60:
0001 .blkb 1
.area idata
0001 00 .byte 0
.area data(ram, con, rel)
0002 .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\PS2_KB.C
0002 L61:
0002 .blkb 1
.area idata
0002 00 .byte 0
.area data(ram, con, rel)
0003 .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\PS2_KB.C
.area text(rom, con, rel)
025A .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\PS2_KB.C
025A .dbfunc e Decode _Decode fV
025A .dbsym s shift L61 c
025A .dbsym s up L60 c
025A ; i -> R20
025A ; scancode -> R16
.even
025A _Decode::
025A 0E940000 xcall push_gset1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -