📄 课程设计.s
字号:
ldi R24,255
out 0x18,R24
.dbline 437
; for(i=0;i<4;i++)
clr R22
xjmp L78
L75:
.dbline 438
; {
.dbline 439
; PORTB=~(1<<i); //键盘线扫描
ldi R16,1
mov R17,R22
xcall lsl8
mov R2,R16
com R2
out 0x18,R2
.dbline 440
; delay_ms(20); //等待低电平稳定
ldi R16,20
ldi R17,0
xcall _delay_ms
.dbline 441
; temp1=PINB&0xf0;//读取键盘扫描信号,屏蔽低四位
in R24,0x16
andi R24,240
sts _temp1,R24
.dbline 442
; if (temp1!=0xf0)//如果有键按下,延时10ms消抖
cpi R24,240
brne X3
xjmp L79
X3:
.dbline 443
; { //本程序用display代替10ms延时,
.dbline 444
; delay_ms(30); //可消除显示抖动
ldi R16,30
ldi R17,0
xcall _delay_ms
.dbline 445
; temp1=PINB&0xf0;//再读键盘
in R24,0x16
andi R24,240
sts _temp1,R24
.dbline 446
; if (temp1!=0xf0)
cpi R24,240
brne X4
xjmp L81
X4:
.dbline 447
; {
.dbline 448
; temp1&=0xf0;
andi R24,240
sts _temp1,R24
.dbline 449
; switch(temp1) //计算键值
mov R20,R24
clr R21
cpi R20,176
ldi R30,0
cpc R21,R30
breq L87
ldi R24,176
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L91
L90:
cpi R20,112
ldi R30,0
cpc R21,R30
breq L86
xjmp L84
L91:
cpi R20,208
ldi R30,0
cpc R21,R30
breq L88
cpi R20,208
ldi R30,0
cpc R21,R30
brlt L84
L92:
cpi R20,224
ldi R30,0
cpc R21,R30
breq L89
xjmp L84
X2:
.dbline 450
; {
L86:
.dbline 451
; case 0x70:temp1=15-(3-i)*4;break;
ldi R17,3
sub R17,R22
ldi R16,4
muls R16,R17
ldi R24,15
sub R24,R0
sts _temp1,R24
.dbline 451
xjmp L84
L87:
.dbline 452
; case 0xb0:temp1=14-(3-i)*4;break;
ldi R17,3
sub R17,R22
ldi R16,4
muls R16,R17
ldi R24,14
sub R24,R0
sts _temp1,R24
.dbline 452
xjmp L84
L88:
.dbline 453
; case 0xd0:temp1=13-(3-i)*4;break;
ldi R17,3
sub R17,R22
ldi R16,4
muls R16,R17
ldi R24,13
sub R24,R0
sts _temp1,R24
.dbline 453
xjmp L84
L89:
.dbline 454
; case 0xe0:temp1=12-(3-i)*4;break;
ldi R17,3
sub R17,R22
ldi R16,4
muls R16,R17
ldi R24,12
sub R24,R0
sts _temp1,R24
.dbline 454
.dbline 455
; default:break;
L84:
.dbline 457
; }
; return temp1;
lds R16,_temp1
xjmp L74
L81:
.dbline 459
; }
; }
L79:
.dbline 460
L76:
.dbline 437
inc R22
L78:
.dbline 437
cpi R22,4
brsh X5
xjmp L75
X5:
.dbline 461
; }
; return 0x00;//无键按下
clr R16
.dbline -2
L74:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 22 c
.dbend
.dbfunc e ks _ks fc
; m -> R20
; n -> R22
.even
_ks::
xcall push_gset2
.dbline -1
.dbline 467
; }
; /**********************************************/
; /*查键盘*/
; /**********************************************/
; unsigned char ks(void)
; {
.dbline 469
; unsigned char m,n;
; DDRB=0x0f;
ldi R24,15
out 0x17,R24
.dbline 470
; PORTB=0xff;
ldi R24,255
out 0x18,R24
.dbline 471
; for(n=0;n<4;n++)
clr R22
xjmp L97
L94:
.dbline 472
; {
.dbline 473
; PORTB=~(1<<n);
ldi R16,1
mov R17,R22
xcall lsl8
mov R2,R16
com R2
out 0x18,R2
.dbline 474
; delay_ms(10);
ldi R16,10
ldi R17,0
xcall _delay_ms
.dbline 475
; m=PINB&0xf0;
in R20,0x16
andi R20,240
.dbline 476
; if(m!=0xf0)
cpi R20,240
breq L98
.dbline 477
; return 0xff;
ldi R16,255
xjmp L93
L98:
.dbline 478
L95:
.dbline 471
inc R22
L97:
.dbline 471
cpi R22,4
brlo L94
.dbline 479
; }
; return 0x00;
clr R16
.dbline -2
L93:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r m 20 c
.dbsym r n 22 c
.dbend
.area vector(rom, abs)
.org 20
jmp _PS2_KEY
.area text(rom, con, rel)
.dbfile F:\调试\计算器\课程设计.c
.dbfunc e PS2_KEY _PS2_KEY fV
.even
_PS2_KEY::
st -y,R2
st -y,R3
st -y,R24
st -y,R25
in R2,0x3f
st -y,R2
.dbline -1
.dbline 489
; }
;
; //*********************************************************//
;
; //******************************************************** //
;
; #pragma interrupt_handler PS2_KEY:6
;
; void PS2_KEY(void)
; {
.dbline 491
;
; if((count_jiema>0)&&(count_jiema<9))
clr R2
lds R3,_count_jiema
cp R2,R3
brsh L101
mov R24,R3
cpi R24,9
brsh L101
.dbline 492
; {
.dbline 493
; data=data>>1;
lds R2,_data
lsr R2
sts _data,R2
.dbline 494
; if(PINE&DATA1)
sbis 0x1,5
rjmp L103
.dbline 495
; data|=0x80;
mov R24,R2
ori R24,128
sts _data,R24
L103:
.dbline 496
; }
L101:
.dbline 497
; count_jiema++;
lds R24,_count_jiema
subi R24,255 ; addi 1
sts _count_jiema,R24
L105:
.dbline 499
L106:
.dbline 499
sbis 0x1,4
rjmp L105
.dbline 501
ldi R24,10
lds R2,_count_jiema
cp R24,R2
brsh L108
.dbline 502
.dbline 504
clr R2
sts _count_jiema,R2
.dbline 505
ldi R24,1
sts _flag,R24
.dbline 506
out 0x39,R2
.dbline 508
L108:
.dbline -2
L100:
ld R2,y+
out 0x3f,R2
ld R25,y+
ld R24,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e Decode _Decode fV
; TempCyc -> R22
; ScanCode -> R20
.even
_Decode::
xcall push_gset2
mov R20,R16
sbiw R28,1
.dbline -1
.dbline 516
;
; while(!(PINE&0X10)); //
;
; if(count_jiema>10)
; {
; // putchar0(data);//测试键盘码用
; count_jiema=0;
; flag=1;
; EIMSK=0x00;
;
; }
; }
;
; //*********************************************************//
; /*译码*/
; //******************************************************** //
;
; void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
; {
.dbline 519
; unsigned char TempCyc;
;
; if (!Key_UP) //
lds R2,_Key_UP
tst R2
breq X8
xjmp L111
X8:
.dbline 520
; {
.dbline 521
; switch (ScanCode)
mov R22,R20
clr R23
cpi R22,88
ldi R30,0
cpc R23,R30
breq L118
cpi R22,89
ldi R30,0
cpc R23,R30
breq L119
ldi R24,89
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L148
L147:
cpi R22,18
ldi R30,0
cpc R23,R30
breq L117
xjmp L113
L148:
cpi R22,102
ldi R30,0
cpc R23,R30
breq L120
cpi R22,102
ldi R30,0
cpc R23,R30
brlt L113
L149:
cpi R22,240
ldi R30,0
cpc R23,R30
breq L116
xjmp L113
X6:
.dbline 522
; {
L116:
.dbline 524
; case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始,把Shift = 1;解锁。否则下次总是显示大写字母
; Key_UP = 1;
ldi R24,1
sts _Key_UP,R24
.dbline 525
; break;
xjmp L112
L117:
.dbline 528
;
; case 0x12 : // 左 SHIFT
; Shift = 1;
ldi R24,1
sts _Shift,R24
.dbline 529
; break;
xjmp L112
L118:
.dbline 531
;
; case 0x58 : Shift=~Shift;break;
lds R2,_Shift
com R2
sts _Shift,R2
.dbline 531
xjmp L112
L119:
.dbline 533
; case 0x59 : // 右 SHIFT
; Shift = 1;
ldi R24,1
sts _Shift,R24
.dbline 534
; break;
xjmp L112
L120:
.dbline 536
; case 0x66 : //DEL键
; if (DisNumx==-1)
lds R24,_DisNumx
cpi R24,255
brne L121
.dbline 537
; {
.dbline 538
; DisNumy=DisNumy-8;
lds R24,_DisNumy
subi R24,8
sts _DisNumy,R24
.dbline 539
; DisNumx=15;
ldi R24,15
sts _DisNumx,R24
.dbline 540
; }
xjmp L112
L121:
.dbline 542
; else
; {
.dbline 543
; write_asiic(DisNumx, DisNumy, UnShifted[40][1]);
lds R2,_UnShifted+80+1
std y+0,R2
lds R18,_DisNumy
lds R16,_DisNumx
xcall _write_asiic
.dbline 544
; DisNumx--;
lds R24,_DisNumx
subi R24,1
sts _DisNumx,R24
.dbline 545
; }
.dbline 546
; break;
xjmp L112
L113:
.dbline 548
; default:
; if (DisNumx > 15)
ldi R24,15
lds R2,_DisNumx
cp R24,R2
brsh L125
.dbline 549
; {
.dbline 550
; DisNumy=DisNumy+8;
lds R24,_DisNumy
subi R24,248 ; addi 8
sts _DisNumy,R24
.dbline 551
; if( DisNumy==64)DisNumy=0;
cpi R24,64
brne L127
.dbline 551
clr R2
sts _DisNumy,R2
L127:
.dbline 552
; DisplayListChar(0, DisNumy);//清LCD第二行
lds R18,_DisNumy
clr R16
xcall _DisplayListChar
.dbline 553
; DisNumx=0;
clr R2
sts _DisNumx,R2
.dbline 556
;
;
; }
L125:
.dbline 557
; if(!Shift) //如果SHIFT没按下
lds R2,_Shift
tst R2
breq X9
xjmp L129
X9:
.dbline 558
; {
.dbline 559
clr R22
xjmp L134
L131:
.dbline 559
L132:
.dbline 559
inc R22
L134:
.dbline 559
; for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<71); TempCyc++); //查表显示
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_UnShifted
ldi R25,>_UnShifted
add R30,R24
adc R31,R25
ldd R2,z+0
cp R2,R20
breq L135
cpi R22,71
brlo L131
L135:
.dbline 560
; if (UnShifted[TempCyc][0] == ScanCode)
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_UnShifted
ldi R25,>_UnShifted
add R30,R24
adc R31,R25
ldd R2,z+0
cp R2,R20
breq X10
xjmp L112
X10:
.dbline 561
; { write_asiic(DisNumx, DisNumy, UnShifted[TempCyc][1]);
.dbline 561
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_UnShifted+1
ldi R25,>_UnShifted+1
add R30,R24
adc R31,R25
ldd R2,z+0
std y+0,R2
lds R18,_DisNumy
lds R16,_DisNumx
xcall _write_asiic
.dbline 562
; DisNumx++;
lds R24,_DisNumx
subi R24,255 ; addi 1
sts _DisNumx,R24
.dbline 564
;
; }
.dbline 565
; }
xjmp L112
L129:
.dbline 567
; else //按下SHIFT
; {
.dbline 568
clr R22
xjmp L142
L139:
.dbline 568
L140:
.dbline 568
inc R22
L142:
.dbline 568
; for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_Shifted
ldi R25,>_Shifted
add R30,R24
adc R31,R25
ldd R2,z+0
cp R2,R20
breq L143
cpi R22,59
brlo L139
L143:
.dbline 569
; if (Shifted[TempCyc][0] == ScanCode)
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_Shifted
ldi R25,>_Shifted
add R30,R24
adc R31,R25
ldd R2,z+0
cp R2,R20
brne L112
.dbline 570
; { write_asiic(DisNumx, DisNumy, Shifted[TempCyc][1]);
.dbline 570
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_Shifted+1
ldi R25,>_Shifted+1
add R30,R24
adc R31,R25
ldd R2,z+0
std y+0,R2
lds R18,_DisNumy
lds R16,_DisNumx
xcall _write_asiic
.dbline 571
; DisNumx++;
lds R24,_DisNumx
subi R24,255 ; addi 1
sts _DisNumx,R24
.dbline 573
;
; }
.dbline 574
; }
.dbline 576
;
; break;
.dbline 578
; }
; }
xjmp L112
L111:
.dbline 580
; else
; {
.dbline 581
; Key_UP = 0;
clr R2
sts _Key_UP,R2
.dbline 582
; switch (ScanCode) //当键松开时不处理断码,SHIFT+G为12H 34H F0H 34H F0H 12H,按下(12H 34H),松开(F0H 34H F0H 12H)
clr R21
cpi R20,18
ldi R30,0
cpc R21,R30
breq L153
cpi R20,18
ldi R30,0
cpc R21,R30
brlt L150
L155:
cpi R20,89
ldi R30,0
cpc R21,R30
breq L154
xjmp L150
X7:
.dbline 583
; {
L153:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -