📄 buzzer.lst
字号:
0086 2022 TST R2
0087 F7D9 BNE 0x0083
0088 2E20 MOV R2,R16
0089 2433 CLR R3
008A 5001 SUBI R16,1
008B 2022 TST R2
008C F7A9 BNE 0x0082
008D 940E014B CALL pop_gset1
008F 9508 RET
_KeyScan:
KeyNum --> R20
temp --> R22
0090 940E0146 CALL push_gset2
(0033) }
(0034) }
(0035)
(0036) /*-----------------------------------------------------------------
(0037) 函数名称: void KeyScan(void)
(0038) 函数功能: 键盘扫描程序
(0039) 参 数:
(0040) 返 回 值: 无
(0041) -----------------------------------------------------------------*/
(0042) void KeyScan(void)
(0043) {
(0044) uchar temp; //存放音符
(0045) uchar KeyNum = 0; //用来存放按键信息
0092 2744 CLR R20
(0046) DDRA = 0xff; //置端口A为输出
0093 EF8F LDI R24,0xFF
0094 BB8A OUT 0x1A,R24
(0047) PORTA = 0xff; //全部输出为高电平
0095 BB8B OUT 0x1B,R24
(0048) DelayMs(1); //延时一段时间
0096 E001 LDI R16,1
0097 DFE7 RCALL _DelayMs
(0049) DDRA = 0x00; //置端口A为输入
0098 2422 CLR R2
0099 BA2A OUT 0x1A,R2
(0050) if( PINA != 0xff) //是否有按键按下
009A B389 IN R24,0x19
009B 3F8F CPI R24,0xFF
009C F011 BEQ 0x009F
(0051) DelayMs(1); //延时去抖动
009D E001 LDI R16,1
009E DFE0 RCALL _DelayMs
(0052)
(0053) DDRA = 0xff; //置端口A为输出
009F EF8F LDI R24,0xFF
00A0 BB8A OUT 0x1A,R24
(0054) PORTA = 0xff; //全部输出为高电平
00A1 BB8B OUT 0x1B,R24
(0055) DelayMs(1); //延时一段时间
00A2 E001 LDI R16,1
00A3 DFDB RCALL _DelayMs
(0056) DDRA = 0x00; //置端口A为输入
00A4 2422 CLR R2
00A5 BA2A OUT 0x1A,R2
(0057) if( PINA != 0xff) //是否有按键按下
00A6 B389 IN R24,0x19
00A7 3F8F CPI R24,0xFF
00A8 F409 BNE 0x00AA
00A9 C071 RJMP 0x011B
(0058) { //确实有按键按下
(0059) switch (PINA & 0xff)//判断是哪个按键按下
00AA B369 IN R22,0x19
00AB 2777 CLR R23
00AC 7070 ANDI R23,0
00AD 3D6F CPI R22,0xDF
00AE E0E0 LDI R30,0
00AF 077E CPC R23,R30
00B0 F409 BNE 0x00B2
00B1 C038 RJMP 0x00EA
00B2 ED8F LDI R24,0xDF
00B3 E090 LDI R25,0
00B4 1786 CP R24,R22
00B5 0797 CPC R25,R23
00B6 F07C BLT 0x00C6
00B7 376F CPI R22,0x7F
00B8 E0E0 LDI R30,0
00B9 077E CPC R23,R30
00BA F409 BNE 0x00BC
00BB C032 RJMP 0x00EE
00BC 376F CPI R22,0x7F
00BD E0E0 LDI R30,0
00BE 077E CPC R23,R30
00BF F40C BGE 0x00C1
00C0 C054 RJMP 0x0115
00C1 3B6F CPI R22,0xBF
00C2 E0E0 LDI R30,0
00C3 077E CPC R23,R30
00C4 F139 BEQ 0x00EC
00C5 C04F RJMP 0x0115
00C6 3E6F CPI R22,0xEF
00C7 E0E0 LDI R30,0
00C8 077E CPC R23,R30
00C9 F0F1 BEQ 0x00E8
00CA 3E6F CPI R22,0xEF
00CB E0E0 LDI R30,0
00CC 077E CPC R23,R30
00CD F40C BGE 0x00CF
00CE C046 RJMP 0x0115
00CF 3F67 CPI R22,0xF7
00D0 E0E0 LDI R30,0
00D1 077E CPC R23,R30
00D2 F099 BEQ 0x00E6
00D3 3F6B CPI R22,0xFB
00D4 E0E0 LDI R30,0
00D5 077E CPC R23,R30
00D6 F069 BEQ 0x00E4
00D7 3F6D CPI R22,0xFD
00D8 E0E0 LDI R30,0
00D9 077E CPC R23,R30
00DA F039 BEQ 0x00E2
00DB 3F6E CPI R22,0xFE
00DC E0E0 LDI R30,0
00DD 077E CPC R23,R30
00DE F009 BEQ 0x00E0
00DF C035 RJMP 0x0115
(0060) {
(0061) case 0b11111110: KeyNum = 1;break;
00E0 E041 LDI R20,1
00E1 C033 RJMP 0x0115
(0062) case 0b11111101: KeyNum = 2;break;
00E2 E042 LDI R20,2
00E3 C031 RJMP 0x0115
(0063) case 0b11111011: KeyNum = 3;break;
00E4 E043 LDI R20,3
00E5 C02F RJMP 0x0115
(0064) case 0b11110111: KeyNum = 4;break;
00E6 E044 LDI R20,4
00E7 C02D RJMP 0x0115
(0065) case 0b11101111: KeyNum = 5;break;
00E8 E045 LDI R20,5
00E9 C02B RJMP 0x0115
(0066) case 0b11011111: KeyNum = 6;break;
00EA E046 LDI R20,6
00EB C029 RJMP 0x0115
(0067) case 0b10111111: KeyNum = 7;break;
00EC E047 LDI R20,7
00ED C027 RJMP 0x0115
(0068) case 0b01111111: KeyNum = 8;break;
00EE E048 LDI R20,0x8
(0069) default: break;
00EF C025 RJMP 0x0115
(0070) }
(0071)
(0072) while(PINA != 0xff)
(0073) {
(0074) DDRB = 0xff;
00F0 EF8F LDI R24,0xFF
00F1 BB87 OUT 0x17,R24
(0075) PORTB&= ~(1<<(KeyNum-1));//显示对应的发光二极管
00F2 2F14 MOV R17,R20
00F3 5011 SUBI R17,1
00F4 E001 LDI R16,1
00F5 940E015F CALL lsl8
00F7 2E20 MOV R2,R16
00F8 9420 COM R2
00F9 B238 IN R3,0x18
00FA 2032 AND R3,R2
00FB BA38 OUT 0x18,R3
(0076) DDRA = 0xff; //置端口A为输出
00FC EF8F LDI R24,0xFF
00FD BB8A OUT 0x1A,R24
(0077) PORTA = 0xff; //全部输出为高电平
00FE BB8B OUT 0x1B,R24
(0078) // DelayMs(1); //延时一段时间
(0079) temp = tab[KeyNum-1];
00FF E082 LDI R24,2
0100 9F84 MUL R24,R20
0101 01F0 MOVW R30,R0
0102 E58E LDI R24,0x5E
0103 E090 LDI R25,0
0104 0FE8 ADD R30,R24
0105 1FF9 ADC R31,R25
0106 8160 LDD R22,Z+0
0107 C001 RJMP 0x0109
(0080) while(temp--)
(0081) NOP();
0108 0000 NOP
0109 2E26 MOV R2,R22
010A 2433 CLR R3
010B 5061 SUBI R22,1
010C 2022 TST R2
010D F7D1 BNE 0x0108
(0082) DDRD = (1<<5);
010E E280 LDI R24,0x20
010F BB81 OUT 0x11,R24
(0083) PORTD ^= (1<<5);
0110 B222 IN R2,0x12
0111 2628 EOR R2,R24
0112 BA22 OUT 0x12,R2
(0084) DDRA = 0x00;
0113 2422 CLR R2
0114 BA2A OUT 0x1A,R2
0115 B389 IN R24,0x19
0116 3F8F CPI R24,0xFF
0117 F6C1 BNE 0x00F0
(0085) }
(0086) DDRB = 0xff; //设为输出
0118 EF8F LDI R24,0xFF
0119 BB87 OUT 0x17,R24
(0087) PORTB = 0xff; //灭所有的二极管
011A BB88 OUT 0x18,R24
(0088) }
011B 940E013D CALL pop_gset2
011D 9508 RET
(0089)
(0090) }
(0091) /*-----------------------------------------------------------------
(0092) 函数名称: void main(void)
(0093) 函数功能:
(0094) 参 数:
(0095) 返 回 值: 无
(0096) -----------------------------------------------------------------*/
(0097) void main(void)
(0098) {
(0099) DDRB = 0xff;
_main:
011E EF8F LDI R24,0xFF
011F BB87 OUT 0x17,R24
(0100) PORTB = 0xff;
0120 BB88 OUT 0x18,R24
0121 C001 RJMP 0x0123
(0101) while(1)
(0102) {
(0103) // DelayMs(200);
(0104) KeyScan();
FILE: <library>
0122 DF6D RCALL _KeyScan
0123 CFFE RJMP 0x0122
0124 9508 RET
mod8u:
0125 9468 BSET 6
0126 C001 RJMP xdiv8u
div8u:
0127 94E8 BCLR 6
xdiv8u:
0128 932A ST R18,-Y
0129 92FA ST R15,-Y
012A 92EA ST R14,-Y
012B 24FF CLR R15
012C 24EE CLR R14
012D E120 LDI R18,0x10
012E 0F00 LSL R16
012F 1CFF ROL R15
0130 1CEE ROL R14
0131 16E1 CP R14,R17
0132 F010 BCS 0x0135
0133 1AE1 SUB R14,R17
0134 9503 INC R16
0135 952A DEC R18
0136 F7B9 BNE 0x012E
0137 F40E BRTC 0x0139
0138 2D0E MOV R16,R14
0139 90E9 LD R14,Y+
013A 90F9 LD R15,Y+
013B 9129 LD R18,Y+
013C 9508 RET
pop_gset2:
013D E0E2 LDI R30,2
013E 940C014C JMP pop
push_gset5:
0140 92FA ST R15,-Y
0141 92EA ST R14,-Y
push_gset4:
0142 92DA ST R13,-Y
0143 92CA ST R12,-Y
push_gset3:
0144 92BA ST R11,-Y
0145 92AA ST R10,-Y
push_gset2:
0146 937A ST R23,-Y
0147 936A ST R22,-Y
push_gset1:
0148 935A ST R21,-Y
0149 934A ST R20,-Y
014A 9508 RET
pop_gset1:
014B E0E1 LDI R30,1
pop:
014C 9149 LD R20,Y+
014D 9159 LD R21,Y+
014E FDE0 SBRC R30,0
014F 9508 RET
0150 9169 LD R22,Y+
0151 9179 LD R23,Y+
0152 FDE1 SBRC R30,1
0153 9508 RET
0154 90A9 LD R10,Y+
0155 90B9 LD R11,Y+
0156 FDE2 SBRC R30,2
0157 9508 RET
0158 90C9 LD R12,Y+
0159 90D9 LD R13,Y+
015A FDE3 SBRC R30,3
015B 9508 RET
015C 90E9 LD R14,Y+
015D 90F9 LD R15,Y+
015E 9508 RET
lsl8:
015F 2311 TST R17
0160 F019 BEQ 0x0164
0161 0F00 LSL R16
0162 951A DEC R17
0163 CFFB RJMP lsl8
0164 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -