📄 key.lst
字号:
(0025) void DelayMs(uchar i)
(0026) {
007A C006 RJMP 0x0081
(0027) uchar j;
(0028) while(i--)
(0029) {
(0030) j = 167;//1mhz 1ms延时
007B EA47 LDI R20,0xA7
(0031) while(j--);
007C 2E24 MOV R2,R20
007D 2433 CLR R3
007E 5041 SUBI R20,1
007F 2022 TST R2
0080 F7D9 BNE 0x007C
0081 2E20 MOV R2,R16
0082 2433 CLR R3
0083 5001 SUBI R16,1
0084 2022 TST R2
0085 F7A9 BNE 0x007B
0086 940E0132 CALL pop_gset1
0088 9508 RET
_KeyScan:
KeyNum --> R20
0089 940E012D CALL push_gset2
(0032) }
(0033) }
(0034)
(0035) /*-----------------------------------------------------------------
(0036) 函数名称: void KeyScan(void)
(0037) 函数功能: 键盘扫描程序
(0038) 参 数:
(0039) 返 回 值: 无
(0040) -----------------------------------------------------------------*/
(0041) void KeyScan(void)
(0042) {
(0043) uchar KeyNum = 0; //用来存放按键信息
008B 2744 CLR R20
(0044) DDRA = 0xff; //置端口A为输出
008C EF8F LDI R24,0xFF
008D BB8A OUT 0x1A,R24
(0045) PORTA = 0xff; //全部输出为高电平
008E BB8B OUT 0x1B,R24
(0046) DelayMs(1); //延时一段时间
008F E001 LDI R16,1
0090 DFE7 RCALL _DelayMs
(0047) DDRA = 0x00; //置端口A为输入
0091 2422 CLR R2
0092 BA2A OUT 0x1A,R2
(0048) if( PINA != 0xff) //是否有按键按下
0093 B389 IN R24,0x19
0094 3F8F CPI R24,0xFF
0095 F011 BEQ 0x0098
(0049) DelayMs(1); //延时去抖动
0096 E001 LDI R16,1
0097 DFE0 RCALL _DelayMs
(0050)
(0051) DDRA = 0xff; //置端口A为输出
0098 EF8F LDI R24,0xFF
0099 BB8A OUT 0x1A,R24
(0052) PORTA = 0xff; //全部输出为高电平
009A BB8B OUT 0x1B,R24
(0053) DelayMs(1); //延时一段时间
009B E001 LDI R16,1
009C DFDB RCALL _DelayMs
(0054) DDRA = 0x00; //置端口A为输入
009D 2422 CLR R2
009E BA2A OUT 0x1A,R2
(0055) if( PINA != 0xff) //是否有按键按下
009F B389 IN R24,0x19
00A0 3F8F CPI R24,0xFF
00A1 F409 BNE 0x00A3
00A2 C05D RJMP 0x0100
(0056) { //确实有按键按下
(0057) switch (PINA & 0xff)//判断是哪个按键按下
00A3 B369 IN R22,0x19
00A4 2777 CLR R23
00A5 7070 ANDI R23,0
00A6 3D6F CPI R22,0xDF
00A7 E0E0 LDI R30,0
00A8 077E CPC R23,R30
00A9 F409 BNE 0x00AB
00AA C036 RJMP 0x00E1
00AB ED8F LDI R24,0xDF
00AC E090 LDI R25,0
00AD 1786 CP R24,R22
00AE 0797 CPC R25,R23
00AF F074 BLT 0x00BE
00B0 376F CPI R22,0x7F
00B1 E0E0 LDI R30,0
00B2 077E CPC R23,R30
00B3 F189 BEQ 0x00E5
00B4 376F CPI R22,0x7F
00B5 E0E0 LDI R30,0
00B6 077E CPC R23,R30
00B7 F40C BGE 0x00B9
00B8 C041 RJMP 0x00FA
00B9 3B6F CPI R22,0xBF
00BA E0E0 LDI R30,0
00BB 077E CPC R23,R30
00BC F131 BEQ 0x00E3
00BD C03C RJMP 0x00FA
00BE 3E6F CPI R22,0xEF
00BF E0E0 LDI R30,0
00C0 077E CPC R23,R30
00C1 F0E9 BEQ 0x00DF
00C2 3E6F CPI R22,0xEF
00C3 E0E0 LDI R30,0
00C4 077E CPC R23,R30
00C5 F1A4 BLT 0x00FA
00C6 3F67 CPI R22,0xF7
00C7 E0E0 LDI R30,0
00C8 077E CPC R23,R30
00C9 F099 BEQ 0x00DD
00CA 3F6B CPI R22,0xFB
00CB E0E0 LDI R30,0
00CC 077E CPC R23,R30
00CD F069 BEQ 0x00DB
00CE 3F6D CPI R22,0xFD
00CF E0E0 LDI R30,0
00D0 077E CPC R23,R30
00D1 F039 BEQ 0x00D9
00D2 3F6E CPI R22,0xFE
00D3 E0E0 LDI R30,0
00D4 077E CPC R23,R30
00D5 F009 BEQ 0x00D7
00D6 C023 RJMP 0x00FA
(0058) {
(0059) case 0b11111110: KeyNum = 1;break;
00D7 E041 LDI R20,1
00D8 C021 RJMP 0x00FA
(0060) case 0b11111101: KeyNum = 2;break;
00D9 E042 LDI R20,2
00DA C01F RJMP 0x00FA
(0061) case 0b11111011: KeyNum = 3;break;
00DB E043 LDI R20,3
00DC C01D RJMP 0x00FA
(0062) case 0b11110111: KeyNum = 4;break;
00DD E044 LDI R20,4
00DE C01B RJMP 0x00FA
(0063) case 0b11101111: KeyNum = 5;break;
00DF E045 LDI R20,5
00E0 C019 RJMP 0x00FA
(0064) case 0b11011111: KeyNum = 6;break;
00E1 E046 LDI R20,6
00E2 C017 RJMP 0x00FA
(0065) case 0b10111111: KeyNum = 7;break;
00E3 E047 LDI R20,7
00E4 C015 RJMP 0x00FA
(0066) case 0b01111111: KeyNum = 8;break;
00E5 E048 LDI R20,0x8
(0067) default: break;
00E6 C013 RJMP 0x00FA
(0068) }
(0069)
(0070) while(PINA != 0xff)
(0071) {
(0072) DDRB = 0xff;
00E7 EF8F LDI R24,0xFF
00E8 BB87 OUT 0x17,R24
(0073) PORTB&= ~(1<<(KeyNum-1));//显示对应的发光二极管
00E9 2F14 MOV R17,R20
00EA 5011 SUBI R17,1
00EB E001 LDI R16,1
00EC 940E0146 CALL lsl8
00EE 2E20 MOV R2,R16
00EF 9420 COM R2
00F0 B238 IN R3,0x18
00F1 2032 AND R3,R2
00F2 BA38 OUT 0x18,R3
(0074) DDRA = 0xff; //置端口A为输出
00F3 EF8F LDI R24,0xFF
00F4 BB8A OUT 0x1A,R24
(0075) PORTA = 0xff; //全部输出为高电平
00F5 BB8B OUT 0x1B,R24
(0076) DelayMs(1); //延时一段时间
00F6 E001 LDI R16,1
00F7 DF80 RCALL _DelayMs
(0077) DDRA = 0x00;
00F8 2422 CLR R2
00F9 BA2A OUT 0x1A,R2
00FA B389 IN R24,0x19
00FB 3F8F CPI R24,0xFF
00FC F751 BNE 0x00E7
(0078) }
(0079) DDRB = 0xff; //设为输出
00FD EF8F LDI R24,0xFF
00FE BB87 OUT 0x17,R24
(0080) PORTB = 0xff; //灭所有的二极管
00FF BB88 OUT 0x18,R24
(0081) }
0100 940E0124 CALL pop_gset2
0102 9508 RET
(0082)
(0083) }
(0084) /*-----------------------------------------------------------------
(0085) 函数名称: void main(void)
(0086) 函数功能:
(0087) 参 数:
(0088) 返 回 值: 无
(0089) -----------------------------------------------------------------*/
(0090) void main(void)
(0091) {
(0092) DDRB = 0xff;
_main:
0103 EF8F LDI R24,0xFF
0104 BB87 OUT 0x17,R24
(0093) PORTB = 0xff;
0105 BB88 OUT 0x18,R24
0106 C003 RJMP 0x010A
(0094) while(1)
(0095) {
(0096) DelayMs(200);
0107 EC08 LDI R16,0xC8
0108 DF6F RCALL _DelayMs
(0097) KeyScan();
FILE: <library>
0109 DF7F RCALL _KeyScan
010A CFFC RJMP 0x0107
010B 9508 RET
mod8u:
010C 9468 BSET 6
010D C001 RJMP xdiv8u
div8u:
010E 94E8 BCLR 6
xdiv8u:
010F 932A ST R18,-Y
0110 92FA ST R15,-Y
0111 92EA ST R14,-Y
0112 24FF CLR R15
0113 24EE CLR R14
0114 E120 LDI R18,0x10
0115 0F00 LSL R16
0116 1CFF ROL R15
0117 1CEE ROL R14
0118 16E1 CP R14,R17
0119 F010 BCS 0x011C
011A 1AE1 SUB R14,R17
011B 9503 INC R16
011C 952A DEC R18
011D F7B9 BNE 0x0115
011E F40E BRTC 0x0120
011F 2D0E MOV R16,R14
0120 90E9 LD R14,Y+
0121 90F9 LD R15,Y+
0122 9129 LD R18,Y+
0123 9508 RET
pop_gset2:
0124 E0E2 LDI R30,2
0125 940C0133 JMP pop
push_gset5:
0127 92FA ST R15,-Y
0128 92EA ST R14,-Y
push_gset4:
0129 92DA ST R13,-Y
012A 92CA ST R12,-Y
push_gset3:
012B 92BA ST R11,-Y
012C 92AA ST R10,-Y
push_gset2:
012D 937A ST R23,-Y
012E 936A ST R22,-Y
push_gset1:
012F 935A ST R21,-Y
0130 934A ST R20,-Y
0131 9508 RET
pop_gset1:
0132 E0E1 LDI R30,1
pop:
0133 9149 LD R20,Y+
0134 9159 LD R21,Y+
0135 FDE0 SBRC R30,0
0136 9508 RET
0137 9169 LD R22,Y+
0138 9179 LD R23,Y+
0139 FDE1 SBRC R30,1
013A 9508 RET
013B 90A9 LD R10,Y+
013C 90B9 LD R11,Y+
013D FDE2 SBRC R30,2
013E 9508 RET
013F 90C9 LD R12,Y+
0140 90D9 LD R13,Y+
0141 FDE3 SBRC R30,3
0142 9508 RET
0143 90E9 LD R14,Y+
0144 90F9 LD R15,Y+
0145 9508 RET
lsl8:
0146 2311 TST R17
0147 F019 BEQ 0x014B
0148 0F00 LSL R16
0149 951A DEC R17
014A CFFB RJMP lsl8
014B 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -